dodo-mcp 1.2.1 → 1.3.1

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 (151) hide show
  1. package/README.md +37 -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 +36 -1
  7. package/dist/cli/main.js.map +1 -1
  8. package/dist/config/globalConfig.js +3 -5
  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 +21 -24
  23. package/dist/server/aiAdmin.js.map +1 -1
  24. package/dist/server/appServer.js +3 -6
  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/configSession.js +21 -0
  29. package/dist/server/configSession.js.map +1 -0
  30. package/dist/server/configUi/index.html +3 -0
  31. package/dist/server/configUi/ui/dataRecovery.js +90 -0
  32. package/dist/server/configUi/ui/deployment.js +111 -0
  33. package/dist/server/configUi/ui/recovery.js +167 -0
  34. package/dist/server/configUi/workbench.js +23 -7
  35. package/dist/server/installationRuntime.js +3 -1
  36. package/dist/server/installationRuntime.js.map +1 -1
  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 +34 -11
  41. package/dist/server/localConfig.js.map +1 -1
  42. package/dist/server/remoteConfig.js +23 -13
  43. package/dist/server/remoteConfig.js.map +1 -1
  44. package/dist/server/stdioServer.js +2 -5
  45. package/dist/server/stdioServer.js.map +1 -1
  46. package/dist/services/ai/network.js +1 -18
  47. package/dist/services/ai/network.js.map +1 -1
  48. package/dist/services/ai/subagents.js +5 -2
  49. package/dist/services/ai/subagents.js.map +1 -1
  50. package/dist/services/assistance/verification.js +43 -10
  51. package/dist/services/assistance/verification.js.map +1 -1
  52. package/dist/services/changes/applier.js +472 -297
  53. package/dist/services/changes/applier.js.map +1 -1
  54. package/dist/services/git/gitService.js +150 -34
  55. package/dist/services/git/gitService.js.map +1 -1
  56. package/dist/services/jobs/jobManager.js +59 -2
  57. package/dist/services/jobs/jobManager.js.map +1 -1
  58. package/dist/services/jobs/spool.js +9 -3
  59. package/dist/services/jobs/spool.js.map +1 -1
  60. package/dist/services/multimodal/mediaService.js +6 -6
  61. package/dist/services/multimodal/mediaService.js.map +1 -1
  62. package/dist/services/recovery/configKeys.js +115 -0
  63. package/dist/services/recovery/configKeys.js.map +1 -0
  64. package/dist/services/recovery/configVault.js +361 -0
  65. package/dist/services/recovery/configVault.js.map +1 -0
  66. package/dist/services/recovery/contracts.js +24 -0
  67. package/dist/services/recovery/contracts.js.map +1 -0
  68. package/dist/services/recovery/databaseAwareness.js +179 -0
  69. package/dist/services/recovery/databaseAwareness.js.map +1 -0
  70. package/dist/services/recovery/deploymentArchive.js +129 -0
  71. package/dist/services/recovery/deploymentArchive.js.map +1 -0
  72. package/dist/services/recovery/deploymentContracts.js +70 -0
  73. package/dist/services/recovery/deploymentContracts.js.map +1 -0
  74. package/dist/services/recovery/deploymentHealth.js +143 -0
  75. package/dist/services/recovery/deploymentHealth.js.map +1 -0
  76. package/dist/services/recovery/deploymentMaintenance.js +197 -0
  77. package/dist/services/recovery/deploymentMaintenance.js.map +1 -0
  78. package/dist/services/recovery/deploymentService.js +429 -0
  79. package/dist/services/recovery/deploymentService.js.map +1 -0
  80. package/dist/services/recovery/deploymentSource.js +36 -0
  81. package/dist/services/recovery/deploymentSource.js.map +1 -0
  82. package/dist/services/recovery/dockerDeployment.js +172 -0
  83. package/dist/services/recovery/dockerDeployment.js.map +1 -0
  84. package/dist/services/recovery/drift.js +178 -0
  85. package/dist/services/recovery/drift.js.map +1 -0
  86. package/dist/services/recovery/evidence.js +127 -0
  87. package/dist/services/recovery/evidence.js.map +1 -0
  88. package/dist/services/recovery/gitCopies.js +219 -0
  89. package/dist/services/recovery/gitCopies.js.map +1 -0
  90. package/dist/services/recovery/history.js +423 -0
  91. package/dist/services/recovery/history.js.map +1 -0
  92. package/dist/services/recovery/recoveryService.js +521 -0
  93. package/dist/services/recovery/recoveryService.js.map +1 -0
  94. package/dist/services/recovery/storage.js +344 -0
  95. package/dist/services/recovery/storage.js.map +1 -0
  96. package/dist/services/schedules/scheduleService.js +9 -10
  97. package/dist/services/schedules/scheduleService.js.map +1 -1
  98. package/dist/store/db.js +71 -0
  99. package/dist/store/db.js.map +1 -1
  100. package/dist/tools/catalog.js +4 -0
  101. package/dist/tools/catalog.js.map +1 -1
  102. package/dist/tools/changeTools.js +1 -1
  103. package/dist/tools/changeTools.js.map +1 -1
  104. package/dist/tools/context.js +23 -3
  105. package/dist/tools/context.js.map +1 -1
  106. package/dist/tools/deploymentTools.js +58 -0
  107. package/dist/tools/deploymentTools.js.map +1 -0
  108. package/dist/tools/directTools.js +9 -5
  109. package/dist/tools/directTools.js.map +1 -1
  110. package/dist/tools/gitTools.js +7 -2
  111. package/dist/tools/gitTools.js.map +1 -1
  112. package/dist/tools/jobTools.js +4 -4
  113. package/dist/tools/jobTools.js.map +1 -1
  114. package/dist/tools/projectTools.js +1 -0
  115. package/dist/tools/projectTools.js.map +1 -1
  116. package/dist/tools/recoveryTools.js +79 -0
  117. package/dist/tools/recoveryTools.js.map +1 -0
  118. package/dist/tools/runtimeTools.js +1 -1
  119. package/dist/tools/runtimeTools.js.map +1 -1
  120. package/dist/tools/surface.js +6 -1
  121. package/dist/tools/surface.js.map +1 -1
  122. package/dist/tunnel/credentials.js +1 -1
  123. package/dist/tunnel/credentials.js.map +1 -1
  124. package/docs/ARCHITECTURE.md +92 -2
  125. package/docs/CI.md +118 -0
  126. package/docs/COMPATIBILITY.md +7 -6
  127. package/docs/EVALUATION.md +17 -12
  128. package/docs/MANUAL_ACCEPTANCE.md +72 -2
  129. package/docs/MCP_CONNECTIONS.md +238 -0
  130. package/docs/RECOVERY.md +448 -0
  131. package/docs/RELEASE_1.3.0.md +64 -0
  132. package/docs/RELEASE_1.3.1.md +49 -0
  133. package/docs/RELEASE_NOTES.md +31 -0
  134. package/docs/SECURITY.md +123 -0
  135. package/docs/TEST_REPORT.md +312 -5
  136. package/docs/TUNNEL.md +6 -0
  137. package/docs/WEB_CLIENTS.md +3 -0
  138. package/docs/adr/047-temporary-remote-config.md +11 -0
  139. package/docs/adr/051-source-recovery-foundation.md +45 -0
  140. package/docs/adr/052-reviewed-source-restore.md +50 -0
  141. package/docs/adr/053-content-drift-and-private-git-recovery.md +29 -0
  142. package/docs/adr/054-verified-source-checkpoints.md +58 -0
  143. package/docs/adr/055-reviewed-docker-deployments.md +42 -0
  144. package/docs/adr/056-owner-data-recovery.md +47 -0
  145. package/docs/adr/README.md +7 -0
  146. package/native/private-state-windows.cs +105 -0
  147. package/package.json +8 -1
  148. package/schemas/global-config.schema.json +34 -0
  149. package/schemas/tools.compact.json +175 -15
  150. package/schemas/tools.hybrid.json +350 -16
  151. package/schemas/tools.json +4883 -816
