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.
- package/README.md +45 -6
- package/dist/cli/dataRecovery.js +38 -0
- package/dist/cli/dataRecovery.js.map +1 -0
- package/dist/cli/deployment.js +61 -0
- package/dist/cli/deployment.js.map +1 -0
- package/dist/cli/main.js +35 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/config/globalConfig.js +8 -0
- package/dist/config/globalConfig.js.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/ipc/server.js +2 -0
- package/dist/ipc/server.js.map +1 -1
- package/dist/ipc/timeouts.js +5 -0
- package/dist/ipc/timeouts.js.map +1 -0
- package/dist/platform/privateFs.js +32 -3
- package/dist/platform/privateFs.js.map +1 -1
- package/dist/platform/windowsPrivateAcl.js +90 -0
- package/dist/platform/windowsPrivateAcl.js.map +1 -0
- package/dist/security/outboundAddress.js +20 -0
- package/dist/security/outboundAddress.js.map +1 -0
- package/dist/server/aiAdmin.js +35 -10
- package/dist/server/aiAdmin.js.map +1 -1
- package/dist/server/appServer.js +11 -3
- package/dist/server/appServer.js.map +1 -1
- package/dist/server/bootstrap.js +14 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/configUi/index.html +3 -0
- package/dist/server/configUi/ui/dataRecovery.js +90 -0
- package/dist/server/configUi/ui/deployment.js +111 -0
- package/dist/server/configUi/ui/recovery.js +167 -0
- package/dist/server/configUi/workbench.css +28 -1
- package/dist/server/configUi/workbench.js +136 -25
- package/dist/server/installationRuntime.js +3 -1
- package/dist/server/installationRuntime.js.map +1 -1
- package/dist/server/instructions.js +6 -2
- package/dist/server/instructions.js.map +1 -1
- package/dist/server/ipcDispatch.js +219 -0
- package/dist/server/ipcDispatch.js.map +1 -1
- package/dist/server/localConfig.js +1 -1
- package/dist/server/localConfig.js.map +1 -1
- package/dist/server/stdioServer.js +11 -3
- package/dist/server/stdioServer.js.map +1 -1
- package/dist/services/ai/network.js +1 -18
- package/dist/services/ai/network.js.map +1 -1
- package/dist/services/ai/subagents.js +5 -2
- package/dist/services/ai/subagents.js.map +1 -1
- package/dist/services/assistance/verification.js +43 -10
- package/dist/services/assistance/verification.js.map +1 -1
- package/dist/services/changes/applier.js +472 -297
- package/dist/services/changes/applier.js.map +1 -1
- package/dist/services/git/gitService.js +150 -34
- package/dist/services/git/gitService.js.map +1 -1
- package/dist/services/jobs/jobManager.js +59 -2
- package/dist/services/jobs/jobManager.js.map +1 -1
- package/dist/services/jobs/spool.js +9 -3
- package/dist/services/jobs/spool.js.map +1 -1
- package/dist/services/multimodal/mediaService.js +6 -6
- package/dist/services/multimodal/mediaService.js.map +1 -1
- package/dist/services/recovery/configKeys.js +115 -0
- package/dist/services/recovery/configKeys.js.map +1 -0
- package/dist/services/recovery/configVault.js +361 -0
- package/dist/services/recovery/configVault.js.map +1 -0
- package/dist/services/recovery/contracts.js +24 -0
- package/dist/services/recovery/contracts.js.map +1 -0
- package/dist/services/recovery/databaseAwareness.js +179 -0
- package/dist/services/recovery/databaseAwareness.js.map +1 -0
- package/dist/services/recovery/deploymentArchive.js +129 -0
- package/dist/services/recovery/deploymentArchive.js.map +1 -0
- package/dist/services/recovery/deploymentContracts.js +70 -0
- package/dist/services/recovery/deploymentContracts.js.map +1 -0
- package/dist/services/recovery/deploymentHealth.js +143 -0
- package/dist/services/recovery/deploymentHealth.js.map +1 -0
- package/dist/services/recovery/deploymentMaintenance.js +197 -0
- package/dist/services/recovery/deploymentMaintenance.js.map +1 -0
- package/dist/services/recovery/deploymentService.js +429 -0
- package/dist/services/recovery/deploymentService.js.map +1 -0
- package/dist/services/recovery/deploymentSource.js +36 -0
- package/dist/services/recovery/deploymentSource.js.map +1 -0
- package/dist/services/recovery/dockerDeployment.js +172 -0
- package/dist/services/recovery/dockerDeployment.js.map +1 -0
- package/dist/services/recovery/drift.js +178 -0
- package/dist/services/recovery/drift.js.map +1 -0
- package/dist/services/recovery/evidence.js +127 -0
- package/dist/services/recovery/evidence.js.map +1 -0
- package/dist/services/recovery/gitCopies.js +219 -0
- package/dist/services/recovery/gitCopies.js.map +1 -0
- package/dist/services/recovery/history.js +423 -0
- package/dist/services/recovery/history.js.map +1 -0
- package/dist/services/recovery/recoveryService.js +521 -0
- package/dist/services/recovery/recoveryService.js.map +1 -0
- package/dist/services/recovery/storage.js +344 -0
- package/dist/services/recovery/storage.js.map +1 -0
- package/dist/services/schedules/scheduleService.js +9 -10
- package/dist/services/schedules/scheduleService.js.map +1 -1
- package/dist/store/db.js +71 -0
- package/dist/store/db.js.map +1 -1
- package/dist/tools/catalog.js +4 -0
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/changeTools.js +1 -1
- package/dist/tools/changeTools.js.map +1 -1
- package/dist/tools/context.js +23 -3
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/deploymentTools.js +58 -0
- package/dist/tools/deploymentTools.js.map +1 -0
- package/dist/tools/directTools.js +9 -5
- package/dist/tools/directTools.js.map +1 -1
- package/dist/tools/gitTools.js +7 -2
- package/dist/tools/gitTools.js.map +1 -1
- package/dist/tools/jobTools.js +4 -4
- package/dist/tools/jobTools.js.map +1 -1
- package/dist/tools/projectTools.js +1 -0
- package/dist/tools/projectTools.js.map +1 -1
- package/dist/tools/recoveryTools.js +79 -0
- package/dist/tools/recoveryTools.js.map +1 -0
- package/dist/tools/runtimeTools.js +1 -1
- package/dist/tools/runtimeTools.js.map +1 -1
- package/dist/tools/surface.js +101 -41
- package/dist/tools/surface.js.map +1 -1
- package/dist/tunnel/credentials.js +1 -1
- package/dist/tunnel/credentials.js.map +1 -1
- package/docs/AI_PROVIDERS.md +6 -3
- package/docs/ARCHITECTURE.md +88 -4
- package/docs/CI.md +118 -0
- package/docs/COMPATIBILITY.md +7 -6
- package/docs/EVALUATION.md +17 -12
- package/docs/MANUAL_ACCEPTANCE.md +59 -2
- package/docs/RECOVERY.md +448 -0
- package/docs/RELEASE_1.2.1.md +47 -0
- package/docs/RELEASE_1.3.0.md +64 -0
- package/docs/RELEASE_NOTES.md +41 -0
- package/docs/SECURITY.md +122 -0
- package/docs/TEST_REPORT.md +327 -5
- package/docs/WEB_CLIENTS.md +6 -1
- package/docs/adr/051-source-recovery-foundation.md +45 -0
- package/docs/adr/052-reviewed-source-restore.md +50 -0
- package/docs/adr/053-content-drift-and-private-git-recovery.md +29 -0
- package/docs/adr/054-verified-source-checkpoints.md +58 -0
- package/docs/adr/055-reviewed-docker-deployments.md +42 -0
- package/docs/adr/056-owner-data-recovery.md +47 -0
- package/docs/adr/README.md +7 -0
- package/native/private-state-windows.cs +105 -0
- package/package.json +7 -1
- package/schemas/global-config.schema.json +44 -0
- package/schemas/tools.compact.json +175 -15
- package/schemas/tools.hybrid.json +350 -16
- package/schemas/tools.json +4883 -816
package/docs/RECOVERY.md
ADDED
|
@@ -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
|
package/docs/RELEASE_NOTES.md
CHANGED
|
@@ -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 ที่ผู้ใช้
|