dodo-mcp 1.0.1 → 1.0.3

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 (49) hide show
  1. package/README.md +49 -19
  2. package/dist/cli/main.js +108 -43
  3. package/dist/cli/main.js.map +1 -1
  4. package/dist/cli/menu.js +5 -6
  5. package/dist/cli/menu.js.map +1 -1
  6. package/dist/config/globalConfig.js +23 -1
  7. package/dist/config/globalConfig.js.map +1 -1
  8. package/dist/config/stateImport.js +2 -2
  9. package/dist/config/stateImport.js.map +1 -1
  10. package/dist/config/tunnelConfig.js +2 -3
  11. package/dist/config/tunnelConfig.js.map +1 -1
  12. package/dist/server/appServer.js +89 -9
  13. package/dist/server/appServer.js.map +1 -1
  14. package/dist/server/configUi/app.js +54 -65
  15. package/dist/server/configUi/index.html +21 -22
  16. package/dist/server/configUi/workbench.js +7 -4
  17. package/dist/server/ipcDispatch.js +25 -0
  18. package/dist/server/ipcDispatch.js.map +1 -1
  19. package/dist/server/localConfig.js +50 -63
  20. package/dist/server/localConfig.js.map +1 -1
  21. package/dist/server/remoteConfig.js +317 -0
  22. package/dist/server/remoteConfig.js.map +1 -0
  23. package/dist/tunnel/control.js +4 -6
  24. package/dist/tunnel/control.js.map +1 -1
  25. package/dist/tunnel/credentials.js +5 -19
  26. package/dist/tunnel/credentials.js.map +1 -1
  27. package/dist/tunnel/runtime.js +3 -4
  28. package/dist/tunnel/runtime.js.map +1 -1
  29. package/dist/tunnel/supervisor.js +8 -10
  30. package/dist/tunnel/supervisor.js.map +1 -1
  31. package/docs/AI_PROVIDERS.md +1 -1
  32. package/docs/ARCHITECTURE.md +29 -14
  33. package/docs/COMPATIBILITY.md +7 -3
  34. package/docs/MANUAL_ACCEPTANCE.md +39 -10
  35. package/docs/RELEASE_1.0.0.md +3 -0
  36. package/docs/RELEASE_1.0.2.md +46 -0
  37. package/docs/RELEASE_1.0.3.md +57 -0
  38. package/docs/RELEASE_NOTES.md +37 -0
  39. package/docs/SECURITY.md +39 -13
  40. package/docs/TEST_REPORT.md +61 -2
  41. package/docs/TUNNEL.md +114 -53
  42. package/docs/WINDOWS.md +1 -1
  43. package/docs/adr/031-owner-selected-tunnel-supervision.md +8 -2
  44. package/docs/adr/044-global-launcher-and-cli-menu.md +3 -3
  45. package/docs/adr/047-temporary-remote-config.md +47 -0
  46. package/docs/adr/048-persistent-connection-mode.md +58 -0
  47. package/docs/adr/README.md +2 -0
  48. package/package.json +3 -1
  49. package/schemas/global-config.schema.json +6 -12
@@ -25,6 +25,8 @@ import { attachOptionalServices } from './optionalServices.js';
25
25
  import { createWorkspaceHost } from './workspaceHost.js';
26
26
  import { startLocalConfig } from './localConfig.js';
27
27
  import { DODO_VERSION } from './version.js';
28
+ import { osCredentialAvailability, osTunnelCredentialRef, storeOsTunnelCredentialValue } from '../tunnel/credentials.js';
29
+ import { RemoteConfigGateway } from './remoteConfig.js';
28
30
  export { DODO_VERSION };
