dodo-mcp 1.2.0 → 1.3.0

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 (147) hide show
  1. package/README.md +45 -6
  2. package/dist/cli/dataRecovery.js +38 -0
  3. package/dist/cli/dataRecovery.js.map +1 -0
  4. package/dist/cli/deployment.js +61 -0
  5. package/dist/cli/deployment.js.map +1 -0
  6. package/dist/cli/main.js +35 -1
  7. package/dist/cli/main.js.map +1 -1
  8. package/dist/config/globalConfig.js +8 -0
  9. package/dist/config/globalConfig.js.map +1 -1
  10. package/dist/errors.js +1 -1
  11. package/dist/errors.js.map +1 -1
  12. package/dist/ipc/server.js +2 -0
  13. package/dist/ipc/server.js.map +1 -1
  14. package/dist/ipc/timeouts.js +5 -0
  15. package/dist/ipc/timeouts.js.map +1 -0
  16. package/dist/platform/privateFs.js +32 -3
  17. package/dist/platform/privateFs.js.map +1 -1
  18. package/dist/platform/windowsPrivateAcl.js +90 -0
  19. package/dist/platform/windowsPrivateAcl.js.map +1 -0
  20. package/dist/security/outboundAddress.js +20 -0
  21. package/dist/security/outboundAddress.js.map +1 -0
  22. package/dist/server/aiAdmin.js +35 -10
  23. package/dist/server/aiAdmin.js.map +1 -1
  24. package/dist/server/appServer.js +11 -3
  25. package/dist/server/appServer.js.map +1 -1
  26. package/dist/server/bootstrap.js +14 -0
  27. package/dist/server/bootstrap.js.map +1 -1
  28. package/dist/server/configUi/index.html +3 -0
  29. package/dist/server/configUi/ui/dataRecovery.js +90 -0
  30. package/dist/server/configUi/ui/deployment.js +111 -0
  31. package/dist/server/configUi/ui/recovery.js +167 -0
  32. package/dist/server/configUi/workbench.css +28 -1
  33. package/dist/server/configUi/workbench.js +136 -25
  34. package/dist/server/installationRuntime.js +3 -1
  35. package/dist/server/installationRuntime.js.map +1 -1
  36. package/dist/server/instructions.js +6 -2
  37. package/dist/server/instructions.js.map +1 -1
  38. package/dist/server/ipcDispatch.js +219 -0
  39. package/dist/server/ipcDispatch.js.map +1 -1
  40. package/dist/server/localConfig.js +1 -1
  41. package/dist/server/localConfig.js.map +1 -1
  42. package/dist/server/stdioServer.js +11 -3
  43. package/dist/server/stdioServer.js.map +1 -1
  44. package/dist/services/ai/network.js +1 -18
  45. package/dist/services/ai/network.js.map +1 -1
  46. package/dist/services/ai/subagents.js +5 -2
  47. package/dist/services/ai/subagents.js.map +1 -1
  48. package/dist/services/assistance/verification.js +43 -10
  49. package/dist/services/assistance/verification.js.map +1 -1
  50. package/dist/services/changes/applier.js +472 -297
  51. package/dist/services/changes/applier.js.map +1 -1
  52. package/dist/services/git/gitService.js +150 -34
  53. package/dist/services/git/gitService.js.map +1 -1
  54. package/dist/services/jobs/jobManager.js +59 -2
  55. package/dist/services/jobs/jobManager.js.map +1 -1
  56. package/dist/services/jobs/spool.js +9 -3
  57. package/dist/services/jobs/spool.js.map +1 -1
  58. package/dist/services/multimodal/mediaService.js +6 -6
  59. package/dist/services/multimodal/mediaService.js.map +1 -1
  60. package/dist/services/recovery/configKeys.js +115 -0
  61. package/dist/services/recovery/configKeys.js.map +1 -0
  62. package/dist/services/recovery/configVault.js +361 -0
  63. package/dist/services/recovery/configVault.js.map +1 -0
  64. package/dist/services/recovery/contracts.js +24 -0
  65. package/dist/services/recovery/contracts.js.map +1 -0
  66. package/dist/services/recovery/databaseAwareness.js +179 -0
  67. package/dist/services/recovery/databaseAwareness.js.map +1 -0
  68. package/dist/services/recovery/deploymentArchive.js +129 -0
  69. package/dist/services/recovery/deploymentArchive.js.map +1 -0
  70. package/dist/services/recovery/deploymentContracts.js +70 -0
  71. package/dist/services/recovery/deploymentContracts.js.map +1 -0
  72. package/dist/services/recovery/deploymentHealth.js +143 -0
  73. package/dist/services/recovery/deploymentHealth.js.map +1 -0
  74. package/dist/services/recovery/deploymentMaintenance.js +197 -0
  75. package/dist/services/recovery/deploymentMaintenance.js.map +1 -0
  76. package/dist/services/recovery/deploymentService.js +429 -0
  77. package/dist/services/recovery/deploymentService.js.map +1 -0
  78. package/dist/services/recovery/deploymentSource.js +36 -0
  79. package/dist/services/recovery/deploymentSource.js.map +1 -0
  80. package/dist/services/recovery/dockerDeployment.js +172 -0
  81. package/dist/services/recovery/dockerDeployment.js.map +1 -0
  82. package/dist/services/recovery/drift.js +178 -0
  83. package/dist/services/recovery/drift.js.map +1 -0
  84. package/dist/services/recovery/evidence.js +127 -0
  85. package/dist/services/recovery/evidence.js.map +1 -0
  86. package/dist/services/recovery/gitCopies.js +219 -0
  87. package/dist/services/recovery/gitCopies.js.map +1 -0
  88. package/dist/services/recovery/history.js +423 -0
  89. package/dist/services/recovery/history.js.map +1 -0
  90. package/dist/services/recovery/recoveryService.js +521 -0
  91. package/dist/services/recovery/recoveryService.js.map +1 -0
  92. package/dist/services/recovery/storage.js +344 -0
  93. package/dist/services/recovery/storage.js.map +1 -0
  94. package/dist/services/schedules/scheduleService.js +9 -10
  95. package/dist/services/schedules/scheduleService.js.map +1 -1
  96. package/dist/store/db.js +71 -0
  97. package/dist/store/db.js.map +1 -1
  98. package/dist/tools/catalog.js +4 -0
  99. package/dist/tools/catalog.js.map +1 -1
  100. package/dist/tools/changeTools.js +1 -1
  101. package/dist/tools/changeTools.js.map +1 -1
  102. package/dist/tools/context.js +23 -3
  103. package/dist/tools/context.js.map +1 -1
  104. package/dist/tools/deploymentTools.js +58 -0
  105. package/dist/tools/deploymentTools.js.map +1 -0
  106. package/dist/tools/directTools.js +9 -5
  107. package/dist/tools/directTools.js.map +1 -1
  108. package/dist/tools/gitTools.js +7 -2
  109. package/dist/tools/gitTools.js.map +1 -1
  110. package/dist/tools/jobTools.js +4 -4
  111. package/dist/tools/jobTools.js.map +1 -1
  112. package/dist/tools/projectTools.js +1 -0
  113. package/dist/tools/projectTools.js.map +1 -1
  114. package/dist/tools/recoveryTools.js +79 -0
  115. package/dist/tools/recoveryTools.js.map +1 -0
  116. package/dist/tools/runtimeTools.js +1 -1
  117. package/dist/tools/runtimeTools.js.map +1 -1
  118. package/dist/tools/surface.js +101 -41
  119. package/dist/tools/surface.js.map +1 -1
  120. package/dist/tunnel/credentials.js +1 -1
  121. package/dist/tunnel/credentials.js.map +1 -1
  122. package/docs/AI_PROVIDERS.md +6 -3
  123. package/docs/ARCHITECTURE.md +88 -4
  124. package/docs/CI.md +118 -0
  125. package/docs/COMPATIBILITY.md +7 -6
  126. package/docs/EVALUATION.md +17 -12
  127. package/docs/MANUAL_ACCEPTANCE.md +59 -2
  128. package/docs/RECOVERY.md +448 -0
  129. package/docs/RELEASE_1.2.1.md +47 -0
  130. package/docs/RELEASE_1.3.0.md +64 -0
  131. package/docs/RELEASE_NOTES.md +41 -0
  132. package/docs/SECURITY.md +122 -0
  133. package/docs/TEST_REPORT.md +327 -5
  134. package/docs/WEB_CLIENTS.md +6 -1
  135. package/docs/adr/051-source-recovery-foundation.md +45 -0
  136. package/docs/adr/052-reviewed-source-restore.md +50 -0
  137. package/docs/adr/053-content-drift-and-private-git-recovery.md +29 -0
  138. package/docs/adr/054-verified-source-checkpoints.md +58 -0
  139. package/docs/adr/055-reviewed-docker-deployments.md +42 -0
  140. package/docs/adr/056-owner-data-recovery.md +47 -0
  141. package/docs/adr/README.md +7 -0
  142. package/native/private-state-windows.cs +105 -0
  143. package/package.json +7 -1
  144. package/schemas/global-config.schema.json +44 -0
  145. package/schemas/tools.compact.json +175 -15
  146. package/schemas/tools.hybrid.json +350 -16
  147. package/schemas/tools.json +4883 -816
