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
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { createTwoFilesPatch } from 'diff';
|
|
6
|
+
import { DodoError } from '../../errors.js';
|
|
7
|
+
import { digestOf, newId, sha256Bytes } from '../../util/hash.js';
|
|
8
|
+
import { truncateUtf8, looksBinary, decodeUtf8Strict } from '../../util/bytes.js';
|
|
9
|
+
import { rootIdentity } from './storage.js';
|
|
10
|
+
const absent = (path) => ({ path, kind: 'absent', hash: null, bytes: 0, mode: null });
|
|
11
|
+
const selected = (p, paths) => !paths.length || paths.some(s => s === '.' || p === s || p.startsWith(s + '/'));
|
|
12
|
+
/** Private durable history, never conversation memory or a source of authorization. */
|
|
13
|
+
export class RecoveryHistory {
|
|
14
|
+
s;
|
|
15
|
+
recovery;
|
|
16
|
+
context = new AsyncLocalStorage();
|
|
17
|
+
constructor(s, recovery) {
|
|
18
|
+
this.s = s;
|
|
19
|
+
this.recovery = recovery;
|
|
20
|
+
}
|
|
21
|
+
get db() { return this.s.store.db; }
|
|
22
|
+
assertRoot() { this.recovery.assertProject(); }
|
|
23
|
+
reconcile() {
|
|
24
|
+
this.db.prepare("UPDATE recovery_sessions SET state='interrupted',ended_at=? WHERE workspace_id=? AND state='open'").run(Date.now(), this.s.workspaceId);
|
|
25
|
+
this.db.prepare('DELETE FROM recovery_plan_refs WHERE plan_id IN (SELECT plan_id FROM recovery_restore_plans WHERE workspace_id=?) AND plan_id IN (SELECT id FROM change_plans WHERE epoch<>? OR expires_at<? OR invalidated_at IS NOT NULL)').run(this.s.workspaceId, this.s.epoch, Date.now());
|
|
26
|
+
}
|
|
27
|
+
session(id, a) {
|
|
28
|
+
this.assertRoot();
|
|
29
|
+
const row = this.db.prepare('SELECT * FROM recovery_sessions WHERE id=? AND workspace_id=?').get(id, this.s.workspaceId);
|
|
30
|
+
if (!row || (!a.owner && row.actor !== a.id))
|
|
31
|
+
throw new DodoError('NOT_FOUND', 'recovery session is unavailable for this caller/project');
|
|
32
|
+
if (row.root_identity !== rootIdentity(this.s.wfs.root))
|
|
33
|
+
throw new DodoError('PATH_DENIED', 'session belongs to a replaced project directory');
|
|
34
|
+
return row;
|
|
35
|
+
}
|
|
36
|
+
newSession(id, actor, title) {
|
|
37
|
+
this.assertRoot();
|
|
38
|
+
if (this.db.prepare('SELECT COUNT(*) n FROM recovery_sessions WHERE workspace_id=?').get(this.s.workspaceId).n >= 10000)
|
|
39
|
+
throw new DodoError('RESOURCE_LIMIT', 'Recovery session history limit reached; owner review is required');
|
|
40
|
+
this.db.prepare("INSERT INTO recovery_sessions (id,workspace_id,actor,root_identity,epoch,title,state,created_at) VALUES (?,?,?,?,?,?,'open',?)")
|
|
41
|
+
.run(id, this.s.workspaceId, actor, rootIdentity(this.s.wfs.root), this.s.epoch, title, Date.now());
|
|
42
|
+
}
|
|
43
|
+
async around(actor, sessionId, fn) {
|
|
44
|
+
const inherited = this.context.getStore();
|
|
45
|
+
if (inherited) {
|
|
46
|
+
if (sessionId && inherited.sessionId !== sessionId)
|
|
47
|
+
throw new DodoError('INVALID_INPUT', 'nested recovery session override');
|
|
48
|
+
return fn();
|
|
49
|
+
}
|
|
50
|
+
if (sessionId) {
|
|
51
|
+
const row = this.session(sessionId, { id: actor });
|
|
52
|
+
if (row.state !== 'open' || row.epoch !== this.s.epoch)
|
|
53
|
+
throw new DodoError('CONFLICT', 'session is not open in this epoch; begin a new session');
|
|
54
|
+
}
|
|
55
|
+
const op = { actor, implicit: !sessionId, ...(sessionId ? { sessionId } : {}) };
|
|
56
|
+
return this.context.run(op, async () => { try {
|
|
57
|
+
return await fn();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
if (op.implicit && op.sessionId)
|
|
61
|
+
this.end(op.sessionId, { id: actor });
|
|
62
|
+
} });
|
|
63
|
+
}
|
|
64
|
+
sessionForCapture(actor) {
|
|
65
|
+
const op = this.context.getStore();
|
|
66
|
+
if (op?.sessionId)
|
|
67
|
+
return op.sessionId;
|
|
68
|
+
const id = `implicit_${randomUUID()}`;
|
|
69
|
+
this.newSession(id, actor, 'Automatic operation');
|
|
70
|
+
if (op)
|
|
71
|
+
op.sessionId = id;
|
|
72
|
+
return id;
|
|
73
|
+
}
|
|
74
|
+
published(m) {
|
|
75
|
+
if (m.trigger === 'activation')
|
|
76
|
+
return;
|
|
77
|
+
const op = this.context.getStore();
|
|
78
|
+
this.db.transaction(() => {
|
|
79
|
+
this.db.prepare('INSERT INTO recovery_events (session_id,snapshot_id,kind,created_at) VALUES (?,?,?,?)').run(m.sessionId, m.id, 'checkpoint', Date.now());
|
|
80
|
+
this.db.prepare('UPDATE recovery_sessions SET baseline_id=COALESCE(baseline_id,?) WHERE id=?').run(m.id, m.sessionId);
|
|
81
|
+
if (!op)
|
|
82
|
+
this.db.prepare("UPDATE recovery_sessions SET state='closed',ended_at=? WHERE id=?").run(Date.now(), m.sessionId);
|
|
83
|
+
})();
|
|
84
|
+
if (op)
|
|
85
|
+
op.snapshotId = m.id;
|
|
86
|
+
}
|
|
87
|
+
record(kind, ref) {
|
|
88
|
+
const op = this.context.getStore();
|
|
89
|
+
if (!op?.sessionId)
|
|
90
|
+
return;
|
|
91
|
+
this.db.prepare('INSERT INTO recovery_events (session_id,snapshot_id,kind,ref,created_at) VALUES (?,?,?,?,?)')
|
|
92
|
+
.run(op.sessionId, op.snapshotId ?? null, kind, ref, Date.now());
|
|
93
|
+
}
|
|
94
|
+
async begin(actor, title) {
|
|
95
|
+
return this.s.mutations.run(async () => {
|
|
96
|
+
this.assertRoot();
|
|
97
|
+
if (!this.recovery.policy().enabled)
|
|
98
|
+
throw new DodoError('CONFLICT', 'Recovery is disabled by the owner');
|
|
99
|
+
await this.recovery.checkpoint('activation', 'system:activation');
|
|
100
|
+
const id = newId('rs');
|
|
101
|
+
this.newSession(id, actor.id, title);
|
|
102
|
+
try {
|
|
103
|
+
const checkpointId = await this.context.run({ actor: actor.id, sessionId: id, implicit: false }, () => this.recovery.checkpoint('owner-checkpoint', actor.id));
|
|
104
|
+
if (!checkpointId)
|
|
105
|
+
throw new DodoError('CONFLICT', 'register and enable Recovery first');
|
|
106
|
+
// Status is bounded and already filters secret paths. Never change the Git index.
|
|
107
|
+
try {
|
|
108
|
+
const git = await this.s.git.status();
|
|
109
|
+
const entries = git.entries.filter(e => { try {
|
|
110
|
+
this.recovery.assertSourcePath(e.path);
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return false;
|
|
115
|
+
} });
|
|
116
|
+
this.db.prepare('UPDATE recovery_sessions SET dirty_json=? WHERE id=?').run(JSON.stringify({ isRepo: git.isRepo, entries, truncated: git.truncated }), id);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
this.db.prepare('UPDATE recovery_sessions SET dirty_json=? WHERE id=?').run('{"status":"unavailable"}', id);
|
|
120
|
+
}
|
|
121
|
+
return { sessionId: id, checkpointId };
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
this.db.prepare("UPDATE recovery_sessions SET state='interrupted',ended_at=? WHERE id=?").run(Date.now(), id);
|
|
125
|
+
throw e;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
end(id, a) { const row = this.session(id, a); this.db.prepare("UPDATE recovery_sessions SET state='closed',ended_at=? WHERE id=? AND state='open'").run(Date.now(), id); return { sessionId: id, state: row.state === 'open' ? 'closed' : row.state }; }
|
|
130
|
+
list(a, kind, cursor = 0, limit = 20) {
|
|
131
|
+
this.assertRoot();
|
|
132
|
+
if (!Number.isSafeInteger(cursor) || cursor < 0 || cursor > 1000000 || limit < 1 || limit > 100)
|
|
133
|
+
throw new DodoError('INVALID_INPUT', 'invalid recovery page');
|
|
134
|
+
if (kind === 'sessions') {
|
|
135
|
+
const rows = this.db.prepare(`SELECT id,actor,title,state,created_at,ended_at FROM recovery_sessions WHERE workspace_id=? ${a.owner ? '' : 'AND actor=?'} ORDER BY created_at DESC,id LIMIT ? OFFSET ?`).all(this.s.workspaceId, ...(a.owner ? [] : [a.id]), limit + 1, cursor);
|
|
136
|
+
return { items: rows.slice(0, limit), nextCursor: rows.length > limit ? cursor + limit : null, sourceOnly: true };
|
|
137
|
+
}
|
|
138
|
+
const rows = this.db.prepare(`SELECT DISTINCT s.id,s.state,s.scope,s.bytes,s.created_at,s.pinned FROM recovery_snapshots s LEFT JOIN recovery_events e ON s.id=e.snapshot_id LEFT JOIN recovery_sessions r ON r.id=e.session_id WHERE s.workspace_id=? ${a.owner ? '' : 'AND r.actor=?'} ORDER BY s.created_at DESC,s.id LIMIT ? OFFSET ?`).all(this.s.workspaceId, ...(a.owner ? [] : [a.id]), limit + 1, cursor);
|
|
139
|
+
return { items: rows.slice(0, limit), nextCursor: rows.length > limit ? cursor + limit : null, sourceOnly: true };
|
|
140
|
+
}
|
|
141
|
+
async manifest(id, a) {
|
|
142
|
+
this.assertRoot();
|
|
143
|
+
if (!a.owner && !this.db.prepare('SELECT 1 FROM recovery_events e JOIN recovery_sessions r ON r.id=e.session_id WHERE e.snapshot_id=? AND r.workspace_id=? AND r.actor=?').get(id, this.s.workspaceId, a.id))
|
|
144
|
+
throw new DodoError('NOT_FOUND', 'checkpoint unavailable for this caller/project');
|
|
145
|
+
const m = await this.recovery.storage.readVerified(id, this.s.workspaceId);
|
|
146
|
+
if (m.rootIdentity !== rootIdentity(this.s.wfs.root))
|
|
147
|
+
throw new DodoError('PATH_DENIED', 'checkpoint root identity changed');
|
|
148
|
+
return m;
|
|
149
|
+
}
|
|
150
|
+
async inspect(a, input) {
|
|
151
|
+
const cursor = input.cursor ?? 0, limit = input.limit ?? 50;
|
|
152
|
+
if (input.sessionId) {
|
|
153
|
+
const row = this.session(input.sessionId, a);
|
|
154
|
+
const events = this.db.prepare('SELECT seq,kind,ref,snapshot_id,created_at FROM recovery_events WHERE session_id=? ORDER BY seq LIMIT ? OFFSET ?').all(row.id, limit + 1, cursor);
|
|
155
|
+
return { sessionId: row.id, title: row.title, state: row.state, baselineId: row.baseline_id, dirtyState: this.filteredDirty(row.dirty_json), events: events.slice(0, limit), nextCursor: events.length > limit ? cursor + limit : null, sourceOnly: true };
|
|
156
|
+
}
|
|
157
|
+
if (!input.checkpointId)
|
|
158
|
+
throw new DodoError('INVALID_INPUT', 'choose a checkpoint or session');
|
|
159
|
+
const m = await this.manifest(input.checkpointId, a);
|
|
160
|
+
const allowed = m.entries.filter(e => { try {
|
|
161
|
+
this.recovery.assertSourcePath(e.path);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return false;
|
|
166
|
+
} });
|
|
167
|
+
return { checkpointId: m.id, scope: m.scope, createdAt: m.createdAt, actor: m.actor, entries: allowed.slice(cursor, cursor + limit), nextCursor: allowed.length > cursor + limit ? cursor + limit : null, excludedByPolicy: m.excludedByPolicy + (m.entries.length - allowed.length), sourceOnly: true };
|
|
168
|
+
}
|
|
169
|
+
filteredDirty(raw) {
|
|
170
|
+
const data = JSON.parse(raw);
|
|
171
|
+
return { ...data, ...(data.entries ? { entries: data.entries.filter(e => { try {
|
|
172
|
+
this.recovery.assertSourcePath(e.path);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
} }) } : {}) };
|
|
178
|
+
}
|
|
179
|
+
current(rel) {
|
|
180
|
+
this.recovery.assertSourcePath(rel);
|
|
181
|
+
const r = this.s.wfs.resolve(rel, { allowMissing: true });
|
|
182
|
+
if (!r.stat)
|
|
183
|
+
return absent(rel);
|
|
184
|
+
if (r.stat.isDirectory())
|
|
185
|
+
return { path: rel, kind: 'directory', hash: null, bytes: 0, mode: r.stat.mode & 0o777, identity: rootIdentity(r.abs) };
|
|
186
|
+
const { bytes, stat } = this.s.wfs.readFileBytes(rel, this.s.limits.readFileBytes);
|
|
187
|
+
return { path: rel, kind: 'file', hash: sha256Bytes(bytes).slice(7), bytes: bytes.length, mode: stat.mode & 0o777 };
|
|
188
|
+
}
|
|
189
|
+
async desired(a, selection) {
|
|
190
|
+
if (Boolean(selection.checkpointId) === Boolean(selection.sessionId))
|
|
191
|
+
throw new DodoError('INVALID_INPUT', 'choose exactly one checkpoint or session');
|
|
192
|
+
const paths = (selection.paths ?? []).map(p => this.s.wfs.normalizeRel(p)), desired = new Map(), expected = new Map(), ids = new Set();
|
|
193
|
+
if (selection.checkpointId) {
|
|
194
|
+
const m = await this.manifest(selection.checkpointId, a);
|
|
195
|
+
ids.add(m.id);
|
|
196
|
+
for (const e of m.entries)
|
|
197
|
+
if (selected(e.path, paths)) {
|
|
198
|
+
this.recovery.assertSourcePath(e.path);
|
|
199
|
+
desired.set(e.path, e);
|
|
200
|
+
}
|
|
201
|
+
if (selection.exactMirror) {
|
|
202
|
+
if (m.scope !== 'source')
|
|
203
|
+
throw new DodoError('INVALID_INPUT', 'exact mirror requires a complete source checkpoint');
|
|
204
|
+
for (const e of await this.recovery.currentEntries())
|
|
205
|
+
if (e.kind === 'file' && selected(e.path, paths) && !desired.has(e.path))
|
|
206
|
+
desired.set(e.path, absent(e.path));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
if (selection.exactMirror)
|
|
211
|
+
throw new DodoError('INVALID_INPUT', 'session undo never mirrors unrelated files');
|
|
212
|
+
const row = this.session(selection.sessionId, a);
|
|
213
|
+
const events = this.db.prepare('SELECT * FROM recovery_events WHERE session_id=? ORDER BY seq').all(row.id);
|
|
214
|
+
if (events.some(e => e.kind === 'job'))
|
|
215
|
+
throw new DodoError('CONFLICT', 'session contains shell/job effects with unknown authorship; preview a specific checkpoint instead');
|
|
216
|
+
for (const event of events.filter(e => e.kind === 'changeset')) {
|
|
217
|
+
const cs = this.s.store.getChangeset(event.ref);
|
|
218
|
+
if (!cs || cs.workspaceId !== this.s.workspaceId || !event.snapshot_id)
|
|
219
|
+
throw new DodoError('RECOVERY_REQUIRED', 'session receipt chain is incomplete');
|
|
220
|
+
if (cs.status === 'failed')
|
|
221
|
+
continue;
|
|
222
|
+
if (!['committed', 'rolled_back'].includes(cs.status))
|
|
223
|
+
throw new DodoError('RECOVERY_REQUIRED', 'session has an unfinished journal');
|
|
224
|
+
const m = await this.manifest(event.snapshot_id, a);
|
|
225
|
+
ids.add(m.id);
|
|
226
|
+
const before = new Map(m.entries.map(e => [e.path, e]));
|
|
227
|
+
const plan = cs.planId ? this.s.store.getPlan(cs.planId) : undefined;
|
|
228
|
+
if (!plan)
|
|
229
|
+
throw new DodoError('RECOVERY_REQUIRED', 'session plan receipt is missing');
|
|
230
|
+
const plannedFiles = JSON.parse(plan.payload).files;
|
|
231
|
+
for (const step of this.s.store.listJournalSteps(cs.id)) {
|
|
232
|
+
const updates = [[step.path, step.op === 'move' ? null : step.afterHash]];
|
|
233
|
+
if (step.destPath)
|
|
234
|
+
updates.push([step.destPath, step.afterHash]);
|
|
235
|
+
for (const [p, h] of updates) {
|
|
236
|
+
if (!selected(p, paths))
|
|
237
|
+
continue;
|
|
238
|
+
this.recovery.assertSourcePath(p);
|
|
239
|
+
const pre = before.get(p);
|
|
240
|
+
if (!pre)
|
|
241
|
+
throw new DodoError('RECOVERY_REQUIRED', 'missing session before-image');
|
|
242
|
+
const last = expected.get(p);
|
|
243
|
+
if (last && (last.kind !== pre.kind || last.hash !== pre.hash || (last.identity && last.identity !== pre.identity) || (process.platform !== 'win32' && last.mode !== null && last.mode !== pre.mode)))
|
|
244
|
+
throw new DodoError('FILE_CHANGED', 'external/interleaved edit detected between session receipts');
|
|
245
|
+
const mode = plannedFiles[step.seq]?.mode ?? before.get(step.path)?.mode ?? null;
|
|
246
|
+
if (!desired.has(p))
|
|
247
|
+
desired.set(p, pre);
|
|
248
|
+
expected.set(p, step.op === 'mkdir' ? { path: p, kind: 'directory', hash: null, bytes: 0, mode, identity: this.s.store.getMeta(`journal-directory:${cs.id}:${step.seq}`) ?? 'unknown' } : h ? { path: p, kind: 'file', hash: h.replace(/^sha256:/, ''), bytes: 0, mode } : absent(p));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const conflicts = [];
|
|
254
|
+
for (const [p, e] of expected) {
|
|
255
|
+
const current = this.current(p);
|
|
256
|
+
if (e.kind !== current.kind || e.hash !== current.hash || (e.identity && e.identity !== current.identity) || (process.platform !== 'win32' && e.mode !== null && e.mode !== current.mode))
|
|
257
|
+
conflicts.push({ path: p, reason: 'changed after this session; no merge or overwrite' });
|
|
258
|
+
}
|
|
259
|
+
return { desired, ids, conflicts, selectionDigest: digestOf([...desired]) };
|
|
260
|
+
}
|
|
261
|
+
async preview(a, selection) {
|
|
262
|
+
return this.s.mutations.run(async () => {
|
|
263
|
+
const { desired, ids, conflicts, selectionDigest } = await this.desired(a, selection);
|
|
264
|
+
const files = [];
|
|
265
|
+
let aggregate = 0;
|
|
266
|
+
for (const [rel, want] of desired) {
|
|
267
|
+
const current = this.current(rel);
|
|
268
|
+
if (want.kind === 'directory') {
|
|
269
|
+
if (current.kind === 'absent')
|
|
270
|
+
files.push({ path: rel, action: 'mkdir', beforeHash: null, afterHash: 'directory', mode: want.mode ?? 0o755, createParents: this.s.wfs.resolveForCreate(rel, true).missingParents, diff: 'create directory', diffTruncated: false, bytesBefore: 0, bytesAfter: 0 });
|
|
271
|
+
else if (current.kind !== 'directory')
|
|
272
|
+
conflicts.push({ path: rel, reason: 'file/directory type conflict' });
|
|
273
|
+
else if (process.platform !== 'win32' && want.mode !== current.mode)
|
|
274
|
+
conflicts.push({ path: rel, reason: 'existing directory permissions differ; preserved for owner review' });
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
if (current.kind === 'directory') {
|
|
278
|
+
if (want.kind === 'absent' && selection.sessionId)
|
|
279
|
+
files.push({ path: rel, action: 'rmdir', beforeHash: 'directory:' + current.identity, afterHash: null, directoryIdentity: current.identity, mode: current.mode ?? 0o755, diff: 'remove owned empty directory after selected file deletions', diffTruncated: false, bytesBefore: 0, bytesAfter: 0 });
|
|
280
|
+
else
|
|
281
|
+
conflicts.push({ path: rel, reason: 'directory removal requires an empty owned directory plan' });
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (want.kind === current.kind && want.hash === current.hash && (want.kind !== 'file' || want.mode === current.mode))
|
|
285
|
+
continue;
|
|
286
|
+
if (files.length >= this.s.limits.previewFilesMax)
|
|
287
|
+
throw new DodoError('RESOURCE_LIMIT', 'restore selection exceeds plan file limit; select fewer paths');
|
|
288
|
+
let bytes;
|
|
289
|
+
if (want.kind === 'file') {
|
|
290
|
+
bytes = await this.recovery.storage.readObject(want.hash, want.bytes, this.s.limits.readFileBytes);
|
|
291
|
+
aggregate += bytes.length;
|
|
292
|
+
}
|
|
293
|
+
if (aggregate > this.s.limits.previewAggregateBytes)
|
|
294
|
+
throw new DodoError('RESOURCE_LIMIT', 'restore selection exceeds plan byte limit');
|
|
295
|
+
const before = current.kind === 'file' ? this.s.wfs.readFileBytes(rel, this.s.limits.readFileBytes).bytes : Buffer.alloc(0);
|
|
296
|
+
if (current.hash && sha256Bytes(before) !== 'sha256:' + current.hash)
|
|
297
|
+
throw new DodoError('FILE_CHANGED', 'source changed during preview');
|
|
298
|
+
const after = bytes ?? Buffer.alloc(0);
|
|
299
|
+
let diff = 'Binary contents differ (hashes and sizes shown)';
|
|
300
|
+
if (!looksBinary(before) && !looksBinary(after)) {
|
|
301
|
+
try {
|
|
302
|
+
diff = createTwoFilesPatch(rel, rel, decodeUtf8Strict(before) ?? '<binary>', decodeUtf8Strict(after) ?? '<binary>', undefined, undefined, { context: 3, timeout: 250, maxEditLength: 10000 }) ?? '<diff exceeded computation budget; compare hashes>';
|
|
303
|
+
}
|
|
304
|
+
catch { /* binary encoding */ }
|
|
305
|
+
}
|
|
306
|
+
const bounded = truncateUtf8(diff, Math.min(this.s.limits.toolContentBytes, 16000));
|
|
307
|
+
const f = { path: rel, action: want.kind === 'absent' ? 'delete' : current.kind === 'absent' ? 'create' : 'modify', beforeHash: current.hash ? 'sha256:' + current.hash : null, afterHash: want.hash ? 'sha256:' + want.hash : null, bytesBefore: current.bytes, bytesAfter: want.bytes, ...(current.mode === null ? {} : { beforeMode: current.mode }), diff: bounded.text, diffTruncated: bounded.truncated, ...(bytes ? { afterContentB64: bytes.toString('base64'), mode: want.mode ?? 0o644 } : { mode: current.mode ?? 0o644 }) };
|
|
308
|
+
if (f.action === 'create') {
|
|
309
|
+
const resolved = this.s.wfs.resolveForCreate(rel, true);
|
|
310
|
+
if (resolved.missingParents.length)
|
|
311
|
+
f.createParents = resolved.missingParents;
|
|
312
|
+
}
|
|
313
|
+
files.push(f);
|
|
314
|
+
}
|
|
315
|
+
// A partial directory selection may need ancestors outside that selection.
|
|
316
|
+
// Include those structural creations in the reviewed journal, not hidden IO.
|
|
317
|
+
const plannedPaths = new Set(files.map(f => f.path));
|
|
318
|
+
for (const file of [...files])
|
|
319
|
+
if (file.action === 'mkdir')
|
|
320
|
+
for (const parent of file.createParents ?? []) {
|
|
321
|
+
if (plannedPaths.has(parent))
|
|
322
|
+
continue;
|
|
323
|
+
this.recovery.assertSourcePath(parent);
|
|
324
|
+
plannedPaths.add(parent);
|
|
325
|
+
files.push({ path: parent, action: 'mkdir', beforeHash: null, afterHash: 'directory', mode: 0o755, createParents: this.s.wfs.resolveForCreate(parent, true).missingParents, diff: 'create structural parent directory for selected restore', diffTruncated: false, bytesBefore: 0, bytesAfter: 0 });
|
|
326
|
+
}
|
|
327
|
+
if (files.length > this.s.limits.previewFilesMax)
|
|
328
|
+
throw new DodoError('RESOURCE_LIMIT', 'restore selection exceeds plan file limit');
|
|
329
|
+
const order = (f) => f.action === 'mkdir' ? 0 : f.action === 'rmdir' ? 2 : 1;
|
|
330
|
+
files.sort((a, b) => order(a) - order(b) || (a.action === 'mkdir' ? a.path.length - b.path.length : a.action === 'rmdir' ? b.path.length - a.path.length : 0));
|
|
331
|
+
for (const f of files)
|
|
332
|
+
if (f.action === 'rmdir') {
|
|
333
|
+
f.directoryChildren = files.filter(c => (c.action === 'delete' || c.action === 'rmdir') && path.posix.dirname(c.path) === f.path).map(c => path.posix.basename(c.path));
|
|
334
|
+
if (fs.readdirSync(this.s.wfs.resolve(f.path).abs).some(n => !f.directoryChildren.includes(n)))
|
|
335
|
+
conflicts.push({ path: f.path, reason: 'directory contains unrelated entries; preserved' });
|
|
336
|
+
}
|
|
337
|
+
const database = await this.recovery.databases.compatibility([...ids]);
|
|
338
|
+
if (database.blocking)
|
|
339
|
+
conflicts.push({ path: '(database)', reason: 'migration compatibility is unknown or incompatible under the owner rule; no database changes performed' });
|
|
340
|
+
const view = files.map(({ afterContentB64: _, ...f }) => f); // bytes stay private; only bounded diffs go to the caller
|
|
341
|
+
if (conflicts.length)
|
|
342
|
+
return { applicable: false, conflicts: conflicts.slice(0, 100), files: view, sourceOnly: true, database, planId: null, planHash: null };
|
|
343
|
+
if (!files.length)
|
|
344
|
+
return { applicable: false, conflicts: [], files: [], sourceOnly: true, database, planId: null, planHash: null, unchanged: true };
|
|
345
|
+
const plan = { version: 1, workspaceId: this.s.workspaceId, epoch: this.s.epoch, principal: a.id, source: 'restore', summary: `restore ${files.length} source path(s)`, files };
|
|
346
|
+
const id = newId('plan'), payload = JSON.stringify(plan), hash = digestOf({ planId: id, payload }), expiresAt = Date.now() + this.s.limits.planExpiryMs;
|
|
347
|
+
const meta = { version: 1, identity: rootIdentity(this.s.wfs.root), epoch: this.s.epoch, source: selection, snapshotIds: [...ids], selectionDigest, planHash: hash, databaseDigest: database.digest };
|
|
348
|
+
this.db.transaction(() => { this.s.store.putPlan({ id, workspaceId: this.s.workspaceId, epoch: this.s.epoch, principal: a.id, planHash: hash, payload, ttlMs: this.s.limits.planExpiryMs }); this.db.prepare('INSERT INTO recovery_restore_plans VALUES (?,?,?,?)').run(id, this.s.workspaceId, a.id, JSON.stringify(meta)); for (const snap of ids)
|
|
349
|
+
this.db.prepare('INSERT INTO recovery_plan_refs VALUES (?,?)').run(id, snap); })(); // Preview writes private plan metadata only, never source/emergency snapshots.
|
|
350
|
+
return { applicable: true, planId: id, planHash: hash, expiresAt, workspaceId: this.s.workspaceId, workspaceEpoch: this.s.epoch, files: view, conflicts: [], sourceOnly: true, database, coverage: 'selected included source only; databases, secrets, volumes and external effects are excluded', exactMirror: selection.exactMirror ?? false };
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
status(a, planId) {
|
|
354
|
+
this.assertRoot();
|
|
355
|
+
const rows = this.db.prepare(`SELECT r.plan_id,p.plan_hash,p.epoch,p.expires_at,p.invalidated_at FROM recovery_restore_plans r JOIN change_plans p ON p.id=r.plan_id WHERE r.workspace_id=? AND r.actor=? ${planId ? 'AND r.plan_id=?' : ''} ORDER BY p.created_at DESC LIMIT 20`).all(this.s.workspaceId, a.id, ...(planId ? [planId] : []));
|
|
356
|
+
if (planId && !rows.length)
|
|
357
|
+
throw new DodoError('NOT_FOUND', 'restore plan unavailable');
|
|
358
|
+
return { plans: rows.map(r => {
|
|
359
|
+
const cs = this.db.prepare('SELECT id,status FROM changesets WHERE plan_id=? ORDER BY created_at DESC LIMIT 1').get(r.plan_id);
|
|
360
|
+
return { planId: r.plan_id, planHash: r.plan_hash, workspaceEpoch: r.epoch, workspaceId: this.s.workspaceId, expiresAt: r.expires_at, changesetId: cs?.id ?? null, status: cs?.status ?? (r.epoch !== this.s.epoch || r.expires_at < Date.now() ? 'expired' : 'planned') };
|
|
361
|
+
}) };
|
|
362
|
+
}
|
|
363
|
+
finishAgent(runId, actor) {
|
|
364
|
+
const key = 'recovery-agent:' + digestOf({ runId, actor, workspace: this.s.workspaceId, epoch: this.s.epoch });
|
|
365
|
+
const id = this.s.store.getMeta(key);
|
|
366
|
+
if (id)
|
|
367
|
+
this.end(id, { id: actor });
|
|
368
|
+
}
|
|
369
|
+
async forAgent(runId, actor) {
|
|
370
|
+
if (!this.recovery.status().registered || !this.recovery.policy().enabled)
|
|
371
|
+
return undefined;
|
|
372
|
+
return this.s.mutations.run(async () => {
|
|
373
|
+
const key = 'recovery-agent:' + digestOf({ runId, actor, workspace: this.s.workspaceId, epoch: this.s.epoch });
|
|
374
|
+
const saved = this.s.store.getMeta(key);
|
|
375
|
+
if (saved && this.session(saved, { id: actor }).state === 'open')
|
|
376
|
+
return saved;
|
|
377
|
+
const result = await this.begin({ id: actor }, `Agent run ${runId}`);
|
|
378
|
+
this.s.store.setMeta(key, result.sessionId);
|
|
379
|
+
return result.sessionId;
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
async apply(a, planId, planHash) {
|
|
383
|
+
return this.s.mutations.run(async () => {
|
|
384
|
+
this.assertRoot();
|
|
385
|
+
if (!this.recovery.policy().enabled)
|
|
386
|
+
throw new DodoError('CONFLICT', 'enable Recovery before restore so the pre-restore source is protected');
|
|
387
|
+
const row = this.db.prepare('SELECT payload FROM recovery_restore_plans WHERE plan_id=? AND workspace_id=? AND actor=?').get(planId, this.s.workspaceId, a.id);
|
|
388
|
+
if (!row)
|
|
389
|
+
throw new DodoError('NOT_FOUND', 'restore plan unavailable for this caller/project');
|
|
390
|
+
const meta = JSON.parse(row.payload);
|
|
391
|
+
if (meta.planHash !== planHash)
|
|
392
|
+
throw new DodoError('PLAN_HASH_MISMATCH', 'review the exact restore plan hash');
|
|
393
|
+
if (meta.epoch !== this.s.epoch)
|
|
394
|
+
throw new DodoError('STALE_WORKSPACE', 'preview restore again after restart');
|
|
395
|
+
if (meta.identity !== rootIdentity(this.s.wfs.root))
|
|
396
|
+
throw new DodoError('PATH_DENIED', 'restore root identity changed');
|
|
397
|
+
for (const id of meta.snapshotIds)
|
|
398
|
+
await this.manifest(id, a);
|
|
399
|
+
const plan = this.s.store.getPlan(planId);
|
|
400
|
+
if (!plan)
|
|
401
|
+
throw new DodoError('NOT_FOUND', 'restore plan missing');
|
|
402
|
+
for (const f of JSON.parse(plan.payload).files)
|
|
403
|
+
this.recovery.assertSourcePath(f.path);
|
|
404
|
+
// Session history must still describe this exact selection; new receipts invalidate the plan.
|
|
405
|
+
const current = await this.desired(a, meta.source);
|
|
406
|
+
if (current.selectionDigest !== meta.selectionDigest || current.conflicts.length)
|
|
407
|
+
throw new DodoError('FILE_CHANGED', 'session source drifted before restore');
|
|
408
|
+
const checkDatabase = async () => {
|
|
409
|
+
const observed = await this.recovery.databases.compatibility(meta.snapshotIds);
|
|
410
|
+
if (observed.blocking || (meta.databaseDigest ? meta.databaseDigest !== observed.digest : observed.configured))
|
|
411
|
+
throw new DodoError('CONFLICT', 'database compatibility changed; review source restore again');
|
|
412
|
+
};
|
|
413
|
+
await checkDatabase();
|
|
414
|
+
return this.around(a.id, undefined, async () => {
|
|
415
|
+
// Applier makes the pre-restore backup, rechecks all hashes and journals exact direction.
|
|
416
|
+
const result = await this.recovery.withReviewedRestore(() => this.s.applier.applyRecovery({ planId, planHash, workspaceId: this.s.workspaceId, epoch: this.s.epoch, principal: a.id }), checkDatabase);
|
|
417
|
+
const database = await this.recovery.databases.compatibility(meta.snapshotIds);
|
|
418
|
+
return { ...result, verified: true, sourceOnly: true, database, databaseChangedDuringRestore: Boolean(meta.databaseDigest && database.digest !== meta.databaseDigest) };
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/services/recovery/history.ts"],"names":[],"mappings":"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"}
|