dodo-mcp 1.0.1 → 1.0.2

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/docs/TUNNEL.md CHANGED
@@ -9,7 +9,10 @@ DODO เปิด MCP และ OAuth บน local loopback ผู้ใช้
9
9
  - Local Config: `http://127.0.0.1:21731`
10
10
  - managed readiness/metrics: `http://127.0.0.1:21732` โดยค่าเริ่มต้น
11
11
 
12
- Tunnel ต้อง route health, discovery, OAuth และ MCP ทุก path ไปยัง listener `21730` เดียวกัน ห้าม route Local Config `21731`, metrics `21732`, private IPC หรือ debug endpoint ออก public
12
+ Tunnel ต้อง route public hostname ทุก path ไปยัง listener `21730` เดียวกันเพื่อให้
13
+ health, discovery, OAuth และ MCP ทำงานครบ ห้าม route Local Config `21731`, metrics
14
+ `21732`, private IPC หรือ debug endpoint ออก public Namespace `/config` บน `21730`
15
+ ตอบ 404 ตามค่าเริ่มต้นและเปิดได้ชั่วคราวเฉพาะเมื่อเจ้าของสั่งตามหัวข้อถัดไป
13
16
 
14
17
  ## Public origin
15
18
 
@@ -42,6 +45,37 @@ dodo start --no-tunnel
42
45
  เปิดอยู่ได้ทันที และมีปุ่มหยุดเฉพาะ child ที่ process นี้เป็นเจ้าของ ช่องถูกล้างหลังส่ง
43
46
  Backend ตอบ `tokenStored:false` และไม่เขียนค่าลง config หรือ credential store
44
47
 
48
+ ## เปิด Remote Config ผ่าน Tunnel ชั่วคราว
49
+
50
+ ```bash
51
+ dodo --web
52
+ # Remote Config: https://mcp.example.com/config
53
+ # Pairing code (shown once): XXXX-XXXX-XXXX-XXXX
54
+
55
+ dodo web --status
56
+ dodo web --close
57
+ ```
58
+
59
+ `dodo --web` ทำงานได้สองกรณี: ถ้ายังไม่มี DODO process จะเริ่ม MCP ที่พอร์ต 21730,
60
+ Local Config ที่ 21731 และ Tunnel แล้วเปิด Remote Config; ถ้า process กำลังรันอยู่จะ
61
+ ใช้ authenticated private IPC เพื่อเปิดหรือต่ออายุ lease โดยไม่ restart MCP หาก
62
+ process เดิมเริ่มแบบ local-only คำสั่งจะถาม run-scoped Tunnel token แบบซ่อนและส่งให้
63
+ process ที่รันอยู่ครั้งเดียว Token ไม่ถูกบันทึกและไม่อยู่ใน argv หรือ audit
64
+
65
+ URL ไม่มี query/fragment secret ผู้ใช้ต้องกรอก pairing code ที่ terminal แสดง Code
66
+ มีอายุไม่เกิน 10 นาทีและใช้ได้ครั้งเดียว จากนั้น server ออก session cookie ที่เป็น
67
+ `Secure`, `HttpOnly`, `SameSite=Strict` และ `Path=/config` ตัว lease ปิดอัตโนมัติ
68
+ ภายใน 1 ชั่วโมง เมื่อหมดอายุ `/config`, assets และ owner API ใต้ namespace นี้กลับ
69
+ เป็น 404 การรัน `dodo --web` อีกครั้งยกเลิก code/session เดิมและออกชุดใหม่
70
+
71
+ Remote Config เป็น authenticated bridge ไปยัง Local Config เดิม การเขียนทุกครั้งยัง
72
+ ตรวจ workspace ID/epoch, owner validation และ policy ของ Local Config ไม่มี MCP tool
73
+ สำหรับเปิด lease และ `dodo web --close` ปิดเฉพาะหน้าเว็บ โดยไม่หยุด MCP หรือ Tunnel
74
+
75
+ ถ้ามี external tunnel ที่เจ้าของรันอยู่แล้วและไม่ต้องการให้ DODO เริ่ม cloudflared ใช้
76
+ `dodo start --web --no-tunnel` จาก interactive terminal การเลือกนี้บอกเพียงว่า route
77
+ ภายนอกมีอยู่แล้ว; DODO ไม่กล่าวอ้างหรือสร้าง route/DNS ให้เอง
78
+
45
79
  คำสั่งตรวจสถานะที่ไม่มี secret:
46
80
 