@@ -0,0 +1,344 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { DodoError } from '../../errors.js';
5
+ import { assertPrivatePath, ensurePrivateDirectory } from '../../platform/privateFs.js';
6
+ import { digestOf } from '../../util/hash.js';
7
+ const HASH = /^[a-f0-9]{64}$/;
8
+ export function syncDir(dir) {
9
+ if (process.platform === 'win32')
10
+ return;
11
+ const fd = fs.openSync(dir, fs.constants.O_RDONLY);
12
+ try {
13
+ fs.fsyncSync(fd);
14
+ }
15
+ catch (err) {
16
+ if (!['EINVAL', 'ENOTSUP', 'EOPNOTSUPP'].includes(err.code ?? ''))
17
+ throw err;
18
+ }
19
+ finally {
20
+ fs.closeSync(fd);
21
+ }
22
+ }
23
+ export function rootIdentity(root) {
24
+ const st = fs.lstatSync(root, { bigint: true });
25
+ if (!st.isDirectory() || st.isSymbolicLink() || fs.realpathSync.native(root) !== root)
26
+ throw new DodoError('PATH_DENIED', 'recovery root is no longer canonical');
27
+ return `${st.dev}:${st.ino}:${st.birthtimeNs}`;
28
+ }
29
+ /** Separate CAS and references: media/resource TTL and GC never own these bytes. */
30
+ export class RecoveryStorage {
31
+ store;
32
+ installationPolicy;
33
+ directory;
34
+ identity;
35
+ constructor(store, configDir, installationPolicy) {
36
+ this.store = store;
37
+ this.installationPolicy = installationPolicy;
38
+ assertPrivatePath(configDir, true);
39
+ const recoveryDir = path.join(configDir, 'recovery');
40
+ ensurePrivateDirectory(recoveryDir);
41
+ this.directory = fs.realpathSync.native(recoveryDir);
42
+ this.identity = rootIdentity(this.directory);
43
+ for (const dir of ['objects', 'manifests', 'staging'])
44
+ ensurePrivateDirectory(path.join(this.directory, dir));
45
+ }
46
+ safeDir(name) {
47
+ if (rootIdentity(this.directory) !== this.identity)
48
+ throw new DodoError('PATH_DENIED', 'recovery storage directory changed');
49
+ assertPrivatePath(this.directory, true);
50
+ const dir = path.join(this.directory, name);
51
+ assertPrivatePath(dir, true);
52
+ return dir;
53
+ }
54
+ objectPath(hash) {
55
+ if (!HASH.test(hash))
56
+ throw new DodoError('RECOVERY_REQUIRED', 'invalid recovery object reference');
57
+ return path.join(this.safeDir('objects'), hash);
58
+ }
59
+ manifestPath(id) {
60
+ if (!/^snap_[a-f0-9-]{36}$/.test(id))
61
+ throw new DodoError('INVALID_INPUT', 'invalid snapshot ID');
62
+ return path.join(this.safeDir('manifests'), `${id}.json`);
63
+ }
64
+ stagePath() { return path.join(this.safeDir('staging'), randomUUID()); }
65
+ usage(query, ...params) { return this.store.db.prepare(query).get(...params).n; }
66
+ usageFor(workspaceId) {
67
+ return { installationBytes: this.usage('SELECT COALESCE(SUM(bytes),0) n FROM recovery_objects') + this.usage('SELECT COALESCE(SUM(bytes),0) n FROM recovery_git_copies'),
68
+ projectBytes: this.usage('SELECT COALESCE(SUM(bytes),0) n FROM recovery_objects WHERE hash IN (SELECT object_hash FROM recovery_refs r JOIN recovery_snapshots s ON s.id=r.snapshot_id WHERE workspace_id=?)', workspaceId) + this.usage('SELECT COALESCE(SUM(bytes),0) n FROM recovery_git_copies WHERE workspace_id=?', workspaceId),
69
+ reservedBytes: this.usage('SELECT COALESCE(SUM(bytes),0) n FROM recovery_reservations') };
70
+ }
71
+ reserve(id, workspaceId, bytes, policy, logicalBytes = bytes, stagingBytes = bytes) {
72
+ if (!Number.isSafeInteger(bytes) || bytes < 0)
73
+ throw new DodoError('RESOURCE_LIMIT', 'invalid recovery reservation');
74
+ this.store.db.transaction(() => {
75
+ const usage = this.usageFor(workspaceId), install = this.installationPolicy();
76
+ const local = this.usage('SELECT COALESCE(SUM(logical_bytes),0) n FROM recovery_reservations WHERE workspace_id=?', workspaceId);
77
+ const reservedDisk = this.usage('SELECT COALESCE(SUM(bytes+staging_bytes),0) n FROM recovery_reservations');
78
+ const stat = fs.statfsSync(this.directory, { bigint: true });
79
+ const free = stat.bavail * stat.bsize;
80
+ if (usage.installationBytes + usage.reservedBytes + bytes > install.storageBytes || usage.projectBytes + local + logicalBytes > policy.projectBytes || free < BigInt(install.freeFloorBytes) + BigInt(reservedDisk + bytes + stagingBytes)) {
81
+ throw new DodoError('RESOURCE_LIMIT', 'backup storage reservation exceeds quota or free-space floor', { recovery: 'free disk space or review Recovery quotas in owner settings; source was not changed' });
82
+ }
83
+ this.store.db.prepare('INSERT INTO recovery_reservations VALUES (?,?,?,?,?,?)').run(id, workspaceId, bytes, logicalBytes, stagingBytes, Date.now());
84
+ }).immediate();
85
+ }
86
+ estimate(workspaceId, entries) {
87
+ const unique = new Map(entries.map(e => [e.hash, e.bytes]));
88
+ let physical = 0, logical = 0, staging = 0;
89
+ for (const [hash, bytes] of unique) {
90
+ if (!this.store.db.prepare('SELECT 1 FROM recovery_objects WHERE hash=?').get(hash))
91
+ physical += bytes;
92
+ if (!this.store.db.prepare('SELECT 1 FROM recovery_refs r JOIN recovery_snapshots s ON s.id=r.snapshot_id WHERE s.workspace_id=? AND r.object_hash=? LIMIT 1').get(workspaceId, hash))
93
+ logical += bytes;
94
+ staging = Math.max(staging, bytes);
95
+ }
96
+ return { physical, logical, staging };
97
+ }
98
+ release(id) { this.store.db.prepare('DELETE FROM recovery_reservations WHERE id=?').run(id); }
99
+ async verifyObject(hash, expectedBytes) {
100
+ const file = this.objectPath(hash), before = assertPrivatePath(file);
101
+ if (before.size !== expectedBytes)
102
+ throw new DodoError('RECOVERY_REQUIRED', 'backup object size mismatch');
103
+ const handle = await fs.promises.open(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
104
+ try {
105
+ const h = createHash('sha256');
106
+ const b = Buffer.alloc(128 * 1024);
107
+ let size = 0;
108
+ const fdstat = await handle.stat();
109
+ if (fdstat.dev !== before.dev || fdstat.ino !== before.ino || fdstat.nlink !== 1)
110
+ throw new DodoError('RECOVERY_REQUIRED', 'backup object identity changed');
111
+ while (true) {
112
+ const { bytesRead } = await handle.read(b, 0, b.length, null);
113
+ if (!bytesRead)
114
+ break;
115
+ size += bytesRead;
116
+ if (size > expectedBytes)
117
+ throw new DodoError('RECOVERY_REQUIRED', 'backup object grew');
118
+ h.update(b.subarray(0, bytesRead));
119
+ }
120
+ const after = await handle.stat(), live = assertPrivatePath(file);
121
+ if (size !== expectedBytes || h.digest('hex') !== hash || after.mtimeMs !== fdstat.mtimeMs || after.ctimeMs !== fdstat.ctimeMs || live.ino !== after.ino || live.dev !== after.dev)
122
+ throw new DodoError('RECOVERY_REQUIRED', 'backup object integrity failed');
123
+ }
124
+ finally {
125
+ await handle.close();
126
+ }
127
+ }
128
+ async readObject(hash, bytes, limit) {
129
+ if (bytes > limit)
130
+ throw new DodoError('FILE_TOO_LARGE', 'restore file exceeds configured content budget');
131
+ await this.verifyObject(hash, bytes);
132
+ const file = this.objectPath(hash), stat = assertPrivatePath(file), fd = fs.openSync(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
133
+ try {
134
+ const opened = fs.fstatSync(fd);
135
+ if (opened.ino !== stat.ino || opened.dev !== stat.dev || opened.size !== bytes || opened.nlink !== 1)
136
+ throw new DodoError('RECOVERY_REQUIRED', 'backup changed before read');
137
+ const result = fs.readFileSync(fd);
138
+ if (result.length !== bytes || createHash('sha256').update(result).digest('hex') !== hash)
139
+ throw new DodoError('RECOVERY_REQUIRED', 'backup content integrity failed');
140
+ return result;
141
+ }
142
+ finally {
143
+ fs.closeSync(fd);
144
+ }
145
+ }
146
+ async publishObject(stage, hash, bytes) {
147
+ if (path.dirname(stage) !== this.safeDir('staging'))
148
+ throw new DodoError('PATH_DENIED', 'invalid recovery staging path');
149
+ assertPrivatePath(stage);
150
+ const dest = this.objectPath(hash);
151
+ try {
152
+ fs.linkSync(stage, dest);
153
+ }
154
+ catch (e) {
155
+ if (e.code !== 'EEXIST')
156
+ throw e;
157
+ }
158
+ fs.unlinkSync(stage);
159
+ syncDir(path.dirname(dest));
160
+ // Another project may be publishing identical bytes. Publication/verification
161
+ // is serialized by the caller's installation transaction where needed.
162
+ await this.verifyObject(hash, bytes);
163
+ this.store.db.prepare('INSERT OR IGNORE INTO recovery_objects VALUES (?,?,?)').run(hash, bytes, Date.now());
164
+ }
165
+ async publish(manifest) {
166
+ await this.verifyEntries(manifest.entries);
167
+ const text = JSON.stringify(manifest), digest = digestOf(manifest);
168
+ const file = this.manifestPath(manifest.id);
169
+ const fd = fs.openSync(file, 'wx', 0o600);
170
+ try {
171
+ fs.writeFileSync(fd, text);
172
+ fs.fsyncSync(fd);
173
+ }
174
+ finally {
175
+ fs.closeSync(fd);
176
+ }
177
+ syncDir(path.dirname(file));
178
+ this.store.db.transaction(() => {
179
+ const row = this.store.db.prepare('UPDATE recovery_snapshots SET state=\'READY\',manifest_digest=?,bytes=? WHERE id=? AND state=\'PREPARING\'').run(digest, manifest.entries.reduce((n, e) => n + e.bytes, 0), manifest.id);
180
+ if (row.changes !== 1)
181
+ throw new DodoError('RECOVERY_REQUIRED', 'snapshot state changed while publishing');
182
+ for (const e of manifest.entries)
183
+ if (e.hash)
184
+ this.store.db.prepare('INSERT OR IGNORE INTO recovery_refs VALUES (?,?)').run(manifest.id, e.hash);
185
+ this.release(manifest.id);
186
+ }).immediate();
187
+ }
188
+ async readVerified(id, workspaceId) {
189
+ const row = this.store.db.prepare("SELECT manifest_digest FROM recovery_snapshots WHERE id=? AND workspace_id=? AND state='READY'").get(id, workspaceId);
190
+ if (!row)
191
+ throw new DodoError('NOT_FOUND', 'snapshot unavailable for this project');
192
+ const file = this.manifestPath(id), stat = assertPrivatePath(file);
193
+ if (stat.size > 256 * 1024 * 1024)
194
+ throw new DodoError('RESOURCE_LIMIT', 'backup manifest too large');
195
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0));
196
+ let text;
197
+ try {
198
+ const st = fs.fstatSync(fd);
199
+ if (st.ino !== stat.ino || st.dev !== stat.dev || st.nlink !== 1)
200
+ throw new DodoError('RECOVERY_REQUIRED', 'manifest identity changed');
201
+ text = fs.readFileSync(fd, 'utf8');
202
+ }
203
+ finally {
204
+ fs.closeSync(fd);
205
+ }
206
+ let m;
207
+ try {
208
+ m = JSON.parse(text);
209
+ }
210
+ catch {
211
+ throw new DodoError('RECOVERY_REQUIRED', 'backup manifest is corrupt');
212
+ }
213
+ if (m.id !== id || m.workspaceId !== workspaceId || m.version !== 1 || m.complete !== true || digestOf(m) !== row.manifest_digest)
214
+ throw new DodoError('RECOVERY_REQUIRED', 'backup manifest integrity failed');
215
+ await this.verifyEntries(m.entries);
216
+ return m;
217
+ }
218
+ /** Content-addressed duplicates refer to the same object, not separate ACLs.
219
+ * Verify every distinct object freshly for this call; never cache permission
220
+ * or integrity results across calls, and reject inconsistent size references. */
221
+ async verifyEntries(entries) {
222
+ const objects = new Map();
223
+ for (const e of entries)
224
+ if (e.hash) {
225
+ if (objects.has(e.hash) && objects.get(e.hash) !== e.bytes)
226
+ throw new DodoError('RECOVERY_REQUIRED', 'inconsistent backup object size references');
227
+ objects.set(e.hash, e.bytes);
228
+ }
229
+ for (const [hash, bytes] of objects)
230
+ await this.verifyObject(hash, bytes);
231
+ }
232
+ /** Only under the exclusive project lease. Interrupted snapshots never become READY. */
233
+ reconcile(workspaceId) {
234
+ this.store.db.transaction(() => {
235
+ this.store.db.prepare("UPDATE recovery_snapshots SET state='INCOMPLETE' WHERE workspace_id=? AND state='PREPARING'").run(workspaceId);
236
+ this.store.db.prepare('DELETE FROM recovery_reservations WHERE workspace_id=?').run(workspaceId);
237
+ }).immediate();
238
+ }
239
+ /** Shared read-only retention calculation. Preview never deletes state or bytes. */
240
+ retention(workspaceId, policy, now = Date.now()) {
241
+ const sessions = this.store.db.prepare("SELECT id,created_at FROM recovery_sessions WHERE workspace_id=? AND state='closed' ORDER BY created_at DESC,rowid DESC").all(workspaceId);
242
+ const removeSessions = new Set();
243
+ const livePlan = (id) => Boolean(this.store.db.prepare(`SELECT 1 FROM recovery_plan_refs r JOIN change_plans p ON p.id=r.plan_id WHERE r.snapshot_id=? AND p.expires_at>=? AND p.invalidated_at IS NULL LIMIT 1`).get(id, now));
244
+ const named = (id) => Boolean(this.store.db.prepare('SELECT 1 FROM recovery_pointers WHERE snapshot_id=? LIMIT 1').get(id));
245
+ const deployment = (id) => Boolean(this.store.db.prepare('SELECT 1 FROM recovery_deployments WHERE snapshot_id=? LIMIT 1').get(id));
246
+ const databaseRule = (id) => Boolean(this.store.db.prepare('SELECT 1 FROM recovery_database_bindings WHERE snapshot_id=? LIMIT 1').get(id));
247
+ for (const [i, session] of sessions.entries()) {
248
+ if (i < policy.retainedPoints && session.created_at >= now - policy.retentionDays * 86400000)
249
+ continue;
250
+ const events = this.store.db.prepare(`SELECT e.snapshot_id,s.pinned,e.kind,e.ref FROM recovery_events e LEFT JOIN recovery_snapshots s ON s.id=e.snapshot_id WHERE e.session_id=?`).all(session.id);
251
+ if (events.some(e => e.pinned === 1 || (e.snapshot_id && (named(e.snapshot_id) || livePlan(e.snapshot_id) || deployment(e.snapshot_id) || databaseRule(e.snapshot_id)))
252
+ || e.kind === 'changeset' && Boolean(this.store.db.prepare("SELECT 1 FROM changesets WHERE id=? AND status IN ('committing','recovery_required')").get(e.ref))
253
+ || e.kind === 'job' && Boolean(this.store.db.prepare("SELECT 1 FROM jobs WHERE id=? AND status='running'").get(e.ref))))
254
+ continue;
255
+ removeSessions.add(session.id);
256
+ }
257
+ const rows = this.store.db.prepare("SELECT id,scope,created_at,pinned,bytes FROM recovery_snapshots WHERE workspace_id=? AND state='READY' ORDER BY created_at DESC,rowid DESC").all(workspaceId);
258
+ const keep = new Set([rows[0]?.id, rows.find(r => r.scope === 'source')?.id]);
259
+ const points = rows.map((r, i) => {
260
+ let reason = 'eligible';
261
+ if (keep.has(r.id))
262
+ reason = 'latest_backup';
263
+ else if (r.pinned)
264
+ reason = 'pinned';
265
+ else if (named(r.id))
266
+ reason = 'named_checkpoint';
267
+ else if (deployment(r.id))
268
+ reason = 'deployment_provenance';
269
+ else if (databaseRule(r.id))
270
+ reason = 'database_compatibility_rule';
271
+ else if (this.store.db.prepare('SELECT 1 FROM recovery_drift WHERE baseline_id=?').get(r.id))
272
+ reason = 'drift_baseline';
273
+ else if (livePlan(r.id))
274
+ reason = 'reviewed_restore_plan';
275
+ else if (this.store.db.prepare('SELECT session_id FROM recovery_events WHERE snapshot_id=?').all(r.id).some(e => !removeSessions.has(e.session_id)))
276
+ reason = 'session_history';
277
+ else if (i < policy.retainedPoints && r.created_at >= now - policy.retentionDays * 86400000)
278
+ reason = 'within_retention';
279
+ return { checkpointId: r.id, logicalBytes: r.bytes, reason, eligible: reason === 'eligible' };
280
+ });
281
+ return { sessions: [...removeSessions], points };
282
+ }
283
+ cleanupPreview(workspaceId, policy, cursor = 0, limit = 50) {
284
+ const plan = this.retention(workspaceId, policy), eligible = plan.points.filter(p => p.eligible);
285
+ return { digest: digestOf(plan), checkedAt: Date.now(), items: plan.points.slice(cursor, cursor + limit), nextCursor: plan.points.length > cursor + limit ? cursor + limit : null,
286
+ eligiblePoints: eligible.length, closedSessions: plan.sessions.length, logicalBytes: eligible.reduce((n, p) => n + p.logicalBytes, 0),
287
+ physicalBytesFreed: null, scope: 'retention_preview_only', note: 'Shared objects, Git copies and the orphan grace period affect actual disk savings; no purge was executed.' };
288
+ }
289
+ /** Same plan as preview, under a transaction; named points and pins are never expired. */
290
+ prune(workspaceId, policy) {
291
+ const manifests = [];
292
+ this.store.db.transaction(() => {
293
+ this.store.db.prepare('DELETE FROM recovery_plan_refs WHERE plan_id IN (SELECT id FROM change_plans WHERE workspace_id=? AND (expires_at<? OR invalidated_at IS NOT NULL))').run(workspaceId, Date.now());
294
+ const plan = this.retention(workspaceId, policy);
295
+ for (const id of plan.sessions) {
296
+ this.store.db.prepare('DELETE FROM recovery_events WHERE session_id=?').run(id);
297
+ this.store.db.prepare('DELETE FROM recovery_sessions WHERE id=?').run(id);
298
+ }
299
+ for (const p of plan.points)
300
+ if (p.eligible) {
301
+ this.store.db.prepare('DELETE FROM recovery_snapshots WHERE id=?').run(p.checkpointId);
302
+ manifests.push(this.manifestPath(p.checkpointId));
303
+ }
304
+ }).immediate();
305
+ for (const file of manifests)
306
+ fs.rmSync(file, { force: true });
307
+ return manifests.length;
308
+ }
309
+ /** Orphans only; no active capture anywhere. Grace covers unpublished files after crashes. */
310
+ collectOrphans(now = Date.now()) {
311
+ let removed = 0;
312
+ this.store.db.transaction(() => {
313
+ if (this.usage('SELECT COUNT(*) n FROM recovery_reservations') > 0)
314
+ return;
315
+ const cutoff = now - 24 * 60 * 60 * 1000;
316
+ const rows = this.store.db.prepare('SELECT hash FROM recovery_objects WHERE created_at<? AND NOT EXISTS (SELECT 1 FROM recovery_refs WHERE object_hash=hash)').all(cutoff);
317
+ for (const r of rows) {
318
+ fs.rmSync(this.objectPath(r.hash), { force: true });
319
+ this.store.db.prepare('DELETE FROM recovery_objects WHERE hash=?').run(r.hash);
320
+ removed++;
321
+ }
322
+ for (const name of fs.readdirSync(this.safeDir('objects'))) {
323
+ if (!HASH.test(name) || this.store.db.prepare('SELECT 1 FROM recovery_objects WHERE hash=?').get(name))
324
+ continue;
325
+ const p = this.objectPath(name), st = fs.lstatSync(p);
326
+ if (st.isFile() && !st.isSymbolicLink() && st.nlink === 1 && st.mtimeMs < cutoff) {
327
+ fs.unlinkSync(p);
328
+ removed++;
329
+ }
330
+ }
331
+ // Unpublished staging files have no database references. Don't traverse links.
332
+ for (const name of fs.readdirSync(this.safeDir('staging'))) {
333
+ const p = path.join(this.safeDir('staging'), name);
334
+ const st = fs.lstatSync(p);
335
+ if (st.isFile() && !st.isSymbolicLink() && st.nlink === 1 && st.mtimeMs < cutoff) {
336
+ fs.unlinkSync(p);
337
+ removed++;
338
+ }
339
+ }
340
+ }).immediate();
341
+ return removed;
342
+ }
343
+ }
344
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/services/recovery/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAC9B,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO;IACzC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,QAAQ,EAAC,SAAS,EAAC,YAAY,CAAC,CAAC,QAAQ,CAAE,GAA6B,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,MAAM,GAAG,CAAC;IACxG,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACjC,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAC,sCAAsC,CAAC,CAAC;IACjK,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AACD,oFAAoF;AACpF,MAAM,OAAO,eAAe;IAGL;IAA0C;IAFtD,SAAS,CAAS;IACV,QAAQ,CAAS;IAClC,YAAqB,KAAY,EAAE,SAAiB,EAAW,kBAAoD;QAA9F,UAAK,GAAL,KAAK,CAAO;QAA8B,uBAAkB,GAAlB,kBAAkB,CAAkC;QACjH,iBAAiB,CAAC,SAAS,EAAC,IAAI,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAC,UAAU,CAAC,CAAC;QACpD,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAC,WAAW,EAAC,SAAS,CAAC;YAAE,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAC,GAAG,CAAC,CAAC,CAAC;IAC7G,CAAC;IACO,OAAO,CAAC,IAAqC;QACnD,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAC,oCAAoC,CAAC,CAAC;QAC5H,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAC,IAAI,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAC,IAAI,CAAC,CAAC;QAAC,iBAAiB,CAAC,GAAG,EAAC,IAAI,CAAC,CAAC;QAAC,OAAO,GAAG,CAAC;IACtF,CAAC;IACD,UAAU,CAAC,IAAW;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,mCAAmC,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,YAAY,CAAC,EAAS;QACpB,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,eAAe,EAAC,qBAAqB,CAAC,CAAC;QACjG,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IACD,SAAS,KAAY,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,KAAY,EAAC,GAAG,MAAgB,IAAU,OAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAgB,CAAC,CAAC,CAAC,CAAA,CAAC;IAC9H,QAAQ,CAAC,WAAkB;QACzB,OAAO,EAAC,iBAAiB,EAAC,IAAI,CAAC,KAAK,CAAC,uDAAuD,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC;YAClK,YAAY,EAAC,IAAI,CAAC,KAAK,CAAC,oLAAoL,EAAC,WAAW,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,+EAA+E,EAAC,WAAW,CAAC;YACjU,aAAa,EAAC,IAAI,CAAC,KAAK,CAAC,4DAA4D,CAAC,EAAC,CAAC;IAC5F,CAAC;IACD,OAAO,CAAC,EAAS,EAAC,WAAkB,EAAC,KAAY,EAAC,MAAqB,EAAC,YAAY,GAAC,KAAK,EAAC,YAAY,GAAC,KAAK;QAC3G,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAC,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAC,8BAA8B,CAAC,CAAC;QAClH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,GAAE,EAAE;YAC5B,MAAM,KAAK,GAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,yFAAyF,EAAC,WAAW,CAAC,CAAC;YAC9H,MAAM,YAAY,GAAC,IAAI,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;YAC1G,MAAM,IAAI,GAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAC,EAAC,MAAM,EAAC,IAAI,EAAC,CAAC,CAAC;YAAC,MAAM,IAAI,GAAC,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,KAAK,CAAC;YAC1F,IAAI,KAAK,CAAC,iBAAiB,GAAC,KAAK,CAAC,aAAa,GAAC,KAAK,GAAC,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,GAAC,KAAK,GAAC,YAAY,GAAC,MAAM,CAAC,YAAY,IAAI,IAAI,GAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,GAAC,MAAM,CAAC,YAAY,GAAC,KAAK,GAAC,YAAY,CAAC,EAAE,CAAC;gBACvN,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAC,8DAA8D,EAAC,EAAC,QAAQ,EAAC,qFAAqF,EAAC,CAAC,CAAC;YACxM,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAC,WAAW,EAAC,KAAK,EAAC,YAAY,EAAC,YAAY,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjJ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjB,CAAC;IACD,QAAQ,CAAC,WAAkB,EAAC,OAAyC;QACnE,MAAM,MAAM,GAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,CAAC,IAAI,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAA,IAAI,QAAQ,GAAC,CAAC,EAAC,OAAO,GAAC,CAAC,EAAC,OAAO,GAAC,CAAC,CAAC;QAC1F,KAAI,MAAM,CAAC,IAAI,EAAC,KAAK,CAAC,IAAG,MAAM,EAAC,CAAC;YAC/B,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAC,QAAQ,IAAE,KAAK,CAAC;YACnG,IAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,kIAAkI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAC,IAAI,CAAC;gBAAC,OAAO,IAAE,KAAK,CAAC;YACnM,OAAO,GAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,EAAC,QAAQ,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC;IACpC,CAAC;IACD,OAAO,CAAC,EAAS,IAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA,CAAC;IACxG,KAAK,CAAC,YAAY,CAAC,IAAW,EAAC,aAAoB;QACjD,MAAM,IAAI,GAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjE,IAAG,MAAM,CAAC,IAAI,KAAG,aAAa;YAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,6BAA6B,CAAC,CAAC;QACvG,MAAM,MAAM,GAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,IAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC;YACH,MAAM,CAAC,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAA,MAAM,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAC,IAAI,CAAC,CAAC;YAAA,IAAI,IAAI,GAAC,CAAC,CAAC;YACvE,MAAM,MAAM,GAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAAA,IAAG,MAAM,CAAC,GAAG,KAAG,MAAM,CAAC,GAAG,IAAE,MAAM,CAAC,GAAG,KAAG,MAAM,CAAC,GAAG,IAAE,MAAM,CAAC,KAAK,KAAG,CAAC;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,gCAAgC,CAAC,CAAC;YACjL,OAAM,IAAI,EAAC,CAAC;gBAAA,MAAM,EAAC,SAAS,EAAC,GAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,MAAM,EAAC,IAAI,CAAC,CAAC;gBAAA,IAAG,CAAC,SAAS;oBAAC,MAAM;gBAAA,IAAI,IAAE,SAAS,CAAC;gBAAA,IAAG,IAAI,GAAC,aAAa;oBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,oBAAoB,CAAC,CAAC;gBAAA,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAC,SAAS,CAAC,CAAC,CAAC;YAAA,CAAC;YAC9N,MAAM,KAAK,GAAC,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,GAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAG,IAAI,KAAG,aAAa,IAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAG,IAAI,IAAE,KAAK,CAAC,OAAO,KAAG,MAAM,CAAC,OAAO,IAAE,KAAK,CAAC,OAAO,KAAG,MAAM,CAAC,OAAO,IAAE,IAAI,CAAC,GAAG,KAAG,KAAK,CAAC,GAAG,IAAE,IAAI,CAAC,GAAG,KAAG,KAAK,CAAC,GAAG;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,gCAAgC,CAAC,CAAC;QACxO,CAAC;gBAAS,CAAC;YAAA,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAAA,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAW,EAAC,KAAY,EAAC,KAAY;QACpD,IAAG,KAAK,GAAC,KAAK;YAAC,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAC,gDAAgD,CAAC,CAAC;QACtG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC;QACpC,MAAM,IAAI,GAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAC,IAAI,GAAC,iBAAiB,CAAC,IAAI,CAAC,EAAC,EAAE,GAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAC,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,IAAE,CAAC,CAAC,CAAC,CAAC;QACtI,IAAI,CAAC;YACH,MAAM,MAAM,GAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAA,IAAG,MAAM,CAAC,GAAG,KAAG,IAAI,CAAC,GAAG,IAAE,MAAM,CAAC,GAAG,KAAG,IAAI,CAAC,GAAG,IAAE,MAAM,CAAC,IAAI,KAAG,KAAK,IAAE,MAAM,CAAC,KAAK,KAAG,CAAC;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,4BAA4B,CAAC,CAAC;YAC3L,MAAM,MAAM,GAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjC,IAAG,MAAM,CAAC,MAAM,KAAG,KAAK,IAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAG,IAAI;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,iCAAiC,CAAC,CAAC;YAC9J,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAO,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAA,CAAC;IAC7B,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,KAAY,EAAC,IAAW,EAAC,KAAY;QACvD,IAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAAC,MAAM,IAAI,SAAS,CAAC,aAAa,EAAC,+BAA+B,CAAC,CAAC;QACpH,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,IAAI,GAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC;YAAA,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAC,IAAI,CAAC,CAAC;QAAA,CAAC;QAAC,OAAM,CAAC,EAAC,CAAC;YAAA,IAAI,CAA2B,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,CAAC,CAAC;QAAA,CAAC;QACjG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,8EAA8E;QAC9E,uEAAuE;QACvE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,CAAC,IAAI,EAAC,KAAK,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAAyB;QACrC,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAAA,MAAM,IAAI,GAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzG,MAAM,EAAE,GAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC;YAAA,EAAE,CAAC,aAAa,CAAC,EAAE,EAAC,IAAI,CAAC,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAA,CAAC;gBAAO,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAA,CAAC;QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,GAAE,EAAE;YAC5B,MAAM,GAAG,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,4GAA4G,CAAC,CAAC,GAAG,CAAC,MAAM,EAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,GAAC,CAAC,CAAC,KAAK,EAAC,CAAC,CAAC,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClN,IAAG,GAAG,CAAC,OAAO,KAAG,CAAC;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,yCAAyC,CAAC,CAAC;YACtG,KAAI,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO;gBAAC,IAAG,CAAC,CAAC,IAAI;oBAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5I,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,EAAS,EAAC,WAAkB;QAC7C,MAAM,GAAG,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,gGAAgG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAC,WAAW,CAAuC,CAAC;QAC5L,IAAG,CAAC,GAAG;YAAC,MAAM,IAAI,SAAS,CAAC,WAAW,EAAC,uCAAuC,CAAC,CAAC;QACjF,MAAM,IAAI,GAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAC,IAAI,GAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAAA,IAAG,IAAI,CAAC,IAAI,GAAC,GAAG,GAAC,IAAI,GAAC,IAAI;YAAC,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAC,2BAA2B,CAAC,CAAC;QAC3J,MAAM,EAAE,GAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAC,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,IAAE,CAAC,CAAC,CAAC,CAAC;QAAA,IAAI,IAAW,CAAC;QAC9F,IAAG,CAAC;YAAA,MAAM,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAAA,IAAG,EAAE,CAAC,GAAG,KAAG,IAAI,CAAC,GAAG,IAAE,EAAE,CAAC,GAAG,KAAG,IAAI,CAAC,GAAG,IAAE,EAAE,CAAC,KAAK,KAAG,CAAC;gBAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,2BAA2B,CAAC,CAAC;YAAA,IAAI,GAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAC,MAAM,CAAC,CAAC;QAAA,CAAC;gBAAO,CAAC;YAAA,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAA,CAAC;QACpN,IAAI,CAAkB,CAAC;QAAA,IAAG,CAAC;YAAA,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;QAAA,CAAC;QAAA,MAAK,CAAC;YAAA,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,4BAA4B,CAAC,CAAC;QAAA,CAAC;QAChJ,IAAG,CAAC,CAAC,EAAE,KAAG,EAAE,IAAE,CAAC,CAAC,WAAW,KAAG,WAAW,IAAE,CAAC,CAAC,OAAO,KAAG,CAAC,IAAE,CAAC,CAAC,QAAQ,KAAG,IAAI,IAAE,QAAQ,CAAC,CAAC,CAAC,KAAG,GAAG,CAAC,eAAe;YAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAC,kCAAkC,CAAC,CAAC;QAC3L,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IACD;;qFAEiF;IACzE,KAAK,CAAC,aAAa,CAAC,OAAoC;QAC9D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK;oBAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,4CAA4C,CAAC,CAAC;gBACnJ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO;YAAE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IACD,wFAAwF;IACxF,SAAS,CAAC,WAAkB;QAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,GAAE,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,6FAA6F,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACjB,CAAC;IACD,oFAAoF;IAC5E,SAAS,CAAC,WAAkB,EAAC,MAAqB,EAAC,GAAG,GAAC,IAAI,CAAC,GAAG,EAAE;QACvE,MAAM,QAAQ,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,yHAAyH,CAAC,CAAC,GAAG,CAAC,WAAW,CAAyC,CAAC;QACzN,MAAM,cAAc,GAAC,IAAI,GAAG,EAAU,CAAC;QACvC,MAAM,QAAQ,GAAC,CAAC,EAAS,EAAC,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,yJAAyJ,CAAC,CAAC,GAAG,CAAC,EAAE,EAAC,GAAG,CAAC,CAAC,CAAC;QAClO,MAAM,KAAK,GAAC,CAAC,EAAS,EAAC,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/H,MAAM,UAAU,GAAC,CAAC,EAAS,EAAC,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACvI,MAAM,YAAY,GAAC,CAAC,EAAS,EAAC,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/I,KAAI,MAAM,CAAC,CAAC,EAAC,OAAO,CAAC,IAAG,QAAQ,CAAC,OAAO,EAAE,EAAC,CAAC;YAC1C,IAAG,CAAC,GAAC,MAAM,CAAC,cAAc,IAAE,OAAO,CAAC,UAAU,IAAE,GAAG,GAAC,MAAM,CAAC,aAAa,GAAC,QAAQ;gBAAC,SAAS;YAC3F,MAAM,MAAM,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,6IAA6I,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAoF,CAAC;YACrR,IAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,KAAG,CAAC,IAAE,CAAC,CAAC,CAAC,WAAW,IAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,IAAE,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;mBACpJ,CAAC,CAAC,IAAI,KAAG,WAAW,IAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,sFAAsF,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;mBACvJ,CAAC,CAAC,IAAI,KAAG,KAAK,IAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,SAAS;YAC9H,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,4IAA4I,CAAC,CAAC,GAAG,CAAC,WAAW,CAAiF,CAAC;QAChR,MAAM,IAAI,GAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,KAAG,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE;YAC3B,IAAI,MAAM,GAAC,UAAU,CAAC;YACtB,IAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,eAAe,CAAC;iBAAK,IAAG,CAAC,CAAC,MAAM;gBAAC,MAAM,GAAC,QAAQ,CAAC;iBAAK,IAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,kBAAkB,CAAC;iBACnH,IAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,uBAAuB,CAAC;iBACnD,IAAG,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,6BAA6B,CAAC;iBAC3D,IAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,gBAAgB,CAAC;iBAC/G,IAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAC,uBAAuB,CAAC;iBACjD,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAgC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gBAAC,MAAM,GAAC,iBAAiB,CAAC;iBACrM,IAAG,CAAC,GAAC,MAAM,CAAC,cAAc,IAAE,CAAC,CAAC,UAAU,IAAE,GAAG,GAAC,MAAM,CAAC,aAAa,GAAC,QAAQ;gBAAC,MAAM,GAAC,kBAAkB,CAAC;YAC3G,OAAO,EAAC,YAAY,EAAC,CAAC,CAAC,EAAE,EAAC,YAAY,EAAC,CAAC,CAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,KAAG,UAAU,EAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,OAAO,EAAC,QAAQ,EAAC,CAAC,GAAG,cAAc,CAAC,EAAC,MAAM,EAAC,CAAC;IAC/C,CAAC;IACD,cAAc,CAAC,WAAkB,EAAC,MAAqB,EAAC,MAAM,GAAC,CAAC,EAAC,KAAK,GAAC,EAAE;QACvE,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAC,MAAM,CAAC,EAAC,QAAQ,GAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzF,OAAO,EAAC,MAAM,EAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAC,MAAM,GAAC,KAAK,CAAC,EAAC,UAAU,EAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAC,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,MAAM,GAAC,KAAK,CAAA,CAAC,CAAA,IAAI;YAC1J,cAAc,EAAC,QAAQ,CAAC,MAAM,EAAC,cAAc,EAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAC,YAAY,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,CAAC,GAAC,CAAC,CAAC,YAAY,EAAC,CAAC,CAAC;YAC1H,kBAAkB,EAAC,IAAI,EAAC,KAAK,EAAC,wBAAwB,EAAC,IAAI,EAAC,2GAA2G,EAAC,CAAC;IAC7K,CAAC;IACD,0FAA0F;IAC1F,KAAK,CAAC,WAAkB,EAAC,MAAqB;QAC5C,MAAM,SAAS,GAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,GAAE,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,qJAAqJ,CAAC,CAAC,GAAG,CAAC,WAAW,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACzM,MAAM,IAAI,GAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAC,MAAM,CAAC,CAAC;YAC9C,KAAI,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAC,CAAC;gBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAA,CAAC;YAC1L,KAAI,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAC,IAAG,CAAC,CAAC,QAAQ,EAAC,CAAC;oBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;oBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;gBAAA,CAAC;QACtL,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACf,KAAI,MAAM,IAAI,IAAI,SAAS;YAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;QAAA,OAAO,SAAS,CAAC,MAAM,CAAC;IACnF,CAAC;IACD,8FAA8F;IAC9F,cAAc,CAAC,GAAG,GAAC,IAAI,CAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,GAAC,CAAC,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,GAAE,EAAE;YAC5B,IAAG,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,GAAC,CAAC;gBAAC,OAAO;YACvE,MAAM,MAAM,GAAC,GAAG,GAAC,EAAE,GAAC,EAAE,GAAC,EAAE,GAAC,IAAI,CAAC;YAC/B,MAAM,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,0HAA0H,CAAC,CAAC,GAAG,CAAC,MAAM,CAAyB,CAAC;YACjM,KAAI,MAAM,CAAC,IAAI,IAAI,EAAC,CAAC;gBAAA,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;gBAAA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAA,OAAO,EAAE,CAAC;YAAA,CAAC;YAC/J,KAAI,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,CAAC;gBACzD,IAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAC,SAAS;gBAC7G,MAAM,CAAC,GAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAC,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjD,IAAG,EAAE,CAAC,MAAM,EAAE,IAAE,CAAC,EAAE,CAAC,cAAc,EAAE,IAAE,EAAE,CAAC,KAAK,KAAG,CAAC,IAAE,EAAE,CAAC,OAAO,GAAC,MAAM,EAAC,CAAC;oBAAA,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAAA,OAAO,EAAE,CAAC;gBAAA,CAAC;YACrG,CAAC;YACD,+EAA+E;YAC/E,KAAI,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,CAAC;gBAAA,MAAM,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,IAAI,CAAC,CAAC;gBAAA,MAAM,EAAE,GAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAAA,IAAG,EAAE,CAAC,MAAM,EAAE,IAAE,CAAC,EAAE,CAAC,cAAc,EAAE,IAAE,EAAE,CAAC,KAAK,KAAG,CAAC,IAAE,EAAE,CAAC,OAAO,GAAC,MAAM,EAAC,CAAC;oBAAA,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAAA,OAAO,EAAE,CAAC;gBAAA,CAAC;YAAA,CAAC;QAC1O,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAAA,OAAO,OAAO,CAAC;IAChC,CAAC;CACF"}
@@ -134,20 +134,14 @@ export class ScheduleService {
134
134
  return;
135
135
  this.bootedAt = Date.now();
136
136
  this.timer = setInterval(() => { if (ready()) {
137
- try {
138
- this.tick();
139
- }
140
- catch {
141
- this.stop();
142
- console.error('[dodo] scheduler stopped after a state error; inspect schedules locally before restarting');
143
- }
137
+ void this.tick().catch(() => { this.stop(); console.error('[dodo] scheduler stopped after a state error; inspect schedules locally before restarting'); });
144
138
  } }, 1000);
145
139
  this.timer.unref();
146
140
  }
