dodo-mcp 1.1.0 → 1.2.0
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 +55 -14
- package/dist/cli/main.js +92 -28
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/menu.js +2 -2
- package/dist/cli/menu.js.map +1 -1
- package/dist/config/globalConfig.js +6 -2
- package/dist/config/globalConfig.js.map +1 -1
- package/dist/config/tunnelConfig.js +2 -1
- package/dist/config/tunnelConfig.js.map +1 -1
- package/dist/projects/ownerAdmin.js +86 -0
- package/dist/projects/ownerAdmin.js.map +1 -0
- package/dist/projects/registry.js +90 -9
- package/dist/projects/registry.js.map +1 -1
- package/dist/security/projectAccess.js +69 -0
- package/dist/security/projectAccess.js.map +1 -0
- package/dist/security/projectAuthority.js +5 -1
- package/dist/security/projectAuthority.js.map +1 -1
- package/dist/server/appServer.js +23 -9
- package/dist/server/appServer.js.map +1 -1
- package/dist/server/bootstrap.js +5 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/configUi/app.css +8 -0
- package/dist/server/configUi/app.js +93 -18
- package/dist/server/configUi/index.html +22 -13
- package/dist/server/installationRuntime.js +6 -2
- package/dist/server/installationRuntime.js.map +1 -1
- package/dist/server/instructions.js +1 -1
- package/dist/server/instructions.js.map +1 -1
- package/dist/server/ipcDispatch.js.map +1 -1
- package/dist/server/localConfig.js +55 -13
- package/dist/server/localConfig.js.map +1 -1
- package/dist/services/ai/subagents.js +1 -1
- package/dist/services/ai/subagents.js.map +1 -1
- package/dist/services/multimodal/storage.js +10 -1
- package/dist/services/multimodal/storage.js.map +1 -1
- package/dist/services/schedules/scheduleService.js +8 -1
- package/dist/services/schedules/scheduleService.js.map +1 -1
- package/dist/store/db.js +14 -0
- package/dist/store/db.js.map +1 -1
- package/dist/tools/agentRuntimeTools.js +2 -3
- package/dist/tools/agentRuntimeTools.js.map +1 -1
- package/dist/tools/context.js +85 -5
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/surface.js +2 -6
- package/dist/tools/surface.js.map +1 -1
- package/dist/tunnel/control.js +11 -4
- package/dist/tunnel/control.js.map +1 -1
- package/dist/tunnel/log.js +32 -0
- package/dist/tunnel/log.js.map +1 -1
- package/dist/tunnel/supervisor.js +103 -24
- package/dist/tunnel/supervisor.js.map +1 -1
- package/docs/ARCHITECTURE.md +12 -4
- package/docs/AUTH.md +6 -0
- package/docs/COMPATIBILITY.md +3 -2
- package/docs/MANUAL_ACCEPTANCE.md +22 -6
- package/docs/PROJECTS.md +73 -2
- package/docs/RELEASE_1.2.0.md +75 -0
- package/docs/RELEASE_NOTES.md +15 -0
- package/docs/SECURITY.md +27 -6
- package/docs/TEST_REPORT.md +74 -0
- package/docs/TUNNEL.md +79 -16
- package/docs/adr/048-persistent-connection-mode.md +3 -1
- package/docs/adr/050-cloudflare-local-and-project-access.md +67 -0
- package/docs/adr/README.md +1 -0
- package/package.json +2 -1
- package/schemas/global-config.schema.json +1 -0
- package/schemas/tools.compact.json +123 -3
- package/schemas/tools.hybrid.json +297 -3
- package/schemas/tools.json +828 -0
|
@@ -217,7 +217,10 @@
|
|
|
217
217
|
// chips
|
|
218
218
|
const c = s.connection || {};
|
|
219
219
|
if (c.workspaceSelected === false) setChip('chip-mcp', 'warn', '⚠', 'เปิดอยู่ แต่รอเจ้าของเลือก workspace');
|
|
220
|
-
else if (c.activeMcpUrl)
|
|
220
|
+
else if (c.activeMcpUrl) {
|
|
221
|
+
const connectionLabel = c.connectionMode === 'tunnel' ? 'DODO Tunnel' : c.connectionMode === 'external' ? 'Cloudflare Local' : 'เฉพาะเครื่อง';
|
|
222
|
+
setChip('chip-mcp', s.state === 'switching' ? 'busy' : 'ok', s.state === 'switching' ? '⟳' : '●', s.state === 'switching' ? 'กำลังสลับ workspace' : `${connectionLabel} · ${c.activeMcpUrl.replace(/^https?:\/\//, '')}`);
|
|
223
|
+
}
|
|
221
224
|
else setChip('chip-mcp', 'warn', '○', 'ไม่มี HTTP listener ใน entry นี้');
|
|
222
225
|
if (c.oauthConfigured === true) setChip('chip-oauth', 'ok', '●', `เปิดใช้ · ${c.activePublicUrl || c.activeMcpUrl}`);
|
|
223
226
|
else if (c.oauthConfigured === false) setChip('chip-oauth', 'warn', '⚠', 'LOCKED — ยังไม่ตั้ง public URL');
|
|
@@ -273,7 +276,10 @@
|
|
|
273
276
|
// entirely (a short note with a tooltip replaces it); managed mode keeps
|
|
274
277
|
// every original control. Pure presentation: no scope/guard changes.
|
|
275
278
|
const p = s.permissions;
|
|
276
|
-
|
|
279
|
+
// Read the installation-level mode, not the per-workspace permissions
|
|
280
|
+
// block: `permissions` is null until a workspace is selected, which used to
|
|
281
|
+
// make a fresh personal-mode install render the managed-mode ACL cards.
|
|
282
|
+
const personalMode = (s.accessMode ?? (p && p.accessMode)) === 'personal';
|
|
277
283
|
$('card-perm').hidden = personalMode;
|
|
278
284
|
$('card-clients').hidden = personalMode;
|
|
279
285
|
$('personal-note').hidden = !personalMode;
|
|
@@ -359,16 +365,20 @@
|
|
|
359
365
|
const browserFormSig = JSON.stringify([browserMode ? browserMode.value : 'local', Number($('tunnel-metrics').value), Number($('tunnel-restarts').value)]);
|
|
360
366
|
const tunnelDirty = !force && lastTunnelFormSig !== null && browserFormSig !== lastTunnelFormSig;
|
|
361
367
|
if (!tunnelDirty) {
|
|
362
|
-
$('tunnel-mode-local').checked = tunnel.connectionMode
|
|
368
|
+
$('tunnel-mode-local').checked = tunnel.connectionMode === 'local';
|
|
369
|
+
$('tunnel-mode-external').checked = tunnel.connectionMode === 'external';
|
|
363
370
|
$('tunnel-mode-tunnel').checked = tunnel.connectionMode === 'tunnel';
|
|
364
371
|
$('tunnel-metrics').value = String(tunnel.metricsPort || 21732);
|
|
365
372
|
$('tunnel-restarts').value = String(tunnel.maxRestarts ?? 2);
|
|
366
373
|
}
|
|
367
|
-
$('tunnel-credential').textContent = tunnel.
|
|
368
|
-
?
|
|
369
|
-
: tunnel.
|
|
370
|
-
?
|
|
371
|
-
:
|
|
374
|
+
$('tunnel-credential').textContent = tunnel.connectionMode !== 'tunnel'
|
|
375
|
+
? 'ไม่ใช้ token ในโหมดนี้ — token ใช้เฉพาะเมื่อ DODO เป็นผู้เริ่ม cloudflared'
|
|
376
|
+
: tunnel.credentialConfigured
|
|
377
|
+
? `● มี credential แล้ว (${tunnel.credentialStorage}; ไม่แสดงค่า)`
|
|
378
|
+
: tunnel.credentialStore && tunnel.credentialStore.available
|
|
379
|
+
? `○ ยังไม่มี credential · พร้อมบันทึกใน ${tunnel.credentialStore.provider}`
|
|
380
|
+
: `✕ credential store ใช้ไม่ได้${tunnel.credentialStore && tunnel.credentialStore.provider ? ` (${tunnel.credentialStore.provider})` : ''}`;
|
|
381
|
+
syncTunnelControls();
|
|
372
382
|
lastTunnelFormSig = serverFormSig;
|
|
373
383
|
const tunnelRuntime = tunnel.runtime || {};
|
|
374
384
|
const currentTunnel = tunnelRuntime.current;
|
|
@@ -379,8 +389,12 @@
|
|
|
379
389
|
$('tunnel-badge').className = 'badge warn';
|
|
380
390
|
$('tunnel-badge').textContent = `◌ Tunnel ${currentTunnel.phase || 'กำลังเริ่ม'}`;
|
|
381
391
|
} else {
|
|
382
|
-
$('tunnel-badge').className = tunnel.connectionMode === 'tunnel' ? 'badge warn' : 'badge';
|
|
383
|
-
$('tunnel-badge').textContent = tunnel.connectionMode === 'tunnel'
|
|
392
|
+
$('tunnel-badge').className = tunnel.connectionMode === 'tunnel' ? 'badge warn' : tunnel.connectionMode === 'external' ? 'badge ok' : 'badge';
|
|
393
|
+
$('tunnel-badge').textContent = tunnel.connectionMode === 'tunnel'
|
|
394
|
+
? '◌ เลือก DODO Tunnel · ต้อง restart'
|
|
395
|
+
: tunnel.connectionMode === 'external'
|
|
396
|
+
? '● ใช้ Cloudflare ที่รันในเครื่อง'
|
|
397
|
+
: '● ใช้เฉพาะเครื่อง';
|
|
384
398
|
}
|
|
385
399
|
|
|
386
400
|
// clients
|
|
@@ -445,6 +459,47 @@
|
|
|
445
459
|
head.append(titleWrap, status);
|
|
446
460
|
|
|
447
461
|
const root = document.createElement('code'); root.className = 'path project-path'; root.textContent = project.root; root.title = project.root;
|
|
462
|
+
|
|
463
|
+
// ระดับการเข้าถึง: ค่าเดียวที่ควบคุมว่า AI ทำอะไรได้ในโปรเจกต์นี้
|
|
464
|
+
const accessRow = document.createElement('div'); accessRow.className = 'project-access';
|
|
465
|
+
const accessLabel = document.createElement('label');
|
|
466
|
+
accessLabel.textContent = 'ระดับการเข้าถึง';
|
|
467
|
+
const accessSelect = document.createElement('select');
|
|
468
|
+
accessSelect.setAttribute('aria-label', `ระดับการเข้าถึงของ ${project.displayName}`);
|
|
469
|
+
for (const [value, text] of [['read', 'อ่านอย่างเดียว'], ['edit', 'แก้ไข'], ['full', 'ทำงานเต็มรูปแบบ']]) {
|
|
470
|
+
const option = document.createElement('option'); option.value = value; option.textContent = text;
|
|
471
|
+
accessSelect.append(option);
|
|
472
|
+
}
|
|
473
|
+
accessSelect.value = project.accessLevel;
|
|
474
|
+
accessLabel.append(accessSelect);
|
|
475
|
+
const accessSummary = document.createElement('p'); accessSummary.className = 'help'; accessSummary.textContent = project.accessSummary;
|
|
476
|
+
const accessStatus = document.createElement('p'); accessStatus.className = 'help project-access-status'; accessStatus.setAttribute('role', 'status'); accessStatus.setAttribute('aria-live', 'polite');
|
|
477
|
+
const accessSave = document.createElement('button'); accessSave.type = 'button'; accessSave.className = 'btn small'; accessSave.textContent = 'บันทึกระดับ';
|
|
478
|
+
accessSave.disabled = true;
|
|
479
|
+
accessSelect.addEventListener('change', () => { accessSave.disabled = accessSelect.value === project.accessLevel; accessStatus.textContent = ''; });
|
|
480
|
+
accessSave.addEventListener('click', () => withBusy(accessSave, 'กำลังบันทึก…', async () => {
|
|
481
|
+
const chosen = accessSelect.value;
|
|
482
|
+
try {
|
|
483
|
+
// The backend is the source of truth: only report success once it confirms.
|
|
484
|
+
const saved = await api('projects/access', { projectId: project.projectId, access: chosen }, context);
|
|
485
|
+
// Update this card from the backend's response instead of re-rendering
|
|
486
|
+
// the whole list: a full re-render replaced the node and threw away
|
|
487
|
+
// the confirmation the owner needs to see.
|
|
488
|
+
project.accessLevel = saved.project.accessLevel;
|
|
489
|
+
accessSelect.value = saved.project.accessLevel;
|
|
490
|
+
accessSummary.textContent = saved.project.accessSummary;
|
|
491
|
+
accessStatus.textContent = `✓ บันทึกแล้ว: ${saved.project.accessSummary}`;
|
|
492
|
+
accessSave.disabled = true;
|
|
493
|
+
notify('success', `ตั้งระดับของ ${saved.project.displayName} เป็น ${saved.project.accessLevel} แล้ว`);
|
|
494
|
+
} catch (error) {
|
|
495
|
+
accessSelect.value = project.accessLevel;
|
|
496
|
+
accessSave.disabled = true;
|
|
497
|
+
accessStatus.textContent = `✕ ${error.message}`;
|
|
498
|
+
notify('error', `เปลี่ยนระดับไม่สำเร็จ: ${error.message}`);
|
|
499
|
+
}
|
|
500
|
+
}));
|
|
501
|
+
accessRow.append(accessLabel, accessSummary, accessSave, accessStatus);
|
|
502
|
+
|
|
448
503
|
const description = document.createElement('p'); description.className = 'help project-status'; description.textContent = project.statusText;
|
|
449
504
|
const details = document.createElement('details'); details.className = 'details';
|
|
450
505
|
const summary = document.createElement('summary'); summary.textContent = 'รายละเอียด registry';
|
|
@@ -464,7 +519,9 @@
|
|
|
464
519
|
const switched = await api('workspace/switch', { path: project.root }, context);
|
|
465
520
|
if (switched.changed) {
|
|
466
521
|
switchedOnce = true;
|
|
467
|
-
notify('success',
|
|
522
|
+
notify('success', result.accessMode === 'personal'
|
|
523
|
+
? `สลับไปที่ ${project.displayName} แล้ว — AI ต้องเรียก project_overview ใหม่ และใช้ระดับ ${project.accessLevel} ของโปรเจกต์นี้`
|
|
524
|
+
: `สลับไปที่ ${project.displayName} แล้ว — AI ต้องเรียก project_overview ใหม่ และ client ต้องมีสิทธิ์ใน workspace ใหม่`, true);
|
|
468
525
|
}
|
|
469
526
|
await refresh(true);
|
|
470
527
|
} catch (error) {
|
|
@@ -485,7 +542,7 @@
|
|
|
485
542
|
} catch (error) { notify('error', `นำโปรเจกต์ออกไม่สำเร็จ: ${error.message}`); }
|
|
486
543
|
}));
|
|
487
544
|
actions.append(switchButton, removeButton);
|
|
488
|
-
article.append(head, root, description, details, actions);
|
|
545
|
+
article.append(head, root, accessRow, description, details, actions);
|
|
489
546
|
list.append(article);
|
|
490
547
|
}
|
|
491
548
|
}
|
|
@@ -504,18 +561,23 @@
|
|
|
504
561
|
const context = workspaceContext();
|
|
505
562
|
withBusy($('project-add'), 'กำลังเพิ่ม…', async () => {
|
|
506
563
|
try {
|
|
507
|
-
const body = { path: projectPath };
|
|
564
|
+
const body = { path: projectPath, access: $('project-add-access').value };
|
|
508
565
|
if (displayName) body.displayName = displayName;
|
|
509
566
|
const result = await api('projects/add', body, context);
|
|
567
|
+
// Only the backend decides whether a project is usable; the message
|
|
568
|
+
// reflects the mode it reports, never a canned assumption.
|
|
569
|
+
const ready = result.project.requiresClientAcl
|
|
570
|
+
? `เพิ่ม ${result.project.displayName} แล้ว (ระดับ ${result.project.accessLevel}) — โหมดแยกสิทธิ์: อนุญาต client สำหรับโปรเจกต์นี้ก่อนใช้งาน`
|
|
571
|
+
: `เพิ่ม ${result.project.displayName} แล้ว — พร้อมใช้ทันที (${result.project.accessSummary})`;
|
|
510
572
|
if ($('project-add-open').checked) {
|
|
511
573
|
const switched = await api('workspace/switch', { path: result.project.root }, context);
|
|
512
574
|
switchedOnce = Boolean(switched.changed);
|
|
513
|
-
notify('success',
|
|
575
|
+
notify('success', `${ready} · AI ต้องเรียก project_overview ใหม่`, true);
|
|
514
576
|
pathInput.value = ''; nameInput.value = '';
|
|
515
577
|
await refresh(true);
|
|
516
578
|
} else {
|
|
517
579
|
pathInput.value = ''; nameInput.value = '';
|
|
518
|
-
notify(result.changed ? 'success' : 'info', result.relocated ? `อัปเดต path ของ ${result.project.displayName} แล้ว โดยไม่คัดลอกสิทธิ์ workspace เดิม` : result.changed ?
|
|
580
|
+
notify(result.changed ? 'success' : 'info', result.relocated ? `อัปเดต path ของ ${result.project.displayName} แล้ว โดยไม่คัดลอกสิทธิ์ workspace เดิม` : result.changed ? ready : 'โปรเจกต์นี้อยู่ใน registry แล้ว');
|
|
519
581
|
await loadProjects(true);
|
|
520
582
|
}
|
|
521
583
|
} catch (error) {
|
|
@@ -940,6 +1002,17 @@
|
|
|
940
1002
|
});
|
|
941
1003
|
|
|
942
1004
|
// ---- Cloudflare Tunnel ----
|
|
1005
|
+
function syncTunnelControls() {
|
|
1006
|
+
const mode = document.querySelector('input[name="connectionMode"]:checked')?.value || 'local';
|
|
1007
|
+
const managed = mode === 'tunnel';
|
|
1008
|
+
$('tunnel-credential-fields').hidden = !managed;
|
|
1009
|
+
$('tunnel-token').disabled = !managed;
|
|
1010
|
+
$('tunnel-metrics').disabled = !managed;
|
|
1011
|
+
$('tunnel-restarts').disabled = !managed;
|
|
1012
|
+
if (!managed) $('tunnel-token').value = '';
|
|
1013
|
+
}
|
|
1014
|
+
document.querySelectorAll('input[name="connectionMode"]').forEach((input) => input.addEventListener('change', syncTunnelControls));
|
|
1015
|
+
|
|
943
1016
|
$('tunnel-form').addEventListener('submit', (ev) => {
|
|
944
1017
|
ev.preventDefault();
|
|
945
1018
|
const errorElement = $('tunnel-error');
|
|
@@ -962,12 +1035,14 @@
|
|
|
962
1035
|
}
|
|
963
1036
|
withBusy($('tunnel-save'), 'กำลังบันทึก…', async () => {
|
|
964
1037
|
try {
|
|
965
|
-
const body = { connectionMode, metricsPort, maxRestarts, ...(token ? { token } : {}) };
|
|
1038
|
+
const body = { connectionMode, metricsPort, maxRestarts, ...(connectionMode === 'tunnel' && token ? { token } : {}) };
|
|
966
1039
|
const result = await api('tunnel/config', body);
|
|
967
1040
|
tokenInput.value = '';
|
|
968
1041
|
notify('info', result.connectionMode === 'tunnel'
|
|
969
|
-
? 'บันทึกแล้ว — restart DODO
|
|
970
|
-
:
|
|
1042
|
+
? 'บันทึกแล้ว — restart DODO เพื่อให้ DODO เริ่ม Tunnel เป็น MCP endpoint หลัก'
|
|
1043
|
+
: result.connectionMode === 'external'
|
|
1044
|
+
? 'บันทึกแล้ว — restart DODO แล้วรัน cloudflared ที่ติดตั้งในเครื่องด้วยตนเอง'
|
|
1045
|
+
: 'บันทึกแล้ว — restart DODO เพื่อใช้ MCP เฉพาะในเครื่อง');
|
|
971
1046
|
await refresh(true);
|
|
972
1047
|
} catch (error) {
|
|
973
1048
|
tokenInput.value = '';
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<section class="card" id="card-projects" aria-labelledby="h-projects">
|
|
117
117
|
<div class="card-head">
|
|
118
|
-
<h2 id="h-projects">Project Registry</h2>
|
|
118
|
+
<h2 id="h-projects">โปรเจกต์และสิทธิ์ของ AI <span class="muted">Project Registry</span></h2>
|
|
119
119
|
<span class="badge" id="projects-count" hidden></span>
|
|
120
120
|
</div>
|
|
121
121
|
<div class="card-state" id="projects-loading">กำลังโหลด…</div>
|
|
@@ -128,9 +128,15 @@
|
|
|
128
128
|
<form id="project-add-form" class="form" novalidate>
|
|
129
129
|
<label for="project-add-path">เพิ่มโปรเจกต์ด้วย absolute path</label>
|
|
130
130
|
<input id="project-add-path" name="path" type="text" autocomplete="off" spellcheck="false" placeholder="/Users/you/projects/app" aria-describedby="project-add-help project-add-error" required>
|
|
131
|
-
<label for="project-add-name"
|
|
131
|
+
<label for="project-add-name">ชื่อโปรเจกต์ <span class="muted">(ใช้เรียกโปรเจกต์นี้กับ AI)</span></label>
|
|
132
|
+
<input id="project-add-name" name="displayName" type="text" autocomplete="off" maxlength="120" placeholder="auto-upload">
|
|
133
|
+
<label for="project-add-access">ระดับการเข้าถึง <button type="button" class="help-tip" data-tip="กำหนดสิ่งที่ AI ทำได้ในโปรเจกต์นี้ และเป็นเพดานสูงสุด สิทธิ์จริงคือส่วนที่ทับกับ OAuth scope ของ client นั้น เช่น token ที่อ่านได้อย่างเดียวจะยังอ่านได้อย่างเดียวแม้เลือกทำงานเต็มรูปแบบ" aria-label="คำอธิบาย: ระดับการเข้าถึง">?</button></label>
|
|
132
134
|
<div class="input-row">
|
|
133
|
-
<
|
|
135
|
+
<select id="project-add-access" name="access">
|
|
136
|
+
<option value="read">อ่านอย่างเดียว — อ่าน ค้นหา วิเคราะห์</option>
|
|
137
|
+
<option value="edit" selected>แก้ไข — อ่านและแก้ไฟล์</option>
|
|
138
|
+
<option value="full">ทำงานเต็มรูปแบบ — อ่าน แก้ไฟล์ และรันคำสั่ง/ทดสอบ</option>
|
|
139
|
+
</select>
|
|
134
140
|
<button type="submit" class="btn primary" id="project-add">เพิ่มโปรเจกต์</button>
|
|
135
141
|
</div>
|
|
136
142
|
<label class="check"><input type="checkbox" id="project-add-open" checked><span>เปิดโปรเจกต์นี้ทันทีหลังเพิ่ม</span></label>
|
|
@@ -145,9 +151,9 @@
|
|
|
145
151
|
<div class="card-state error-state" id="projects-error" hidden></div>
|
|
146
152
|
</section>
|
|
147
153
|
|
|
148
|
-
<p class="callout info" id="personal-note" hidden><span aria-hidden="true">ℹ</span><span>โหมดส่วนตัว:
|
|
154
|
+
<p class="callout info" id="personal-note" hidden><span aria-hidden="true">ℹ</span><span>โหมดส่วนตัว: ตั้งสิทธิ์ของแต่ละโปรเจกต์จากช่อง “ระดับการเข้าถึง” ในการ์ดด้านบนได้เลย ไม่ต้องตั้ง Client ACL หรือ Trust ซ้ำ <button type="button" class="help-tip" data-tip="ระดับ อ่าน/แก้ไข/ทำงานเต็มรูปแบบเป็นเพดานต่อโปรเจกต์ และยังถูกจำกัดด้วย OAuth scope, sandbox, path/secret guards และ expected hash เปลี่ยนเป็นโหมดแยกสิทธิ์ละเอียดได้ที่หน้า Settings" aria-label="คำอธิบาย: โหมดส่วนตัว">?</button></span></p>
|
|
149
155
|
|
|
150
|
-
<section class="card" id="card-perm" aria-labelledby="h-perm">
|
|
156
|
+
<section class="card" id="card-perm" hidden aria-labelledby="h-perm">
|
|
151
157
|
<div class="card-head">
|
|
152
158
|
<h2 id="h-perm">Trust ของโปรเจกต์นี้ <button type="button" class="help-tip" data-tip="ระดับสิทธิ์ที่บันทึกไว้ต่อโปรเจกต์ ส่วน 'สิทธิ์ที่มีผล' คือค่าที่ใช้จริงในรอบนี้ ซึ่งอาจต่างกันเมื่อรันด้วย override flag" aria-label="คำอธิบาย: trust และ effective trust">?</button></h2>
|
|
153
159
|
<span class="badge" id="perm-effective-badge" hidden></span>
|
|
@@ -184,7 +190,7 @@
|
|
|
184
190
|
<div class="card-state error-state" id="perm-error" hidden></div>
|
|
185
191
|
</section>
|
|
186
192
|
|
|
187
|
-
<section class="card" id="card-clients" aria-labelledby="h-clients">
|
|
193
|
+
<section class="card" id="card-clients" hidden aria-labelledby="h-clients">
|
|
188
194
|
<div class="card-head"><h2 id="h-clients">Client access <button type="button" class="help-tip" data-tip="OAuth scopes กำหนดขอบเขตสูงสุดของ token (อ่าน/แก้ไฟล์/รันคำสั่ง) การอนุญาตที่นี่มีผลเฉพาะโฟลเดอร์นี้ และไม่เพิ่ม scope ให้ token ที่ออกไปแล้ว" aria-label="คำอธิบาย: OAuth scopes">?</button></h2><span class="badge" id="clients-count" hidden></span></div>
|
|
189
195
|
<div class="card-state" id="clients-loading">กำลังโหลด…</div>
|
|
190
196
|
<div class="card-body" id="clients-body" hidden>
|
|
@@ -279,17 +285,20 @@
|
|
|
279
285
|
</section>
|
|
280
286
|
|
|
281
287
|
<section class="card" id="card-tunnel" aria-labelledby="h-tunnel">
|
|
282
|
-
<div class="card-head"><h2 id="h-tunnel">การเชื่อมต่อ MCP <button type="button" class="help-tip" data-tip="เลือกได้หนึ่งโหมดต่อ DODO installation:
|
|
288
|
+
<div class="card-head"><h2 id="h-tunnel">การเชื่อมต่อ MCP <button type="button" class="help-tip" data-tip="เลือกได้หนึ่งโหมดต่อ DODO installation: ใช้เฉพาะเครื่อง, ใช้ Cloudflare ที่คุณติดตั้งและรันเอง, หรือให้ DODO ดูแล cloudflared ด้วย Tunnel token" aria-label="คำอธิบาย: connection mode">?</button></h2><span class="badge" id="tunnel-badge">กำลังตรวจ…</span></div>
|
|
283
289
|
<form id="tunnel-form" class="form" novalidate>
|
|
284
290
|
<fieldset>
|
|
285
291
|
<legend>โหมดที่ใช้เมื่อเปิด DODO</legend>
|
|
286
|
-
<label class="check"><input id="tunnel-mode-local" name="connectionMode" type="radio" value="local"><span><b
|
|
287
|
-
<label class="check"><input id="tunnel-mode-
|
|
292
|
+
<label class="check"><input id="tunnel-mode-local" name="connectionMode" type="radio" value="local"><span><b>เฉพาะเครื่อง (Loopback)</b><small>AI ในเครื่องใช้ <code>127.0.0.1:21730/mcp</code> โดยไม่มี Cloudflare</small></span></label>
|
|
293
|
+
<label class="check"><input id="tunnel-mode-external" name="connectionMode" type="radio" value="external"><span><b>Cloudflare Local (ติดตั้งในเครื่อง)</b><small>คุณติดตั้งและรัน <code>cloudflared</code> เอง DODO ใช้ Public MCP URL แต่ไม่อ่าน token และไม่ควบคุม process</small></span></label>
|
|
294
|
+
<label class="check"><input id="tunnel-mode-tunnel" name="connectionMode" type="radio" value="tunnel"><span><b>DODO Tunnel</b><small>DODO อ่าน token จาก credential store และเริ่ม/หยุด cloudflared พร้อม DODO</small></span></label>
|
|
288
295
|
</fieldset>
|
|
289
|
-
<
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
296
|
+
<div id="tunnel-credential-fields">
|
|
297
|
+
<label for="tunnel-token">Cloudflare Tunnel token</label>
|
|
298
|
+
<input id="tunnel-token" name="token" type="password" autocomplete="new-password" spellcheck="false" maxlength="8192" placeholder="เว้นว่างเพื่อใช้ credential ที่บันทึกไว้" aria-describedby="tunnel-credential tunnel-error">
|
|
299
|
+
<p class="help" id="tunnel-credential">ใช้เฉพาะโหมด DODO Tunnel · กำลังตรวจ credential store…</p>
|
|
300
|
+
<p class="help">Token เป็น write-only และเก็บใน Keychain/Credential Manager/Secret Service เท่านั้น หน้าเว็บจะไม่อ่านค่ากลับมา</p>
|
|
301
|
+
</div>
|
|
293
302
|
<details class="details">
|
|
294
303
|
<summary>ค่าขั้นสูง</summary>
|
|
295
304
|
<div class="two-col">
|
|
@@ -6,6 +6,7 @@ import { DodoError } from '../errors.js';
|
|
|
6
6
|
import { bootstrapWorkspace } from './bootstrap.js';
|
|
7
7
|
import { attachOptionalServices } from './optionalServices.js';
|
|
8
8
|
import { projectAuthority, isOwner } from '../security/projectAuthority.js';
|
|
9
|
+
import { isPersonalMode } from '../security/accessMode.js';
|
|
9
10
|
/** Explicit target runtimes never replace the legacy default workspace. */
|
|
10
11
|
export class InstallationRuntime {
|
|
11
12
|
initial;
|
|
@@ -48,8 +49,11 @@ export class InstallationRuntime {
|
|
|
48
49
|
if (!r)
|
|
49
50
|
throw new DodoError('FORBIDDEN', 'project unavailable or not authorized');
|
|
50
51
|
const authority = projectAuthority(this.store, p, r.workspaceId);
|
|
51
|
-
if (authority.scopes.length === 0)
|
|
52
|
-
throw new DodoError('WORKSPACE_ACCESS_REQUIRED',
|
|
52
|
+
if (authority.scopes.length === 0) {
|
|
53
|
+
throw new DodoError('WORKSPACE_ACCESS_REQUIRED', isPersonalMode(this.store)
|
|
54
|
+
? `no usable scope for project "${r.displayName}" (access level: ${r.accessLevel}); raise the level in Local Config > Projects or reconnect the client with the scopes you need`
|
|
55
|
+
: 'owner must allow access to the target project');
|
|
56
|
+
}
|
|
53
57
|
if (!r.available)
|
|
54
58
|
throw new DodoError('PATH_DENIED', 'registered project directory is not ready');
|
|
55
59
|
return r;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installationRuntime.js","sourceRoot":"","sources":["../../src/server/installationRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAA8B,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"installationRuntime.js","sourceRoot":"","sources":["../../src/server/installationRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const COMMON_INSTRUCTIONS = `DODO uses the connected client's OAuth scopes (HTTP), workspace access and local trust settings. Start with project_overview to get the active workspace and its capabilities. Pass workspaceId and workspaceEpoch from that overview to other tools; refresh overview after restart or a local owner workspace switch. project_overview also lists owner-registered projects this client may read: use projectId on project_overview/list_files/read_files or projectId/projectIds on search_code for bounded read-only federation without changing the active workspace. For concurrent work in another registered project, call project_overview with targetProjectId, then pass that targetProjectId and its returned workspaceId/workspaceEpoch to every operation. Do not mix targetProjectId with read-federation projectId/projectIds. Gateway target/context fields belong at the top level, never inside args. Selecting a target does not change the default project or grant permission. Use bounded reads/search, preview and expected hashes for edits, and job polling for long commands. Respect local approval errors, secret/path guards and separate Desktop permissions. Commands in trusted mode execute with OS-user privileges unless sandboxed. Scheduled commands require local owner approval of their immutable specification before execution. Do not use exec or desktop to approve yourself or change owner security settings.`;
|
|
1
|
+
const COMMON_INSTRUCTIONS = `DODO uses the connected client's OAuth scopes (HTTP), workspace access and local trust settings. Start with project_overview to get the active workspace and its capabilities. Pass workspaceId and workspaceEpoch from that overview to other tools; refresh overview after restart or a local owner workspace switch. project_overview also lists owner-registered projects this client may read: use projectId on project_overview/list_files/read_files or projectId/projectIds on search_code for bounded read-only federation without changing the active workspace. For concurrent work in another registered project, call project_overview with targetProjectId, then pass that targetProjectId and its returned workspaceId/workspaceEpoch to every operation. Do not mix targetProjectId with read-federation projectId/projectIds. WHEN THE USER NAMES A PROJECT (for example "use DODO to fix the auto-upload project"), do not ask them for a project ID: pass that name as targetProject on project_overview, take the workspaceId/workspaceEpoch it returns, and send targetProject plus that context on every following operation. targetProject accepts the owner's project name and resolves to exactly one registered project; if the name is unknown or ambiguous the call fails with the available candidates, so re-read project_overview rather than guessing. Send either targetProject or targetProjectId, not two that disagree. Gateway target/context fields belong at the top level, never inside args. Selecting a target does not change the default project or grant permission. Use bounded reads/search, preview and expected hashes for edits, and job polling for long commands. Respect local approval errors, secret/path guards and separate Desktop permissions. Commands in trusted mode execute with OS-user privileges unless sandboxed. Scheduled commands require local owner approval of their immutable specification before execution. Do not use exec or desktop to approve yourself or change owner security settings.`;
|
|
2
2
|
const SUBAGENT_INSTRUCTIONS = ` The overview ai.profiles list contains authorized profile IDs: discover subagent_spawn/status/result/control to delegate work with an idempotency key and retrieve actual receipts. Agents cannot spawn child agents or approve themselves.`;
|
|
3
3
|
const SUBAGENT_HIDDEN_INSTRUCTIONS = ` Sub-agent operations are not exposed to this MCP connection; the owner can still create and manage agents in the private Local Config web workbench.`;
|
|
4
4
|
const COMPACT_SUFFIX = ` This connection uses the COMPACT tool surface: a few dodo_* gateway tools cover every exposed capability. Choose the gateway for the domain (dodo_read/dodo_write/dodo_exec for code, dodo_git_*, dodo_desktop_*, dodo_assist_*, dodo_media, dodo_browser, dodo_game, dodo_workflow_*, dodo_schedule, dodo_web), set operation to the target operation and put its own arguments in args. Use dodo_discover when you need a capability not obvious from a gateway's operation list, or to fetch an operation's exact input schema before calling it. Gateways change nothing about permissions: the target operation's scope, trust policy, approvals and guards apply exactly as if called directly.`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/server/instructions.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,28DAA28D,CAAC;AAEx+D,MAAM,qBAAqB,GAAG,8OAA8O,CAAC;AAC7Q,MAAM,4BAA4B,GAAG,uJAAuJ,CAAC;AAC7L,MAAM,cAAc,GAAG,wqBAAwqB,CAAC;AAChsB,MAAM,aAAa,GAAG,ynBAAynB,CAAC;AAEhpB,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,GAAG,qBAAqB,CAAC;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,GAAG,cAAc,CAAC;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAAsB,GAAG,aAAa,CAAC;AAE1E,MAAM,UAAU,eAAe,CAAC,OAAsC,EAAE,WAAmC,EAAE,SAAS,EAAE,IAAI,EAAE;IAC5H,MAAM,IAAI,GAAG,mBAAmB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC/G,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,GAAG,cAAc,CAAC;IACxD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,GAAG,aAAa,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipcDispatch.js","sourceRoot":"","sources":["../../src/server/ipcDispatch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ipcDispatch.js","sourceRoot":"","sources":["../../src/server/ipcDispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ import { loadGlobalConfig, saveGlobalConfig, validatePublicUrl, GlobalConfigSche
|
|
|
11
11
|
import { ALL_SCOPES } from '../security/policy.js';
|
|
12
12
|
import { DodoError } from '../errors.js';
|
|
13
13
|
import { ProjectRegistry } from '../projects/registry.js';
|
|
14
|
+
import { ProjectAdmin } from '../projects/ownerAdmin.js';
|
|
15
|
+
import { PROJECT_ACCESS_LEVELS } from '../security/projectAccess.js';
|
|
14
16
|
import { accessMode } from '../security/accessMode.js';
|
|
15
17
|
const TOKEN_TTL_MS = 8 * 60 * 60 * 1000;
|
|
16
18
|
const UI_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), 'configUi');
|
|
@@ -175,7 +177,7 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
175
177
|
const transport = info.transport;
|
|
176
178
|
const selected = hasWorkspace();
|
|
177
179
|
const activeConnectionMode = transport?.connectionMode
|
|
178
|
-
?? (transport?.publicUrl ?
|
|
180
|
+
?? (transport?.publicUrl ? cfg.tunnel.connectionMode === 'local' ? 'external' : cfg.tunnel.connectionMode : 'local');
|
|
179
181
|
res.json({
|
|
180
182
|
version: info.version ?? ws.services.version,
|
|
181
183
|
state: host.state(),
|
|
@@ -191,6 +193,10 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
191
193
|
recoveryRequired: ws.store.listChangesetsByStatus('recovery_required').filter((c) => c.workspaceId === ws.workspaceId).length,
|
|
192
194
|
switchSupported,
|
|
193
195
|
} : null,
|
|
196
|
+
// Top-level: the owner's mode is an installation fact, true even before a
|
|
197
|
+
// workspace is selected. The UI hid the ACL cards off `permissions`,
|
|
198
|
+
// which is null on a fresh install — exactly when the owner is confused.
|
|
199
|
+
accessMode: accessMode(ws.store),
|
|
194
200
|
schedules: selected ? ws.services.schedules.list() : [],
|
|
195
201
|
desktop: selected ? { policy: ws.services.desktop.policy() } : null,
|
|
196
202
|
android: selected ? { policy: ws.services.android.policy() } : null,
|
|
@@ -207,16 +213,16 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
207
213
|
connectionMode: activeConnectionMode,
|
|
208
214
|
mcpLocalUrl: transport ? `http://127.0.0.1:${transport.port}/mcp` : null,
|
|
209
215
|
publicUrl: cfg.publicUrl ?? '',
|
|
210
|
-
mcpPublicUrl: activeConnectionMode
|
|
216
|
+
mcpPublicUrl: activeConnectionMode !== 'local' && transport?.publicUrl ? `${transport.publicUrl}/mcp` : null,
|
|
211
217
|
activeMcpUrl: transport
|
|
212
|
-
? activeConnectionMode
|
|
218
|
+
? activeConnectionMode !== 'local' && transport.publicUrl
|
|
213
219
|
? `${transport.publicUrl}/mcp`
|
|
214
220
|
: `http://127.0.0.1:${transport.port}/mcp`
|
|
215
221
|
: null,
|
|
216
222
|
oauthConfigured: transport ? !transport.locked : null,
|
|
217
|
-
activePublicUrl: activeConnectionMode
|
|
223
|
+
activePublicUrl: activeConnectionMode !== 'local' ? transport?.publicUrl ?? null : null,
|
|
218
224
|
restartRequired: transport !== undefined && (cfg.tunnel.connectionMode !== activeConnectionMode
|
|
219
|
-
|| (cfg.tunnel.connectionMode
|
|
225
|
+
|| (cfg.tunnel.connectionMode !== 'local' && (cfg.publicUrl ?? null) !== (transport.publicUrl ?? null))),
|
|
220
226
|
localConfigOrigin: `http://127.0.0.1:${actualPort}`,
|
|
221
227
|
expiresAt,
|
|
222
228
|
},
|
|
@@ -227,7 +233,11 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
227
233
|
credentialStore: info.tunnelCredentialStore
|
|
228
234
|
? { available: info.tunnelCredentialStore.available, provider: info.tunnelCredentialStore.provider }
|
|
229
235
|
: { available: false, provider: 'unavailable' },
|
|
230
|
-
cloudflared: cfg.tunnel.
|
|
236
|
+
cloudflared: cfg.tunnel.connectionMode === 'local'
|
|
237
|
+
? 'not-used'
|
|
238
|
+
: cfg.tunnel.connectionMode === 'external'
|
|
239
|
+
? 'owner-managed'
|
|
240
|
+
: cfg.tunnel.executable ? 'owner-selected' : 'trusted-PATH',
|
|
231
241
|
metricsPort: cfg.tunnel.metricsPort,
|
|
232
242
|
maxRestarts: cfg.tunnel.maxRestarts,
|
|
233
243
|
runtime: info.tunnelRuntime?.status() ?? { available: false, running: false, current: null, lastKnown: null },
|
|
@@ -271,22 +281,35 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
271
281
|
res.status(409).json({ error: 'Workspace changed. Refresh before reviewing projects.', code: 'STALE_WORKSPACE' });
|
|
272
282
|
return;
|
|
273
283
|
}
|
|
274
|
-
const projects = new
|
|
284
|
+
const projects = new ProjectAdmin(ws.store).list();
|
|
275
285
|
res.json({
|
|
276
286
|
workspaceId: ws.workspaceId,
|
|
277
287
|
workspaceEpoch: ws.epoch,
|
|
278
288
|
activeWorkspaceId: hasWorkspace() ? ws.workspaceId : null,
|
|
289
|
+
accessMode: accessMode(ws.store),
|
|
290
|
+
accessLevels: PROJECT_ACCESS_LEVELS,
|
|
279
291
|
projects,
|
|
280
292
|
});
|
|
281
293
|
});
|
|
282
294
|
app.post('/api/projects/add', (req, res) => {
|
|
283
|
-
const input = z.object({
|
|
295
|
+
const input = z.object({
|
|
296
|
+
path: z.string().min(1).max(4096),
|
|
297
|
+
displayName: z.string().min(1).max(120).optional(),
|
|
298
|
+
access: z.enum(['read', 'edit', 'full']).optional(),
|
|
299
|
+
}).strict().safeParse(req.body);
|
|
284
300
|
if (!input.success) {
|
|
285
|
-
res.status(400).json({ error: 'Project path
|
|
301
|
+
res.status(400).json({ error: 'Project path, name or access level is invalid.', code: 'INVALID_INPUT' });
|
|
286
302
|
return;
|
|
287
303
|
}
|
|
288
304
|
try {
|
|
289
|
-
|
|
305
|
+
// One transaction in ProjectRegistry.add: path identity, unique name and
|
|
306
|
+
// access level commit together, so a rejected level cannot leave a
|
|
307
|
+
// half-registered project behind.
|
|
308
|
+
const result = new ProjectAdmin(host.current().store).add({
|
|
309
|
+
path: input.data.path,
|
|
310
|
+
...(input.data.displayName ? { name: input.data.displayName } : {}),
|
|
311
|
+
...(input.data.access ? { access: input.data.access } : {}),
|
|
312
|
+
});
|
|
290
313
|
res.json({ ok: true, ...result, authorityChanged: false });
|
|
291
314
|
}
|
|
292
315
|
catch (error) {
|
|
@@ -294,6 +317,23 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
294
317
|
res.status(status).json(body);
|
|
295
318
|
}
|
|
296
319
|
});
|
|
320
|
+
app.post('/api/projects/access', (req, res) => {
|
|
321
|
+
const input = z.object({
|
|
322
|
+
projectId: z.string().min(1).max(96),
|
|
323
|
+
access: z.enum(['read', 'edit', 'full']),
|
|
324
|
+
}).strict().safeParse(req.body);
|
|
325
|
+
if (!input.success) {
|
|
326
|
+
res.status(400).json({ error: 'Project ID or access level is invalid.', code: 'INVALID_INPUT' });
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
res.json({ ok: true, project: new ProjectAdmin(host.current().store).setAccess(input.data.projectId, input.data.access) });
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
const { status, body } = ownerStateError(error);
|
|
334
|
+
res.status(status).json(body);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
297
337
|
app.post('/api/projects/remove', async (req, res) => {
|
|
298
338
|
const input = z.object({ projectId: z.string().min(1).max(96), confirmProjectId: z.string().min(1).max(96) }).strict().safeParse(req.body);
|
|
299
339
|
if (!input.success || input.data.projectId !== input.data.confirmProjectId) {
|
|
@@ -345,7 +385,7 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
345
385
|
// provider. Config stores only an opaque reference and one selected mode.
|
|
346
386
|
app.post('/api/tunnel/config', async (req, res) => {
|
|
347
387
|
const input = z.object({
|
|
348
|
-
connectionMode: z.enum(['local', 'tunnel']),
|
|
388
|
+
connectionMode: z.enum(['local', 'external', 'tunnel']),
|
|
349
389
|
token: z.string().min(20).max(8192).optional(),
|
|
350
390
|
metricsPort: z.number().int().min(1024).max(65535).optional(),
|
|
351
391
|
maxRestarts: z.number().int().min(0).max(5).optional(),
|
|
@@ -361,11 +401,13 @@ export async function startLocalConfig(target, port = 21731, info = {}) {
|
|
|
361
401
|
try {
|
|
362
402
|
const current = loadGlobalConfig(ws.paths.configFile);
|
|
363
403
|
let credentialRef = current.tunnel.credentialRef;
|
|
364
|
-
if (input.data.connectionMode
|
|
404
|
+
if (input.data.connectionMode !== 'local') {
|
|
365
405
|
if (!current.publicUrl) {
|
|
366
|
-
throw new DodoError('CONFLICT', 'Set the public HTTPS origin before selecting
|
|
406
|
+
throw new DodoError('CONFLICT', 'Set the public HTTPS origin before selecting a Cloudflare mode.');
|
|
367
407
|
}
|
|
368
408
|
validatePublicUrl(current.publicUrl, false);
|
|
409
|
+
}
|
|
410
|
+
if (input.data.connectionMode === 'tunnel') {
|
|
369
411
|
if (rawToken) {
|
|
370
412
|
if (!info.tunnelCredentialStore?.available) {
|
|
371
413
|
throw new DodoError('NOT_SUPPORTED', 'The reviewed OS credential store is unavailable on this machine.');
|