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/README.md +22 -5
- package/dist/cli/main.js +70 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/menu.js +10 -4
- package/dist/cli/menu.js.map +1 -1
- package/dist/server/appServer.js +70 -2
- package/dist/server/appServer.js.map +1 -1
- package/dist/server/configUi/app.js +19 -7
- package/dist/server/configUi/workbench.js +7 -4
- package/dist/server/ipcDispatch.js +25 -0
- package/dist/server/ipcDispatch.js.map +1 -1
- package/dist/server/remoteConfig.js +317 -0
- package/dist/server/remoteConfig.js.map +1 -0
- package/docs/AI_PROVIDERS.md +1 -1
- package/docs/ARCHITECTURE.md +17 -2
- package/docs/COMPATIBILITY.md +1 -1
- package/docs/MANUAL_ACCEPTANCE.md +25 -1
- package/docs/RELEASE_1.0.2.md +46 -0
- package/docs/RELEASE_NOTES.md +18 -0
- package/docs/SECURITY.md +18 -2
- package/docs/TEST_REPORT.md +29 -2
- package/docs/TUNNEL.md +42 -3
- package/docs/WINDOWS.md +1 -1
- package/docs/adr/047-temporary-remote-config.md +47 -0
- package/docs/adr/README.md +1 -0
- package/package.json +2 -1
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
|
|
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 มี
|
|
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
|
|
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.
|
|
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`
|
package/docs/adr/README.md
CHANGED
|
@@ -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.
|
|
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",
|