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/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, forwarded-header rejection และ rate limit ไม่มี Local Config/admin endpoint บน public MCP plane
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` เท่านั้น Local Config `21731`, metrics `21732` และ private IPC ไม่ถูก expose readiness บอกสถานะ Cloudflare connection เท่านั้น ไม่ใช่หลักฐานว่า AI client กำลังเชื่อมต่อ
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
 
@@ -2,7 +2,53 @@
2
2
 
3
3
  ## Scope
4
4
 
5
- รายงานนี้ใช้กับ DODO MCP 1.0.0 source และแยกผล automated กับ manual อย่างชัดเจน
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 v1.0.0 ที่ยังไม่ publish
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
- สถานะ real Cloudflare Tunnel บน macOS/Windows/Linux: `MANUAL_NOT_RUN`
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 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.0 ยังไม่ประกาศ 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
 
@@ -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. Windows has no
46
- DODO command sandbox; requested sandboxing fails closed. Schedules require an
47
- explicit unsandboxed specification and separate local owner approval. Desktop
48
- and macOS speech remain unsupported on Windows; no silent privilege downgrade.
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. Add an allow-failure
54
- Windows Node 22/24 CI evidence job first; do not skip entire legacy suites to
55
- produce green results. Only after native tests and Windows 11 manual acceptance
56
- may that job become required and documentation say supported.
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
- non-secret ignored evidence และไม่มีขั้น publish npm
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`
@@ -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.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",