@ycniuqton/devlens 0.1.10 → 0.1.12

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.
@@ -35,18 +35,63 @@ exports.integrationsRouter.get('/tunnel/status', (_req, res) => {
35
35
  exports.integrationsRouter.post('/tunnel/start', async (req, res) => {
36
36
  const { provider } = req.body;
37
37
  const port = req.app.locals.port || 5157;
38
+ const settingsService = req.app.locals.settingsService;
39
+ const ngrokToken = settingsService?.getNgrokAuthToken();
40
+ if (provider === 'ngrok' && !ngrokToken) {
41
+ return res.status(400).json({ error: 'ngrok_no_token', message: 'ngrok auth token not configured' });
42
+ }
38
43
  try {
39
- const url = await (0, tunnel_1.startTunnel)(port, provider || 'cloudflare');
44
+ const url = await (0, tunnel_1.startTunnel)(port, provider || 'cloudflare', ngrokToken);
40
45
  res.json({ ok: true, url, provider: provider || 'cloudflare' });
41
46
  }
42
47
  catch (err) {
43
48
  res.status(500).json({ error: err.message });
44
49
  }
45
50
  });
46
- exports.integrationsRouter.post('/tunnel/stop', (_req, res) => {
51
+ exports.integrationsRouter.post('/tunnel/stop', (req, res) => {
47
52
  (0, tunnel_1.stopTunnel)();
53
+ // Always re-enable direct IP on disconnect so user is never locked out
54
+ const settingsService = req.app.locals.settingsService;
55
+ if (settingsService)
56
+ settingsService.updateSettings({ directIpAccess: true });
48
57
  res.json({ ok: true });
49
58
  });
59
+ exports.integrationsRouter.get('/direct-ip', (req, res) => {
60
+ const settingsService = req.app.locals.settingsService;
61
+ const enabled = settingsService?.getSettings().directIpAccess !== false;
62
+ res.json({ enabled });
63
+ });
64
+ exports.integrationsRouter.post('/direct-ip', (req, res) => {
65
+ try {
66
+ const { enabled } = req.body;
67
+ const settingsService = req.app.locals.settingsService;
68
+ if (!settingsService)
69
+ return res.status(500).json({ error: 'Settings service not available' });
70
+ settingsService.updateSettings({ directIpAccess: !!enabled });
71
+ res.json({ ok: true, enabled: !!enabled });
72
+ }
73
+ catch (err) {
74
+ res.status(500).json({ error: err.message });
75
+ }
76
+ });
77
+ exports.integrationsRouter.get('/tunnel/ngrok-token', (req, res) => {
78
+ const settingsService = req.app.locals.settingsService;
79
+ const token = settingsService?.getNgrokAuthToken();
80
+ res.json({ configured: !!token });
81
+ });
82
+ exports.integrationsRouter.post('/tunnel/ngrok-token', (req, res) => {
83
+ try {
84
+ const { token } = req.body;
85
+ const settingsService = req.app.locals.settingsService;
86
+ if (!settingsService)
87
+ return res.status(500).json({ error: 'Settings service not available' });
88
+ settingsService.updateSettings({ ngrokAuthToken: token || undefined });
89
+ res.json({ ok: true });
90
+ }
91
+ catch (err) {
92
+ res.status(500).json({ error: err.message });
93
+ }
94
+ });
50
95
  exports.integrationsRouter.get('/jira/issues', async (req, res) => {
51
96
  try {
52
97
  const cached = getCached('jira');
@@ -1 +1 @@
1
- {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/routes/integrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/routes/integrations.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -39,12 +39,31 @@ function createServer(options) {
39
39
  app.locals.settingsService = settingsService;
40
40
  app.locals.projectDir = options.projectDir;
41
41
  app.locals.port = options.port;
42
+ // Block non-localhost requests when directIpAccess is disabled
43
+ app.use((req, res, next) => {
44
+ const ip = req.socket.remoteAddress || '';
45
+ const isLocal = ip === '127.0.0.1' || ip === '::1' || ip === '::ffff:127.0.0.1';
46
+ if (!isLocal && !settingsService.getSettings().directIpAccess) {
47
+ return res.status(403).send('Direct IP access is disabled. Use the tunnel URL.');
48
+ }
49
+ next();
50
+ });
42
51
  // API routes
43
52
  app.get('/api/info', (_req, res) => {
53
+ const os = require('os');
54
+ const networkIps = [];
55
+ for (const ifaces of Object.values(os.networkInterfaces())) {
56
+ for (const iface of ifaces) {
57
+ if (iface.family === 'IPv4' && !iface.internal)
58
+ networkIps.push(iface.address);
59
+ }
60
+ }
44
61
  res.json({
45
62
  projectDir: options.projectDir,
46
63
  projectName: path_1.default.basename(options.projectDir),
47
64
  port: options.port,
65
+ localUrl: `http://localhost:${options.port}`,
66
+ networkUrls: networkIps.map(ip => `http://${ip}:${options.port}`),
48
67
  });
49
68
  });
50
69
  app.use('/api', diff_1.diffRouter);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  export interface DevlensSettings {
2
2
  ignorePatterns: string[];
3
+ ngrokAuthToken?: string;
4
+ directIpAccess: boolean;
3
5
  }
4
6
  export interface SettingsService {
5
7
  getSettings(): DevlensSettings;
6
8
  updateSettings(input: Partial<DevlensSettings>): DevlensSettings;
7
9
  getIgnorePatterns(): string[];
10
+ getNgrokAuthToken(): string | undefined;
8
11
  /** Convert ignore patterns to chokidar-compatible globs */
9
12
  getChokidarIgnoreGlobs(): (string | RegExp)[];
10
13
  /** Convert ignore patterns to a Set of names for the file explorer */
@@ -37,7 +37,7 @@ function createSettingsService(projectDir) {
37
37
  fs_1.default.mkdirSync(devlensDir, { recursive: true });
38
38
  }
39
39
  if (!fs_1.default.existsSync(settingsFile)) {
40
- const initial = { ignorePatterns: DEFAULT_IGNORE_PATTERNS };
40
+ const initial = { ignorePatterns: DEFAULT_IGNORE_PATTERNS, directIpAccess: true };
41
41
  fs_1.default.writeFileSync(settingsFile, JSON.stringify(initial, null, 2));
42
42
  }
43
43
  }
@@ -47,10 +47,12 @@ function createSettingsService(projectDir) {
47
47
  const data = JSON.parse(fs_1.default.readFileSync(settingsFile, 'utf-8'));
48
48
  return {
49
49
  ignorePatterns: Array.isArray(data.ignorePatterns) ? data.ignorePatterns : DEFAULT_IGNORE_PATTERNS,
50
+ ngrokAuthToken: data.ngrokAuthToken,
51
+ directIpAccess: data.directIpAccess !== false, // default true
50
52
  };
51
53
  }
52
54
  catch {
53
- return { ignorePatterns: DEFAULT_IGNORE_PATTERNS };
55
+ return { ignorePatterns: DEFAULT_IGNORE_PATTERNS, directIpAccess: true };
54
56
  }
55
57
  }
56
58
  function save(settings) {
@@ -65,6 +67,8 @@ function createSettingsService(projectDir) {
65
67
  const current = load();
66
68
  const merged = {
67
69
  ignorePatterns: input.ignorePatterns ?? current.ignorePatterns,
70
+ ngrokAuthToken: input.ngrokAuthToken !== undefined ? input.ngrokAuthToken : current.ngrokAuthToken,
71
+ directIpAccess: input.directIpAccess !== undefined ? input.directIpAccess : current.directIpAccess,
68
72
  };
69
73
  // Dedupe + trim + drop empties
70
74
  merged.ignorePatterns = Array.from(new Set(merged.ignorePatterns.map(p => (p || '').trim()).filter(Boolean)));
@@ -74,6 +78,9 @@ function createSettingsService(projectDir) {
74
78
  getIgnorePatterns() {
75
79
  return load().ignorePatterns;
76
80
  },
81
+ getNgrokAuthToken() {
82
+ return load().ngrokAuthToken;
83
+ },
77
84
  getChokidarIgnoreGlobs() {
78
85
  const patterns = load().ignorePatterns;
79
86
  // Always ignore dotfiles
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/services/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/services/settings.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  export declare function getTunnelStatus(): {
2
- provider: "cloudflare" | "ngrok" | null;
2
+ provider: "ngrok" | "cloudflare" | null;
3
3
  url: string | null;
4
4
  status: "error" | "disconnected" | "connecting" | "connected";
5
5
  error: string | undefined;
6
6
  };
7
- export declare function startTunnel(port: number, provider?: 'cloudflare' | 'ngrok'): Promise<string>;
7
+ export declare function startTunnel(port: number, provider?: 'cloudflare' | 'ngrok', ngrokToken?: string): Promise<string>;
8
8
  export declare function stopTunnel(): void;
@@ -1,9 +1,59 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.getTunnelStatus = getTunnelStatus;
4
37
  exports.startTunnel = startTunnel;
5
38
  exports.stopTunnel = stopTunnel;
6
39
  const child_process_1 = require("child_process");
40
+ const path = __importStar(require("path"));
41
+ // Use bundled binaries from npm packages
42
+ let cloudflaredBin;
43
+ let ngrokBin;
44
+ try {
45
+ cloudflaredBin = require('cloudflared').bin;
46
+ }
47
+ catch {
48
+ cloudflaredBin = 'cloudflared';
49
+ }
50
+ try {
51
+ const ngrokDir = path.dirname(require.resolve('ngrok'));
52
+ ngrokBin = path.join(ngrokDir, 'bin', 'ngrok');
53
+ }
54
+ catch {
55
+ ngrokBin = 'ngrok';
56
+ }
7
57
  const state = {
8
58
  provider: null,
9
59
  url: null,
@@ -18,28 +68,27 @@ function getTunnelStatus() {
18
68
  error: state.error,
19
69
  };
20
70
  }
21
- function startTunnel(port, provider = 'cloudflare') {
22
- // Stop existing tunnel first
71
+ function startTunnel(port, provider = 'cloudflare', ngrokToken) {
23
72
  stopTunnel();
24
73
  state.provider = provider;
25
74
  state.status = 'connecting';
26
75
  state.error = undefined;
27
76
  if (provider === 'ngrok') {
28
- return startNgrok(port);
77
+ return startNgrok(port, ngrokToken);
29
78
  }
30
79
  return startCloudflare(port);
31
80
  }
32
81
  function startCloudflare(port) {
33
82
  return new Promise((resolve, reject) => {
34
83
  try {
35
- state.process = (0, child_process_1.spawn)('cloudflared', ['tunnel', '--url', `http://localhost:${port}`], {
84
+ state.process = (0, child_process_1.spawn)(cloudflaredBin, ['tunnel', '--url', `http://localhost:${port}`], {
36
85
  stdio: ['ignore', 'pipe', 'pipe'],
37
86
  });
38
87
  }
39
88
  catch {
40
89
  state.status = 'error';
41
- state.error = 'cloudflared not installed';
42
- reject(new Error('cloudflared is not installed. Install: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/'));
90
+ state.error = 'cloudflared not found';
91
+ reject(new Error('cloudflared binary not found'));
43
92
  return;
44
93
  }
45
94
  let resolved = false;
@@ -81,20 +130,24 @@ function startCloudflare(port) {
81
130
  state.error = 'Tunnel setup timed out';
82
131
  reject(new Error('Tunnel setup timed out'));
83
132
  }
84
- }, 15000);
133
+ }, 30000);
85
134
  });
86
135
  }
87
- function startNgrok(port) {
136
+ function startNgrok(port, token) {
88
137
  return new Promise((resolve, reject) => {
138
+ const args = ['http', String(port), '--log=stdout'];
139
+ if (token) {
140
+ args.push(`--authtoken=${token}`);
141
+ }
89
142
  try {
90
- state.process = (0, child_process_1.spawn)('ngrok', ['http', String(port), '--log=stdout'], {
143
+ state.process = (0, child_process_1.spawn)(ngrokBin, args, {
91
144
  stdio: ['ignore', 'pipe', 'pipe'],
92
145
  });
93
146
  }
94
147
  catch {
95
148
  state.status = 'error';
96
- state.error = 'ngrok not installed';
97
- reject(new Error('ngrok is not installed. Install: https://ngrok.com/download'));
149
+ state.error = 'ngrok not found';
150
+ reject(new Error('ngrok binary not found'));
98
151
  return;
99
152
  }
100
153
  let resolved = false;
@@ -109,6 +162,15 @@ function startNgrok(port) {
109
162
  state.status = 'connected';
110
163
  resolve(match[0]);
111
164
  }
165
+ // Detect auth token error
166
+ if (text.includes('authentication failed') || text.includes('ERR_NGROK_108') || text.includes('invalid token')) {
167
+ if (!resolved) {
168
+ resolved = true;
169
+ state.status = 'error';
170
+ state.error = 'Invalid ngrok auth token';
171
+ reject(new Error('Invalid ngrok auth token'));
172
+ }
173
+ }
112
174
  }
113
175
  };
114
176
  state.process.stdout?.on('data', handleOutput);
@@ -136,7 +198,7 @@ function startNgrok(port) {
136
198
  state.error = 'Tunnel setup timed out';
137
199
  reject(new Error('Tunnel setup timed out'));
138
200
  }
139
- }, 15000);
201
+ }, 30000);
140
202
  });
141
203
  }
142
204
  function stopTunnel() {
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/services/tunnel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/services/tunnel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ycniuqton/devlens",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -29,12 +29,14 @@
29
29
  },
30
30
  "homepage": "https://github.com/ycniuqton/Devlens#readme",
31
31
  "dependencies": {
32
- "@ycniuqton/devlens": "^0.1.7",
32
+ "@ycniuqton/devlens": "^0.1.11",
33
33
  "better-sqlite3": "^12.8.0",
34
34
  "chokidar": "^3.6.0",
35
+ "cloudflared": "^0.7.1",
35
36
  "commander": "^12.0.0",
36
37
  "diff2html": "^3.4.47",
37
38
  "express": "^4.18.2",
39
+ "ngrok": "^4.3.3",
38
40
  "open": "^10.1.0",
39
41
  "simple-git": "~3.33.0",
40
42
  "ws": "^8.16.0"
@@ -1326,6 +1326,49 @@ body {
1326
1326
 
1327
1327
  .tunnel-buttons { display: flex; gap: var(--sp-3); }
1328
1328
 
1329
+ .ngrok-token-card {
1330
+ margin-top: var(--sp-3);
1331
+ padding: var(--sp-4);
1332
+ background: var(--color-surface-2);
1333
+ border: 1px solid var(--color-border);
1334
+ border-radius: var(--radius-md);
1335
+ }
1336
+
1337
+ .direct-ip-row {
1338
+ display: flex;
1339
+ align-items: center;
1340
+ justify-content: space-between;
1341
+ gap: var(--sp-4);
1342
+ margin-top: var(--sp-4);
1343
+ padding: var(--sp-3) var(--sp-4);
1344
+ background: var(--color-surface-2);
1345
+ border: 1px solid var(--color-border);
1346
+ border-radius: var(--radius-md);
1347
+ }
1348
+ .direct-ip-label { font-size: var(--text-sm); font-weight: 500; color: var(--color-text); display: block; }
1349
+ .direct-ip-desc { font-size: var(--text-xs); color: var(--color-text-muted); margin-top: 2px; display: block; }
1350
+
1351
+ .toggle-switch { position: relative; display: inline-block; width: 40px; height: 22px; flex-shrink: 0; }
1352
+ .toggle-switch input { opacity: 0; width: 0; height: 0; }
1353
+ .toggle-slider {
1354
+ position: absolute; inset: 0;
1355
+ background: var(--color-border);
1356
+ border-radius: 22px;
1357
+ cursor: pointer;
1358
+ transition: background 0.2s;
1359
+ }
1360
+ .toggle-slider:before {
1361
+ content: '';
1362
+ position: absolute;
1363
+ width: 16px; height: 16px;
1364
+ left: 3px; top: 3px;
1365
+ background: white;
1366
+ border-radius: 50%;
1367
+ transition: transform 0.2s;
1368
+ }
1369
+ .toggle-switch input:checked + .toggle-slider { background: var(--color-primary, #6366f1); }
1370
+ .toggle-switch input:checked + .toggle-slider:before { transform: translateX(18px); }
1371
+
1329
1372
  .tunnel-active-card {
1330
1373
  display: flex;
1331
1374
  align-items: center;
package/public/index.html CHANGED
@@ -368,7 +368,31 @@
368
368
  ngrok
369
369
  </button>
370
370
  </div>
371
- <p class="section-hint">Requires <code>cloudflared</code> or <code>ngrok</code> installed on your system.</p>
371
+ <p class="section-hint">Cloudflare Tunnel works out of the box. ngrok requires a free auth token.</p>
372
+ </div>
373
+
374
+ <!-- Direct IP access toggle -->
375
+ <div class="direct-ip-row">
376
+ <div>
377
+ <span class="direct-ip-label">Direct IP Access</span>
378
+ <span class="direct-ip-desc">Allow access via <code>http://IP:PORT</code>. Disable to restrict access to tunnel only.</span>
379
+ </div>
380
+ <label class="toggle-switch">
381
+ <input type="checkbox" id="direct-ip-toggle" onchange="setDirectIpAccess(this.checked)" checked>
382
+ <span class="toggle-slider"></span>
383
+ </label>
384
+ </div>
385
+
386
+ <!-- ngrok token setup (shown when token missing) -->
387
+ <div id="ngrok-token-setup" style="display:none" class="ngrok-token-card">
388
+ <p style="margin:0 0 var(--sp-3);color:var(--color-text-secondary);font-size:var(--text-sm)">
389
+ ngrok requires a free auth token. <a href="https://dashboard.ngrok.com/get-started/your-authtoken" target="_blank" style="color:var(--color-primary-hover)">Get yours here</a>.
390
+ </p>
391
+ <div style="display:flex;gap:var(--sp-2);align-items:center">
392
+ <input type="password" id="ngrok-token-input" placeholder="Paste your ngrok auth token" style="flex:1;padding:var(--sp-2) var(--sp-3);background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);font-size:var(--text-sm)">
393
+ <button class="btn btn-primary btn-sm" onclick="saveNgrokToken()">Save &amp; Connect</button>
394
+ <button class="btn btn-ghost btn-sm" onclick="hideNgrokTokenSetup()">Cancel</button>
395
+ </div>
372
396
  </div>
373
397
  </div>
374
398
 
package/public/js/app.js CHANGED
@@ -21,6 +21,7 @@ function switchTab(tab) {
21
21
  if (navItem) navItem.classList.add('active');
22
22
  const view = document.getElementById(tab + '-view');
23
23
  if (view) view.classList.add('active');
24
+ window.dispatchEvent(new CustomEvent('tab-activated', { detail: { tab } }));
24
25
  }
25
26
 
26
27
  navItems.forEach(item => {
@@ -154,8 +154,8 @@ document.getElementById('browser-refresh-btn')?.addEventListener('click', () =>
154
154
  });
155
155
 
156
156
  // Lazy load when tab opens
157
- document.querySelector('[data-tab="browser"]')?.addEventListener('click', () => {
158
- if (!Object.keys(explorerCache).length) renderTree();
157
+ window.addEventListener('tab-activated', (e) => {
158
+ if (e.detail.tab === 'browser' && !Object.keys(explorerCache).length) renderTree();
159
159
  });
160
160
 
161
161
  if (location.pathname === '/browser') {
@@ -280,8 +280,8 @@ document.getElementById('history-refresh-btn')?.addEventListener('click', () =>
280
280
  });
281
281
 
282
282
  // Lazy load when tab opens
283
- document.querySelector('[data-tab="history"]')?.addEventListener('click', () => {
284
- if (!historyLoaded) {
283
+ window.addEventListener('tab-activated', (e) => {
284
+ if (e.detail.tab === 'history' && !historyLoaded) {
285
285
  loadBranchInfo();
286
286
  loadCommits();
287
287
  }
@@ -42,11 +42,15 @@ async function startTunnelAction(provider) {
42
42
  });
43
43
  const data = await res.json();
44
44
  if (data.ok) {
45
+ hideNgrokTokenSetup();
45
46
  updateTunnelUI({ status: 'connected', url: data.url });
46
47
  showToast(`Tunnel connected: ${data.url}`, 'success');
48
+ } else if (data.error === 'ngrok_no_token') {
49
+ updateTunnelUI({ status: 'disconnected' });
50
+ showNgrokTokenSetup();
47
51
  } else {
48
52
  updateTunnelUI({ status: 'error' });
49
- showToast(data.error || 'Tunnel failed', 'error');
53
+ showToast(data.message || data.error || 'Tunnel failed', 'error');
50
54
  }
51
55
  } catch (err) {
52
56
  updateTunnelUI({ status: 'error' });
@@ -56,6 +60,18 @@ async function startTunnelAction(provider) {
56
60
 
57
61
  async function stopTunnelAction() {
58
62
  try {
63
+ // If currently accessing via tunnel URL, redirect to local URL first
64
+ const tunnelStatus = await fetch('/api/integrations/tunnel/status').then(r => r.json());
65
+ const onTunnel = tunnelStatus.url && window.location.href.startsWith(tunnelStatus.url);
66
+
67
+ if (onTunnel) {
68
+ const info = await fetch('/api/info').then(r => r.json());
69
+ const fallback = info.networkUrls?.[0] || info.localUrl || `http://localhost:${info.port}`;
70
+ await fetch('/api/integrations/tunnel/stop', { method: 'POST' });
71
+ window.location.href = fallback + '/integrations';
72
+ return;
73
+ }
74
+
59
75
  await fetch('/api/integrations/tunnel/stop', { method: 'POST' });
60
76
  updateTunnelUI({ status: 'disconnected' });
61
77
  showToast('Tunnel disconnected', 'info');
@@ -71,6 +87,32 @@ function copyTunnelUrl() {
71
87
  });
72
88
  }
73
89
 
90
+ function showNgrokTokenSetup() {
91
+ document.getElementById('ngrok-token-setup').style.display = '';
92
+ document.getElementById('ngrok-token-input').focus();
93
+ }
94
+
95
+ function hideNgrokTokenSetup() {
96
+ document.getElementById('ngrok-token-setup').style.display = 'none';
97
+ document.getElementById('ngrok-token-input').value = '';
98
+ }
99
+
100
+ async function saveNgrokToken() {
101
+ const token = document.getElementById('ngrok-token-input').value.trim();
102
+ if (!token) { showToast('Please enter your ngrok auth token', 'error'); return; }
103
+ try {
104
+ await fetch('/api/integrations/tunnel/ngrok-token', {
105
+ method: 'POST',
106
+ headers: { 'Content-Type': 'application/json' },
107
+ body: JSON.stringify({ token }),
108
+ });
109
+ showToast('Token saved, connecting...', 'info');
110
+ await startTunnelAction('ngrok');
111
+ } catch {
112
+ showToast('Failed to save token', 'error');
113
+ }
114
+ }
115
+
74
116
  // ---- Task Managers (Jira / Linear) ----
75
117
  async function loadIntegrations() {
76
118
  const container = document.getElementById('integrations-content');
@@ -187,8 +229,32 @@ function escapeHtml(str) {
187
229
  return div.innerHTML;
188
230
  }
189
231
 
190
- // Load on tab click
191
- document.querySelector('[data-tab="integrations"]')?.addEventListener('click', () => {
192
- loadTunnelStatus();
193
- loadIntegrations();
232
+ async function loadDirectIpStatus() {
233
+ try {
234
+ const res = await fetch('/api/integrations/direct-ip');
235
+ const data = await res.json();
236
+ const toggle = document.getElementById('direct-ip-toggle');
237
+ if (toggle) toggle.checked = data.enabled;
238
+ } catch {}
239
+ }
240
+
241
+ async function setDirectIpAccess(enabled) {
242
+ try {
243
+ await fetch('/api/integrations/direct-ip', {
244
+ method: 'POST',
245
+ headers: { 'Content-Type': 'application/json' },
246
+ body: JSON.stringify({ enabled }),
247
+ });
248
+ showToast(enabled ? 'Direct IP access enabled' : 'Direct IP access disabled', 'info');
249
+ } catch {
250
+ showToast('Failed to update direct IP setting', 'error');
251
+ }
252
+ }
253
+
254
+ window.addEventListener('tab-activated', (e) => {
255
+ if (e.detail.tab === 'integrations') {
256
+ loadTunnelStatus();
257
+ loadDirectIpStatus();
258
+ loadIntegrations();
259
+ }
194
260
  });
@@ -76,8 +76,8 @@ function escapeAttrSettings(str) {
76
76
 
77
77
  document.getElementById('save-settings-btn')?.addEventListener('click', saveSettings);
78
78
 
79
- document.querySelector('[data-tab="settings"]')?.addEventListener('click', () => {
80
- if (!settingsLoaded) loadSettings();
79
+ window.addEventListener('tab-activated', (e) => {
80
+ if (e.detail.tab === 'settings' && !settingsLoaded) loadSettings();
81
81
  });
82
82
 
83
83
  if (location.pathname === '/settings') {