29
31
  /**
30
32
  * The HTTP entry (`dodo start`): OAuth AS + MCP resource server on
@@ -94,17 +96,38 @@ export async function startServer(opts) {
94
96
  // Assigned once the IPC resources exist; closures below read it per request.
95
97
  const hostRef = { host: undefined };
96
98
  const active = () => (hostRef.host ? hostRef.host.current() : ws0);
97
- // ---- public URL / auth mode -------------------------------------------
98
- const publicUrlRaw = opts.publicUrlOverride ?? config.publicUrl;
99
+ // ---- selected endpoint / auth mode ------------------------------------
100
+ const port = opts.portOverride ?? config.port;
101
+ const connectionMode = opts.connectionMode ?? config.tunnel.connectionMode;
102
+ const publicUrlRaw = connectionMode === 'local'
103
+ // A dynamic port is useful for internal fixtures but cannot be a stable
104
+ // OAuth issuer before listen completes, so that low-level mode stays locked.
105
+ // The product CLI rejects port 0 for Local mode before reaching this layer.
106
+ ? port === 0 ? undefined : `http://127.0.0.1:${port}`
107
+ : opts.publicUrlOverride ?? config.publicUrl;
99
108
  let locked = true;
100
109
  let issuer = null;
101
110
  let resourceUrl = null;
102
111
  if (publicUrlRaw !== undefined) {
103
- const url = validatePublicUrl(publicUrlRaw, config.dangerouslyAllowInsecurePublicUrl);
112
+ const url = validatePublicUrl(publicUrlRaw, config.dangerouslyAllowInsecurePublicUrl || connectionMode === 'local');
104
113
  issuer = url.origin;
105
114
  resourceUrl = `${issuer}/mcp`;
106
115
  locked = false;
107
116
  }
117
+ if (opts.remoteConfig && connectionMode !== 'tunnel') {
118
+ await ws0.shutdownServices();
119
+ installDb.close();
120
+ throw new DodoError('CONFLICT', 'Remote Config is available only while DODO connection mode is tunnel', {
121
+ recovery: 'run dodo tunnel configure --tunnel --os-credential --public-url https://your-host, restart DODO, then run dodo --web',
122
+ });
123
+ }
124
+ if (opts.remoteConfig && !issuer) {
125
+ await ws0.shutdownServices();
126
+ installDb.close();
127
+ throw new DodoError('CONFLICT', 'dodo --web requires a configured public HTTPS origin', {
128
+ recovery: 'run dodo init --public-url https://your-host, then run dodo --web again',
129
+ });
130
+ }
108
131
  // ---- express app -------------------------------------------------------
109
132
  const app = express();
110
133
  app.disable('x-powered-by');
@@ -119,6 +142,13 @@ export async function startServer(opts) {
119
142
  if (issuer)
120
143
  originAllowlist.push(new URL(issuer).hostname);
121
144
  app.use(originValidation(originAllowlist));
145
+ // This router is inert (404) until the local owner explicitly opens a
146
+ // bounded lease. It is mounted before OAuth's provider callback so the
147
+ // temporary /config namespace can be reached through the same tunnel.
148
+ const remoteConfigGateway = issuer && connectionMode === 'tunnel'
149
+ ? new RemoteConfigGateway(issuer, opts.remoteConfigLeaseMs)
150
+ : undefined;
151
+ remoteConfigGateway?.mount(app);
122
152
  app.get('/healthz', (_req, res) => {
123
153
  res.setHeader('Cache-Control', 'no-store').json({ status: 'ok', name: 'dodo', version: DODO_VERSION, authConfigured: !locked, workspaceSelected });
124
154
  });
@@ -253,7 +283,6 @@ export async function startServer(opts) {
253
283
  res.status(404).setHeader('Cache-Control', 'no-store').json({ error: 'not_found' });
254
284
  });
255
285
  // ---- listen ------------------------------------------------------------
256
- const port = opts.portOverride ?? config.port;
257
286
  const httpServer = http.createServer(app);
258
287
  httpServer.requestTimeout = 120_000;
259
288
  httpServer.headersTimeout = 30_000;
@@ -282,9 +311,36 @@ export async function startServer(opts) {
282
311
  });
283
312
  }
284
313
  // ---- private IPC (per workspace) ---------------------------------------
285
- const transportInfo = () => ({ kind: 'http', port: actualPort, locked, publicUrl: issuer });
314
+ const transportInfo = () => ({ kind: 'http', port: actualPort, locked, publicUrl: issuer, connectionMode });
315
+ let remoteConfigReady = false;
316
+ const remoteConfigControl = remoteConfigGateway ? {
317
+ open: async (args) => {
318
+ if (!remoteConfigReady)
319
+ throw new DodoError('NOT_SUPPORTED', 'Remote Config requires the loopback Local Config server');
320
+ const keys = Object.keys(args);
321
+ if (keys.length > 0) {
322
+ throw new DodoError('INVALID_INPUT', 'Remote Config open request contains an unsupported field');
323
+ }
324
+ if (!opts.tunnelRuntime?.status().running) {
325
+ throw new DodoError('CONFLICT', 'the configured DODO Tunnel is not running', {
326
+ recovery: 'restart DODO in tunnel mode and inspect dodo tunnel doctor if startup fails',
327
+ });
328
+ }
329
+ return remoteConfigGateway.open();
330
+ },
331
+ close: () => remoteConfigGateway.close(),
332
+ status: () => ({
333
+ ...remoteConfigGateway.status(),
334
+ tunnel: opts.tunnelRuntime?.status() ?? { available: false, running: false, current: null, lastKnown: null },
335
+ }),
336
+ } : undefined;
286
337
  const resourcesFor = async (ws) => {
287
- return startOwnerControl(ws, createIpcDispatcher({ ws, transport: transportInfo(), requestStop: () => void shutdown() }));
338
+ return startOwnerControl(ws, createIpcDispatcher({
339
+ ws,
340
+ transport: transportInfo(),
341
+ requestStop: () => void shutdown(),
342
+ ...(remoteConfigControl ? { remoteConfig: remoteConfigControl } : {}),
343
+ }));
288
344
  };
289
345
  // A live process for the target root would be clobbered by our IPC bind
290
346
  // (startIpcServer removes an existing socket file): probe it first.
@@ -340,6 +396,7 @@ export async function startServer(opts) {
340
396
  installation.defaultReady = () => theHost.state() === 'ready';
341
397
  // ---- owner-only Local Config plane ------------------------------------
342
398
  let localConfig;
399
+ let initialRemoteConfig = null;
343
400
  try {
344
401
  if (opts.configPort !== undefined) {
345
402
  localConfig = await startLocalConfig(theHost, opts.configPort, {
@@ -348,9 +405,24 @@ export async function startServer(opts) {
348
405
  runMode: runMode ?? null,
349
406
  workspaceSelected: () => workspaceSelected,
350
407
  ...(opts.tunnelRuntime ? { tunnelRuntime: opts.tunnelRuntime } : {}),
408
+ tunnelCredentialStore: {
409
+ ...osCredentialAvailability(),
410
+ store: async (token) => {
411
+ const ref = osTunnelCredentialRef(configDir);
412
+ await storeOsTunnelCredentialValue(ref, token);
413
+ return ref;
414
+ },
415
+ },
351
416
  log,
352
417
  });
353
418
  installation.ai.settings.ports.push(Number(new URL(localConfig.url).port));
419
+ remoteConfigGateway?.attachLocal(localConfig.url);
420
+ remoteConfigReady = Boolean(remoteConfigGateway);
421
+ if (opts.remoteConfig)
422
+ initialRemoteConfig = remoteConfigGateway?.open(opts.remoteConfigLeaseMs) ?? null;
423
+ }
424
+ if (opts.remoteConfig && !initialRemoteConfig) {
425
+ throw new DodoError('NOT_SUPPORTED', 'Remote Config requires the loopback Local Config server');
354
426
  }
355
427
  }
356
428
  catch (err) {
@@ -375,6 +447,7 @@ export async function startServer(opts) {
375
447
  shutdownPromise = (async () => {
376
448
  try {
377
449
  await localConfig?.close();
450
+ remoteConfigGateway?.close();
378
451
  await closeHttp();
379
452
  await jobsClosed;
380
453
  await mcpHandlerClose?.();
@@ -396,15 +469,19 @@ export async function startServer(opts) {
396
469
  `DODO ${DODO_VERSION} | foreground`,
397
470
  workspaceSelected ? `Workspace: ${rootInfo.root}` : 'Workspace: (ยังไม่ได้เลือก — เพิ่มหรือเลือกใน Local Config / dodo --cli)',
398
471
  workspaceSelected ? `Workspace ID: ${workspaceId} | epoch: ${epoch}` : 'Workspace ID: (ยังไม่สร้าง context สำหรับ AI)',
399
- `MCP: http://127.0.0.1:${actualPort}/mcp`,
400
- locked ? `Public: (not configured — server is LOCKED; run: dodo init --public-url https://your-host)` : `Public: ${issuer}/mcp`,
472
+ `MCP: ${issuer}/mcp (${connectionMode})`,
473
+ connectionMode === 'tunnel' ? `Local upstream: http://127.0.0.1:${actualPort}/mcp` : 'Tunnel: disabled by owner selection',
401
474
  !workspaceSelected ? 'Auth: OAuth installation login available; project access remains denied until owner ACL assignment' : locked ? 'Auth: LOCKED / setup required — all tool access refused' : `Auth: OAuth enabled | Policy: ${services.trustMode()}`,
402
475
  workspaceSelected ? `Exec: ${services.trustMode() === 'trusted' ? 'allowed by trusted mode (OS-user privileges!)' : 'local approval required'} | OS sandbox: ${config.commandSandbox === 'off' ? 'NOT enabled' : `${config.commandSandbox} (adapter: ${services.jobs ? 'configured' : 'n/a'})`}` : 'Exec: disabled until a workspace is selected',
403
- 'Tunnel: external / managed by you',
476
+ connectionMode === 'tunnel' ? 'Tunnel: DODO-owned; starts and stops with this process' : 'Connection: local only',
404
477
  `State: ${configDir}${configDirEnvVar ? ` (from ${configDirEnvVar})` : configDirSource === 'env' ? ' (from explicit environment override)' : ''}`,
405
478
  ];
406
479
  if (localConfig)
407
480
  log(`[dodo] Private config (expires in 8h): ${localConfig.url}`);
481
+ if (initialRemoteConfig) {
482
+ log(`[dodo] Remote Config (expires in 1h): ${initialRemoteConfig.url}`);
483
+ log(`[dodo] Remote Config pairing code (shown once): ${initialRemoteConfig.pairingCode}`);
484
+ }
408
485
  if (runMode)
409
486
  log(`[dodo] ${runMode}: trusted OS-user execution for this run; OAuth, client/path access and file guards remain required.`);
410
487
  if (!opts.quiet)
@@ -423,6 +500,7 @@ export async function startServer(opts) {
423
500
  port: actualPort,
424
501
  locked,
425
502
  publicUrl: issuer,
503
+ connectionMode,
426
504
  get ipcPath() {
427
505
  return ipcSocketPath(configDir, theHost.current().workspaceId);
428
506
  },
@@ -431,6 +509,8 @@ export async function startServer(opts) {
431
509
  return theHost.current().services;
432
510
  },
433
511
  configUrl: localConfig?.url ?? null,
512
+ remoteConfig: initialRemoteConfig,
513
+ remoteConfigStatus: () => remoteConfigGateway?.status() ?? null,
434
514
  host: theHost,
435
515
  get workspaceSelected() {
436
516
  return workspaceSelected;
@@ -1 +1 @@
1
- {"version":3,"file":"appServer.js","sourceRoot":"","sources":["../../src/server/appServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"appServer.js","sourceRoot":"","sources":["../../src/server/appServer.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  (() => {
7
7
  const $ = (id) => document.getElementById(id);
8
8
  const TOKEN_KEY = 'dodo-config-token';
9
+ const REMOTE_CONFIG = location.pathname === '/config' || location.pathname.startsWith('/config/');
10
+ const API_PREFIX = REMOTE_CONFIG ? '/config' : '';
9
11
  const THEME_KEY = 'dodo-theme';
10
12
  const MODE_LABEL = { inspect: 'inspect', edit: 'edit', trusted: 'trusted' };
11
13
  const MODE_TEXT = {
@@ -16,12 +18,22 @@
16
18
 
17
19
  // ---- token (fragment → sessionStorage, fragment stripped from the URL) ----
18
20
  let token = '';
19
- if (location.hash.length > 1) {
21
+ if (!REMOTE_CONFIG && location.hash.length > 1) {
20
22
  token = location.hash.slice(1);
21
23
  try { sessionStorage.setItem(TOKEN_KEY, token); } catch (_e) { /* private mode */ }
