dodo-mcp 1.1.0 → 1.2.1

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 (78) hide show
  1. package/README.md +71 -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 +16 -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/aiAdmin.js +32 -8
  19. package/dist/server/aiAdmin.js.map +1 -1
  20. package/dist/server/appServer.js +37 -12
  21. package/dist/server/appServer.js.map +1 -1
  22. package/dist/server/bootstrap.js +5 -1
  23. package/dist/server/bootstrap.js.map +1 -1
  24. package/dist/server/configUi/app.css +8 -0
  25. package/dist/server/configUi/app.js +93 -18
  26. package/dist/server/configUi/index.html +22 -13
  27. package/dist/server/configUi/workbench.css +28 -1
  28. package/dist/server/configUi/workbench.js +113 -18
  29. package/dist/server/installationRuntime.js +6 -2
  30. package/dist/server/installationRuntime.js.map +1 -1
  31. package/dist/server/instructions.js +7 -3
  32. package/dist/server/instructions.js.map +1 -1
  33. package/dist/server/ipcDispatch.js.map +1 -1
  34. package/dist/server/localConfig.js +55 -13
  35. package/dist/server/localConfig.js.map +1 -1
  36. package/dist/server/stdioServer.js +14 -3
  37. package/dist/server/stdioServer.js.map +1 -1
  38. package/dist/services/ai/subagents.js +1 -1
  39. package/dist/services/ai/subagents.js.map +1 -1
  40. package/dist/services/multimodal/storage.js +10 -1
  41. package/dist/services/multimodal/storage.js.map +1 -1
  42. package/dist/services/schedules/scheduleService.js +8 -1
  43. package/dist/services/schedules/scheduleService.js.map +1 -1
  44. package/dist/store/db.js +14 -0
  45. package/dist/store/db.js.map +1 -1
  46. package/dist/tools/agentRuntimeTools.js +2 -3
  47. package/dist/tools/agentRuntimeTools.js.map +1 -1
  48. package/dist/tools/context.js +85 -5
  49. package/dist/tools/context.js.map +1 -1
  50. package/dist/tools/surface.js +97 -46
  51. package/dist/tools/surface.js.map +1 -1
  52. package/dist/tunnel/control.js +11 -4
  53. package/dist/tunnel/control.js.map +1 -1
  54. package/dist/tunnel/log.js +32 -0
  55. package/dist/tunnel/log.js.map +1 -1
  56. package/dist/tunnel/supervisor.js +103 -24
  57. package/dist/tunnel/supervisor.js.map +1 -1
  58. package/docs/AI_PROVIDERS.md +6 -3
  59. package/docs/ARCHITECTURE.md +18 -6
  60. package/docs/AUTH.md +6 -0
  61. package/docs/COMPATIBILITY.md +3 -2
  62. package/docs/MANUAL_ACCEPTANCE.md +22 -6
  63. package/docs/PROJECTS.md +73 -2
  64. package/docs/RELEASE_1.2.0.md +75 -0
  65. package/docs/RELEASE_1.2.1.md +47 -0
  66. package/docs/RELEASE_NOTES.md +33 -0
  67. package/docs/SECURITY.md +37 -6
  68. package/docs/TEST_REPORT.md +101 -0
  69. package/docs/TUNNEL.md +79 -16
  70. package/docs/WEB_CLIENTS.md +6 -1
  71. package/docs/adr/048-persistent-connection-mode.md +3 -1
  72. package/docs/adr/050-cloudflare-local-and-project-access.md +67 -0
  73. package/docs/adr/README.md +1 -0
  74. package/package.json +3 -1
  75. package/schemas/global-config.schema.json +11 -0
  76. package/schemas/tools.compact.json +123 -3
  77. package/schemas/tools.hybrid.json +297 -3
  78. package/schemas/tools.json +828 -0
@@ -76,8 +76,10 @@ export async function tunnelDoctor(configDir, config) {
76
76
  executable = 'available';
77
77
  }
78
78
  catch { /* reported as missing */ }