@@ -0,0 +1,448 @@
1
+ # Recovery: source, deployments and private configuration
2
+
3
+ This documents the 1.3.0 source candidate. Publication and supported-platform
4
+ results are recorded separately in [release notes](RELEASE_1.3.0.md) and
5
+ [the test report](TEST_REPORT.md). Source backup is default-on for registered
6
+ projects; deployment/database/config adapters require separate owner opt-in.
7
+
8
+ Registered projects default to automatic source backups on first activation.
9
+ Existing projects without a Recovery policy also default to enabled; an explicit
10
+ owner opt-out persists. Merely starting DODO from an arbitrary directory does
11
+ not scan that directory, the launcher workspace, or your home directory.
12
+
13
+ In Local Config, select a project and open **Recovery · สำรอง source**. The card
14
+ shows initializing, ready, blocked, or disabled by owner, the last saved
15
+ checkpoint (integrity checked at capture), included/excluded counts and logical project storage. Advanced
16
+ settings cover the project's quota, retention, and relative runtime/data roots.
17
+ Installation storage/free-space limits are under Settings → system JSON →
18
+ `recovery`. Changing that configuration never grants access to source or commands.
19
+
20
+ From the registered project's directory, while its server is running:
21
+
22
+ ```sh
23
+ dodo recovery status
24
+ dodo recovery checkpoint
25
+ dodo recovery configure --enabled false --yes
26
+ dodo recovery configure --enabled true --yes
27
+ ```
28
+
29
+ These commands use private owner IPC. There are no public MCP tools for changing
30
+ Recovery policy. Disabling requires owner confirmation, is audited, preserves
31
+ old points and does not turn off the existing file journal. Re-enabling schedules
32
+ a new baseline; saving a preference alone does not mean a backup has completed.
33
+
34
+ Writes and directory creation capture their targets before mutation. Commands,
35
+ verification recipes, runtime/media jobs, schedules, and Git commits capture the
36
+ source scope before executing. These paths keep the shared project mutation queue,
37
+ authorization, hash/conflict and sandbox checks. A caller cannot bypass backups
38
+ by hiding an operation from discover or selecting a more permissive trust mode.
39
+
40
+ Backups hold actual independent bytes, modes and existence tombstones in private
41
+ `recovery/objects`, with versioned manifests and SQLite references separate from
42
+ resource/media cache. No working Git repository, branch or commit is modified, and nothing is pushed.
43
+ Independent private Git copies are described below.
44
+ Deleting a working file does not delete its backup. Hash verification and a source
45
+ rescan precede readiness. Corruption, changing files, scan limits, insufficient
46
+ disk space or a failed backup stop the pending source mutation.
47
+
48
+ Defaults: 5 GiB of referenced objects per project, 20 GiB physical objects per
49
+ installation, 500 MiB free-space floor, 30 days/200 unpinned points, 64 MiB per
50
+ file, and 100,000 scanned entries. Reservations account for concurrent projects
51
+ and temporary copies. Content is deduplicated; the newest full baseline, newest
52
+ point and pinned points are retained. Unreferenced objects/staging have a 24-hour
53
+ grace period and are collected only without active captures. Storage reclamation
54
+ can therefore require waiting or extra space; it never evicts protected points
55
+ just to allow another write.
56
+
57
+ This is **source-only coverage**. Default exclusions include secret/protected
58
+ paths, `.git`, dependencies/build/cache directories, database/dump/log files and
59
+ owner-declared data roots. Ordinary ignore rules reduce baseline scanning; an
60
+ explicit allowed source target is captured even if ordinarily ignored. Explicit
61
+ targets excluded by the source/data policy are refused while protection is on.
62
+ Do not interpret this as a backup of databases, volumes, secrets, OS settings,
63
+ Desktop/ADB effects or remote systems.
64
+
65
+ Credential screening is bounded and heuristic, not a guarantee that every
66
+ secret is recognizable. Backup storage has the same private filesystem/ACL
67
+ requirements as DODO state. It is not protected against an administrator or the
68
+ same OS owner intentionally tampering with both data and metadata.
69
+
70
+ A checkpoint is not an atomic filesystem-wide snapshot. DODO queues its own
71
+ writers but cannot stop an IDE or unrelated process. It verifies paths, identity,
72
+ hashes and inventory; detected drift fails closed. Modes are preserved, not all
73
+ ACLs/xattrs/alternate streams. On Windows directory fsync is unavailable. Private
74
+ Git copy files use write-capable handles for mandatory file flushes, with fresh
75
+ ACL and file identity checks. See [platform evidence](TEST_REPORT.md) for the
76
+ tested revision; a macOS/Linux result alone does not certify Windows.
77
+
78
+ An abrupt restart marks incomplete captures as incomplete, releases only the
79
+ leased project's abandoned reservation, and rebuilds/rechecks the active
80
+ baseline. It never repeats a command. It cannot recover source lost before the
81
+ first complete backup. Use the reviewed flow below rather than copying private
82
+ backup objects directly into the workspace.
83
+
84
+ ## Preview and restore
85
+
86
+ On the selected project's Recovery card, choose checkpoint or session history,
87
+ optionally select a relative file/directory, then click **ดู preview**. Review the
88
+ create/modify/delete list, diffs, hashes and conflicts before **กู้คืนตามแผนนี้**.
89
+ Confirmation applies only that immutable plan. Changed files refuse the selection;
90
+ there is no force overwrite or automatic merge. Use the journal status button
91
+ after reconnect or an uncertain response, rather than sending another apply.
92
+
93
+ CLI (private owner IPC; capture the IDs from preview):
94
+
95
+ ```sh
96
+ dodo recovery list
97
+ dodo recovery list --sessions
98
+ dodo recovery preview SNAPSHOT_ID --path src
99
+ dodo recovery preview SESSION_ID --session
100
+ dodo recovery apply PLAN_ID --hash PLAN_HASH --key SAME_RETRY_KEY --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
101
+ ```
102
+
103
+ `--exact-mirror` is an explicit preview option for a full-source checkpoint. It
104
+ includes deletion of extra allowed source files. The default preserves unrelated
105
+ extras; excluded secrets, databases, runtime data and volumes remain excluded.
106
+ Recovery must be enabled to apply, so a verified pre-restore backup is mandatory.
107
+ Binary source files are restored as exact bytes within the existing file/plan
108
+ budgets. Oversized selections fail with a smaller-selection hint, never truncate.
109
+
110
+ MCP full operations: `checkpoint_list`, `checkpoint_inspect`, `checkpoint_create`,
111
+ `recovery_session_list`, `recovery_session_inspect`, `recovery_session_begin`,
112
+ `recovery_session_end`, `restore_preview`, `restore_apply`, `restore_status`.
113
+ Use the existing `dodo_read` and `dodo_write` compact gateways and discover schemas.
114
+ Full catalog: 158 capabilities (154 with sub-agents hidden); Compact remains 20.
115
+ Gateway arguments cannot override top-level workspace/project/recovery context.
116
+
117
+ For several edits belonging to one task, call `recovery_session_begin`, then pass
118
+ its `sessionId` as top-level `recoverySessionId` on each mutation. Close it with
119
+ `recovery_session_end`. Calls without this context retain automatic before-images
120
+ in separate implicit sessions. Different conversations are never guessed to be
121
+ one task. Session undo preserves pre-existing dirty/untracked files and coalesces
122
+ repeated edits, moves, creations and deletions; external/interleaved edits conflict.
123
+ Shell jobs have unknown authorship: session-wide undo is refused when jobs appear,
124
+ but a specific checkpoint can still be reviewed. External effects are never undone.
125
+
126
+ Only your own historical records are exposed over MCP, under current target ACLs.
127
+ Private owner controls can review other callers' records. Session/snapshot/plan
128
+ IDs grant no permission. Inspect mode still requires approval of the exact restore
129
+ plan; read-only clients cannot restore. Old journal-only `rollback_changes` and
130
+ `dodo recover` remain available. Directory journal changes use the reviewed recovery
131
+ flow; directories created implicitly as file parents may be retained conservatively.
132
+ Existing directories whose permission modes differ from the checkpoint require
133
+ owner review and produce a conflict; this version does not silently chmod them.
134
+ Missing structural parents of a selected directory appear as explicit creations
135
+ in preview. Parents outside the selection use the normal default directory mode.
136
+
137
+ After restart, sessions are interrupted and old previews expire. Create a fresh
138
+ context/preview for new recovery. A completed retry returns the original receipt;
139
+ a key with uncertain outcome reports recovery-required without repeating writes.
140
+ Closed history obeys retention, while open/interrupted sessions, unresolved changes,
141
+ active jobs, pinned points and unexpired plans retain their backup references.
142
+
143
+ ## External changes and Git copies
144
+
145
+ DODO now keeps the **expected source state** separately from its snapshots. When a mutation target was changed outside the journal, the write fails with `FILE_CHANGED` even when the caller rereads its new hash. Other non-conflicting file edits remain possible. Significant source drift blocks new commands until the owner reviews it. Defaults: at least 20 changed files and more than 20% of the baseline, or 10 deletions. Commands still run under the existing exec/sandbox policy; backups cannot undo database or volume effects.
146
+
147
+ In the project's Recovery card choose **ตรวจไฟล์และเปรียบเทียบ**. The comparison shows paths and before/observed hashes, with pagination, not raw credential/file contents. **ยอมรับสถานะที่ตรวจนี้** accepts exactly the reviewed state; it neither restores files nor marks tests as passed. To restore previous source instead, use the existing checkpoint/session preview and confirm that exact plan.
148
+
149
+ Equivalent owner terminal flow:
150
+
151
+ ```sh
152
+ dodo recovery scan --limit 50
153
+ # If nextCursor is present:
154
+ dodo recovery scan --cursor 50 --limit 50
155
+ # Only after reviewing the digest and current project context:
156
+ dodo recovery acknowledge 'sha256:THE_REVIEWED_DIGEST' --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
157
+ ```
158
+
159
+ MCP can call `restore_status` with `scan:true` (through `dodo_read` in Compact mode). It has no operation to acknowledge drift or change backup policy. Restart and creating a checkpoint do not acknowledge external changes. A bounded scan runs every 60 seconds when the project is idle, and commands receive a preflight scan. The default 15-second scan budget is a limit, not a completion guarantee for every repository. Busy or incomplete scans report their status; they do not silently accept the files.
160
+
161
+ External changes are labeled **unknown author**, including changes observed after a shell job. An emergency snapshot saves the state DODO actually observes, without replacing the protected baseline. DODO cannot recreate bytes overwritten before any backup existed. A reviewed source restore remains possible while drift is present, with all existing plan/hash/path checks intact.
162
+
163
+ For Git projects, DODO creates independent private bare copies at source checkpoint boundaries. No working branch, HEAD, staged/unstaged split or user index changes. Each copy contains only approved source bytes and a create-only `refs/dodo/snapshots/<snapshot-id>`; not old Git history, secrets or remotes. Hooks, filters, helpers and network protocols are disabled for this builder. The source manifest also records modes/empty directories that Git alone cannot represent.
164
+
165
+ The advanced Recovery settings can require Git copies and select a separate backup directory. Prepare an **empty, dedicated private directory** outside projects and DODO state; its existing filesystem identity is verified. Removing or replacing that directory stops configured copies rather than redirecting them elsewhere. Copies count toward Recovery quotas. With no Git repository, ordinary source recovery still works; Git-required mode blocks full checkpoints until Git is available.
166
+
167
+ If `.git` and source files are deleted but the registered root directory remains, preview/restore still uses the independent source checkpoint. If the entire root or installation state was lost, automatic restore cannot validate its old identity. Inspect the separately stored bare copy and `dodo-source-manifest.json` locally, extract approved files to a new directory, review it, then register that directory. For a single reviewed file, an owner may use `git --git-dir=/absolute/backup/snap_ID.git show refs/dodo/snapshots/snap_ID:path/to/file` to inspect the independent bytes. Do not pipe an unreviewed archive over an existing project. Git copies do not back up Git history, external LFS objects, databases or volumes.
168
+
169
+ ## Test evidence and named checkpoints
170
+
171
+ The Recovery dashboard now separates three things:
172
+
173
+ - **SAVED**: source bytes passed integrity checks at capture. No test claim.
174
+ - **VERIFIED / FAILED / INCONCLUSIVE / STALE**: results of the selected
175
+ `verify_changes` recipes against a specific before-run snapshot and manifest.
176
+ Open **ตรวจหลักฐานปัจจุบัน** to recheck freshness. List entries and the last
177
+ verified time are historical observations, not a claim about current files.
178
+ - **OWNER_MARKED_STABLE**: a name selected by the owner. It does not change a
179
+ failed test into a pass or expand any permission.
180
+
181
+ Use `verify_changes` plan → run → report through the existing assistance gateway.
182
+ Select exact recipe digests and use the plan's source digest and an idempotency key.
183
+ With Recovery enabled, the response includes the checkpoint ID, manifest hash,
184
+ verification state, reason and check timestamp. Read-only clients cannot execute
185
+ verification; inspect trust still requires approval. Checks not selected remain
186
+ listed as not run. An empty, skipped, inconsistent or truncated test report does
187
+ not certify the snapshot. Ordinary successful build/lint commands prove only
188
+ those commands, not tests that were never run.
189
+
190
+ DODO compares included source and selected recipes before/after verification.
191
+ Source generation or formatting makes the old evidence stale; capture and verify
192
+ again. Changes reverted between observations, external dependencies/environment,
193
+ and dishonest test scripts are not covered. Evidence is not an OS sandbox or a
194
+ proof of correctness. Restart/parser changes require new verification.
195
+
196
+ In checkpoint history choose **Pin สำเนานี้** or **ตั้งชื่อสำเนา**. Names such as
197
+ `before-refactor`, `stable`, and `release candidate` refer to immutable snapshots.
198
+ A name update uses the revision shown by the owner API; a concurrent edit is
199
+ refused rather than overwritten. Pins and active names both protect retention.
200
+ Unpinning a named point alone will not delete it. Old/new name changes appear in
201
+ owner history. Naming never rewrites source or the snapshot manifest.
202
+
203
+ Advanced settings include **ดู preview การล้างตาม retention**. It shows eligible
204
+ points and why others are retained without deleting anything. Shared objects,
205
+ Git copies and orphan grace periods mean the logical byte total is not immediate
206
+ free disk space. This version does not expose a manual destructive purge.
207
+
208
+ Owner CLI, in the registered project's directory:
209
+
210
+ ```sh
211
+ dodo recovery status
212
+ dodo recovery evidence
213
+ dodo recovery evidence --id VERIFICATION_ID
214
+ dodo recovery cleanup-preview
215
+ # Read the existing name's revision first (0 only when the name never existed):
216
+ dodo recovery mark stable SNAPSHOT_ID --revision REVIEWED_REVISION --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
217
+ ```
218
+
219
+ After browser reconnect, refresh evidence and query the existing restore receipt.
220
+ Do not repeat uncertain effects. These are private owner controls; MCP/public
221
+ HTTP has no mark/pin/purge endpoint. Without an owner-registered deployment target its state is **NOT_CONFIGURED**;
222
+ database row rollback remains **NOT_SUPPORTED**. Optional adapters are described below. Windows/Android and live
223
+ production recovery require their own acceptance; results from macOS/Linux
224
+ fixtures are not substitutes.
225
+
226
+ ## Reviewed Docker deployment
227
+
228
+ Source backup continues to work without a deployment target. To opt in, open
229
+ **Projects → Deployment · Docker → เพิ่มหรือแก้ปลายทาง**. Select the Docker context,
230
+ Compose project/service, source build folder and Dockerfile, an existing test
231
+ recipe, health URL and optional source mapping. The daemon must already be
232
+ available to your OS account. DODO neither installs/starts it nor disables your
233
+ command sandbox. Docker access is broader than workspace file access.
234
+
235
+ Use advanced definition JSON for multiple required checks, HTTP status checks
236
+ (such as a protected route returning 401), OpenAPI operations, stabilization,
237
+ explicit LAN endpoints, ports and existing named volumes. No credentials, bind
238
+ mounts or privileged Docker arguments are accepted. Source mappings cannot overlap
239
+ volumes. A public URL requires HTTPS; metadata and DODO administration URLs are
240
+ denied. This permission does not turn on `allowWebFetch`.
241
+
242
+ 1. Run `verify_changes` with the current source/required recipe. A passing exit
243
+ without complete required evidence is insufficient.
244
+ 2. Select the target revision and verification ID and create a deployment plan.
245
+ Review the immutable plan/hash. No build or deployment has happened yet.
246
+ 3. Confirm **Build ตามแผนนี้**. DODO streams only the reviewed snapshot, records
247
+ the actual image ID, and verifies declared source bytes inside a stopped probe.
248
+ 4. Confirm **Deploy image นี้**. Source, authority and target are rechecked;
249
+ deployment does not rebuild. All required health checks must pass throughout
250
+ stabilization before the known-good pointer advances.
251
+ 5. Read the durable result after reconnect. `UNKNOWN` means inspect first; do not
252
+ make a new plan merely to repeat a command whose result is uncertain.
253
+
254
+ The same flow is available to an authorized MCP client through `dodo_discover`
255
+ and `dodo_exec` operations `deployment_prepare`, `deployment_build` and
256
+ `deployment_apply`. `dodo_read` exposes bounded targets/list/inspect/compare.
257
+ The full surface retains individual definitions; compact remains at 20 gateways.
258
+ Target registration, image pins and cleanup stay private owner controls.
259
+
260
+ Private owner CLI commands use the current workspace ID/epoch and explicit
261
+ confirmation. Start with `dodo deployment targets` and `dodo deployment list`.
262
+ For example, after reviewing a real target JSON file:
263
+
264
+ ```sh
265
+ dodo deployment configure --file /absolute/path/target.json --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
266
+ dodo deployment prepare --target TARGET_ID --revision 1 --verification VERIFICATION_ID --key UNIQUE_RETRY_KEY --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
267
+ dodo deployment build DEPLOYMENT_ID --hash PLAN_HASH --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
268
+ dodo deployment apply DEPLOYMENT_ID --hash PLAN_HASH --image sha256:IMAGE_DIGEST --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
269
+ ```
270
+
271
+ `--file` contains owner-reviewed data, not executable repository configuration.
272
+ The configure file shape is `{"expectedRevision":0,"enabled":true,
273
+ "confirmDaemonAccess":true,"definition":{...}}`; copy current recipe digests from
274
+ `deployment targets`, and use the exact reviewed ID/hash returned by each step.
275
+ `dodo deployment --help` lists observe, source-preview and rollback-prepare.
276
+
277
+ ### Rollback and source recovery
278
+
279
+ A known-good deployment can prepare a **new image-only rollback plan** after
280
+ inspecting the current service. Apply that plan explicitly. It reuses the exact
281
+ recorded image and requires fresh health; its original tests are historical. It
282
+ does not change workspace source, database rows, migrations, volumes or secrets.
283
+
284
+ `deployment_source_preview` checks actual running-container bytes for the declared
285
+ mapping against the recorded manifest, then produces the normal Recovery restore
286
+ preview. Review and call `restore_apply` to change source, with a mandatory current
287
+ backup and conflict checks. The container keeps running. Mounted data, image
288
+ labels, missing source, compiled-only artifacts or a missing/corrupt CAS manifest
289
+ cannot be substituted for verified source. DODO does not reconstruct source from
290
+ binaries or treat a copied container root as a project backup.
291
+
292
+ ### Uncertain outcomes, probes and image retention
293
+
294
+ The owner dashboard offers **ตรวจและรับทราบผลที่ไม่แน่นอน**. It records the live
295
+ observation and acknowledges the old uncertainty without retrying or declaring
296
+ production healthy. Historical `UNKNOWN` remains visible. Recover via a separately
297
+ reviewed known-good image rollback or an owner-controlled external repair.
298
+
299
+ A crash can leave a stopped source probe. **ตรวจ container probe ที่ค้าง** compares
300
+ its durable name/ID/image/claim and requires it to remain stopped and mount-free
301
+ before exact-ID removal. It never stops or force-removes a running container.
302
+
303
+ **การเก็บ image** previews candidates outside the target's retained image count
304
+ (default 5). Current/previous known-good, active containers, pins, live plans,
305
+ unresolved outcomes and other targets protect images even if the count is above
306
+ the budget. Nothing is deleted automatically. Confirm the exact preview to remove
307
+ only eligible DODO tags/IDs; changed references block deletion. No broad prune,
308
+ volume removal or migration is performed. An uncertain cleanup needs a fresh
309
+ observation; repeating the same review returns its recorded result.
310
+
311
+ CLI maintenance takes a bounded JSON file. Examples of its input objects:
312
+ `{"action":"cleanup_preview","targetId":"TARGET_ID"}`,
313
+ `{"action":"pin","deploymentId":"DEPLOYMENT_ID","pinned":true,"expectedPinned":false}`,
314
+ `{"action":"resolve_preview","deploymentId":"DEPLOYMENT_ID"}` or
315
+ `{"action":"apply","reviewId":"REVIEW_ID","reviewHash":"sha256:REVIEW_HASH"}`.
316
+ Pass it with `dodo deployment maintenance --file ... --workspace ... --epoch ... --yes`.
317
+
318
+ Deployment manifests remain protected source evidence independently of image
319
+ cleanup. History is bounded at 500 deployment records per target and 2,000 owner
320
+ maintenance reviews per project; reaching a bound stops new records rather than
321
+ silently evicting recovery evidence. Target changes invalidate pending plans;
322
+ restore the reviewed target definition before inspecting its old Docker resources.
323
+
324
+ These guards apply to this adapter. Generic shell commands, owner terminals and
325
+ external CI can still change production independently. Historical known-good is
326
+ not a continuous live health monitor. No live owner production deployment or
327
+ manual platform acceptance is implied by disposable automated fixtures.
328
+
329
+ ## Database awareness and encrypted private config
330
+
331
+ Source recovery remains enabled by default for registered projects. **Database
332
+ inspection and secret-file backup remain separate owner opt-ins.** Nothing connects
333
+ to a database, reads a secret or creates an encryption key merely because source
334
+ backup is on. These controls are under **Projects → Database / Private config**;
335
+ they are not MCP operations.
336
+
337
+ ### Read-only migration compatibility
338
+
339
+ The first adapter supports an existing, project-relative SQLite `.db`, `.sqlite`
340
+ or `.sqlite3` file and an ordinary migration table with a string ID column. Choose
341
+ the exact file/table/column and explicitly permit metadata access. There is no
342
+ remote SQL endpoint, credential field, arbitrary query or database rollback API.
343
+ Readiness checks canonical file identity, links, sidecars and bounded IDs. File
344
+ replacement requires a new owner review; a missing/changed schema is not success.
345
+
346
+ For a source checkpoint, the owner specifies required migration IDs and whether
347
+ extra IDs are allowed. This rule is bound to the checkpoint manifest and target
348
+ revision. SQL text, repository instructions and AI guesses do not create a rule.
349
+ A bound rule protects its checkpoint from retention. Use the owner-only
350
+ **ถอนกติกาของ checkpoint นี้** control or `database unbind --file ...` with
351
+ `{"targetId":"TARGET_ID","expectedRevision":1,"checkpointId":"CHECKPOINT_ID","confirmCompatibilityRemoval":true}`
352
+ to remove the rule and its retention reference; fresh previews then return UNKNOWN.
353
+ `COMPATIBLE` means only that the **explicit owner's ID rule** matched; it does not
354
+ prove arbitrary application/data compatibility. No adapter or rule means
355
+ `UNKNOWN`. The default rule blocks source restore when unknown/incompatible; the
356
+ owner can explicitly choose a warning-only policy for that target.
357
+
358
+ Source restore shows bounded compatibility, checks it again under the mutation
359
+ queue and after the mandatory pre-restore backup. Changed evidence invalidates a
360
+ preview. The database is external to the source transaction: another process can
361
+ still migrate it during a write. A final observation reports that drift without
362
+ silently undoing source or data. Quotas/orders/customer records and migration rows
363
+ are not restored; no up/down migration is executed. Generic `run_command` SQL is
364
+ not a fully audited or reversible database operation. Database rollback/PITR is
365
+ `NOT_SUPPORTED`; arrange backups with the database operator separately.
366
+
367
+ Private owner CLI examples (review the JSON, never put credentials in it):
368
+
369
+ ```sh
370
+ dodo recovery database targets
371
+ dodo recovery database configure --file /absolute/path/database-target.json --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
372
+ dodo recovery database inspect TARGET_ID --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
373
+ dodo recovery database bind --file /absolute/path/checkpoint-rule.json --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
374
+ ```
375
+
376
+ Target JSON:
377
+
378
+ ```json
379
+ {"expectedRevision":0,"enabled":true,"confirmReadOnlyAccess":true,"definition":{"name":"App migrations","adapter":"sqlite-migration-table","databaseFile":"data/app.sqlite","table":"migrations","column":"id","onMismatch":"block"}}
380
+ ```
381
+
382
+ Checkpoint rule JSON:
383
+
384
+ ```json
385
+ {"targetId":"TARGET_ID","expectedRevision":1,"checkpointId":"CHECKPOINT_ID","requiredMigrationIds":["001_initial"],"allowExtra":false,"confirmCompatibilityRule":true}
386
+ ```
387
+
388
+ ### Private configuration backup
389
+
390
+ Register an existing private file such as `.env`, by exact project-relative path.
391
+ It must already be denied to source tools and private to the OS user, with no
392
+ symlink/hardlink/alias and at most 1 MiB. DODO does not chmod the workspace or
393
+ expand source permissions. The owner UI/CLI never accepts or displays its contents.
394
+
395
+ Each target gets a random AES-256 key in **macOS Keychain**, **Windows Credential
396
+ Manager**, or **Linux Secret Service**. The backup store contains authenticated
397
+ AES-256-GCM ciphertext and opaque key references in private state, separately from
398
+ source CAS/Git. Fresh nonces and associated data bind project/root, target,
399
+ revision and backup ID. Keys travel to the OS helper over stdin, never argv/config
400
+ JSON/logs. No session/plaintext fallback exists. Unlock/setup the OS store locally;
401
+ headless Linux without `secret-tool` and an available Secret Service cannot use
402
+ this opt-in feature. Android currently has no reviewed recovery-key provider.
403
+
404
+ Use **สำรอง config ตอนนี้** to capture, **ตรวจแผนคืน config** to review redacted sizes
405
+ and impact, then explicitly confirm the exact plan. Stop any dependent program
406
+ before restoring. DODO encrypts a pre-restore copy before the first write, checks
407
+ live owner/context/hash/identity again and reads back the result. It preserves the
408
+ existing private file and writes **in place**, not by an atomic file swap. A crash
409
+ may leave a partial file; the durable receipt then says `UNKNOWN`. Repeating that
410
+ plan never rewrites. Inspect locally and make a fresh reviewed plan from the
411
+ listed encrypted pre-restore backup. DODO never restarts a service automatically.
412
+
413
+ Rotating a key invalidates old previews. New backups use the new OS key; old
414
+ backups still require their original key and are not silently re-encrypted. **A
415
+ lost OS key makes those backups unrecoverable.** State copies alone are not a
416
+ portable/disaster backup. Secure OS key-store recovery is the owner's separate
417
+ responsibility; DODO offers no plaintext key export. Same-user processes and
418
+ administrators remain outside this storage isolation guarantee.
419
+
420
+ Separate retention defaults to 10 backups per target (2–100). Lowering it deletes
421
+ only older unreferenced ciphertext rows. Restore plans/receipts protect their
422
+ source/pre-restore backups, even above the count. Keys are not automatically
423
+ removed from the OS store. There are at most 10 targets, 32 MiB of plaintext-size
424
+ accounted ciphertext per project and 1,000 restore reviews; reaching a bound
425
+ refuses new work instead of silently evicting recovery evidence. Disabling a
426
+ missing target is allowed and retains its backups. Database/config settings have
427
+ independent revisions and do not grant AI any additional access.
428
+
429
+ ```sh
430
+ dodo recovery private-config list
431
+ dodo recovery private-config configure --file /absolute/path/private-config-target.json --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
432
+ dodo recovery private-config backup TARGET_ID --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
433
+ dodo recovery private-config preview BACKUP_ID --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
434
+ dodo recovery private-config apply PLAN_ID --hash PLAN_HASH --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
435
+ dodo recovery private-config rotate TARGET_ID --revision REVIEWED_REVISION --workspace WORKSPACE_ID --epoch WORKSPACE_EPOCH --yes
436
+ ```
437
+
438
+ Registration JSON contains only metadata:
439
+
440
+ ```json
441
+ {"expectedRevision":0,"enabled":true,"confirmEncryptedPrivateBackup":true,"definition":{"name":"App config","path":".env","retention":10}}
442
+ ```
443
+
444
+ Do not put secret values into that JSON, an MCP argument, screenshots or chat.
445
+ Anonymous/OAuth calls cannot use these owner controls; public MCP has no admin
446
+ routes. Existing private owner expiry, Host/Origin, project context and rate limits
447
+ remain in force. Automated fixtures and manual provider/platform tests are reported
448
+ separately in [TEST_REPORT](TEST_REPORT.md) and [MANUAL_ACCEPTANCE](MANUAL_ACCEPTANCE.md).
@@ -0,0 +1,47 @@
1
+ # DODO MCP 1.2.1
2
+
3
+ รุ่น 1.2.1 แก้ปัญหาหน้า Providers & Profiles ตอบเพียง `invalid request` เมื่อข้อมูล
4
+ Agent Profile ไม่ครบ ลดขั้นตอนสร้าง Agent สำหรับการใช้งานส่วนตัว และเพิ่มการเลือก
5
+ operation ที่ AI มองเห็นจากหน้าเว็บ
6
+
7
+ ## สร้าง Agent แบบง่าย
8
+
9
+ 1. บันทึก Provider connection และ API key
10
+ 2. กด **โหลดรายชื่อโมเดล** หรือกรอก Model ID เอง
11
+ 3. เลือกประเภท Agent: Coding, Review หรือ Research
12
+ 4. กด **สร้าง Agent**
13
+
14
+ รายการโมเดลที่โหลดสำเร็จจะเข้า Agent form ทันที ถ้ามีโมเดลเดียว DODO เลือกให้
15
+ อัตโนมัติ ค่าที่ใช้ไม่บ่อย เช่น tool calling, ภาพ, token limits, จำนวนรอบ และราคา
16
+ อยู่ในส่วน **ตั้งค่าขั้นสูง**
17
+
18
+ Preset เป็นเพียงค่าตั้งต้นของ profile และทำได้เฉพาะลดขอบเขตจากสิทธิ์จริง ไม่เพิ่ม
19
+ OAuth scope, project access, trust หรือ approval และไม่ข้าม sandbox, path/secret
20
+ guards, expected hash หรือ audit
21
+
22
+ ## Validation
23
+
24
+ - Browser ปฏิเสธ Agent ที่ไม่มีชื่อ, connection หรือ Model ID ก่อนส่ง request
25
+ - ตัวเลขทุกช่องตรวจช่วงเดียวกับ backend
26
+ - Backend ตอบชื่อ field ที่ผิด เช่น `model` โดยไม่สะท้อนค่าที่กรอกหรือ credential
27
+ - ปุ่มถูกปิดระหว่างบันทึกเพื่อป้องกันการสร้างซ้ำ
28
+
29
+ ## Tool visibility
30
+
31
+ หน้า **Settings → Tools ที่ AI มองเห็น** มีสวิตช์ราย operation, ค้นหา, เปิด/ปิดทั้งหมวด
32
+ และตัวนับสถานะจริง เมื่อบันทึกแล้ว Compact/Hybrid จะตัด operation ออกจาก discover,
33
+ gateway schema และ direct duplicate ใน Hybrid หลัง restart/rescan หากปิดทั้งหมวด gateway
34
+ นั้นจะหายด้วย Full/STDIO ยังคงครบและ security checks เดิมไม่เปลี่ยน
35
+
36
+ ## สถานะตรวจรับ
37
+
38
+ - Typecheck/lint: `AUTOMATED_PASS`
39
+ - Chromium end-to-end แบบ desktop และ 390px: `AUTOMATED_PASS`
40
+ - Provider/profile/project/agent/tool-call/write-file flow: `AUTOMATED_PASS`
41
+ - Tool visibility catalog/HTTP/security/Chromium (desktop และ 320px): `AUTOMATED_PASS`
42
+ - Full suite: 731 passed, 35 skipped; packaging 16/16: `AUTOMATED_PASS`
43
+ - Security regression ที่เกี่ยวข้อง: `AUTOMATED_PASS`
44
+ - Exact tarball install + config schema/UI asset manifest: `AUTOMATED_PASS`
45
+ - Production dependency audit: 0 vulnerabilities: `AUTOMATED_PASS`
46
+ - Live provider ของเจ้าของ: `MANUAL_NOT_RUN`
47
+ - npm publish: `MANUAL_NOT_RUN`
@@ -0,0 +1,64 @@
1
+ # DODO MCP 1.3.0 — Recovery & Local Git Safety
2
+
3
+ เอกสารขอบเขตและวิธีอัปเกรดรุ่น1.3.0 การเผยแพร่ต้องผ่าน macOS และ native
4
+ Windows/Linux gates ก่อน ตรวจรุ่นที่เผยแพร่ด้วย `npm view dodo-mcp version`
5
+ ดู [TEST_REPORT](TEST_REPORT.md) โดยแยกผลตาม revision จาก candidate รอบก่อน
6
+
7
+ ## สิ่งที่เพิ่ม
8
+
9
+ Source backup เปิดเป็นค่าเริ่มต้นสำหรับโปรเจกต์ที่ลงทะเบียน ก่อนงานที่เปลี่ยนไฟล์
10
+ และคำสั่งที่อาจเปลี่ยน source พร้อม immutable checkpoints, caller-owned sessions,
11
+ preview, journaled restore, hash verification และ receipt ที่อ่านต่อได้หลัง restart
12
+ การกู้คืนรักษาไฟล์ที่ไม่อยู่ในแผน ไม่อนุมัติ action แทนเจ้าของ
13
+
14
+ หน้า Projects แสดง Recovery history, external drift, ขอบเขตสำเนาและ quota,
15
+ หลักฐาน test ที่ผูกกับ source/recipe, named/pinned checkpoints และ retention preview
16
+ สำเนา Git อยู่ใน private state แยกจาก index/branch เดิม และไม่ push อัตโนมัติ
17
+
18
+ Owner สามารถเปิด Docker deployment adapter เพื่อ build จาก source ที่ตรวจแล้ว
19
+ ตรวจ image/container bytes, health และ stabilization ก่อนเปลี่ยน known-good
20
+ มี reviewed image rollback, source preview จาก image ที่พิสูจน์ได้ และ cleanup เฉพาะ
21
+ image/probe ที่อยู่ในแผน ไม่ใช้ force prune และไม่ลบ volumes
22
+
23
+ Database/config เป็น opt-in แยก: ตรวจ SQLite migration metadata แบบอ่านอย่างเดียว
24
+ กับกฎที่ owner ผูก checkpoint และสำรองไฟล์ config ลับแบบ AES-256-GCM โดยเก็บ key
25
+ ใน Keychain/Credential Manager/Secret Service UI แสดง preview แบบไม่เปิดเนื้อหา
26
+ AI ไม่มี tool สำหรับอ่านหรือกู้ secrets เหล่านี้
27
+
28
+ ## ขอบเขตที่ต้องทราบ
29
+
30
+ - Source restore ไม่ย้อน database rows, secrets, volumes หรือผลภายนอก
31
+ - Migration compatibility หมายถึงตรงกฎ ID ที่ owner ระบุเท่านั้น; ไม่มี adapter/rule คือ UNKNOWN
32
+ - ไม่มี generic SQL rollback, PITR หรือการ restart services อัตโนมัติ
33
+ - Private config restore เขียนไฟล์เดิม หลังเก็บ encrypted before-copy; process crash
34
+ อาจทิ้งไฟล์บางส่วนและ receipt UNKNOWN เจ้าของต้องตรวจ ไม่ replay เอง
35
+ - Key สูญหายถอดรหัสไม่ได้ ไม่มี plaintext fallback หรืออัปโหลดกุญแจ
36
+ - Local backup ไม่ใช่สำเนานอกเครื่องหรือการรับรองป้องกัน disaster/ransomware
37
+ - Android/Termux recovery และ owner production/ChatGPT manual acceptance ยังต้องตรวจแยก
38
+
39
+ ## Tool surface
40
+
41
+ Full definitions158; ค่าเริ่มต้นซ่อน Sub-agent4 จึงส่ง154 tools ส่วน HTTP Compact
42
+ ไม่เกิน20 และ Hybridไม่เกิน49 การซ่อน tools ไม่ปิด automatic source backup
43
+ หรือเพิ่ม OAuth/ACL/trust/sandbox/approval สิทธิ์ใด ๆ
44
+
45
+ ## อัปเกรดหลัง release พร้อม
46
+
47
+ ```sh
48
+ npm install -g dodo-mcp@1.3.0
49
+ dodo --version
50
+ dodo --cli
51
+ ```
52
+
53
+ หยุด foreground process เดิมอย่างเรียบร้อยเมื่อไม่มีงาน แล้วเริ่ม DODO ใหม่ด้วย
54
+ ค่าของเจ้าของ ไม่เปิด process ซ้ำแย่ง port Refresh/recreate MCP connection ตาม client
55
+ และเรียก project_overview ใหม่สำหรับ epoch ใหม่
56
+
57
+ โปรเจกต์เดิมที่ไม่เคยกำหนด policy จะเปิด source recovery ค่าเริ่มต้น การ opt-out เดิม
58
+ ยังคงอยู่; read ยังทำงานเมื่อ backup blocked แต่ mutation จะรอแก้สาเหตุให้สำรองได้
59
+ ก่อน ใช้ `dodo recovery status` หรือ Projects → Recovery ตรวจ readiness
60
+ เริ่มทำงานอาจใช้เวลาสร้าง baseline และใช้พื้นที่ private state เพิ่ม
61
+
62
+ อ่านวิธีใช้ Web/CLI และข้อจำกัดทั้งหมดใน [Recovery](RECOVERY.md)
63
+ Native CI ไม่รัน Docker container เป็น test runner; disposable Docker acceptance
64
+ เป็นการตรวจ product deployment adapter แยกจาก platform gate
@@ -1,5 +1,46 @@
1
1
  # DODO MCP — Release Notes