22
24
  history.replaceState(null, '', location.pathname);
23
25
  } else {
24
- try { token = sessionStorage.getItem(TOKEN_KEY) || ''; } catch (_e) { token = ''; }
26
+ try { token = REMOTE_CONFIG ? '' : (sessionStorage.getItem(TOKEN_KEY) || ''); } catch (_e) { token = ''; }
27
+ if (REMOTE_CONFIG && location.hash) history.replaceState(null, '', location.pathname);
28
+ }
29
+ if (REMOTE_CONFIG) {
30
+ document.title = 'DODO Remote Config';
31
+ const subtitle = document.querySelector('.brand .sub');
32
+ if (subtitle) subtitle.textContent = 'Remote Config · เปิดชั่วคราวไม่เกิน 1 ชั่วโมง';
33
+ const configLabel = document.querySelector('#chip-config b');
34
+ if (configLabel) configLabel.textContent = 'Remote Config';
35
+ const footerLead = document.querySelector('.foot > span')?.firstChild;
36
+ if (footerLead) footerLead.nodeValue = 'DODO Remote Config · ผ่าน HTTPS tunnel · หมดอายุใน ';
25
37
  }
26
38
 
27
39
  // ---- theme: dark default, light, system; remembered per browser ----
@@ -99,11 +111,11 @@
99
111
  return context ? { 'x-dodo-workspace': context.workspaceId, 'x-dodo-epoch': context.epoch } : {};