147
141
  stop() { if (this.timer)
148
142
  clearInterval(this.timer); this.timer = undefined; }
149
- /** Synchronous claim->spawn: revoke cannot race between permission check and launch. */
150
- tick(now = Date.now()) {
143
+ /** Durable claim, source backup, then live approval recheck immediately before spawn. */
144
+ async tick(now = Date.now()) {
151
145
  const rows = this.s.store.db.prepare("SELECT * FROM schedules WHERE workspace_id=? AND status='approved' ORDER BY next_at LIMIT 64").all(this.s.workspaceId);
152
146
  for (const row of rows) {
153
147
  if (row.expires_at <= now) {
@@ -191,7 +185,12 @@ export class ScheduleService {
191
185
  continue;
192
186
  }
193
187
  try {
194
- const job = this.s.jobs.start({ workspaceId: this.s.workspaceId, epoch: this.s.epoch, principal: `schedule:${row.id}`, kind: 'exec', program: p.spec.command, args: [], cwdRel: p.spec.cwd, timeoutMs: p.spec.timeoutMs, shell: true, sandbox: p.spec.sandbox, network: p.spec.network, stdin: false });
188
+ const job = await this.s.jobs.startProtected({ workspaceId: this.s.workspaceId, epoch: this.s.epoch, principal: `schedule:${row.id}`, kind: 'exec', program: p.spec.command, args: [], cwdRel: p.spec.cwd, timeoutMs: p.spec.timeoutMs, shell: true, sandbox: p.spec.sandbox, network: p.spec.network, stdin: false }, () => {
189
+ const live = this.s.store.db.prepare("SELECT * FROM schedules WHERE id=? AND status='approved'").get(row.id);
190
+ if (!live || live.expires_at <= Date.now())
191
+ throw new DodoError('FORBIDDEN', 'schedule was revoked or expired during source backup');
192
+ this.checked(live);
193
+ });
195
194
  finish('launched', job.jobId);
196
195
  }
197
196
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"scheduleService.js","sourceRoot":"","sources":["../../../src/services/schedules/scheduleService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduleService.js","sourceRoot":"","sources":["../../../src/services/schedules/scheduleService.ts"],"names":[],"mappings":"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"}
package/dist/store/db.js CHANGED
@@ -607,6 +607,77 @@ const MIGRATIONS = [
607
607
  db.exec("ALTER TABLE project_registry ADD COLUMN access_level TEXT NOT NULL DEFAULT 'full'");
608
608
  db.exec('CREATE INDEX IF NOT EXISTS idx_project_registry_workspace ON project_registry(workspace_id) WHERE removed_at IS NULL');
609
609
  },
610
+ `CREATE TABLE recovery_policies (workspace_id TEXT PRIMARY KEY, payload TEXT NOT NULL);
611
+ CREATE TABLE recovery_snapshots (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, project_id TEXT NOT NULL,
612
+ state TEXT NOT NULL CHECK(state IN ('PREPARING','READY','FAILED','INCOMPLETE')), scope TEXT NOT NULL,
613
+ manifest_digest TEXT, bytes INTEGER NOT NULL DEFAULT 0, created_at INTEGER NOT NULL, pinned INTEGER NOT NULL DEFAULT 0);
614
+ CREATE INDEX idx_recovery_snapshots_workspace ON recovery_snapshots(workspace_id,created_at);
615
+ CREATE TABLE recovery_objects (hash TEXT PRIMARY KEY, bytes INTEGER NOT NULL, created_at INTEGER NOT NULL);
616
+ CREATE TABLE recovery_refs (snapshot_id TEXT NOT NULL REFERENCES recovery_snapshots(id) ON DELETE CASCADE,
617
+ object_hash TEXT NOT NULL REFERENCES recovery_objects(hash), PRIMARY KEY(snapshot_id,object_hash));
618
+ CREATE TABLE recovery_reservations (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, bytes INTEGER NOT NULL,
619
+ logical_bytes INTEGER NOT NULL, staging_bytes INTEGER NOT NULL, created_at INTEGER NOT NULL);`,
620
+ `CREATE TABLE recovery_sessions (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, actor TEXT NOT NULL,
621
+ root_identity TEXT NOT NULL, epoch TEXT NOT NULL, title TEXT NOT NULL, state TEXT NOT NULL,
622
+ baseline_id TEXT, dirty_json TEXT NOT NULL DEFAULT '{}', created_at INTEGER NOT NULL, ended_at INTEGER);
623
+ CREATE INDEX idx_recovery_sessions ON recovery_sessions(workspace_id,actor,created_at);
624
+ CREATE TABLE recovery_events (seq INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL REFERENCES recovery_sessions(id),
625
+ snapshot_id TEXT REFERENCES recovery_snapshots(id), kind TEXT NOT NULL, ref TEXT, created_at INTEGER NOT NULL);
626
+ CREATE TABLE recovery_restore_plans (plan_id TEXT PRIMARY KEY REFERENCES change_plans(id),
627
+ workspace_id TEXT NOT NULL, actor TEXT NOT NULL, payload TEXT NOT NULL);
628
+ CREATE TABLE recovery_plan_refs (plan_id TEXT NOT NULL REFERENCES recovery_restore_plans(plan_id) ON DELETE CASCADE,
629
+ snapshot_id TEXT NOT NULL REFERENCES recovery_snapshots(id), PRIMARY KEY(plan_id,snapshot_id));`,
630
+ `CREATE TABLE recovery_drift (workspace_id TEXT PRIMARY KEY, payload TEXT NOT NULL,
631
+ baseline_id TEXT NOT NULL REFERENCES recovery_snapshots(id));
632
+ CREATE TABLE recovery_git_destinations (workspace_id TEXT PRIMARY KEY, path TEXT NOT NULL, identity TEXT NOT NULL);
633
+ CREATE TABLE recovery_git_copies (snapshot_id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
634
+ directory TEXT NOT NULL, identity TEXT, bytes INTEGER NOT NULL, state TEXT NOT NULL, payload TEXT NOT NULL);`,
635
+ `CREATE TABLE recovery_verifications (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, actor TEXT NOT NULL,
636
+ snapshot_id TEXT NOT NULL REFERENCES recovery_snapshots(id) ON DELETE CASCADE,
637
+ manifest_digest TEXT NOT NULL, created_at INTEGER NOT NULL, result_json TEXT, stale INTEGER NOT NULL DEFAULT 0, verified_at INTEGER);
638
+ CREATE INDEX idx_recovery_verifications ON recovery_verifications(workspace_id,created_at);
639
+ CREATE TABLE recovery_pointers (workspace_id TEXT NOT NULL, name TEXT NOT NULL,
640
+ snapshot_id TEXT REFERENCES recovery_snapshots(id), revision INTEGER NOT NULL, updated_at INTEGER NOT NULL,
641
+ PRIMARY KEY(workspace_id,name));
642
+ CREATE TABLE recovery_pointer_events (seq INTEGER PRIMARY KEY AUTOINCREMENT, workspace_id TEXT NOT NULL,
643
+ name TEXT NOT NULL, previous_id TEXT, snapshot_id TEXT, revision INTEGER NOT NULL, created_at INTEGER NOT NULL);`,
644
+ `CREATE TABLE recovery_deployment_targets (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
645
+ revision INTEGER NOT NULL, enabled INTEGER NOT NULL, payload TEXT NOT NULL, docker_context TEXT NOT NULL,
646
+ compose_project TEXT NOT NULL, service TEXT NOT NULL, updated_at INTEGER NOT NULL,
647
+ UNIQUE(docker_context,compose_project,service));
648
+ CREATE TABLE recovery_deployments (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, actor TEXT NOT NULL,
649
+ target_id TEXT NOT NULL REFERENCES recovery_deployment_targets(id), snapshot_id TEXT NOT NULL REFERENCES recovery_snapshots(id),
650
+ key_hash TEXT NOT NULL, request_hash TEXT NOT NULL, payload TEXT NOT NULL, plan_hash TEXT NOT NULL,
651
+ state TEXT NOT NULL CHECK(state IN ('PREPARED','BUILDING','BUILT','DEPLOYING','HEALTH_CHECKING','KNOWN_GOOD','FAILED','UNKNOWN')),
652
+ image_digest TEXT, result_json TEXT, created_at INTEGER NOT NULL, UNIQUE(workspace_id,actor,key_hash));
653
+ CREATE INDEX idx_recovery_deployments ON recovery_deployments(workspace_id,created_at);
654
+ CREATE TABLE recovery_deployment_jobs (deployment_id TEXT NOT NULL REFERENCES recovery_deployments(id),
655
+ job_id TEXT NOT NULL REFERENCES jobs(id), stage TEXT NOT NULL, created_at INTEGER NOT NULL,
656
+ PRIMARY KEY(deployment_id,job_id));
657
+ CREATE TABLE recovery_production_pointers (target_id TEXT PRIMARY KEY REFERENCES recovery_deployment_targets(id),
658
+ deployment_id TEXT NOT NULL REFERENCES recovery_deployments(id), previous_id TEXT REFERENCES recovery_deployments(id),
659
+ revision INTEGER NOT NULL, updated_at INTEGER NOT NULL);`,
660
+ `CREATE TABLE recovery_deployment_maintenance (deployment_id TEXT PRIMARY KEY REFERENCES recovery_deployments(id),
661
+ pinned INTEGER NOT NULL DEFAULT 0, retired INTEGER NOT NULL DEFAULT 0,
662
+ probe_json TEXT, resolution_json TEXT, cleanup_json TEXT);
663
+ CREATE TABLE recovery_deployment_reviews (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
664
+ kind TEXT NOT NULL, payload TEXT NOT NULL, digest TEXT NOT NULL, expires_at INTEGER NOT NULL,
665
+ result_json TEXT);`,
666
+ `CREATE TABLE recovery_database_targets (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
667
+ revision INTEGER NOT NULL, enabled INTEGER NOT NULL, definition TEXT NOT NULL, file_identity TEXT NOT NULL);
668
+ CREATE TABLE recovery_database_bindings (target_id TEXT NOT NULL REFERENCES recovery_database_targets(id),
669
+ snapshot_id TEXT NOT NULL REFERENCES recovery_snapshots(id), target_revision INTEGER NOT NULL,
670
+ manifest_hash TEXT NOT NULL, expected_ids TEXT NOT NULL, allow_extra INTEGER NOT NULL,
671
+ PRIMARY KEY(target_id,snapshot_id));`,
672
+ `CREATE TABLE recovery_config_targets (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
673
+ revision INTEGER NOT NULL, enabled INTEGER NOT NULL, payload TEXT NOT NULL, key_ref TEXT NOT NULL);
674
+ CREATE TABLE recovery_config_backups (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
675
+ target_id TEXT NOT NULL REFERENCES recovery_config_targets(id), target_revision INTEGER NOT NULL,
676
+ key_ref TEXT NOT NULL, sealed TEXT NOT NULL, bytes INTEGER NOT NULL, created_at INTEGER NOT NULL);
677
+ CREATE TABLE recovery_config_restores (id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL,
678
+ target_id TEXT NOT NULL REFERENCES recovery_config_targets(id), snapshot_id TEXT NOT NULL REFERENCES recovery_config_backups(id),
679
+ before_id TEXT REFERENCES recovery_config_backups(id), payload TEXT NOT NULL, hash TEXT NOT NULL,
680
+ state TEXT NOT NULL, result TEXT);`,
610
681
  ];
611
682
  /**
612
683
  * Read-only open with NO migration — for CLI helpers (status/approve) that
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { RECOVERY_TOOLS } from './recoveryTools.js';
2
+ import { DEPLOYMENT_TOOLS } from './deploymentTools.js';
1
3
  import { SUBAGENT_TOOLS } from './subagentTools.js';
2
4
  import { registerTool } from './context.js';
3
5
  import { CORE_TOOL_CATALOG } from './coreCatalog.js';
@@ -24,6 +26,8 @@ export const TOOL_CATALOG = [
24
26
  ...SUBAGENT_TOOLS,
25
27
  // Append platform additions so the complete pre-Android catalog stays an exact prefix.
26
28
  ...ANDROID_TOOLS,
29
+ ...RECOVERY_TOOLS,
30
+ ...DEPLOYMENT_TOOLS,
27
31
  ];
28
32
  export function registerCatalog(server, services) {
29
33
  for (const def of TOOL_CATALOG) {
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/tools/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAqC,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,GAAG,iBAAiB;IACpB,qGAAqG;IACrG,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,uFAAuF;IACvF,GAAG,aAAa;CACjB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAAqB;IACtE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/tools/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAqC,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,GAAG,iBAAiB;IACpB,qGAAqG;IACrG,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,uFAAuF;IACvF,GAAG,aAAa;IAChB,GAAG,cAAc;IACjB,GAAG,gBAAgB;CACpB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,QAAqB;IACtE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -136,7 +136,7 @@ export const applyChangesTool = defineTool({
136
136
  export const rollbackChangesTool = defineTool({
137
137
  name: 'rollback_changes',
138
138
  title: 'Rollback changes',
139
- description: 'Restore the files of a committed changeset to their pre-apply bytes from durable backups. Refused with per-file conflicts if ANY affected file was edited after the apply (human work is never overwritten). Takes the changesetId from apply_changes and a fresh idempotencyKey.',
139
+ description: 'Restore your own committed changeset to its pre-apply bytes from verified durable backups. Changesets owned by another caller require private owner recovery. Refused if any affected file or backup changed. Takes the changesetId from apply_changes and a fresh idempotencyKey.',
140
140
  input: {
141
141
  changesetId: z.string().max(128),
142
142
  idempotencyKey: IdempotencyKey,