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.
Files changed (69) hide show
  1. package/README.md +55 -14
  2. package/dist/cli/main.js +92 -28
  3. package/dist/cli/main.js.map +1 -1
  4. package/dist/cli/menu.js +2 -2
  5. package/dist/cli/menu.js.map +1 -1
  6. package/dist/config/globalConfig.js +6 -2
  7. package/dist/config/globalConfig.js.map +1 -1
  8. package/dist/config/tunnelConfig.js +2 -1
  9. package/dist/config/tunnelConfig.js.map +1 -1
  10. package/dist/projects/ownerAdmin.js +86 -0
  11. package/dist/projects/ownerAdmin.js.map +1 -0
  12. package/dist/projects/registry.js +90 -9
  13. package/dist/projects/registry.js.map +1 -1
  14. package/dist/security/projectAccess.js +69 -0
  15. package/dist/security/projectAccess.js.map +1 -0
  16. package/dist/security/projectAuthority.js +5 -1
  17. package/dist/security/projectAuthority.js.map +1 -1
  18. package/dist/server/appServer.js +23 -9
  19. package/dist/server/appServer.js.map +1 -1
  20. package/dist/server/bootstrap.js +5 -1
  21. package/dist/server/bootstrap.js.map +1 -1
  22. package/dist/server/configUi/app.css +8 -0
  23. package/dist/server/configUi/app.js +93 -18
  24. package/dist/server/configUi/index.html +22 -13
  25. package/dist/server/installationRuntime.js +6 -2
  26. package/dist/server/installationRuntime.js.map +1 -1
  27. package/dist/server/instructions.js +1 -1
  28. package/dist/server/instructions.js.map +1 -1
  29. package/dist/server/ipcDispatch.js.map +1 -1
  30. package/dist/server/localConfig.js +55 -13
  31. package/dist/server/localConfig.js.map +1 -1
  32. package/dist/services/ai/subagents.js +1 -1
  33. package/dist/services/ai/subagents.js.map +1 -1
  34. package/dist/services/multimodal/storage.js +10 -1
  35. package/dist/services/multimodal/storage.js.map +1 -1
  36. package/dist/services/schedules/scheduleService.js +8 -1
  37. package/dist/services/schedules/scheduleService.js.map +1 -1
  38. package/dist/store/db.js +14 -0
  39. package/dist/store/db.js.map +1 -1
  40. package/dist/tools/agentRuntimeTools.js +2 -3
  41. package/dist/tools/agentRuntimeTools.js.map +1 -1
  42. package/dist/tools/context.js +85 -5
  43. package/dist/tools/context.js.map +1 -1
  44. package/dist/tools/surface.js +2 -6
  45. package/dist/tools/surface.js.map +1 -1
  46. package/dist/tunnel/control.js +11 -4
  47. package/dist/tunnel/control.js.map +1 -1
  48. package/dist/tunnel/log.js +32 -0
  49. package/dist/tunnel/log.js.map +1 -1
  50. package/dist/tunnel/supervisor.js +103 -24
  51. package/dist/tunnel/supervisor.js.map +1 -1
  52. package/docs/ARCHITECTURE.md +12 -4
  53. package/docs/AUTH.md +6 -0
  54. package/docs/COMPATIBILITY.md +3 -2
  55. package/docs/MANUAL_ACCEPTANCE.md +22 -6
  56. package/docs/PROJECTS.md +73 -2
  57. package/docs/RELEASE_1.2.0.md +75 -0
  58. package/docs/RELEASE_NOTES.md +15 -0
  59. package/docs/SECURITY.md +27 -6
  60. package/docs/TEST_REPORT.md +74 -0
  61. package/docs/TUNNEL.md +79 -16
  62. package/docs/adr/048-persistent-connection-mode.md +3 -1
  63. package/docs/adr/050-cloudflare-local-and-project-access.md +67 -0
  64. package/docs/adr/README.md +1 -0
  65. package/package.json +2 -1
  66. package/schemas/global-config.schema.json +1 -0
  67. package/schemas/tools.compact.json +123 -3
  68. package/schemas/tools.hybrid.json +297 -3
  69. package/schemas/tools.json +828 -0
@@ -16,10 +16,22 @@ import { signalOwnedProcess } from '../platform/processTree.js';
16
16
  import { buildChildEnv } from '../security/env.js';
17
17
  import { readTunnelCredential } from './credentials.js';
18
18
  import { TunnelLog } from './log.js';
