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.
- package/README.md +49 -19
- package/dist/cli/main.js +108 -43
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/menu.js +5 -6
- package/dist/cli/menu.js.map +1 -1
- package/dist/config/globalConfig.js +23 -1
- package/dist/config/globalConfig.js.map +1 -1
- package/dist/config/stateImport.js +2 -2
- package/dist/config/stateImport.js.map +1 -1
- package/dist/config/tunnelConfig.js +2 -3
- package/dist/config/tunnelConfig.js.map +1 -1
- package/dist/server/appServer.js +89 -9
- package/dist/server/appServer.js.map +1 -1
- package/dist/server/configUi/app.js +54 -65
- package/dist/server/configUi/index.html +21 -22
- package/dist/server/configUi/workbench.js +7 -4
- package/dist/server/ipcDispatch.js +25 -0
- package/dist/server/ipcDispatch.js.map +1 -1
- package/dist/server/localConfig.js +50 -63
- package/dist/server/localConfig.js.map +1 -1
- package/dist/server/remoteConfig.js +317 -0
- package/dist/server/remoteConfig.js.map +1 -0
- package/dist/tunnel/control.js +4 -6
- package/dist/tunnel/control.js.map +1 -1
- package/dist/tunnel/credentials.js +5 -19
- package/dist/tunnel/credentials.js.map +1 -1
- package/dist/tunnel/runtime.js +3 -4
- package/dist/tunnel/runtime.js.map +1 -1
- package/dist/tunnel/supervisor.js +8 -10
- package/dist/tunnel/supervisor.js.map +1 -1
- package/docs/AI_PROVIDERS.md +1 -1
- package/docs/ARCHITECTURE.md +29 -14
- package/docs/COMPATIBILITY.md +7 -3
- package/docs/MANUAL_ACCEPTANCE.md +39 -10
- package/docs/RELEASE_1.0.0.md +3 -0
- package/docs/RELEASE_1.0.2.md +46 -0
- package/docs/RELEASE_1.0.3.md +57 -0
- package/docs/RELEASE_NOTES.md +37 -0
- package/docs/SECURITY.md +39 -13
- package/docs/TEST_REPORT.md +61 -2
- package/docs/TUNNEL.md +114 -53
- package/docs/WINDOWS.md +1 -1
- package/docs/adr/031-owner-selected-tunnel-supervision.md +8 -2
- package/docs/adr/044-global-launcher-and-cli-menu.md +3 -3
- package/docs/adr/047-temporary-remote-config.md +47 -0
- package/docs/adr/048-persistent-connection-mode.md +58 -0
- package/docs/adr/README.md +2 -0
- package/package.json +3 -1
- package/schemas/global-config.schema.json +6 -12
package/dist/server/appServer.js
CHANGED
|
@@ -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
|
-
// ----
|
|
98
|
-
const
|
|
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({
|
|
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:
|
|
400
|
-
|
|
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:
|
|
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}
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
332
|
-
//
|
|
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([
|
|
335
|
-
const
|
|
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-
|
|
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.
|
|
353
|
-
$('tunnel-badge').textContent = 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 = {
|
|
916
|
+
const body = { connectionMode, metricsPort, maxRestarts, ...(token ? { token } : {}) };
|
|
930
917
|
const result = await api('tunnel/config', body);
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
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">
|
|
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"
|
|
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
|
-
<
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
<label
|
|
298
|
-
|
|
299
|
-
</
|
|
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"
|
|
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">
|