79
- let credential = config.tunnel.credentialRef ? 'invalid' : 'missing';
80
- if (config.tunnel.credentialRef) {
79
+ let credential = config.tunnel.connectionMode === 'tunnel'
80
+ ? config.tunnel.credentialRef ? 'invalid' : 'missing'
81
+ : 'not-used';
82
+ if (config.tunnel.connectionMode === 'tunnel' && config.tunnel.credentialRef) {
81
83
  try {
82
84
  await readTunnelCredential(config.tunnel.credentialRef);
83
85
  credential = 'configured';
@@ -103,8 +105,13 @@ export async function tunnelDoctor(configDir, config) {
103
105
  localMcpHealth: local,
104
106
  publicHealth,
105
107
  evidence: {
106
- connected: status.supervisor?.connected === true,
107
- note: 'Public health proves only that the configured HTTPS origin returned DODO health; it does not prove an AI client is connected.',
108
+ connected: config.tunnel.connectionMode === 'tunnel' && status.supervisor?.connected === true,
109
+ processOwnership: config.tunnel.connectionMode === 'tunnel'
110
+ ? 'dodo'
111
+ : config.tunnel.connectionMode === 'external' ? 'owner' : 'none',
112
+ note: config.tunnel.connectionMode === 'external'
113
+ ? 'Public health proves only that the owner-managed HTTPS origin returned DODO health; DODO does not supervise that cloudflared process or prove an AI client is connected.'
114
+ : 'Public health proves only that the configured HTTPS origin returned DODO health; it does not prove an AI client is connected.',
108
115
  },
109
116
  };
110
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/tunnel/control.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/tunnel/control.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import { ensurePrivateDirectory, assertPrivatePath } from '../platform/privateFs
5
5
  import { renameWithRetry } from '../platform/fsRetry.js';
6
6
  import { logLine } from '../security/redact.js';
7
7
  const LOG_BYTES = 512 * 1024;
8
+ /** Bounded coalescing window for the on-disk tail. */
9
+ const FLUSH_INTERVAL_MS = 750;
8
10
  function tailUtf8(input, limit) {
9
11
  if (input.length <= limit)
10
12
  return input;
@@ -41,6 +43,8 @@ export class TunnelLog {
41
43
  credential;
42
44
  file;
43
45
  bytes = Buffer.alloc(0);
46
+ flushTimer;
47
+ pendingFlush = false;
44
48
  constructor(directory, credential) {
45
49
  this.credential = credential;
46
50
  ensurePrivateDirectory(directory);
@@ -54,12 +58,40 @@ export class TunnelLog {
54
58
  throw error;
55
59
  }
56
60
  }
61
+ /**
62
+ * Credential removal and the bounded in-memory tail happen synchronously, so
63
+ * `read()` and the owner IPC are always current. The DISK write is coalesced:
64
+ * rewriting the whole 512 KiB tail for every cloudflared line blocked the
65
+ * event loop (on Windows `renameWithRetry` parks it with `Atomics.wait`),
66
+ * which starved the readiness probe and made the tunnel status flap.
67
+ */
57
68
  append(source, value) {
58
69
  const withoutCredential = this.credential ? value.split(this.credential).join('[REDACTED_TUNNEL_TOKEN]') : value;
59
70
  const line = `${new Date().toISOString()} ${source} ${logLine(withoutCredential)}\n`;
60
71
  this.bytes = tailUtf8(Buffer.concat([this.bytes, Buffer.from(line, 'utf8')]), LOG_BYTES);
72
+ this.scheduleFlush();
73
+ }
74
+ scheduleFlush() {
75
+ this.pendingFlush = true;
76
+ if (this.flushTimer)
77
+ return;
78
+ this.flushTimer = setTimeout(() => { this.flushTimer = undefined; this.flush(); }, FLUSH_INTERVAL_MS);
79
+ this.flushTimer.unref?.();
80
+ }
81
+ /** Persist the bounded tail now. Safe to call repeatedly; used on shutdown. */
82
+ flush() {
83
+ if (!this.pendingFlush)
84
+ return;
85
+ this.pendingFlush = false;
61
86
  writePrivateAtomic(this.file, this.bytes);
62
87
  }
88
+ close() {
89
+ if (this.flushTimer) {
90
+ clearTimeout(this.flushTimer);
91
+ this.flushTimer = undefined;
92
+ }
93
+ this.flush();
94
+ }
63
95
  read(lineLimit = 200) {
64
96
  const all = this.bytes.toString('utf8').split(/\r?\n/).filter(Boolean);
65
97
  const limit = Math.max(1, Math.min(500, Math.trunc(lineLimit)));
@@ -1 +1 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/tunnel/log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/tunnel/log.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -1,13 +1,16 @@
1
1
  # AI Providers, Sub-agents และหลายโปรเจกต์
2
2
 
3
- DODO MCP 1.0.4 สามารถเปิด runtime ของหลายโปรเจกต์ใน process เดียว และเรียกโมเดลจาก backend ผ่าน connection/profile ที่เจ้าของเลือกได้ ค่าเริ่มต้นเป็นโหมดส่วนตัว: เพิ่มโปรเจกต์, connection และ profile แล้วใช้งานได้ทันทีโดยไม่ต้องทำ allowlist ซ้ำ
3
+ DODO MCP 1.2.1 สามารถเปิด runtime ของหลายโปรเจกต์ใน process เดียว และเรียกโมเดลจาก backend ผ่าน connection/profile ที่เจ้าของเลือกได้ ค่าเริ่มต้นเป็นโหมดส่วนตัว: เพิ่มโปรเจกต์, connection และ profile แล้วใช้งานได้ทันทีโดยไม่ต้องทำ allowlist ซ้ำ
4
4
 
5
5
  ## เริ่มใช้งานผ่านเว็บ
6
6
 
7
7
  1. เปิด `dodo start` หรือ `dodo --cli` แล้วเข้า Local Config จาก URL ส่วนตัวที่ terminal แสดง ใช้หน้าเว็บ loopback เท่านั้น หน้า "ภาพรวม" แสดงขั้นตอนถัดไป (เพิ่มโปรเจกต์ → เพิ่ม Provider → สร้าง Profile → เริ่มงาน) พร้อมสถานะและรายการที่ต้องตรวจสอบ
8
8
  2. หน้า "โปรเจกต์": เพิ่ม absolute path ของ A/B แล้วพร้อมใช้ทันที การเลือกดู B ไม่เปลี่ยน default และไม่หยุด A
9
9
  3. หน้า "Providers & Profiles" (ส่วน AI Providers): เลือก preset หรือ Custom, protocol, Base URL และกรอก key เลือกเฉพาะรอบนี้หรือ macOS Keychain ปุ่มบันทึกตรวจรูปแบบ/endpoint policy และแสดงสถานะบันทึกพร้อมเวลา; ปุ่มรายชื่อโมเดลเป็น credential test แยกจากการทดสอบ inference ผลบอกชื่อ connection, เวลา และเมื่อพลาดจะระบุว่าไม่ retry อัตโนมัติ
10
- 4. หน้าเดียวกัน (ส่วน Agent Profiles): สร้าง Coding/Review/Research เลือก connection, Model ID, scopes, tool calling, image input และ budgets แล้วใช้กับทุกโปรเจกต์ที่ลงทะเบียนได้ทันที
10
+ 4. หน้าเดียวกัน (ส่วน Agent Profiles): เลือกประเภท Coding/Review/Research, connection และ
11
+ Model ID แล้วกด **สร้าง Agent** ได้เลย รายชื่อโมเดลที่โหลดจาก Provider จะปรากฏใน
12
+ Agent form อัตโนมัติ ถ้า endpoint ไม่รองรับ model-list ให้พิมพ์ Model ID เอง ส่วน scopes,
13
+ tool calling, image input, token budgets และราคาอยู่ใน **ตั้งค่าขั้นสูง**
11
14
  5. หากเป็น installation ที่แชร์หลาย client ให้เปลี่ยน Settings เป็น managed แล้วกำหนด trust, project ACL, profile/client allowlist และ source egress ต่อโปรเจกต์ (การสลับโหมดมีกล่องยืนยันเสมอ) ในโหมดส่วนตัว ฟอร์มสิทธิ์รายโปรเจกต์ถูกซ่อนและแทนด้วยโน้ตสั้นพร้อม tooltip
12
15
  6. ปุ่มทดสอบ inference/tool calling ส่งข้อมูลสังเคราะห์และอาจมีค่าใช้จ่าย ต้องยืนยันผ่านกล่อง warning ก่อนทุกครั้ง (ค่าใช้จ่ายที่ไม่ทราบแสดงว่า "ไม่ทราบ" ไม่ใช่ศูนย์) ระหว่างทดสอบมี loading modal และปุ่มถูกปิดกันส่งซ้ำ; ผลระบุชื่อ connection, Model ID, ชนิดการทดสอบ และเวลา ผลเก่าไม่รับรองค่าที่เปลี่ยนภายหลัง เมื่อพลาดจะแสดงทั้ง inline และ modal พร้อมข้อความว่าไม่ retry อัตโนมัติ โมเดลที่เปิด tool calling เองแต่ยังไม่ทดสอบยังไม่ถือว่า live coding integration ผ่าน
13
16
  7. หน้า "Chat & Tasks": เลือกโปรเจกต์/profile ระบุงาน ส่งงานหนึ่งครั้ง (มี idempotency key กันงานซ้ำเมื่อ reconnect) แล้วดู "Runs & Jobs" แสดงสถานะอ่านง่าย ข้อความ, tool receipts และผล jobs อยู่ใน details ที่พับได้ การยกเลิก/ลบประวัติต้องยืนยันก่อน
@@ -45,7 +48,7 @@ Ollama loopback อาจเรียก cloud model ได้ ต้องเ
45
48
 
46
49
  ## MCP หลายโปรเจกต์
47
50
 
48
- Full มี 125 tools; Compact 19; Hybrid 49 operations ใหม่ใช้ gateways เดิม
51
+ Complete Full มี 138 tools; Compact 20; Hybrid 49 โดย operations ใหม่ใช้ gateways เดิม
49
52
 
50
53
  ```text
51
54
  project_overview()
@@ -269,8 +269,12 @@ gateways Report ผูก revision, dataset, dependency lock, config และ h
269
269
  `schemas/tools.json` เป็น complete full schema ส่วน compact และ hybrid เป็น schema แยก
270
270
  พร้อม metadata ของ optional feature ค่า `exposeSubagentsToMcp=false` จะกรองสี่
271
271
  Sub-agent definitions ออกจาก Full และกรองสี่ operation names ออกจาก gateway schemas,
272
- instructions และ `dodo_discover` ของ Compact/Hybrid โดยจำนวน gateway names ยังคง
273
- 19/49 การเลือก surface หรือ feature exposure ไม่เปลี่ยน permission
272
+ instructions และ `dodo_discover` ของ Compact/Hybrid โดยจำนวน tool definitions ยังคง
273
+ 20/49 การตั้งค่า `disabledDiscoverOperations` กรอง operation เพิ่มจาก discover และ
274
+ gateway enum, ตัด Hybrid direct duplicate และไม่สร้าง gateway ที่ว่าง จึงทำให้ catalog
275
+ runtime ต่ำกว่าค่าสูงสุดได้ Full direct catalog ไม่รับผลจากค่านี้ ทุก variant cache ด้วย
276
+ canonical feature key และคำนวณ overview/stats จาก catalog ที่ serve จริง การเลือก
277
+ surface หรือ feature exposure ไม่เปลี่ยน permission
274
278
 
275
279
  ## Personal และ managed access mode
276
280
 
@@ -307,7 +311,14 @@ loopback metrics port และ bounded restart count Token ถูก resolve
307
311
  store หรือ owner-controlled env/private-file reference เมื่อเริ่ม process และส่งผ่าน
308
312
  child environment โดยไม่เข้า argv
309
313
 
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
314
+ การเชื่อมต่อมีสามโหมด: `local` เป็น loopback-only, `external` ใช้ public origin แต่
315
+ เจ้าของเป็นผู้รัน `cloudflared`, และ `tunnel` ให้ DODO เป็นเจ้าของ child process
316
+ เฉพาะ managed supervisor ของ `tunnel` มี state machine
317
+ `starting → connecting → connected/backoff → stopped/failed`, private
318
+ bounded/redacted log และ authenticated singleton IPC `status/logs/stop` การ stop
319
+ อ้างอิง live `ChildProcess` ที่ supervisor ถืออยู่เท่านั้น `local` และ `external`
320
+ ไม่ spawn process ส่วน `doctor` ตรวจ local/public health โดยไม่จัดการ Cloudflare
321
+ account หรือ DNS
311
322
 
312
323
  `TunnelRuntime` ผูก supervisor หนึ่งตัวกับ DODO HTTP process และยอมเริ่มเฉพาะเมื่อ
313
324
  saved mode เป็น Tunnel พร้อม credential reference Runtime ส่งค่าผ่าน `TUNNEL_TOKEN`
@@ -319,9 +330,10 @@ Remote Config ไม่เปลี่ยน bind ของ Local Config แล
319
330
  app `RemoteConfigGateway` ถือ pairing/session digest กับ expiry ใน memory, proxy เฉพาะ
320
331
  `/config`, `/config/assets/*`, `/config/api/*` และส่ง request ไป loopback owner server
321
332
  ด้วย internal capability เดิม CLI เปิด/ต่ออายุผ่าน authenticated installation IPC
322
- เฉพาะเมื่อ persistent Tunnel mode ทำงานอยู่ IPC ไม่รับ credential หรือสลับ connection
323
- mode การหมดอายุล้าง code/session และทำให้ namespace กลับเป็น 404 โดยไม่หยุด
324
- MCP/OAuth/Tunnel
333
+ เมื่อ process ใช้ public mode (`external` หรือ `tunnel`) ใน `external` เจ้าของต้อง
334
+ ดูแล public route เอง ส่วน `tunnel` ต้องมี DODO-owned supervisor ที่กำลังทำงาน IPC
335
+ ไม่รับ credential หรือสลับ connection mode การหมดอายุล้าง code/session และทำให้
336
+ namespace กลับเป็น 404 โดยไม่หยุด MCP/OAuth/Cloudflare process
325
337
 
326
338
  ## Optional services
327
339
 
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 แสดงก่อนการลบ/ยกเลิก/เปลี่ยนโหมดทุกครั้ง