100
112
  }
101
113
  async function api(path, body, context = workspaceContext()) {
102
- const headers = { Authorization: `Bearer ${token}`, ...context };
114
+ const headers = { ...(token ? { Authorization: `Bearer ${token}` } : {}), ...context };
103
115
  if (body !== undefined) Object.assign(headers, context, { 'Content-Type': 'application/json' });
104
116
  let res;
105
117
  try {
106
- res = await fetch(`/api/${path}`, { method: body !== undefined ? 'POST' : 'GET', headers, body: body !== undefined ? JSON.stringify(body) : undefined, credentials: 'omit', cache: 'no-store' });
118
+ res = await fetch(`${API_PREFIX}/api/${path}`, { method: body !== undefined ? 'POST' : 'GET', headers, body: body !== undefined ? JSON.stringify(body) : undefined, credentials: REMOTE_CONFIG ? 'same-origin' : 'omit', cache: 'no-store' });
107
119
  } catch (_e) {
108
120
  const err = new Error('ติดต่อ DODO ไม่ได้ — server อาจปิดอยู่ หรือกำลัง restart');
109
121
  err.status = 0;
@@ -112,7 +124,7 @@
112
124
  let data = null;
113
125
  try { data = await res.json(); } catch (_e) { data = null; }
114
126
  if (!res.ok) {
115
- const err = new Error((data && data.error) || `HTTP ${res.status}`);
127
+ const err = new Error((data && data.error) || (REMOTE_CONFIG && res.status === 404 ? 'Remote Config หมดอายุแล้ว — รัน dodo --web เพื่อเปิดใหม่' : `HTTP ${res.status}`));
116
128
  err.status = res.status;
117
129
  err.code = data && data.code;
118
130
  err.data = data;
@@ -172,7 +184,7 @@
172
184
  }
173
185
  function fmtRemaining(ms) {
174
186
  if (!Number.isFinite(ms) || ms <= 0) return 'หมดอายุแล้ว';
175
- const m = Math.floor(ms / 60000);
187
+ const m = Math.ceil(ms / 60000);
176
188
  const h = Math.floor(m / 60);
177
189
  return h > 0 ? `${h} ชม. ${m % 60} นาที` : `${m} นาที`;
178
190
  }
@@ -205,9 +217,9 @@
205
217
  // chips
206
218
  const c = s.connection || {};
207
219
  if (c.workspaceSelected === false) setChip('chip-mcp', 'warn', '⚠', 'เปิดอยู่ แต่รอเจ้าของเลือก workspace');
208
- else if (c.mcpLocalUrl) setChip('chip-mcp', s.state === 'switching' ? 'busy' : 'ok', s.state === 'switching' ? '⟳' : '●', s.state === 'switching' ? 'กำลังสลับ workspace' : `เปิดที่ ${c.mcpLocalUrl.replace(/^http:\/\//, '')}`);
220
+ else if (c.activeMcpUrl) setChip('chip-mcp', s.state === 'switching' ? 'busy' : 'ok', s.state === 'switching' ? '⟳' : '●', s.state === 'switching' ? 'กำลังสลับ workspace' : `${c.connectionMode === 'tunnel' ? 'Tunnel' : 'Local'} · ${c.activeMcpUrl.replace(/^https?:\/\//, '')}`);
209
221
  else setChip('chip-mcp', 'warn', '○', 'ไม่มี HTTP listener ใน entry นี้');
210
- if (c.oauthConfigured === true) setChip('chip-oauth', 'ok', '●', `เปิดใช้ · ${c.activePublicUrl}`);
222
+ if (c.oauthConfigured === true) setChip('chip-oauth', 'ok', '●', `เปิดใช้ · ${c.activePublicUrl || c.activeMcpUrl}`);
211
223
  else if (c.oauthConfigured === false) setChip('chip-oauth', 'warn', '⚠', 'LOCKED — ยังไม่ตั้ง public URL');
212
224
  else setChip('chip-oauth', 'idle', '○', 'ไม่เกี่ยวกับ entry นี้');
213
225
  const remaining = (c.expiresAt || 0) - Date.now();
@@ -310,6 +322,8 @@
310
322
  }
311
323
 
312
324
  // connection
325
+ $('conn-active').textContent = c.activeMcpUrl || 'ไม่มีใน entry นี้';
326
+ $('conn-active-copy').disabled = !c.activeMcpUrl;
313
327
  $('conn-local').textContent = c.mcpLocalUrl || 'ไม่มีใน entry นี้';
314
328
  $('conn-local-copy').disabled = !c.mcpLocalUrl;
315
329
  $('conn-public').textContent = c.mcpPublicUrl || (c.publicUrl ? `${c.publicUrl}/mcp (หลัง restart)` : 'ยังไม่ตั้งค่า');
@@ -318,7 +332,7 @@
318
332
  const oauth = $('conn-oauth');
319
333
  oauth.replaceChildren();
320
334
  const ob = document.createElement('span');
321
- if (c.oauthConfigured === true) { ob.className = 'badge ok'; ob.textContent = '● เปิดใช้'; oauth.append(ob, document.createTextNode(` issuer ${c.activePublicUrl}`)); }
335
+ if (c.oauthConfigured === true) { ob.className = 'badge ok'; ob.textContent = '● เปิดใช้'; oauth.append(ob, document.createTextNode(` issuer ${(c.activeMcpUrl || '').replace(/\/mcp$/, '')}`)); }
322
336
  else if (c.oauthConfigured === false) { ob.className = 'badge warn'; ob.textContent = '⚠ LOCKED'; oauth.append(ob, document.createTextNode(' ยังไม่มี public URL — MCP ปฏิเสธทุก tool call จนกว่าจะตั้งค่าและ restart')); }
323
337
  else { ob.className = 'badge'; ob.textContent = '○ ไม่เกี่ยวกับ entry นี้'; oauth.append(ob); }
324
338
  const originInput = $('conn-origin');
@@ -328,17 +342,24 @@
328
342
  $('conn-restart').hidden = !c.restartRequired;
329
343
  cardState('conn', 'ready');
330
344
 
331
- // Tunnel state contains no credential. The password input is submitted
332
- // only to the run-scoped start endpoint and is cleared after the request.
345
+ // Tunnel state contains only a credential-presence flag. The password
346
+ // input is write-only and cleared after every save attempt.
333
347
  const tunnel = s.tunnel || {};
334
- const serverFormSig = JSON.stringify([Boolean(tunnel.startWithDodo), Number(tunnel.metricsPort || 21732), Number(tunnel.maxRestarts ?? 2)]);
335
- const browserFormSig = JSON.stringify([$('tunnel-auto').checked, Number($('tunnel-metrics').value), Number($('tunnel-restarts').value)]);
348
+ const serverFormSig = JSON.stringify([tunnel.connectionMode || 'local', Number(tunnel.metricsPort || 21732), Number(tunnel.maxRestarts ?? 2)]);
349
+ const browserMode = document.querySelector('input[name="connectionMode"]:checked');
350
+ const browserFormSig = JSON.stringify([browserMode ? browserMode.value : 'local', Number($('tunnel-metrics').value), Number($('tunnel-restarts').value)]);
336
351
  const tunnelDirty = !force && lastTunnelFormSig !== null && browserFormSig !== lastTunnelFormSig;
337
352
  if (!tunnelDirty) {
338
- $('tunnel-auto').checked = Boolean(tunnel.startWithDodo);
353
+ $('tunnel-mode-local').checked = tunnel.connectionMode !== 'tunnel';
354
+ $('tunnel-mode-tunnel').checked = tunnel.connectionMode === 'tunnel';
339
355
  $('tunnel-metrics').value = String(tunnel.metricsPort || 21732);
340
356
  $('tunnel-restarts').value = String(tunnel.maxRestarts ?? 2);
341
357
  }
358
+ $('tunnel-credential').textContent = tunnel.credentialConfigured
359
+ ? `● มี credential แล้ว (${tunnel.credentialStorage}; ไม่แสดงค่า)`
360
+ : tunnel.credentialStore && tunnel.credentialStore.available
361
+ ? `○ ยังไม่มี credential · พร้อมบันทึกใน ${tunnel.credentialStore.provider}`
362
+ : `✕ credential store ใช้ไม่ได้${tunnel.credentialStore && tunnel.credentialStore.provider ? ` (${tunnel.credentialStore.provider})` : ''}`;
342
363
  lastTunnelFormSig = serverFormSig;
343
364
  const tunnelRuntime = tunnel.runtime || {};
344
365
  const currentTunnel = tunnelRuntime.current;
@@ -349,11 +370,9 @@
349
370
  $('tunnel-badge').className = 'badge warn';
350
371
  $('tunnel-badge').textContent = `◌ Tunnel ${currentTunnel.phase || 'กำลังเริ่ม'}`;
351
372
  } else {
352
- $('tunnel-badge').className = tunnel.startWithDodo ? 'badge' : 'badge';
353
- $('tunnel-badge').textContent = tunnel.startWithDodo ? '○ ยังไม่รัน · จะถาม token ตอนเริ่ม' : '○ Tunnel ไม่ได้รัน';
373
+ $('tunnel-badge').className = tunnel.connectionMode === 'tunnel' ? 'badge warn' : 'badge';
374
+ $('tunnel-badge').textContent = tunnel.connectionMode === 'tunnel' ? '◌ เลือก Tunnel · ต้อง restart' : '● ใช้ Local';
354
375
  }