2
2
 
3
+ ## 1.3.0 — Recovery & Local Git Safety
4
+
5
+ - Default-on independent source backups for registered projects, with caller-owned
6
+ sessions, reviewed previews, journaled restore and durable retry/restart receipts.
7
+ - Detect external content drift; preserve separate emergency copies and private Git
8
+ checkpoints without changing the owner's index/branch. Named/pinned checkpoints,
9
+ evidence-bound verification and reviewed retention are available in Web/CLI.
10
+ - Owner-registered Docker Compose deployment with sealed build source, image/container
11
+ provenance, health/stabilization, known-good pointers, exact reviewed image rollback,
12
+ guarded source recovery and bounded image/probe cleanup.
13
+ - Read-only SQLite migration compatibility rules. Separate owner-opt-in encrypted
14
+ private configuration backups with OS-held keys, redacted preview, rotation and
15
+ before-restore ciphertext. No generic database rollback or secret exposure to MCP.
16
+ - Full158 (default154 when Sub-agents are hidden), Compact20, Hybrid49. OAuth, target
17
+ ACL, context, approval, sandbox, secret/path/hash guards remain authoritative.
18
+ - Windows private ACL checks use an inbox .NET helper when available, rereading actual
19
+ permissions on every invocation; fallback preserves the same fail-closed policy.
20
+ - Native Linux/Windows CI and macOS release gates, immutable tarball and fresh install
21
+ verification. Detailed [scope and upgrade notes](RELEASE_1.3.0.md).
22
+
23
+ Verify publication through the npm registry and revision-bound native gate evidence;
24
+ release notes describe scope and are not a publish receipt.
25
+
26
+ ## 1.2.1 — สร้าง Agent แบบง่ายและ error ที่แก้ได้ตรงจุด
27
+
28
+ - ลดขั้นตอนสร้าง Agent เหลือเลือกประเภท, Provider connection และ Model ID แล้วสร้างได้เลย
29
+ - รายชื่อโมเดลที่โหลดจาก Provider ถูกนำมาให้เลือกใน Agent form ทันที; endpoint ที่ไม่มี
30
+ model-list ยังพิมพ์ Model ID เองได้
31
+ - เพิ่ม Coding, Review และ Research presets โดยค่าละเอียดอยู่ในส่วนพับได้
32
+ - ตรวจ Model ID, connection และขีดจำกัดตัวเลขใน browser ก่อนส่ง จึงไม่เหลือข้อความ
33
+ `invalid request` แบบไม่บอกสาเหตุสำหรับกรณีข้อมูลฟอร์มไม่ครบ
34
+ - Owner API คืนเฉพาะชื่อ field ที่ไม่ถูกต้อง ไม่สะท้อน API key หรือค่าที่ผู้ใช้กรอก
35
+ - เพิ่มหน้า Settings สำหรับเปิด/ปิด operation รายตัวใน Compact/Hybrid พร้อมค้นหา,
36
+ สวิตช์รายรายการ, เปิด/ปิดทั้งหมวด และตัวนับที่มีผลจริง
37
+ - operation ที่ปิดหายจาก `dodo_discover`, gateway enum และ Hybrid direct duplicate;
38
+ gateway ที่ว่างจะไม่ถูกส่งให้ client ส่วน Full/STDIO ไม่เปลี่ยน
39
+ - การตั้งค่านี้เปลี่ยนเฉพาะ visibility ไม่ grant OAuth scope, project access, trust,
40
+ approval, sandbox หรือข้าม guards และต้อง restart/rescan หลังบันทึก
41
+
42
+ รุ่นนี้เตรียมเป็น patch `1.2.1`; การ publish และ live-provider manual test เป็น gate แยก
43
+
3
44
  ## 1.2.0 — Cloudflare Local และสิทธิ์ต่อโปรเจกต์ที่มองเห็นได้
4
45
 
5
46
  - แยกการเชื่อมต่อเป็นสามโหมด: เฉพาะเครื่อง (Loopback), Cloudflare Local ที่ผู้ใช้