dodo-mcp 1.0.0 → 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 +33 -2
- package/docs/COMPATIBILITY.md +1 -1
- package/docs/MANUAL_ACCEPTANCE.md +25 -1
- package/docs/RELEASE_1.0.1.md +46 -0
- package/docs/RELEASE_1.0.2.md +46 -0
- package/docs/RELEASE_NOTES.md +42 -0
- package/docs/SECURITY.md +30 -2
- package/docs/TEST_REPORT.md +51 -3
- package/docs/TUNNEL.md +42 -3
- package/docs/WINDOWS.md +1 -1
- package/docs/adr/030-windows-native-candidate.md +10 -8
- package/docs/adr/043-trusted-self-hosted-platform-gates.md +21 -1
- package/docs/adr/047-temporary-remote-config.md +47 -0
- package/docs/adr/README.md +1 -0
- package/package.json +3 -1
package/docs/SECURITY.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# DODO MCP — Security
|
|
2
2
|
|
|
3
|
+
## Release evidence privacy
|
|
4
|
+
|
|
5
|
+
The DODO release-gate and Linux Docker-driver scripts capture child stdout/stderr and failure diagnostics in private
|
|
6
|
+
ignored logs. CI readiness does not dump Docker/host details. Only an explicitly
|
|
7
|
+
allowlisted `public-summary.json` is uploaded, with seven-day retention: revision,
|
|
8
|
+
lock/code fingerprint, platform/architecture/Node, step exit codes, test counts
|
|
9
|
+
including skips, audit counts and package hashes. Arbitrary error messages,
|
|
10
|
+
command arguments, test names, owner paths and runner identity are not copied.
|
|
11
|
+
Raw evidence is not suitable for public upload. GitHub's automatic Set up job
|
|
12
|
+
machine-name output and previously published logs require separate owner action;
|
|
13
|
+
these changes do not erase historical disclosures.
|
|
14
|
+
|
|
3
15
|
## Security model
|
|
4
16
|
|
|
5
17
|
DODO ใช้หลายชั้นร่วมกัน:
|
|
@@ -35,7 +47,19 @@ request ที่อ้าง target ไม่มี ACL ถูกปฏิเ
|
|
|
35
47
|
|
|
36
48
|
MCP และ public route ต้องผ่าน OAuth เสมอ ห้ามใช้ localhost เป็น authentication, ห้ามเปิด CORS เป็น `*`, ห้ามส่ง token ใน query string และห้าม trust proxy headers จากภายนอก
|
|
37
49
|
|
|
38
|
-
Local Config bind loopback ใช้ private capability token, expiration, Host/Origin checks,
|
|
50
|
+
Local Config bind loopback ใช้ private capability token, expiration, Host/Origin checks,
|
|
51
|
+
forwarded-header rejection และ rate limit Public listener ไม่มี owner route ที่ active
|
|
52
|
+
ตามค่าเริ่มต้น เมื่อเจ้าของสั่ง `dodo --web` จะเปิดเฉพาะ namespace `/config` แบบ
|
|
53
|
+
process-memory lease ไม่เกิน 1 ชั่วโมง และกลับเป็น 404 เมื่อปิดหรือหมดอายุ
|
|
54
|
+
|
|
55
|
+
Remote Config ใช้ pairing code สุ่มแบบใช้ครั้งเดียว เก็บใน server เฉพาะ SHA-256 digest
|
|
56
|
+
และแลกเป็น session token ที่ server เก็บเฉพาะ digest Cookie เป็น `Secure`, `HttpOnly`,
|
|
57
|
+
`SameSite=Strict`, `Path=/config`; code/session ไม่อยู่ใน URL, config, browser storage,
|
|
58
|
+
log หรือ audit Proxy ส่งต่อไป Local Config ด้วย capability ภายใน และลอก client
|
|
59
|
+
Authorization/Cookie/Origin/Cloudflare/forwarded headers ออกก่อน ทุก mutation จึงยัง
|
|
60
|
+
ต้องผ่าน workspace/epoch binding และ owner API validation เดิม มี rate limit ที่
|
|
61
|
+
pairing endpoint และ CSP/no-store/frame denial บนทุก response ไม่มี MCP operation เปิด
|
|
62
|
+
หรือยืด lease ได้; เฉพาะ authenticated private IPC/CLI ของเจ้าของเท่านั้น
|
|
39
63
|
|
|
40
64
|
UI assets เสิร์ฟจากแพ็กเกจเองทั้งหมดรวมถึง SweetAlert2 ที่ vendor แบบ pin version (ไม่มี CDN; CSP ยังเป็น `script-src 'self'; style-src 'self'` โดยไม่มี `unsafe-inline`/`unsafe-eval`) เส้นทาง `/assets` เป็น fail-closed: path ที่ decode แล้วต้องตรงรูปแบบเข้มงวด (ลึกได้หนึ่งระดับเฉพาะ `ui/`, `vendor/`), นามสกุลอยู่ใน allowlist (`.css/.js/.svg`), ปฏิเสธ `..`, backslash, NUL และไฟล์ที่ resolve ออกนอก UI directory ทั้งหมดตอบ 404 ข้อความจาก server/paths/client/provider ทุกตัว render ผ่าน `textContent` (SweetAlert ใช้ `titleText`/`text` เท่านั้น ไม่ใช้ `html`) กล่องยืนยันของ UI เป็นชั้น UX เพิ่มเติม ไม่แทนที่ approval/validation ฝั่ง server
|
|
41
65
|
|
|
@@ -208,7 +232,11 @@ Response/config/audit เก็บเฉพาะสถานะที่ไม
|
|
|
208
232
|
ควบคุม tunnel หน้าเว็บเริ่ม network process เฉพาะเมื่อ owner กด “เปิด Tunnel รอบนี้”
|
|
209
233
|
และการตั้ง startup preference ไม่เริ่ม network process
|
|
210
234
|
|
|
211
|
-
Tunnel route ต้องชี้ทุก public path ไป MCP/OAuth listener `127.0.0.1:21730` เท่านั้น
|
|
235
|
+
Tunnel route ต้องชี้ทุก public path ไป MCP/OAuth listener `127.0.0.1:21730` เท่านั้น
|
|
236
|
+
Local Config `21731`, metrics `21732` และ private IPC ไม่ถูก expose `/config` ที่
|
|
237
|
+
listener 21730 เป็น bounded bridge ที่ปิดเป็น 404 โดยค่าเริ่มต้นและไม่ทำให้พอร์ต 21731
|
|
238
|
+
รับ network ภายนอก readiness บอกสถานะ Cloudflare connection เท่านั้น ไม่ใช่หลักฐานว่า
|
|
239
|
+
AI client กำลังเชื่อมต่อ
|
|
212
240
|
|
|
213
241
|
## Setup and existing-state import
|
|
214
242
|
|
package/docs/TEST_REPORT.md
CHANGED
|
@@ -2,7 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
## Scope
|
|
4
4
|
|
|
5
|
-
รายงานนี้ใช้กับ DODO MCP 1.0.
|
|
5
|
+
รายงานนี้ใช้กับ DODO MCP 1.0.2 source และแยกผล automated กับ manual อย่างชัดเจน
|
|
6
|
+
|
|
7
|
+
## Release 1.0.2 — Temporary Remote Config
|
|
8
|
+
|
|
9
|
+
เพิ่ม owner-paired `/config` bridge บน listener 21730 ที่ปิดเป็น 404 ตามค่าเริ่มต้น
|
|
10
|
+
และเปิดได้ครั้งละไม่เกินหนึ่งชั่วโมงด้วย `dodo --web` โดย Local Config 21731 ยังคง
|
|
11
|
+
bind loopback เท่านั้น `dodo --web` ต่ออายุผ่าน authenticated installation IPC โดย
|
|
12
|
+
ไม่ restart MCP และเริ่ม process-owned Tunnel ด้วย token ชั่วคราวเมื่อ process เดิม
|
|
13
|
+
เริ่มแบบ local-only
|
|
14
|
+
|
|
15
|
+
- typecheck และ targeted lint: **AUTOMATED_PASS**
|
|
16
|
+
- `tests/security/remoteConfig.test.ts`: **AUTOMATED_PASS** — absent-by-default,
|
|
17
|
+
one-time pairing, strict cookie/CSP, unauthorized asset/API, cross-site denial,
|
|
18
|
+
workspace/epoch binding, expiry/close, IPC renewal, token/pairing non-persistence
|
|
19
|
+
และ run-scoped Tunnel handoff
|
|
20
|
+
- `tests/integration/remoteConfigUi.test.ts`: **AUTOMATED_PASS** ใน Chromium จริง —
|
|
21
|
+
pairing และ dashboard จริงที่ 1440×900/390×844, no console errors, no horizontal
|
|
22
|
+
overflow, close → 404; screenshots อยู่ใน ignored local release evidence
|
|
23
|
+
- `tests/integration/cli.test.ts`: bounded `--web`, `web --status`, `web --close`
|
|
24
|
+
contract ผ่าน
|
|
25
|
+
- `npm run test:all`: **AUTOMATED_PASS** — 98 files ผ่าน, 3 files ข้ามตาม platform;
|
|
26
|
+
677 tests ผ่าน, 34 skipped, 0 failed และ packaging 16/16
|
|
27
|
+
- `npm audit --omit=dev`: **AUTOMATED_PASS** — 0 vulnerabilities
|
|
28
|
+
- npm pack manifest: **AUTOMATED_PASS** — รวม `dist/server/remoteConfig.js`, Local
|
|
29
|
+
Config UI, ADR-047 และ release note; release evidence/state/credentials ไม่อยู่ใน manifest
|
|
30
|
+
- public Cloudflare hostname → Remote Config บนอุปกรณ์ภายนอก: **MANUAL_NOT_RUN**
|
|
31
|
+
|
|
32
|
+
## Release 1.0.1 platform gate — 2026-09-15
|
|
33
|
+
|
|
34
|
+
- macOS local, Node 22: **AUTOMATED_PASS** — core 669 passed / 0 failed / 34 skipped,
|
|
35
|
+
packaging 16/16, production audit 0 vulnerabilities, DodoBench 7/7 และ fresh
|
|
36
|
+
exact-tarball install ผ่าน
|
|
37
|
+
- Windows native self-hosted, Node 22: **AUTOMATED_PASS** — core 671 passed / 0 failed /
|
|
38
|
+
32 skipped, packaging 16/16, production audit 0 vulnerabilities, DodoBench 7/7
|
|
39
|
+
และ fresh install ผ่าน
|
|
40
|
+
- Windows native self-hosted, Node 24: **AUTOMATED_PASS** — core 671 passed / 0 failed /
|
|
41
|
+
32 skipped, packaging 16/16, production audit 0 vulnerabilities, DodoBench 7/7
|
|
42
|
+
และ fresh install ผ่าน
|
|
43
|
+
- Linux Docker: ใช้หลักฐาน gate ที่ผ่านก่อนหน้าและไม่มี runtime source เปลี่ยนหลังจากนั้น;
|
|
44
|
+
release นี้ไม่ได้รัน Linux ซ้ำตามขอบเขต platform follow-up ที่เจ้าของกำหนด
|
|
45
|
+
- Windows manual acceptance บน desktop/permission จริงและ live AI providers:
|
|
46
|
+
**MANUAL_NOT_RUN**
|
|
47
|
+
|
|
48
|
+
Windows CI แก้ persistent-checkout line-ending drift โดยบังคับ canonical Git bytes และ
|
|
49
|
+
ตรวจ clean index ก่อนสร้าง source fingerprint ไม่มีการลด security assertion หรือข้าม
|
|
50
|
+
release gate ส่วน GitHub artifact upload อาจไม่เกิดเมื่อ storage quota เต็ม แต่ sanitized
|
|
51
|
+
summary ยังคงอยู่ใน job log และผล gate ไม่อาศัย artifact upload
|
|
6
52
|
|
|
7
53
|
## Optional Sub-agent MCP exposure — 2026-09-14
|
|
8
54
|
|
|
@@ -48,7 +94,7 @@ OAuth scope, ACL, trust, profile authority, approval หรือข้าม gu
|
|
|
48
94
|
|
|
49
95
|
## AI Providers / Multi-project — current source verification
|
|
50
96
|
|
|
51
|
-
วันที่ 2026-09-14 บน macOS, Node 22.23.2; source
|
|
97
|
+
วันที่ 2026-09-14 บน macOS, Node 22.23.2; source baseline ก่อน release 1.0.1
|
|
52
98
|
|
|
53
99
|
| Gate | ผล |
|
|
54
100
|
|---|---|
|
|
@@ -301,7 +347,9 @@ candidate บน Node 22/24 โดยไม่รับ untrusted pull requests
|
|
|
301
347
|
|
|
302
348
|
สถานะ manual setup/import บน owner state จริง: `MANUAL_NOT_RUN` การตรวจรับใช้ isolated fixtures และ temporary package เท่านั้น ไม่มีการเปลี่ยน owner config, OAuth state, tunnel, DNS หรือ global installation
|
|
303
349
|
|
|
304
|
-
สถานะ
|
|
350
|
+
สถานะ live Cloudflare connection/clean-stop smoke บน macOS/Windows/Linux:
|
|
351
|
+
`MANUAL_PASS` (2026-09-15, run 34908481066); public DNS → MCP/OAuth/Remote Config
|
|
352
|
+
end-to-end บนอุปกรณ์ภายนอก: `MANUAL_NOT_RUN`
|
|
305
353
|
|
|
306
354
|
สถานะ multi-project federation ผ่าน external AI และ owner project จริง: `MANUAL_NOT_RUN`
|
|
307
355
|
|
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
|
|
|
@@ -42,18 +42,20 @@ budget, never deleting a destination or clearing read-only attributes to force
|
|
|
42
42
|
a write. Preserve BOM and CRLF bytes in source edits.
|
|
43
43
|
|
|
44
44
|
OAuth, workspace/client ACLs, trust modes, per-action approvals, journals and
|
|
45
|
-
compact/hybrid/full exposure retain their existing authority.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
compact/hybrid/full exposure retain their existing authority. The current
|
|
46
|
+
candidate includes Windows sandbox integration with native status/confinement
|
|
47
|
+
receipt checks, a C# desktop helper and SAPI speech. These are optional backends:
|
|
48
|
+
missing prerequisites or required confinement must fail closed, not silently
|
|
49
|
+
run unsandboxed. Source availability is not proof of positive native acceptance;
|
|
50
|
+
see WINDOWS.md for outstanding Windows 11, desktop and confinement gates.
|
|
49
51
|
|
|
50
52
|
## Compatibility and rollout
|
|
51
53
|
|
|
52
54
|
The project keeps its current baseline while the Windows support status remains
|
|
53
|
-
EXPERIMENTAL until the proposal's native gates pass.
|
|
54
|
-
|
|
55
|
-
produce green results.
|
|
56
|
-
|
|
55
|
+
EXPERIMENTAL until the proposal's native gates pass. The current Windows Node
|
|
56
|
+
22/24 CI jobs fail the workflow on test failure; do not skip legacy assertions
|
|
57
|
+
to produce green results. A green automated workflow does not replace Windows 11
|
|
58
|
+
manual acceptance or by itself permit documentation to say supported.
|
|
57
59
|
|
|
58
60
|
The IPC protocol intentionally has no unauthenticated fallback. Owners
|
|
59
61
|
must stop running servers from the existing installation or terminal before
|
|
@@ -16,10 +16,17 @@ self-hosted runner มีความเสี่ยงต่อเครื่
|
|
|
16
16
|
ทุก job ใช้ `contents: read`, checkout ไม่ persist credentials และ action dependency
|
|
17
17
|
ถูก pin ด้วย full commit SHA
|
|
18
18
|
|
|
19
|
+
`push main` และ manual dispatch ค่าเริ่มต้นรันเฉพาะ Windows Node 22/24
|
|
20
|
+
ยอมรับผล Linux Docker ที่ตรวจในเครื่องได้โดยไม่บังคับทดสอบ Linux X64 ซ้ำ
|
|
21
|
+
หากต้องการ remote Linux เพิ่ม เจ้าของเลือก `platform=linux` หรือ `all`
|
|
22
|
+
ใน manual dispatch ได้ การเลือก job ไม่เปลี่ยนผลหรือ identity ของ evidence เดิม
|
|
23
|
+
|
|
19
24
|
Linux runner label `linux-ci` รัน release gate ภายใน Docker image เดิมบน Node 22/24
|
|
20
25
|
Windows runner label `windows-ci 02` รัน native candidate release gate บน Node 22/24
|
|
21
26
|
พร้อมตรวจ enabled Administrator token สำหรับ ACL tests ทั้งสอง job upload เฉพาะ
|
|
22
|
-
|
|
27
|
+
`public-summary.json` ที่สร้างด้วย explicit field allowlist และกำหนด retention
|
|
28
|
+
7 วัน ไม่ upload raw logs, runner identity, state หรือ evidence directory ทั้งชุด
|
|
29
|
+
ไม่มีขั้น publish npm
|
|
23
30
|
|
|
24
31
|
macOS ยังคงเป็น local release gate Strict release readiness ต้องมี macOS กับ Linux
|
|
25
32
|
evidence จาก clean revision และ dependency lock เดียวกัน Windows automated result
|
|
@@ -36,3 +43,16 @@ PR checks ภายหลังต้องใช้ disposable isolated runner
|
|
|
36
43
|
`.github/workflows/platform-gates.yml`, `scripts/test-linux-docker.mjs` และ
|
|
37
44
|
`scripts/release-gate.mjs` บันทึก platform, runner origin, revision, lock digest,
|
|
38
45
|
test/package/audit/fresh-install results โดยไม่เก็บ token
|
|
46
|
+
|
|
47
|
+
## Evidence/privacy update
|
|
48
|
+
|
|
49
|
+
Readiness ไม่ dump `docker info`; gate/Docker child diagnostics รวม error paths
|
|
50
|
+
เก็บเฉพาะใน private logs Public summary ไม่รับ error strings, command arguments,
|
|
51
|
+
test names หรือ host identity จากรายงานดิบ และตรวจ machine-test counts กับ
|
|
52
|
+
assertion results ก่อนรับรองผ่าน แต่ GitHub runner ยังแสดง Machine name ใน
|
|
53
|
+
Set up job ก่อน workflow steps; owner ต้องจัดการ hostname และ logs เก่าแยก
|
|
54
|
+
การเปลี่ยน source นี้ไม่ลบสิ่งที่เคยเผยแพร่แล้ว
|
|
55
|
+
|
|
56
|
+
Gate บันทึก code/test/gate fingerprint สำหรับ dirty candidate เพิ่มจาก HEAD/lock
|
|
57
|
+
และตรวจอีกครั้งตอนจบ Docker ตรวจ fingerprint ของไฟล์ที่ COPY จริงกับ host
|
|
58
|
+
ไม่ใช้ HEAD เดิมรับรอง uncommitted source คนละชุด และไม่เปลี่ยน release policy
|
|
@@ -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",
|
|
@@ -39,6 +39,8 @@
|
|
|
39
39
|
"docs/RESOURCES.md",
|
|
40
40
|
"docs/RUNTIME.md",
|
|
41
41
|
"docs/RELEASE_1.0.0.md",
|
|
42
|
+
"docs/RELEASE_1.0.1.md",
|
|
43
|
+
"docs/RELEASE_1.0.2.md",
|
|
42
44
|
"docs/RELEASE_NOTES.md",
|
|
43
45
|
"docs/SCHEDULES.md",
|
|
44
46
|
"docs/SECURITY.md",
|