355
- $('tunnel-session-start').disabled = tunnelRuntime.available !== true || Boolean(currentTunnel && currentTunnel.running);
356
- $('tunnel-session-stop').disabled = tunnelRuntime.available !== true || !Boolean(currentTunnel && currentTunnel.running);
357
376
 
358
377
  // clients
359
378
  $('clients-root').textContent = w ? w.root : 'ยังไม่ได้เลือกโปรเจกต์';
@@ -865,74 +884,44 @@
865
884
  });
866
885
  });
867
886
  $('conn-local-copy').addEventListener('click', (ev) => copyText(state && state.connection ? state.connection.mcpLocalUrl : '', ev.currentTarget));
887
+ $('conn-active-copy').addEventListener('click', (ev) => copyText(state && state.connection ? state.connection.activeMcpUrl : '', ev.currentTarget));
868
888
  $('conn-public-copy').addEventListener('click', (ev) => {
869
889
  const c = state && state.connection;
870
890
  copyText(c ? (c.mcpPublicUrl || (c.publicUrl ? `${c.publicUrl}/mcp` : '')) : '', ev.currentTarget);
871
891
  });
872
892
 
873
893
  // ---- Cloudflare Tunnel ----
874
- $('tunnel-session-form').addEventListener('submit', (ev) => {
875
- ev.preventDefault();
876
- const tokenInput = $('tunnel-session-token');
877
- const errorElement = $('tunnel-session-error');
878
- const tokenValue = tokenInput.value.trim();
879
- errorElement.hidden = true;
880
- tokenInput.removeAttribute('aria-invalid');
881
- if (tokenValue.length < 20) {
882
- errorElement.textContent = '✕ กรอก Cloudflare Tunnel token ที่ถูกต้อง';
883
- errorElement.hidden = false;
884
- tokenInput.setAttribute('aria-invalid', 'true');
885
- tokenInput.focus();
886
- return;
887
- }
888
- withBusy($('tunnel-session-start'), 'กำลังเปิด…', async () => {
889
- try {
890
- const result = await api('tunnel/session/start', { token: tokenValue });
891
- tokenInput.value = '';
892
- notify('success', result.status && result.status.connected
893
- ? 'Tunnel เชื่อมต่อแล้วสำหรับ DODO process นี้'
894
- : 'เริ่ม Tunnel แล้ว กำลังตรวจ readiness');
895
- await refresh(true);
896
- } catch (error) {
897
- tokenInput.value = '';
898
- errorElement.textContent = `✕ ${error.message}`;
899
- errorElement.hidden = false;
900
- notify('error', 'เปิด Tunnel ไม่สำเร็จ');
901
- }
902
- });
903
- });
904
-
905
- $('tunnel-session-stop').addEventListener('click', () => withBusy($('tunnel-session-stop'), 'กำลังหยุด…', async () => {
906
- try {
907
- await api('tunnel/session/stop', {});
908
- $('tunnel-session-token').value = '';
909
- notify('success', 'หยุด Tunnel ที่ DODO process นี้เป็นเจ้าของแล้ว');
910
- await refresh(true);
911
- } catch (error) {
912
- notify('error', `หยุด Tunnel ไม่สำเร็จ: ${error.message}`);
913
- }
914
- }));
915
-
916
894
  $('tunnel-form').addEventListener('submit', (ev) => {
917
895
  ev.preventDefault();
918
896
  const errorElement = $('tunnel-error');
919
897
  errorElement.hidden = true;
920
898
  const metricsPort = Number($('tunnel-metrics').value);
921
899
  const maxRestarts = Number($('tunnel-restarts').value);
900
+ const connectionMode = document.querySelector('input[name="connectionMode"]:checked')?.value || 'local';
901
+ const tokenInput = $('tunnel-token');
902
+ const token = tokenInput.value.trim();
922
903
  if (!Number.isSafeInteger(metricsPort) || metricsPort < 1024 || metricsPort > 65535 || !Number.isSafeInteger(maxRestarts) || maxRestarts < 0 || maxRestarts > 5) {
923
904
  errorElement.textContent = '✕ Metrics port ต้องอยู่ระหว่าง 1024–65535 และ restart ต้องอยู่ระหว่าง 0–5';
924
905
  errorElement.hidden = false;
925
906
  return;
926
907
  }
908
+ if (token && token.length < 20) {
909
+ errorElement.textContent = '✕ Tunnel token สั้นเกินไป';
910
+ errorElement.hidden = false;
911
+ tokenInput.focus();
912
+ return;
913
+ }
927
914
  withBusy($('tunnel-save'), 'กำลังบันทึก…', async () => {
928
915
  try {
929
- const body = { startWithDodo: $('tunnel-auto').checked, metricsPort, maxRestarts };
916
+ const body = { connectionMode, metricsPort, maxRestarts, ...(token ? { token } : {}) };
930
917
  const result = await api('tunnel/config', body);
931
- notify('info', result.startWithDodo
932
- ? 'บันทึกแล้ว — DODO จะถาม token ชั่วคราวใน terminal เมื่อเริ่มรอบถัดไป'
933
- : 'บันทึกแล้ว — รอบถัดไปจะเปิด local MCP โดยไม่ถาม Tunnel token');
918
+ tokenInput.value = '';
919
+ notify('info', result.connectionMode === 'tunnel'
920
+ ? 'บันทึกแล้ว — restart DODO เพื่อใช้ Tunnel เป็น MCP endpoint หลัก'
921
+ : 'บันทึกแล้ว — restart DODO เพื่อใช้ Local MCP เท่านั้น');
934
922
  await refresh(true);
935
923
  } catch (error) {
924
+ tokenInput.value = '';
936
925
  errorElement.textContent = `✕ ${error.message}`;
937
926
  errorElement.hidden = false;
938
927
  notify('error', 'บันทึก Tunnel ไม่สำเร็จ');
@@ -947,7 +936,7 @@
947
936
  });
948
937
  setInterval(() => { if (!document.hidden && !document.querySelector('.btn[aria-busy="true"]')) refresh(false); }, 30000);
949
938
 
950
- if (!token) {
939
+ if (!token && !REMOTE_CONFIG) {
951
940
  $('card-auth').hidden = false;
952
941
  for (const p of ['ws', 'projects', 'perm', 'conn', 'clients']) cardState(p, 'error', 'ต้องเปิดจากลิงก์ส่วนตัวใน terminal');
953
942
  setChip('chip-config', 'error', '✕', 'ไม่มี token');
@@ -249,7 +249,9 @@
249
249
  <div class="card-state" id="conn-loading">กำลังโหลด…</div>
250
250
  <div class="card-body" id="conn-body" hidden>
251
251
  <div class="kv">
252
- <div class="k">Local MCP URL</div>
252
+ <div class="k">Active MCP URL</div>
253
+ <div class="v path-row"><code id="conn-active" class="path">…</code><button type="button" class="btn small" id="conn-active-copy" aria-label="คัดลอก Active MCP URL">คัดลอก</button></div>
254
+ <div class="k">Local upstream</div>
253
255
  <div class="v path-row"><code id="conn-local" class="path">…</code><button type="button" class="btn small" id="conn-local-copy" aria-label="คัดลอก Local MCP URL">คัดลอก</button></div>
254
256
  <div class="k">Public MCP URL <button type="button" class="help-tip" data-tip="URL ที่ AI ฝั่งเว็บใช้เชื่อมต่อผ่าน tunnel ของคุณ ต้องเป็น HTTPS origin ที่ชี้มาที่พอร์ต MCP เท่านั้น ห้ามชี้มาที่หน้า Local Config" aria-label="คำอธิบาย: public URL">?</button></div>
255
257
  <div class="v path-row"><code id="conn-public" class="path">…</code><button type="button" class="btn small" id="conn-public-copy" aria-label="คัดลอก Public MCP URL">คัดลอก</button></div>
@@ -277,32 +279,29 @@
277
279
  </section>
278
280
 
279
281
  <section class="card" id="card-tunnel" aria-labelledby="h-tunnel">
280
- <div class="card-head"><h2 id="h-tunnel">Cloudflare Tunnel <button type="button" class="help-tip" data-tip="สถานะนี้มาจาก process ของ DODO เอง token ใช้เฉพาะรอบที่เปิดและไม่ถูกบันทึกลงเครื่อง ช่องกรอกจะถูกล้างหลังส่งเสมอ" aria-label="คำอธิบาย: tunnel status และ token">?</button></h2><span class="badge" id="tunnel-badge">กำลังตรวจ…</span></div>
281
- <form id="tunnel-session-form" class="form" novalidate>
282
- <label for="tunnel-session-token">Temporary Tunnel token</label>
283
- <input id="tunnel-session-token" name="token" type="password" autocomplete="off" spellcheck="false" maxlength="8192" placeholder="ใช้กับ DODO process นี้เท่านั้น" aria-describedby="tunnel-session-help tunnel-session-error">
284
- <p class="help" id="tunnel-session-help">เริ่มทันที ไม่บันทึกลงเครื่อง และ tunnel หยุดพร้อม DODO</p>
285
- <p class="error" id="tunnel-session-error" role="alert" hidden></p>
286
- <div class="actions">
287
- <button type="submit" class="btn primary" id="tunnel-session-start">เปิด Tunnel รอบนี้</button>
288
- <button type="button" class="btn danger-outline" id="tunnel-session-stop">หยุด Tunnel รอบนี้</button>
289
- </div>
290
- </form>
291
- <details class="details">
292
- <summary>การเริ่มอัตโนมัติและค่าขั้นสูง</summary>
282
+ <div class="card-head"><h2 id="h-tunnel">การเชื่อมต่อ MCP <button type="button" class="help-tip" data-tip="เลือกได้หนึ่งโหมดต่อ DODO installation: Local หรือ DODO Tunnel เมื่อเลือก Tunnel ระบบจะเริ่มและหยุด cloudflared พร้อม DODO ทุกครั้ง" aria-label="คำอธิบาย: connection mode">?</button></h2><span class="badge" id="tunnel-badge">กำลังตรวจ…</span></div>
293
283
  <form id="tunnel-form" class="form" novalidate>
294
- <label class="check"><input id="tunnel-auto" name="startWithDodo" type="checkbox"><span><b>ถาม token และเปิด Tunnel พร้อม DODO</b><small>มีผลเมื่อเริ่มรอบถัดไป กด Enter โดยไม่กรอก token เพื่อเปิดเฉพาะ local MCP ได้</small></span></label>
295
- <p class="help" id="tunnel-help">สำหรับรอบที่ไม่ต้องการ Tunnel ใช้ <code>dodo start --no-tunnel</code> Token ไม่ถูกส่งมาหรือแสดงบนหน้าเว็บนี้</p>
296
- <div class="two-col">
297
- <label>Metrics port<input id="tunnel-metrics" type="number" min="1024" max="65535" inputmode="numeric"></label>
298
- <label>จำนวน restart สูงสุด<input id="tunnel-restarts" type="number" min="0" max="5" inputmode="numeric"></label>
299
- </div>
284
+ <fieldset>
285
+ <legend>โหมดที่ใช้เมื่อเปิด DODO</legend>
286
+ <label class="check"><input id="tunnel-mode-local" name="connectionMode" type="radio" value="local"><span><b>Local</b><small>AI ในเครื่องใช้ <code>127.0.0.1:21730/mcp</code> และ DODO ไม่เปิด Tunnel</small></span></label>
287
+ <label class="check"><input id="tunnel-mode-tunnel" name="connectionMode" type="radio" value="tunnel"><span><b>DODO Tunnel</b><small>ใช้ public origin เป็น MCP URL หลัก และเริ่ม cloudflared พร้อม DODO ทุกครั้ง</small></span></label>
288
+ </fieldset>
289
+ <label for="tunnel-token">Cloudflare Tunnel token</label>
290
+ <input id="tunnel-token" name="token" type="password" autocomplete="new-password" spellcheck="false" maxlength="8192" placeholder="เว้นว่างเพื่อใช้ credential ที่บันทึกไว้" aria-describedby="tunnel-credential tunnel-error">
291
+ <p class="help" id="tunnel-credential">กำลังตรวจ credential store…</p>
292
+ <p class="help">Token เป็น write-only และเก็บใน Keychain/Credential Manager/Secret Service เท่านั้น หน้าเว็บจะไม่อ่านค่ากลับมา</p>
293
+ <details class="details">
294
+ <summary>ค่าขั้นสูง</summary>
295
+ <div class="two-col">
296
+ <label>Metrics port<input id="tunnel-metrics" type="number" min="1024" max="65535" inputmode="numeric"></label>
297
+ <label>จำนวน restart สูงสุด<input id="tunnel-restarts" type="number" min="0" max="5" inputmode="numeric"></label>
298
+ </div>
299
+ </details>
300
300
  <p class="error" id="tunnel-error" role="alert" hidden></p>
301
301
  <div class="actions">
302
- <button type="submit" class="btn primary" id="tunnel-save">บันทึกการเริ่ม Tunnel</button>
302
+ <button type="submit" class="btn primary" id="tunnel-save">บันทึกโหมดการเชื่อมต่อ</button>
303
303
  </div>
304
304
  </form>
305
- </details>
306
305
  </section>
307
306
 
308
307
  <section class="card" id="card-desktop" aria-labelledby="h-desktop">