47
81
  ```bash
@@ -79,8 +113,13 @@ runtime ใช้ bounded restart หลัง `cloudflared` จบ retry ขอ
79
113
 
80
114
  ## หลายโปรเจกต์
81
115
 
82
- หนึ่ง DODO process มี active workspace เดียว ถ้าต้องการทำงานพร้อมกันหลายโปรเจกต์ ให้เปิดหลาย DODO processes ด้วย port, public origin และ config directory ที่แยกกัน แต่ละ managed tunnel ต้องใช้ metrics port ที่ไม่ซ้ำ ระบบจะไม่ให้ process หนึ่ง takeover root ที่อีก process กำลัง serve
116
+ หนึ่ง DODO process มี default workspace หนึ่งตัว แต่ Installation Runtime Manager เปิด
117
+ explicit target runtimes หลายโปรเจกต์พร้อมกันได้ภายใต้ project registry และ target
118
+ authority เดียวกัน จึงไม่ต้องสร้าง Tunnel แยกต่อโปรเจกต์ งานแต่ละ target ใช้
119
+ workspace identity/epoch, jobs และ mutation queue ของตัวเอง
83
120
 
84
121
  ## Security
85
122
 
86
- ห้ามปิด OAuth, ใช้ Tunnel token แทน MCP OAuth, ส่ง token ใน URL หรือเปิด CORS กว้าง Tunnel provider ไม่ได้แทน owner consent ของ DODO และ DODO ไม่เรียก Cloudflare API, ไม่จัดการ DNS, ไม่สร้าง/ลบ Tunnel และไม่เปิด firewall
123
+ ห้ามปิด OAuth, ใช้ Tunnel token แทน MCP OAuth, ส่ง token/pairing/session ใน URL หรือ
124
+ เปิด CORS กว้าง Tunnel provider ไม่ได้แทน owner consent ของ DODO และ DODO ไม่เรียก
125
+ Cloudflare API, ไม่จัดการ DNS, ไม่สร้าง/ลบ Tunnel และไม่เปิด firewall
package/docs/WINDOWS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DODO Windows Candidate — Deferred
2
2
 
3
- DODO MCP 1.0.1 ยังไม่ประกาศ native Windows support โค้ดและ tests สำหรับ Windows
3
+ DODO MCP 1.0.2 ยังไม่ประกาศ native Windows support โค้ดและ tests สำหรับ Windows
4
4
  บางส่วนมีอยู่เป็น candidate สำหรับ phase สุดท้าย แต่ยังไม่มีหลักฐานจาก Windows 11 จริง
5
5
  และ Linux Docker ไม่สามารถใช้แทนหลักฐาน Windows ได้
6
6
 
@@ -0,0 +1,47 @@
1
+ # ADR-047 — Temporary Remote Config on the tunneled listener
2
+
3
+ ## Status
4
+
5
+ Accepted in DODO MCP 1.0.2.
6
+
7
+ ## Context
8
+
9
+ The MCP/OAuth listener is already tunneled from `127.0.0.1:21730`, while Local Config
10
+ is intentionally bound to `127.0.0.1:21731`. Owners sometimes need to configure DODO
11
+ from another device. Permanently routing 21731 or placing its bearer capability in a
12
+ public URL would break the owner control boundary.
13
+
14
+ ## Decision
15
+
16
+ `dodo --web` opens a process-memory lease at `<public-origin>/config` for at most one
17
+ hour. The route is 404 before and after the lease. A random one-time pairing code is
18
+ shown only in the owner terminal; the server stores only its digest. Successful pairing
19
+ issues a random session cookie scoped to `/config` with Secure, HttpOnly and SameSite
20
+ Strict attributes. The server stores only the session digest.
21
+
22
+ The public handler is a bounded reverse proxy to the existing loopback Local Config.
23
+ It strips client credentials and proxy headers, injects the private loopback capability,
24
+ and leaves Local Config's workspace/epoch checks, validation, policy and audit as the
25
+ authority. Pairing never grants MCP scopes, project access, trust or approvals. No MCP
26
+ tool can open the lease.
27
+
28
+ When an already-running local-only DODO process receives `dodo --web`, the CLI reads a
29
+ temporary Tunnel token without echo, sends it once over authenticated owner IPC, and
30
+ the owning process starts `cloudflared`. The token is not persisted or placed in argv.
31
+ Closing or expiry affects only Remote Config; MCP, OAuth and Tunnel continue running.
32
+
33
+ ## Consequences
34
+
35
+ - The owner can choose local-only MCP, tunneled MCP, or tunneled MCP plus temporary
36
+ Remote Config without rebinding either listener.
37
+ - Reopening issues a new code/session and invalidates the previous pair.
38
+ - A live Cloudflare route and public HTTPS origin remain owner prerequisites.
39
+ - Anyone with both the public URL and current one-time code can pair during its short
40
+ validity, so owners must treat the code as a temporary secret and close the lease
41
+ when finished.
42
+
43
+ ## Evidence
44
+
45
+ - `tests/security/remoteConfig.test.ts`
46
+ - `tests/integration/remoteConfigUi.test.ts`
47
+ - `tests/integration/cli.test.ts`
@@ -62,3 +62,4 @@ decisions; ADR-011+ resolve implementation ambiguities without reducing security
62
62
  - [044 — Global launcher and interactive owner menu](044-global-launcher-and-cli-menu.md)
63
63
  - [045 — Explicit project runtimes and provider-backed sub-agents](045-ai-providers-multiproject.md)
64
64
  - [046 — Personal add-and-use mode](046-personal-access-mode.md)
65
+ - [047 — Temporary Remote Config on the tunneled listener](047-temporary-remote-config.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dodo-mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "author": "Arthittakun",
5
5
  "description": "DODO — local-first MCP server with multi-project coding, AI providers, sub-agents, context, memory, media and workflow tools; embedded OAuth and workspace permissions.",
6
6
  "type": "module",
@@ -40,6 +40,7 @@
40
40
  "docs/RUNTIME.md",
41
41
  "docs/RELEASE_1.0.0.md",
42
42
  "docs/RELEASE_1.0.1.md",
43
+ "docs/RELEASE_1.0.2.md",
43
44
  "docs/RELEASE_NOTES.md",
44
45
  "docs/SCHEDULES.md",
45
46
  "docs/SECURITY.md",