19
+ /**
20
+ * Readiness is debounced on purpose. cloudflared re-registers its edge
21
+ * connections on its own schedule, so `/ready` legitimately returns non-200 for
22
+ * a moment during a reconnect. Reporting that single dip as "disconnected"
23
+ * made the owner-visible status flap. The supervisor therefore probes
24
+ * SEQUENTIALLY (never overlapping), ignores results from a previous child, and
25
+ * only leaves `connected` after a bounded number of consecutive failures.
26
+ */
27
+ const READY_PROBE_INTERVAL_MS = 2000;
28
+ /** Strictly below the interval so one probe can never outlive its own slot. */
29
+ const READY_PROBE_TIMEOUT_MS = 1500;
30
+ const READY_FAILURE_THRESHOLD = 3;
19
31
  export const TunnelStatusSchema = z.object({
20
32
  mode: z.literal('managed'),
21
33
  running: z.boolean(),
22
- phase: z.enum(['starting', 'connecting', 'connected', 'backoff', 'stopping', 'stopped', 'failed']),
34
+ phase: z.enum(['starting', 'connecting', 'connected', 'degraded', 'disconnected', 'backoff', 'stopping', 'stopped', 'failed']),
23
35
  connected: z.boolean(),
24
36
  startedAt: z.string().datetime(),
25
37
  updatedAt: z.string().datetime(),
@@ -30,6 +42,10 @@ export const TunnelStatusSchema = z.object({
30
42
  credentialSource: z.literal('configured'),
31
43
  lastExitCode: z.number().int().nullable(),
32
44
  lastError: z.string().max(500).nullable(),
45
+ // Defaulted so a state.json written by an older DODO still parses.
46
+ lastReadyAt: z.string().datetime().nullable().default(null),
47
+ lastFailureAt: z.string().datetime().nullable().default(null),
48
+ consecutiveReadyFailures: z.number().int().min(0).max(100000).default(0),
33
49
  }).strict();
34
50
  function securityWorkspaceRoot() { return fs.realpathSync.native(process.cwd()); }
35
51
  export function tunnelIpcPath(configDir) {
@@ -58,12 +74,15 @@ function writeState(directory, state) {
58
74
  catch { /* renamed or absent */ }
59
75
  }
60
76
  }
61
- export function probeTunnelReady(port, timeoutMs = 1500) {
77
+ export function probeTunnelReady(port, timeoutMs = READY_PROBE_TIMEOUT_MS) {
62
78
  return new Promise(resolve => {
63
79
  let settled = false;
64
80
  const finish = (value) => { if (settled)
65
81
  return; settled = true; resolve(value); };
66
- const request = http.get({ host: '127.0.0.1', port, path: '/ready', timeout: timeoutMs, headers: { Host: `127.0.0.1:${port}` } }, response => {
82
+ // `agent: false` forces a fresh socket per probe. Node's keep-alive global
83
+ // agent pools sockets between probes, and a pooled socket the peer already
84
+ // closed surfaces as a connection error — a spurious "not connected".
85
+ const request = http.get({ host: '127.0.0.1', port, path: '/ready', timeout: timeoutMs, agent: false, headers: { Host: `127.0.0.1:${port}` } }, response => {
67
86
  response.resume();
68
87
  response.once('end', () => finish(response.statusCode === 200));
69
88
  });
@@ -86,7 +105,7 @@ export async function startManagedTunnel(options) {
86
105
  const configDir = path.resolve(options.configDir);
87
106
  const config = options.config;
88
107
  if (config.tunnel.connectionMode !== 'tunnel')
89
- throw new DodoError('CONFLICT', 'DODO is configured for local connection mode', { recovery: 'run dodo tunnel configure --tunnel first' });
108
+ throw new DodoError('CONFLICT', 'DODO is not configured to own the Tunnel process', { recovery: 'run dodo tunnel configure --tunnel first' });
90
109
  if (!config.tunnel.credentialRef)
91
110
  throw new DodoError('NOT_FOUND', 'no saved Cloudflare Tunnel credential is available', { recovery: 'run dodo tunnel configure --tunnel --os-credential --public-url https://your-host' });
92
111
  if (!config.publicUrl)
@@ -104,6 +123,7 @@ export async function startManagedTunnel(options) {
104
123
  maxRestarts: config.tunnel.maxRestarts, metricsUrl, publicOrigin,
105
124
  credentialSource: 'configured',
106
125
  lastExitCode: null, lastError: null,
126
+ lastReadyAt: null, lastFailureAt: null, consecutiveReadyFailures: 0,
107
127
  };
108
128
  let child;
109
129
  let ipcServer;
@@ -120,6 +140,15 @@ export async function startManagedTunnel(options) {
120
140
  status = { ...status, lastError: 'private tunnel state could not be written' };
121
141
  }
122
142
  };
143
+ /**
144
+ * In-memory only. The readiness probe records a timestamp every couple of
145
+ * seconds; persisting each one would rewrite state.json continuously for no
146
+ * owner-visible benefit and, on Windows, park the event loop in the rename
147
+ * retry. Anything that changes `phase` still goes through `update`.
148
+ */
149
+ const updateVolatile = (patch) => {
150
+ status = { ...status, ...patch, updatedAt: new Date().toISOString() };
151
+ };
123
152
  const appendLog = (source, line) => {
124
153
  try {
125
154
  log.append(source, line);
@@ -163,6 +192,10 @@ export async function startManagedTunnel(options) {
163
192
  return;
164
193
  finished = true;
165
194
  update({ running: false, connected: false, phase, ...(error ? { lastError: error } : {}) });
195
+ try {
196
+ log.close();
197
+ }
198
+ catch { /* diagnostics are best effort at shutdown */ }
166
199
  if (ipcServer)
167
200
  await new Promise(resolve => ipcServer.close(() => resolve()));
168
201
  resolveWait(code);
@@ -231,25 +264,73 @@ export async function startManagedTunnel(options) {
231
264
  child.once('error', () => { flush(); update({ lastError: 'cloudflared process could not start' }); done(null); });
232
265
  child.once('close', code => { flush(); done(code); });
233
266
  });
267
+ const probeIntervalMs = options.readinessIntervalMs ?? READY_PROBE_INTERVAL_MS;
268
+ const failureThreshold = Math.max(1, options.readinessFailureThreshold ?? READY_FAILURE_THRESHOLD);
269
+ const readyLog = {
270
+ connected: 'cloudflared readiness endpoint reports connected',
271
+ degraded: 'cloudflared readiness check failed; the edge connection is reconnecting',
272
+ disconnected: `cloudflared readiness endpoint is not connected after ${failureThreshold} consecutive checks`,
273
+ };
274
+ /**
275
+ * One sequential probe loop per spawned child. `generation` fences the loop:
276
+ * a result that arrives after the child exited (or after stop) is discarded
277
+ * instead of overwriting the newer state, which is what previously let a
278
+ * stale probe resurrect a "connected" or "not connected" line.
279
+ */
280
+ let childGeneration = 0;
281
+ const runReadinessLoop = async (generation) => {
282
+ let failures = 0;
283
+ let everReady = false;
284
+ while (!stopping && childGeneration === generation) {
285
+ const ready = await probeTunnelReady(config.tunnel.metricsPort, Math.min(READY_PROBE_TIMEOUT_MS, Math.max(150, probeIntervalMs - 100)));
286
+ if (stopping || childGeneration !== generation)
287
+ return;
288
+ const now = new Date().toISOString();
289
+ if (ready) {
290
+ failures = 0;
291
+ everReady = true;
292
+ }
293
+ else
294
+ failures += 1;
295
+ // Without readiness evidence the tunnel is still "connecting", never
296
+ // "disconnected": we have nothing to have lost yet.
297
+ const phase = ready
298
+ ? 'connected'
299
+ : !everReady
300
+ ? 'connecting'
301
+ : failures >= failureThreshold ? 'disconnected' : 'degraded';
302
+ const changed = phase !== status.phase;
303
+ const patch = {
304
+ phase,
305
+ // `connected` is the DEBOUNCED belief, not the last probe result: it
306
+ // stays true through `degraded` so anything bound to it (CLI status,
307
+ // Local Config, the owner banner) cannot flicker while cloudflared
308
+ // re-establishes an edge session. `phase` carries the nuance.
309
+ connected: phase === 'connected' || phase === 'degraded',
310
+ consecutiveReadyFailures: failures,
311
+ ...(ready ? { lastReadyAt: now, lastError: null } : { lastFailureAt: now }),
312
+ };
313
+ if (changed) {
314
+ update(patch);
315
+ if (readyLog[phase])
316
+ ownerLog(readyLog[phase]);
317
+ }
318
+ else
319
+ updateVolatile(patch);
320
+ await delay(probeIntervalMs);
321
+ }
322
+ };
234
323
  void (async () => {
235
- let readyTimer;
236
324
  try {
237
325
  while (!stopping) {
238
- const readiness = async () => {
239
- if (stopping || !child)
240
- return;
241
- const connected = await probeTunnelReady(config.tunnel.metricsPort);
242
- if (connected !== status.connected) {
243
- update({ connected, phase: connected ? 'connected' : 'connecting' });
244
- ownerLog(connected ? 'cloudflared readiness endpoint reports connected' : 'cloudflared readiness endpoint is not connected');
245
- }
246
- };
247
- readyTimer = setInterval(() => void readiness(), 1000);
248
- readyTimer.unref();
249
- const code = await runChild();
250
- clearInterval(readyTimer);
251
- readyTimer = undefined;
252
- update({ connected: false, lastExitCode: code });
326
+ const generation = ++childGeneration;
327
+ const childExit = runChild();
328
+ void runReadinessLoop(generation);
329
+ const code = await childExit;
330
+ // Fence the readiness loop before recording the exit so a probe that is
331
+ // already in flight cannot report on a process that is gone.
332
+ childGeneration += 1;
333
+ update({ connected: false, lastExitCode: code, consecutiveReadyFailures: 0, phase: stopping ? 'stopping' : 'disconnected' });
253
334
  if (stopping)
254
335
  break;
255
336
  if (status.restarts >= status.maxRestarts) {
@@ -263,13 +344,11 @@ export async function startManagedTunnel(options) {
263
344
  ownerLog(`cloudflared exited; restart ${restarts}/${status.maxRestarts} in ${waitMs}ms`);
264
345
  await delay(waitMs);
265
346
  }
266
- if (readyTimer)
267
- clearInterval(readyTimer);
347
+ childGeneration += 1;
268
348
  await finish(0, 'stopped');
269
349
  }
270
350
  catch {
271
- if (readyTimer)
272
- clearInterval(readyTimer);
351
+ childGeneration += 1;
273
352
  await finish(1, 'failed', 'tunnel supervisor failed without exposing child diagnostics');
274
353
  }
275
354
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/tunnel/supervisor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/tunnel/supervisor.ts"],"names":[],"mappings":"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"}
@@ -307,7 +307,14 @@ loopback metrics port และ bounded restart count Token ถูก resolve
307
307
  store หรือ owner-controlled env/private-file reference เมื่อเริ่ม process และส่งผ่าน
308
308
  child environment โดยไม่เข้า argv
309
309
 
310
- managed supervisor เป็น foreground process มี state machine `starting → connecting → connected/backoff → stopped/failed`, private bounded/redacted log และ authenticated singleton IPC `status/logs/stop` การ stop อ้างอิง live `ChildProcess` ที่ supervisor ถืออยู่เท่านั้น Local mode ไม่ spawn process และ `doctor` ตรวจ local/public health โดยไม่จัดการ Cloudflare account หรือ DNS
310
+ การเชื่อมต่อมีสามโหมด: `local` เป็น loopback-only, `external` ใช้ public origin แต่
311
+ เจ้าของเป็นผู้รัน `cloudflared`, และ `tunnel` ให้ DODO เป็นเจ้าของ child process
312
+ เฉพาะ managed supervisor ของ `tunnel` มี state machine
313
+ `starting → connecting → connected/backoff → stopped/failed`, private
314
+ bounded/redacted log และ authenticated singleton IPC `status/logs/stop` การ stop
315
+ อ้างอิง live `ChildProcess` ที่ supervisor ถืออยู่เท่านั้น `local` และ `external`
316
+ ไม่ spawn process ส่วน `doctor` ตรวจ local/public health โดยไม่จัดการ Cloudflare
317
+ account หรือ DNS
311
318
 
312
319
  `TunnelRuntime` ผูก supervisor หนึ่งตัวกับ DODO HTTP process และยอมเริ่มเฉพาะเมื่อ
313
320
  saved mode เป็น Tunnel พร้อม credential reference Runtime ส่งค่าผ่าน `TUNNEL_TOKEN`
@@ -319,9 +326,10 @@ Remote Config ไม่เปลี่ยน bind ของ Local Config แล
319
326
  app `RemoteConfigGateway` ถือ pairing/session digest กับ expiry ใน memory, proxy เฉพาะ
320
327
  `/config`, `/config/assets/*`, `/config/api/*` และส่ง request ไป loopback owner server
321
328
  ด้วย internal capability เดิม CLI เปิด/ต่ออายุผ่าน authenticated installation IPC
322
- เฉพาะเมื่อ persistent Tunnel mode ทำงานอยู่ IPC ไม่รับ credential หรือสลับ connection
323
- mode การหมดอายุล้าง code/session และทำให้ namespace กลับเป็น 404 โดยไม่หยุด
324
- MCP/OAuth/Tunnel
329
+ เมื่อ process ใช้ public mode (`external` หรือ `tunnel`) ใน `external` เจ้าของต้อง
330
+ ดูแล public route เอง ส่วน `tunnel` ต้องมี DODO-owned supervisor ที่กำลังทำงาน IPC
331
+ ไม่รับ credential หรือสลับ connection mode การหมดอายุล้าง code/session และทำให้
332
+ namespace กลับเป็น 404 โดยไม่หยุด MCP/OAuth/Cloudflare process
325
333
 
326
334
  ## Optional services
327
335
 
package/docs/AUTH.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## MCP OAuth
4
4
 
5
+ > **Simple Project Access Policy** — นอกจาก OAuth scopes และ client ACL แล้ว โปรเจกต์
6
+ > ที่ลงทะเบียนแต่ละตัวมีระดับของตัวเอง (`read`/`edit`/`full`) ที่เป็นเพดานเพิ่มอีกชั้น
7
+ > สิทธิ์จริง = token scopes ∩ grant scopes ∩ (personal ? grant : client ACL) ∩ ระดับโปรเจกต์
8
+ > ระดับนี้บีบได้อย่างเดียว ไม่เคยขยาย และไม่แทนที่ OAuth ดู
9
+ > [docs/PROJECTS.md](PROJECTS.md)
10
+
5
11
  MCP HTTP ใช้ OAuth 2.1 authorization code + PKCE S256:
6
12
 
7
13
  1. client discover protected resource metadata
@@ -13,7 +13,7 @@
13
13
  | MCP HTTP | OAuth protected MCP endpoint ที่ `/mcp` |
14
14
  | MCP STDIO | Full surface เป็นค่าเริ่มต้น |
15
15
  | Local Config | loopback owner control ที่ 21731; เปิด bounded Remote Config `/config` ผ่าน 21730 ได้ครั้งละไม่เกิน 1 ชั่วโมง |
16
- | Cloudflare Tunnel | เลือก persistent `local` หรือ DODO-owned `tunnel`; credential อยู่ใน OS store/reference และ child `cloudflared` หยุดพร้อม DODO |
16
+ | Cloudflare | เลือก persistent `local` (loopback), `external` (Cloudflare Local ที่เจ้าของรันเอง) หรือ `tunnel` (DODO ดูแล process); credential ใช้เฉพาะ `tunnel` และอยู่ใน OS store/reference |
17
17
  | Package | `dodo-mcp` |
18
18
  | CLI | `dodo` |
19
19
 
@@ -75,7 +75,8 @@ desktop และ browser ยังไม่ถือว่ารองรับ
75
75
 
76
76
  `dodo setup --components cloudflared` ตรวจ executable ได้ทุก OS การติดตั้งอัตโนมัติ
77
77
  รองรับ Homebrew บน macOS ส่วน Linux/Windows ใช้ signed official package ที่เจ้าของติดตั้งเอง
78
- โหมด Tunnel ต้องมี public origin และ credential reference ที่ผ่านการตรวจแล้ว ค่า
78
+ โหมด Cloudflare Local ต้องมี public origin แต่ไม่รับ credential และไม่ supervise
79
+ `cloudflared` โหมด DODO Tunnel ต้องมี public origin และ credential reference ที่ผ่านการตรวจแล้ว ค่า
79
80
  `--os-credential` ใช้ macOS Keychain, Windows Credential Manager หรือ Linux Secret
80
81
  Service ส่วน env/file references มีไว้สำหรับ owner-controlled headless environment
81
82
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  ผล manual ต้องบันทึกเป็น `MANUAL_PASS` หรือ `MANUAL_NOT_RUN` พร้อมวันเวลาและ environment ห้ามเดาผลจาก automated test
4
4
 
5
+ สถานะ release 1.2.0: UI/authority/connection-mode fixtures ผ่านอัตโนมัติ แต่การใช้
6
+ **Cloudflare Local** และ **DODO Tunnel** ผ่าน public hostname จริงยัง
7
+ `MANUAL_NOT_RUN` จนกว่าเจ้าของจะทดสอบด้วย Tunnel/DNS/credential จริง
8
+
5
9
  สถานะล่าสุดของ owner-state setup/import gate: `MANUAL_NOT_RUN` (2026-09-14) ชุด automated ใช้ fixture แยกและไม่แตะ config/OAuth/tunnel ของผู้ใช้
6
10
 
7
11
  สถานะ live Cloudflare connection smoke ของรุ่น 1.0.2: `MANUAL_PASS` (2026-09-15) บน
@@ -26,18 +30,19 @@ connection smoke เดิมไม่ได้อ้างว่า AI client
26
30
  10. ตรวจ `dodo tunnel doctor` แยก local/public health และไม่กล่าวว่า AI client connected
27
31
  11. ตรวจ process list ว่า argv ไม่มี token และ `dodo tunnel logs`/audit/config ไม่มี token
28
32
  12. ทดสอบ OAuth + MCP ผ่าน public origin แล้วหยุด DODO; ยืนยัน owned child หยุดตาม
29
- 13. เปิด Local Config เลือก Local แล้ว restart; ตรวจว่าไม่เริ่ม cloudflared และ Active MCP URL เป็น loopback
30
- 14. เลือก Tunnel ผ่าน Local Config พร้อม write-only token แล้ว restart; ตรวจว่าช่องไม่ถูกเติมกลับและ endpoint เป็น public
31
- 15. บันทึก macOS และ Linux Docker แยก environment; Windows manual result แยกตามเครื่องจริง
33
+ 13. เปิด Local Config เลือก **เฉพาะเครื่อง (Loopback)** แล้ว restart; ตรวจว่าไม่เริ่ม cloudflared และ Active MCP URL เป็น loopback
34
+ 14. เลือก **Cloudflare Local (ติดตั้งในเครื่อง)** พร้อม public origin; ตรวจว่าช่อง token ถูกปิด, DODO ไม่เริ่ม/หยุด cloudflared และ endpoint เป็น public หลัง restart
35
+ 15. เลือก **DODO Tunnel** พร้อม write-only token แล้ว restart; ตรวจว่าช่องไม่ถูกเติมกลับและ endpoint เป็น public
36
+ 16. บันทึก macOS และ Linux Docker แยก environment; Windows manual result แยกตามเครื่องจริง
32
37
 
33
- ## Remote Config ผ่าน Tunnel
38
+ ## Remote Config ผ่าน Cloudflare
34
39
 
35
40
  Automated Chromium fixture ผ่านแล้วทั้ง 1440×900 และ 390×844 โดยใช้ isolated
36
41
  loopback public-origin fixture: จับคู่, dashboard/assets/API, workspace-bound mutation,
37
42
  หมดอายุและปิดเป็น 404 ทำงานจริง การตรวจผ่าน public Cloudflare hostname จริงยัง
38
43
  `MANUAL_NOT_RUN`
39
44
 
40
- 1. เลือก Tunnel แบบ persistent และรัน DODO จน `dodo tunnel status` รายงาน connected
45
+ 1. ทดสอบสองรอบ: (ก) Cloudflare Local โดยเจ้าของรัน tunnel เอง และ (ข) DODO Tunnel จน `dodo tunnel status` รายงาน connected
41
46
  2. จาก terminal อื่นรัน `dodo --web`; คำสั่งต้องไม่ถามหรือส่ง Tunnel token ผ่าน IPC
42
47
  3. ตรวจว่า process ไม่ restart และ MCP/OAuth/workspace epoch เดิมไม่เปลี่ยน
43
48
  4. เปิด URL `/config` จากอีกอุปกรณ์ ตรวจว่า URL ไม่มี query/fragment secret
@@ -47,7 +52,7 @@ loopback public-origin fixture: จับคู่, dashboard/assets/API, worksp
47
52
  8. รัน `dodo --web` อีกครั้ง ตรวจ session เดิมถูกยกเลิกและได้ code ใหม่
48
53
  9. รัน `dodo web --close` ตรวจ `/config`, assets และ API เป็น 404 แต่ `/healthz`, OAuth และ `/mcp` ยังอยู่
49
54
  10. เปิดใหม่แล้วรอ 1 ชั่วโมง ตรวจ namespace ปิดเองโดยไม่หยุด MCP/Tunnel
50
- 11. เปลี่ยน persistent mode เป็น Local แล้ว restart; `dodo --web` ต้องถูกปฏิเสธและไม่เริ่ม Tunnel เอง
55
+ 11. เปลี่ยน persistent mode เป็นเฉพาะเครื่อง (Loopback) แล้ว restart; `dodo --web` ต้องถูกปฏิเสธและไม่เริ่ม Tunnel เอง
51
56
  12. ตรวจ config, audit, tunnel log, browser local/session storage และ process argv ว่าไม่มี Tunnel token, pairing code หรือ session token
52
57
 
53
58
  ## Setup foundation
@@ -88,6 +93,17 @@ loopback public-origin fixture: จับคู่, dashboard/assets/API, worksp
88
93
 
89
94
  ## Local Config
90
95
 
96
+ 0b. โปรเจกต์และระดับการเข้าถึง (2026-09-16) — **MANUAL_NOT_RUN**:
97
+ บนเครื่อง Windows จริงที่ใช้ tunnel จริง ให้ตรวจว่า
98
+ (ก) เพิ่มโปรเจกต์จากหน้า Projects ด้วย path + ชื่อ + ระดับเดียว แล้วใช้งานได้ทันที
99
+ โดยไม่ต้องตั้ง client ACL/trust เพิ่ม
100
+ (ข) สั่ง AI ว่า "ใช้ DODO แก้โปรเจกต์ auto-upload" แล้ว AI resolve ชื่อได้เอง
101
+ และแก้ไฟล์ในโปรเจกต์ที่ถูกต้อง
102
+ (ค) ตั้งระดับเป็น `read` แล้วคำสั่งเขียน/รันถูกปฏิเสธจริง
103
+ (ง) แถบสถานะ Tunnel ไม่กระพริบระหว่างใช้งานต่อเนื่อง และ `dodo tunnel status`
104
+ แสดง phase/`lastReadyAt` ที่สอดคล้องกับความเป็นจริง
105
+ (จ) banner ตอน start ไม่พูดถึง ACL เมื่ออยู่ในโหมดส่วนตัว
106
+
91
107
  0. UI ใหม่ (2026-09-14): ตรวจบนเครื่องจริงว่า (ก) nav 8 หน้าใช้ได้ทั้ง desktop และมือถือ
92
108
  (ข) tooltip `?` เปิดด้วยการแตะบนอุปกรณ์ touch จริงและ screen reader อ่านได้
93
109
  (ค) กล่องยืนยัน SweetAlert แสดงก่อนการลบ/ยกเลิก/เปลี่ยนโหมดทุกครั้ง
package/docs/PROJECTS.md CHANGED
@@ -7,13 +7,84 @@ project ID แบบ opaque และคงที่เพื่ออ้าง
7
7
  ## คำสั่ง
8
8
 
9
9
  ```bash
10
- dodo project add /absolute/path/to/project
11
- dodo project add /absolute/path/to/project --name "Web application"
10
+ dodo project add /absolute/path/to/project --name "auto-upload" --access full
11
+ dodo project add "C:\\Users\\User\\Desktop\\auto-upload" --name "auto-upload" --access edit
12
+ dodo project access "auto-upload" --mode edit
12
13
  dodo project list
13
14
  dodo project info prj_xxxxxxxxxxxx
14
15
  dodo project remove prj_xxxxxxxxxxxx --yes
15
16
  ```
16
17
 
18
+ `dodo project access` รับได้ทั้ง **ชื่อโปรเจกต์** และ project ID เว็บ Local Config
19
+ และ CLI เรียก owner-administration service ตัวเดียวกัน (`src/projects/ownerAdmin.ts`)
20
+ จึงใช้ validation, การยืนยันและ audit ชุดเดียวกัน ไม่มี permission logic แยกสองชุด
21
+
22
+ ## Simple Project Access Policy
23
+
24
+ ตอนเพิ่มโปรเจกต์ให้เลือก **ระดับการเข้าถึง** เพียงค่าเดียว:
25
+
26
+ | ระดับ | ความหมาย | OAuth scopes ที่เป็นเพดาน |
27
+ |---|---|---|
28
+ | `read` | อ่านอย่างเดียว — อ่าน ค้นหา วิเคราะห์ | `dodo:read` |
29
+ | `edit` | แก้ไข — อ่านและแก้ไฟล์ | `dodo:read` + `dodo:write` |
30
+ | `full` | ทำงานเต็มรูปแบบ — อ่าน แก้ไฟล์ และรันคำสั่ง/ทดสอบ | `dodo:read` + `dodo:write` + `dodo:exec` |
31
+
32
+ ระดับนี้เป็น **เพดาน ไม่ใช่การให้สิทธิ์** สิทธิ์จริงคือส่วนที่ทับกันของ
33
+
34
+ ```text
35
+ OAuth token scopes ∩ grant scopes ∩ (personal ? grant : client ACL ของ workspace) ∩ ระดับของโปรเจกต์
36
+ ```
37
+
38
+ ดังนั้น token ที่มีแค่ `dodo:read` จะยังอ่านได้อย่างเดียวแม้โปรเจกต์เป็น `full`
39
+ และโปรเจกต์ `read` ก็เขียนไม่ได้แม้ token จะมี `dodo:write` การเปลี่ยนระดับไม่แตะ
40
+ OAuth, trust, approval, path/secret guards, expected hash, sandbox หรือ audit
41
+
42
+ ใน **โหมดส่วนตัว** (ค่าเริ่มต้น) เพิ่มโปรเจกต์แล้วใช้ได้ทันที ไม่ต้องตั้ง client ACL
43
+ หรือ trust ซ้ำต่อโปรเจกต์ ใน **โหมดแยกสิทธิ์** ยังต้องอนุญาต client ต่อโปรเจกต์ตามเดิม
44
+ และระดับของโปรเจกต์จะบีบให้แคบลงอีกชั้น (ไม่เคยขยาย)
45
+
46
+ ### การอัปเกรดจากรุ่นก่อนหน้า
47
+
48
+ โปรเจกต์ที่ลงทะเบียนไว้ก่อนมีนโยบายนี้จะได้ระดับ `full` — เพราะ `full` **ไม่บีบอะไรเพิ่ม**
49
+ สิทธิ์จริงจึงเท่าเดิมทุกประการ (ยังถูกจำกัดด้วย OAuth scopes, client ACL ในโหมดแยกสิทธิ์,
50
+ trust และ guards ทั้งหมด) การบีบให้แคบลงเงียบ ๆ จะเป็นการถอนสิทธิ์ที่เจ้าของไม่ได้สั่ง
51
+ ระดับจะแสดงในหน้า Projects และ `dodo project list` เพื่อให้ลดลงได้เอง
52
+
53
+ ## เรียกโปรเจกต์ด้วยชื่อ
54
+
55
+ ชื่อโปรเจกต์ต้องไม่ซ้ำกัน (เทียบแบบไม่สนตัวพิมพ์) เพราะใช้อ้างอิงโปรเจกต์ในการสั่งงาน AI
56
+
57
+ พูดกับ AI ได้ตรง ๆ ว่า **"ใช้ DODO แก้โปรเจกต์ auto-upload"** แล้ว AI จะ:
58
+
59
+ 1. เรียก `project_overview` พร้อม `targetProject: "auto-upload"` — DODO resolve ชื่อ
60
+ เป็นโปรเจกต์เดียวที่ client นั้นมีสิทธิ์เห็น
61
+ 2. รับ `workspaceId` / `workspaceEpoch` ของโปรเจกต์นั้นกลับมา
62
+ 3. ส่ง `targetProject` พร้อม context นั้นไปกับทุก operation ถัดไป
63
+
64
+ ```jsonc
65
+ project_overview({ targetProject: "auto-upload" })
66
+
67
+ dodo_write({
68
+ targetProject: "auto-upload",
69
+ workspaceId: "ws_…", workspaceEpoch: "boot_…",
70
+ operation: "edit_file",
71
+ args: { /* … */ }
72
+ })
73
+ ```
74
+
75
+ กฎของการ resolve:
76
+
77
+ - เทียบชื่อแบบตัดช่องว่างหัวท้ายและไม่สนตัวพิมพ์
78
+ - ค้นเฉพาะโปรเจกต์ที่ principal นั้นอ่านได้อยู่แล้ว จึงไม่เปิดเผยชื่อหรือ path
79
+ ของโปรเจกต์ที่ไม่มีสิทธิ์
80
+ - ชื่อกำกวม (เช่นข้อมูลเก่าที่ชื่อซ้ำ) → error พร้อมรายชื่อ candidate ที่เห็นได้ ไม่เดา
81
+ - ส่งทั้ง `targetProjectId` และ `targetProject` ที่ชี้คนละโปรเจกต์ → ปฏิเสธ
82
+ - `targetProject` อยู่ระดับบนสุดเท่านั้น ใส่ใน `args` ที่ซ้อนอยู่จะถูกปฏิเสธ
83
+ - หลัง resolve แล้วผ่าน invocation/security pipeline เดิมครบทุกด่าน
84
+
85
+ เจ้าของไม่ต้องรู้หรือพิมพ์ project ID เอง (`targetProjectId` ยังใช้ได้ตามเดิมเพื่อ
86
+ ความเข้ากันได้ย้อนหลัง)
87
+
17
88
  ทุกคำสั่งรองรับข้อมูล local owner เท่านั้น `list`, `info` และ `add` รองรับ
18
89
  `--json`; `remove` ต้องมี `--yes` หลังตรวจ project ID และ path แล้ว
19
90
 
@@ -0,0 +1,75 @@
1
+ # DODO MCP 1.2.0
2
+
3
+ รุ่น 1.2.0 แก้ความกำกวมระหว่าง MCP เฉพาะเครื่องกับ `cloudflared` ที่ติดตั้งในเครื่อง
4
+ และนำสิทธิ์ `อ่าน / แก้ไข / เต็ม` กลับมาแสดงในการ์ดของทุกโปรเจกต์
5
+
6
+ ## การเชื่อมต่อสามโหมด
7
+
8
+ | หน้าเว็บ | ค่า config | ผู้ดูแล `cloudflared` | ใช้ Tunnel token ใน DODO |
9
+ |---|---|---|---|
10
+ | เฉพาะเครื่อง (Loopback) | `local` | ไม่มี | ไม่ใช้ |
11
+ | Cloudflare Local (ติดตั้งในเครื่อง) | `external` | ผู้ใช้ | ไม่รับและไม่อ่าน |
12
+ | DODO Tunnel | `tunnel` | DODO | write-only ผ่าน OS credential store |
13
+
14
+ ```bash
15
+ # AI ในเครื่องเท่านั้น
16
+ dodo tunnel configure --loopback
17
+
18
+ # เจ้าของติดตั้งและรัน cloudflared เอง
19
+ dodo tunnel configure --cloudflare-local --public-url https://mcp.example.com
20
+
21
+ # DODO เริ่มและหยุด cloudflared พร้อมตัวเอง
22
+ dodo tunnel configure --tunnel --public-url https://mcp.example.com --os-credential
23
+ ```
24
+
25
+ ทั้ง Cloudflare Local และ DODO Tunnel ใช้ public origin เป็น OAuth issuer/MCP URL
26
+ แต่มีเพียง DODO Tunnel ที่แตะ credential หรือ supervisor Cloudflare Local ไม่อ้างว่า
27
+ connected เพียงเพราะบันทึก URL และ `dodo tunnel doctor` รายงาน process ownership แยก
28
+ จาก public health
29
+
30
+ ## สิทธิ์แต่ละโปรเจกต์
31
+
32
+ หน้า **โปรเจกต์** แสดงระดับของแต่ละรายการเสมอ:
33
+
34
+ - `read` — อ่าน ค้นหา วิเคราะห์
35
+ - `edit` — เพิ่มสิทธิ์แก้ไฟล์
36
+ - `full` — เพิ่มสิทธิ์รันคำสั่งและทดสอบ
37
+
38
+ ระดับเป็นเพดานเท่านั้น สิทธิ์จริงยังเป็น intersection ของ OAuth token, live grant,
39
+ managed ACL (เมื่อเปิดโหมด managed) และระดับโปรเจกต์ จึงไม่ทำให้ read-only token เขียน
40
+ ได้ และไม่ข้าม workspace ID/epoch, approval, sandbox, path/secret guards, expected hash,
41
+ idempotency หรือ audit
42
+
43
+ โปรเจกต์เดิม migrate เป็น `full` เพื่อไม่ถอนสิทธิ์เงียบ ๆ เจ้าของลดระดับได้จากการ์ด
44
+ โปรเจกต์หรือ CLI:
45
+
46
+ ```bash
47
+ dodo project access "ชื่อโปรเจกต์" --mode read
48
+ dodo project access "ชื่อโปรเจกต์" --mode edit
49
+ dodo project access "ชื่อโปรเจกต์" --mode full
50
+ ```
51
+
52
+ ## อัปเดต
53
+
54
+ ```bash
55
+ npm install -g dodo-mcp@1.2.0
56
+ dodo --version
57
+ dodo start
58
+ ```
59
+
60
+ หลังอัปเดตให้ restart DODO ค่า connection mode หรือ public origin ที่เปลี่ยนจากหน้าเว็บ
61
+ ไม่มีผลกับ process เดิมจนกว่าจะ restart
62
+
63
+ ## ผลตรวจรับ
64
+
65
+ - typecheck/lint: `AUTOMATED_PASS`
66
+ - focused connection/project/OAuth/security/Chromium tests: `AUTOMATED_PASS` —
67
+ 92 passed, 1 skipped, 0 failed
68
+ - core/integration/security/compatibility: `AUTOMATED_PASS` — 726 passed,
69
+ 35 skipped, 0 failed
70
+ - packaging: `AUTOMATED_PASS` — 16/16
71
+ - production dependency audit: `AUTOMATED_PASS` — 0 vulnerabilities
72
+ - immutable release gate และ fresh registry install: ดูผลล่าสุดใน
73
+ [TEST_REPORT.md](TEST_REPORT.md) (ยังไม่อ้างว่าผ่านจนกว่าจะ publish/verify จริง)
74
+ - Cloudflare Local ผ่าน public hostname จริง: `MANUAL_NOT_RUN`
75
+ - DODO Tunnel credential/public hostname จริงของ 1.2.0: `MANUAL_NOT_RUN`
@@ -1,5 +1,20 @@
1
1
  # DODO MCP — Release Notes
2
2
 
3
+ ## 1.2.0 — Cloudflare Local และสิทธิ์ต่อโปรเจกต์ที่มองเห็นได้
4
+
5
+ - แยกการเชื่อมต่อเป็นสามโหมด: เฉพาะเครื่อง (Loopback), Cloudflare Local ที่ผู้ใช้
6
+ รัน `cloudflared` เอง และ DODO Tunnel ที่ DODO ดูแล process
7
+ - Cloudflare Local ใช้ public MCP/OAuth URL โดยไม่รับ/อ่าน Tunnel token และไม่รายงาน
8
+ supervisor connected จาก config อย่างเดียว
9
+ - หน้า Projects แสดงและบันทึกระดับ `read` / `edit` / `full` ของทุกโปรเจกต์จริง
10
+ ในโหมดส่วนตัว ไม่ต้องตามหา Trust/Client ACL หลายส่วน
11
+ - ระดับโปรเจกต์เป็นเพดานที่ intersect กับ OAuth/grant/managed ACL เท่านั้น ไม่เพิ่ม
12
+ สิทธิ์ ไม่ข้าม approval, sandbox, workspace context หรือ file guards
13
+ - Remote Config เปิดผ่าน public Cloudflare ได้ทั้ง owner-managed และ DODO-owned mode;
14
+ loopback-only ยังคงปฏิเสธ
15
+
16
+ ติดตั้งด้วย `npm install -g dodo-mcp@1.2.0` แล้ว restart DODO
17
+
3
18
  ## 1.1.0 — Android device tools through owner-approved ADB
4
19
 
5
20
  - เพิ่ม Full 13 `android_*` operations และ Compact `dodo_mobile` gateway สำหรับ