agentrinse 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +281 -179
  2. package/dist/adapters/claude-cache.d.ts +3 -0
  3. package/dist/adapters/claude-cache.d.ts.map +1 -0
  4. package/dist/adapters/claude-cache.js +67 -0
  5. package/dist/adapters/claude-cache.js.map +1 -0
  6. package/dist/adapters/claude-debug.d.ts +3 -0
  7. package/dist/adapters/claude-debug.d.ts.map +1 -0
  8. package/dist/adapters/claude-debug.js +100 -0
  9. package/dist/adapters/claude-debug.js.map +1 -0
  10. package/dist/adapters/claude-retention.d.ts +36 -0
  11. package/dist/adapters/claude-retention.d.ts.map +1 -0
  12. package/dist/adapters/claude-retention.js +176 -0
  13. package/dist/adapters/claude-retention.js.map +1 -0
  14. package/dist/adapters/codex-database.d.ts +64 -0
  15. package/dist/adapters/codex-database.d.ts.map +1 -0
  16. package/dist/adapters/codex-database.js +409 -0
  17. package/dist/adapters/codex-database.js.map +1 -0
  18. package/dist/adapters/copilot-maintenance.d.ts +23 -0
  19. package/dist/adapters/copilot-maintenance.d.ts.map +1 -0
  20. package/dist/adapters/copilot-maintenance.js +53 -0
  21. package/dist/adapters/copilot-maintenance.js.map +1 -0
  22. package/dist/adapters/provider-adapter.d.ts +5 -0
  23. package/dist/adapters/provider-adapter.d.ts.map +1 -1
  24. package/dist/adapters/provider-adapter.js +352 -6
  25. package/dist/adapters/provider-adapter.js.map +1 -1
  26. package/dist/adapters/provider-root.d.ts +8 -0
  27. package/dist/adapters/provider-root.d.ts.map +1 -0
  28. package/dist/adapters/provider-root.js +27 -0
  29. package/dist/adapters/provider-root.js.map +1 -0
  30. package/dist/adapters/provider-specs.d.ts.map +1 -1
  31. package/dist/adapters/provider-specs.js +25 -0
  32. package/dist/adapters/provider-specs.js.map +1 -1
  33. package/dist/adapters/registry.d.ts +1 -0
  34. package/dist/adapters/registry.d.ts.map +1 -1
  35. package/dist/adapters/registry.js +2 -0
  36. package/dist/adapters/registry.js.map +1 -1
  37. package/dist/commands/adapters.d.ts.map +1 -1
  38. package/dist/commands/adapters.js +3 -1
  39. package/dist/commands/adapters.js.map +1 -1
  40. package/dist/commands/apply.d.ts +2 -0
  41. package/dist/commands/apply.d.ts.map +1 -1
  42. package/dist/commands/apply.js +24 -3
  43. package/dist/commands/apply.js.map +1 -1
  44. package/dist/commands/audit.d.ts +1 -0
  45. package/dist/commands/audit.d.ts.map +1 -1
  46. package/dist/commands/audit.js +3 -1
  47. package/dist/commands/audit.js.map +1 -1
  48. package/dist/commands/completion.js +1 -1
  49. package/dist/commands/doctor.d.ts.map +1 -1
  50. package/dist/commands/doctor.js +34 -0
  51. package/dist/commands/doctor.js.map +1 -1
  52. package/dist/commands/plan.d.ts +2 -0
  53. package/dist/commands/plan.d.ts.map +1 -1
  54. package/dist/commands/plan.js +11 -1
  55. package/dist/commands/plan.js.map +1 -1
  56. package/dist/commands/purge.d.ts +13 -1
  57. package/dist/commands/purge.d.ts.map +1 -1
  58. package/dist/commands/purge.js +52 -6
  59. package/dist/commands/purge.js.map +1 -1
  60. package/dist/commands/show.d.ts.map +1 -1
  61. package/dist/commands/show.js +6 -0
  62. package/dist/commands/show.js.map +1 -1
  63. package/dist/commands/undo.d.ts +7 -1
  64. package/dist/commands/undo.d.ts.map +1 -1
  65. package/dist/commands/undo.js +38 -3
  66. package/dist/commands/undo.js.map +1 -1
  67. package/dist/contracts/action.d.ts +517 -2
  68. package/dist/contracts/action.d.ts.map +1 -1
  69. package/dist/contracts/action.js +101 -1
  70. package/dist/contracts/action.js.map +1 -1
  71. package/dist/contracts/database-backup.d.ts +192 -0
  72. package/dist/contracts/database-backup.d.ts.map +1 -0
  73. package/dist/contracts/database-backup.js +70 -0
  74. package/dist/contracts/database-backup.js.map +1 -0
  75. package/dist/contracts/finding.d.ts +208 -2
  76. package/dist/contracts/finding.d.ts.map +1 -1
  77. package/dist/contracts/plan.d.ts +207 -2
  78. package/dist/contracts/plan.d.ts.map +1 -1
  79. package/dist/contracts/plan.js +11 -2
  80. package/dist/contracts/plan.js.map +1 -1
  81. package/dist/contracts/provider-file-quarantine.d.ts +221 -0
  82. package/dist/contracts/provider-file-quarantine.d.ts.map +1 -0
  83. package/dist/contracts/provider-file-quarantine.js +61 -0
  84. package/dist/contracts/provider-file-quarantine.js.map +1 -0
  85. package/dist/contracts/report.d.ts +208 -2
  86. package/dist/contracts/report.d.ts.map +1 -1
  87. package/dist/contracts/resource.d.ts +3 -0
  88. package/dist/contracts/resource.d.ts.map +1 -1
  89. package/dist/contracts/resource.js +1 -0
  90. package/dist/contracts/resource.js.map +1 -1
  91. package/dist/contracts/run.d.ts +194 -0
  92. package/dist/contracts/run.d.ts.map +1 -1
  93. package/dist/contracts/run.js +16 -0
  94. package/dist/contracts/run.js.map +1 -1
  95. package/dist/core/apply.d.ts +9 -1
  96. package/dist/core/apply.d.ts.map +1 -1
  97. package/dist/core/apply.js +147 -4
  98. package/dist/core/apply.js.map +1 -1
  99. package/dist/core/database-exclusion.d.ts +23 -0
  100. package/dist/core/database-exclusion.d.ts.map +1 -0
  101. package/dist/core/database-exclusion.js +133 -0
  102. package/dist/core/database-exclusion.js.map +1 -0
  103. package/dist/core/database-executor.d.ts +45 -0
  104. package/dist/core/database-executor.d.ts.map +1 -0
  105. package/dist/core/database-executor.js +436 -0
  106. package/dist/core/database-executor.js.map +1 -0
  107. package/dist/core/database-recovery.d.ts +25 -0
  108. package/dist/core/database-recovery.d.ts.map +1 -0
  109. package/dist/core/database-recovery.js +628 -0
  110. package/dist/core/database-recovery.js.map +1 -0
  111. package/dist/core/database-revalidation.d.ts +19 -0
  112. package/dist/core/database-revalidation.d.ts.map +1 -0
  113. package/dist/core/database-revalidation.js +70 -0
  114. package/dist/core/database-revalidation.js.map +1 -0
  115. package/dist/core/no-clobber-rename.d.ts +2 -0
  116. package/dist/core/no-clobber-rename.d.ts.map +1 -1
  117. package/dist/core/no-clobber-rename.js +88 -0
  118. package/dist/core/no-clobber-rename.js.map +1 -1
  119. package/dist/core/pinned-file.d.ts +37 -0
  120. package/dist/core/pinned-file.d.ts.map +1 -0
  121. package/dist/core/pinned-file.js +228 -0
  122. package/dist/core/pinned-file.js.map +1 -0
  123. package/dist/core/plan.d.ts.map +1 -1
  124. package/dist/core/plan.js +4 -1
  125. package/dist/core/plan.js.map +1 -1
  126. package/dist/core/process-ownership.d.ts +1 -0
  127. package/dist/core/process-ownership.d.ts.map +1 -1
  128. package/dist/core/process-ownership.js +17 -3
  129. package/dist/core/process-ownership.js.map +1 -1
  130. package/dist/core/provider-file-executor.d.ts +40 -0
  131. package/dist/core/provider-file-executor.d.ts.map +1 -0
  132. package/dist/core/provider-file-executor.js +259 -0
  133. package/dist/core/provider-file-executor.js.map +1 -0
  134. package/dist/core/provider-file-identity.d.ts +8 -0
  135. package/dist/core/provider-file-identity.d.ts.map +1 -0
  136. package/dist/core/provider-file-identity.js +113 -0
  137. package/dist/core/provider-file-identity.js.map +1 -0
  138. package/dist/core/provider-file-policy.d.ts +19 -0
  139. package/dist/core/provider-file-policy.d.ts.map +1 -0
  140. package/dist/core/provider-file-policy.js +72 -0
  141. package/dist/core/provider-file-policy.js.map +1 -0
  142. package/dist/core/provider-file-recovery.d.ts +25 -0
  143. package/dist/core/provider-file-recovery.d.ts.map +1 -0
  144. package/dist/core/provider-file-recovery.js +393 -0
  145. package/dist/core/provider-file-recovery.js.map +1 -0
  146. package/dist/core/provider-file-revalidation.d.ts +20 -0
  147. package/dist/core/provider-file-revalidation.d.ts.map +1 -0
  148. package/dist/core/provider-file-revalidation.js +60 -0
  149. package/dist/core/provider-file-revalidation.js.map +1 -0
  150. package/dist/core/provider-processes.d.ts +18 -0
  151. package/dist/core/provider-processes.d.ts.map +1 -0
  152. package/dist/core/provider-processes.js +90 -0
  153. package/dist/core/provider-processes.js.map +1 -0
  154. package/dist/index.d.ts +4 -2
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +4 -2
  157. package/dist/index.js.map +1 -1
  158. package/dist/main.d.ts.map +1 -1
  159. package/dist/main.js +4 -1
  160. package/dist/main.js.map +1 -1
  161. package/dist/state/json-file.d.ts +2 -1
  162. package/dist/state/json-file.d.ts.map +1 -1
  163. package/dist/state/json-file.js +59 -2
  164. package/dist/state/json-file.js.map +1 -1
  165. package/dist/state/layout.d.ts +2 -0
  166. package/dist/state/layout.d.ts.map +1 -1
  167. package/dist/state/layout.js +2 -0
  168. package/dist/state/layout.js.map +1 -1
  169. package/dist/state/run-journal.d.ts.map +1 -1
  170. package/dist/state/run-journal.js +8 -2
  171. package/dist/state/run-journal.js.map +1 -1
  172. package/dist/version.d.ts +1 -1
  173. package/dist/version.js +1 -1
  174. package/package.json +1 -1
  175. package/schemas/audit.schema.json +1029 -1
  176. package/schemas/database-backup.schema.json +648 -0
  177. package/schemas/plan.schema.json +1014 -1
  178. package/schemas/provider-file-quarantine.schema.json +741 -0
  179. package/schemas/run.schema.json +180 -0
@@ -0,0 +1,436 @@
1
+ import { chmod, lstat, open, rm } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { isDeepStrictEqual } from "node:util";
4
+ import { inspectCodexDatabase, inspectCodexProcesses, inspectDatabaseOpenHandles, vacuumCodexDatabaseInto, verifyCodexDatabaseIntegrity, } from "../adapters/codex-database.js";
5
+ import { databaseBackupEntrySchema, } from "../contracts/database-backup.js";
6
+ import { ensurePrivateDirectory, syncDirectory, writeJsonAtomic } from "../state/json-file.js";
7
+ import { acquireDatabaseExclusion, lockedFileIdentityMatches, } from "./database-exclusion.js";
8
+ import { CommandInterruptedError } from "./interruption.js";
9
+ import { exchangePaths, renameNoReplace } from "./no-clobber-rename.js";
10
+ export class DatabaseExecutionError extends Error {
11
+ outcome;
12
+ diagnosticCode;
13
+ entry;
14
+ name = "DatabaseExecutionError";
15
+ constructor(message, outcome, diagnosticCode, entry) {
16
+ super(message);
17
+ this.outcome = outcome;
18
+ this.diagnosticCode = diagnosticCode;
19
+ this.entry = entry;
20
+ }
21
+ }
22
+ function assertAuthorized(dependencies) {
23
+ if (dependencies.authorization !== undefined &&
24
+ dependencies.authorization.now().getTime() >= dependencies.authorization.expiresAtMs) {
25
+ throw new DatabaseExecutionError("cleanup plan authorization expired before the database swap", "skipped-stale", "PLAN_EXPIRED_DURING_DATABASE_VACUUM");
26
+ }
27
+ }
28
+ function interruptionFrom(signal) {
29
+ if (signal?.aborted !== true) {
30
+ return undefined;
31
+ }
32
+ return signal.reason instanceof CommandInterruptedError
33
+ ? signal.reason
34
+ : new CommandInterruptedError("database vacuum interrupted");
35
+ }
36
+ function throwIfInterrupted(signal) {
37
+ const interruption = interruptionFrom(signal);
38
+ if (interruption !== undefined) {
39
+ throw interruption;
40
+ }
41
+ }
42
+ function isInterruptionError(error, signal) {
43
+ return (error instanceof CommandInterruptedError ||
44
+ (signal?.aborted === true &&
45
+ (error === signal.reason || (error instanceof Error && error.name === "AbortError"))));
46
+ }
47
+ async function pathExists(path) {
48
+ try {
49
+ await lstat(path);
50
+ return true;
51
+ }
52
+ catch (error) {
53
+ if (error instanceof Error &&
54
+ "code" in error &&
55
+ error.code === "ENOENT") {
56
+ return false;
57
+ }
58
+ throw error;
59
+ }
60
+ }
61
+ async function syncFile(path) {
62
+ const handle = await open(path, "r");
63
+ try {
64
+ await handle.sync();
65
+ }
66
+ finally {
67
+ await handle.close();
68
+ }
69
+ }
70
+ async function assertOffline(path, dependencies, allowedHandlePids = new Set()) {
71
+ const processes = await (dependencies.inspectProcesses ?? inspectCodexProcesses)(dependencies);
72
+ if (processes.status !== "idle") {
73
+ throw new DatabaseExecutionError(processes.status === "busy"
74
+ ? "Codex started before the database swap"
75
+ : `Codex process state is unknown: ${processes.reason}`, "skipped-stale", processes.status === "busy" ? "DATABASE_PROVIDER_ACTIVE" : "DATABASE_PROVIDER_STATE_UNKNOWN");
76
+ }
77
+ const handles = await (dependencies.inspectOpenHandles ?? inspectDatabaseOpenHandles)(path, dependencies);
78
+ const externalPids = handles.status === "busy" ? handles.pids.filter((pid) => !allowedHandlePids.has(pid)) : [];
79
+ if (handles.status === "unknown" || (handles.status === "busy" && externalPids.length !== 0)) {
80
+ throw new DatabaseExecutionError(handles.status === "busy"
81
+ ? "a process opened the database before the swap"
82
+ : `database descriptor state is unknown: ${handles.reason}`, "skipped-stale", handles.status === "busy"
83
+ ? "DATABASE_DESCRIPTOR_ACTIVE"
84
+ : "DATABASE_DESCRIPTOR_STATE_UNKNOWN");
85
+ }
86
+ }
87
+ function assertLockedIdentity(exclusion, path, planned) {
88
+ if (!lockedFileIdentityMatches(exclusion.identities.get(path), planned)) {
89
+ throw new DatabaseExecutionError("database identity changed while acquiring exclusive access", "skipped-stale", "DATABASE_IDENTITY_CHANGED");
90
+ }
91
+ }
92
+ async function assertSidecarIdentity(path, planned, label) {
93
+ let stats;
94
+ try {
95
+ stats = await lstat(path);
96
+ }
97
+ catch (error) {
98
+ if (error instanceof Error &&
99
+ "code" in error &&
100
+ error.code === "ENOENT" &&
101
+ planned === undefined) {
102
+ return;
103
+ }
104
+ throw new DatabaseExecutionError(`database ${label} identity changed while acquiring exclusive access`, "skipped-stale", "DATABASE_IDENTITY_CHANGED");
105
+ }
106
+ if (planned === undefined ||
107
+ !stats.isFile() ||
108
+ stats.isSymbolicLink() ||
109
+ stats.dev !== planned.device ||
110
+ stats.ino !== planned.inode ||
111
+ stats.mode !== planned.mode ||
112
+ stats.mtimeMs !== planned.mtimeMs ||
113
+ stats.size !== planned.measuredBytes ||
114
+ (label === "WAL" && stats.size > 0)) {
115
+ throw new DatabaseExecutionError(`database ${label} identity changed while acquiring exclusive access`, "skipped-stale", "DATABASE_IDENTITY_CHANGED");
116
+ }
117
+ }
118
+ async function assertSidecarsStable(action) {
119
+ await assertSidecarIdentity(`${action.target.path}-wal`, action.target.wal, "WAL");
120
+ await assertSidecarIdentity(`${action.target.path}-shm`, action.target.shm, "SHM");
121
+ }
122
+ async function persist(manifestPath, entry, backupDirectory) {
123
+ const parsed = databaseBackupEntrySchema.parse(entry);
124
+ await writeJsonAtomic(manifestPath, parsed, {
125
+ privateDirectories: [backupDirectory],
126
+ });
127
+ return parsed;
128
+ }
129
+ export async function executeDatabaseVacuum(action, options) {
130
+ throwIfInterrupted(options.signal);
131
+ const dependencies = options.signal === undefined
132
+ ? (options.dependencies ?? {})
133
+ : { ...options.dependencies, signal: options.signal };
134
+ const clock = dependencies.clock ?? (() => new Date());
135
+ const rename = dependencies.rename ?? renameNoReplace;
136
+ const exchange = dependencies.exchange ?? exchangePaths;
137
+ const acquireExclusion = dependencies.acquireExclusion ?? acquireDatabaseExclusion;
138
+ const inspect = dependencies.inspectDatabase ?? inspectCodexDatabase;
139
+ const originalDirectory = dirname(action.target.path);
140
+ const backupPath = join(options.backupDirectory, `${options.entryId}-${action.target.filename}.original`);
141
+ const backupWalPath = action.target.wal === undefined ? undefined : `${backupPath}-wal`;
142
+ const backupShmPath = action.target.shm === undefined ? undefined : `${backupPath}-shm`;
143
+ const temporaryDirectory = join(originalDirectory, `.${action.target.filename}.${options.entryId}.vacuum-work`);
144
+ const temporaryPath = join(temporaryDirectory, action.target.filename);
145
+ const manifestPath = join(options.backupDirectory, `${options.entryId}.json`);
146
+ await ensurePrivateDirectory(options.backupDirectory);
147
+ const backupDirectoryStats = await lstat(options.backupDirectory);
148
+ const sourceStats = await lstat(action.target.path);
149
+ if (backupDirectoryStats.dev !== sourceStats.dev) {
150
+ throw new DatabaseExecutionError("database rollback storage is on a different filesystem", "skipped-stale", "DATABASE_BACKUP_CROSS_DEVICE");
151
+ }
152
+ if ((await pathExists(backupPath)) ||
153
+ (backupWalPath !== undefined && (await pathExists(backupWalPath))) ||
154
+ (backupShmPath !== undefined && (await pathExists(backupShmPath))) ||
155
+ (await pathExists(temporaryDirectory)) ||
156
+ (await pathExists(manifestPath))) {
157
+ throw new DatabaseExecutionError("database maintenance destination already exists", "failed", "DATABASE_DESTINATION_OCCUPIED");
158
+ }
159
+ await ensurePrivateDirectory(temporaryDirectory);
160
+ let entry;
161
+ let mutationStarted = false;
162
+ try {
163
+ entry = await persist(manifestPath, {
164
+ schemaVersion: 1,
165
+ entryId: options.entryId,
166
+ runId: options.runId,
167
+ actionId: action.actionId,
168
+ resourceId: action.resourceId,
169
+ status: "preparing",
170
+ originalPath: action.target.path,
171
+ backupPath,
172
+ ...(backupWalPath === undefined ? {} : { backupWalPath }),
173
+ ...(backupShmPath === undefined ? {} : { backupShmPath }),
174
+ temporaryPath,
175
+ createdAt: clock().toISOString(),
176
+ expiresAt: new Date(clock().getTime() + action.backupTtlMinutes * 60_000).toISOString(),
177
+ target: action.target,
178
+ }, options.backupDirectory);
179
+ }
180
+ catch (error) {
181
+ await rm(temporaryDirectory, { recursive: true, force: true });
182
+ await syncDirectory(originalDirectory);
183
+ throw error;
184
+ }
185
+ try {
186
+ await assertOffline(action.target.path, dependencies);
187
+ assertAuthorized(dependencies);
188
+ await (dependencies.vacuumInto ?? vacuumCodexDatabaseInto)(action.target.path, temporaryPath, dependencies);
189
+ throwIfInterrupted(options.signal);
190
+ await chmod(temporaryPath, action.target.mode & 0o7777);
191
+ await (dependencies.verifyIntegrity ?? verifyCodexDatabaseIntegrity)(temporaryPath, dependencies);
192
+ const compacted = await inspect(temporaryPath, dependencies, action.target.path, action.target.path);
193
+ if (compacted.identity.schemaDigest !== action.target.schemaDigest ||
194
+ compacted.identity.migrationVersion !== action.target.migrationVersion ||
195
+ compacted.identity.migrationDigest !== action.target.migrationDigest ||
196
+ compacted.identity.tables.join("\0") !== action.target.tables.join("\0") ||
197
+ compacted.identity.autoVacuum !== 2 ||
198
+ compacted.sidecarsPresent) {
199
+ throw new DatabaseExecutionError("compacted database does not match the planned Codex contract", "failed", "DATABASE_COMPACTED_CONTRACT_CHANGED", entry);
200
+ }
201
+ await syncFile(temporaryPath);
202
+ entry = await persist(manifestPath, { ...entry, status: "vacuumed" }, options.backupDirectory);
203
+ await assertOffline(action.target.path, dependencies);
204
+ assertAuthorized(dependencies);
205
+ const current = await inspect(action.target.path, dependencies);
206
+ if (!isDeepStrictEqual(current.identity, action.target) ||
207
+ (current.identity.wal?.measuredBytes ?? 0) > 0) {
208
+ throw new DatabaseExecutionError("database identity changed before the atomic swap", "skipped-stale", "DATABASE_IDENTITY_CHANGED", entry);
209
+ }
210
+ assertAuthorized(dependencies);
211
+ entry = await persist(manifestPath, {
212
+ ...entry,
213
+ status: "installing",
214
+ backupIdentity: current.identity,
215
+ installedIdentity: compacted.identity,
216
+ }, options.backupDirectory);
217
+ let exclusion;
218
+ try {
219
+ exclusion = await acquireExclusion([action.target.path, temporaryPath], process.platform, new Map([
220
+ [action.target.path, current.identity.mode],
221
+ [temporaryPath, compacted.identity.mode],
222
+ ]));
223
+ }
224
+ catch (error) {
225
+ throw new DatabaseExecutionError(error instanceof Error ? error.message : String(error), "skipped-stale", "DATABASE_EXCLUSION_UNAVAILABLE", entry);
226
+ }
227
+ let exchanged = false;
228
+ let archived = false;
229
+ const movedSidecars = [];
230
+ let transitionResult;
231
+ let transitionError;
232
+ let transitionFailed = false;
233
+ try {
234
+ try {
235
+ // Both inode locks stay held across exchange, archival, and the durable
236
+ // manifest write so Codex can never reopen a half-transitioned layout.
237
+ assertLockedIdentity(exclusion, action.target.path, current.identity);
238
+ assertLockedIdentity(exclusion, temporaryPath, compacted.identity);
239
+ await assertOffline(action.target.path, dependencies, new Set([process.pid]));
240
+ await assertSidecarsStable(action);
241
+ const lockedCurrent = await inspect(action.target.path, dependencies, action.target.path, action.target.path, exclusion.handles?.get(action.target.path));
242
+ const lockedCompacted = await inspect(temporaryPath, dependencies, action.target.path, action.target.path, exclusion.handles?.get(temporaryPath));
243
+ if (lockedCurrent.identity.fingerprint !== current.identity.fingerprint ||
244
+ lockedCompacted.identity.fingerprint !== compacted.identity.fingerprint) {
245
+ throw new DatabaseExecutionError("database content changed while acquiring the atomic swap boundary", "skipped-stale", "DATABASE_IDENTITY_CHANGED", entry);
246
+ }
247
+ assertAuthorized(dependencies);
248
+ throwIfInterrupted(options.signal);
249
+ await exchange(action.target.path, temporaryPath);
250
+ exchanged = true;
251
+ mutationStarted = true;
252
+ if (action.target.wal !== undefined && backupWalPath !== undefined) {
253
+ const source = `${action.target.path}-wal`;
254
+ await rename(source, backupWalPath);
255
+ movedSidecars.push({ source, destination: backupWalPath });
256
+ }
257
+ if (action.target.shm !== undefined && backupShmPath !== undefined) {
258
+ const source = `${action.target.path}-shm`;
259
+ await rename(source, backupShmPath);
260
+ movedSidecars.push({ source, destination: backupShmPath });
261
+ }
262
+ await rename(temporaryPath, backupPath);
263
+ archived = true;
264
+ await syncDirectory(originalDirectory);
265
+ await syncDirectory(options.backupDirectory);
266
+ await rm(temporaryDirectory, { recursive: true, force: true });
267
+ await syncDirectory(originalDirectory);
268
+ entry = await persist(manifestPath, {
269
+ ...entry,
270
+ status: "installed",
271
+ }, options.backupDirectory);
272
+ transitionResult = {
273
+ backupEntryId: entry.entryId,
274
+ backupPath: entry.backupPath,
275
+ originalBytes: action.target.measuredBytes,
276
+ compactedBytes: compacted.identity.measuredBytes,
277
+ retainedBackupBytes: action.target.measuredBytes +
278
+ (action.target.wal?.measuredBytes ?? 0) +
279
+ (action.target.shm?.measuredBytes ?? 0),
280
+ reclaimedBytes: 0,
281
+ };
282
+ }
283
+ catch (installError) {
284
+ if (isInterruptionError(installError, options.signal) && !exchanged) {
285
+ throw interruptionFrom(options.signal) ?? installError;
286
+ }
287
+ try {
288
+ if (installError instanceof DatabaseExecutionError &&
289
+ installError.outcome === "skipped-stale" &&
290
+ !exchanged) {
291
+ throw installError;
292
+ }
293
+ if (archived) {
294
+ await exchange(action.target.path, backupPath);
295
+ await rm(backupPath);
296
+ }
297
+ else if (exchanged) {
298
+ await exchange(action.target.path, temporaryPath);
299
+ }
300
+ for (const sidecar of movedSidecars.reverse()) {
301
+ if (!(await pathExists(sidecar.source)) && (await pathExists(sidecar.destination))) {
302
+ await rename(sidecar.destination, sidecar.source);
303
+ }
304
+ }
305
+ await syncDirectory(originalDirectory);
306
+ await syncDirectory(options.backupDirectory);
307
+ await rm(temporaryDirectory, { recursive: true, force: true });
308
+ await syncDirectory(originalDirectory);
309
+ entry = await persist(manifestPath, {
310
+ ...entry,
311
+ status: "restored",
312
+ restoredAt: clock().toISOString(),
313
+ diagnostic: {
314
+ severity: "error",
315
+ code: "DATABASE_INSTALL_ROLLED_BACK",
316
+ message: installError instanceof Error ? installError.message : String(installError),
317
+ adapter: action.adapter,
318
+ resourceId: action.resourceId,
319
+ },
320
+ }, options.backupDirectory);
321
+ throw new DatabaseExecutionError("database installation failed and the original was restored", "rolled-back", "DATABASE_INSTALL_ROLLED_BACK", entry);
322
+ }
323
+ catch (rollbackError) {
324
+ if (rollbackError instanceof DatabaseExecutionError) {
325
+ throw rollbackError;
326
+ }
327
+ entry = await persist(manifestPath, {
328
+ ...entry,
329
+ status: "partial",
330
+ diagnostic: {
331
+ severity: "error",
332
+ code: "DATABASE_INSTALL_ROLLBACK_PARTIAL",
333
+ message: `install failed: ${installError instanceof Error ? installError.message : String(installError)}; rollback failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`,
334
+ adapter: action.adapter,
335
+ resourceId: action.resourceId,
336
+ },
337
+ }, options.backupDirectory);
338
+ throw new DatabaseExecutionError("database installation and automatic rollback did not complete", "partially-applied", "DATABASE_INSTALL_ROLLBACK_PARTIAL", entry);
339
+ }
340
+ }
341
+ }
342
+ catch (error) {
343
+ transitionFailed = true;
344
+ transitionError = error;
345
+ }
346
+ try {
347
+ await exclusion.release();
348
+ }
349
+ catch (releaseError) {
350
+ const message = releaseError instanceof Error ? releaseError.message : String(releaseError);
351
+ try {
352
+ entry = await persist(manifestPath, {
353
+ ...entry,
354
+ status: "partial",
355
+ diagnostic: {
356
+ severity: "error",
357
+ code: "DATABASE_EXCLUSION_RELEASE_PARTIAL",
358
+ message,
359
+ adapter: action.adapter,
360
+ resourceId: action.resourceId,
361
+ },
362
+ }, options.backupDirectory);
363
+ }
364
+ catch {
365
+ // The run journal still receives the last durable manifest identity.
366
+ }
367
+ throw new DatabaseExecutionError("database exclusion could not be fully released; recovery is required", "partially-applied", "DATABASE_EXCLUSION_RELEASE_PARTIAL", entry);
368
+ }
369
+ if (transitionFailed) {
370
+ throw transitionError;
371
+ }
372
+ return transitionResult;
373
+ }
374
+ catch (error) {
375
+ if (isInterruptionError(error, options.signal)) {
376
+ const sourceExists = await pathExists(action.target.path).catch(() => false);
377
+ const backupExists = await pathExists(backupPath).catch(() => false);
378
+ if (sourceExists && !backupExists) {
379
+ await rm(temporaryDirectory, { recursive: true, force: true });
380
+ await syncDirectory(originalDirectory);
381
+ entry = await persist(manifestPath, {
382
+ ...entry,
383
+ status: "restored",
384
+ restoredAt: clock().toISOString(),
385
+ diagnostic: {
386
+ severity: "warning",
387
+ code: "COMMAND_INTERRUPTED",
388
+ message: "database vacuum was interrupted before the atomic swap",
389
+ adapter: action.adapter,
390
+ resourceId: action.resourceId,
391
+ },
392
+ }, options.backupDirectory);
393
+ }
394
+ throw interruptionFrom(options.signal) ?? error;
395
+ }
396
+ if (!mutationStarted &&
397
+ !(error instanceof DatabaseExecutionError && error.outcome === "partially-applied")) {
398
+ await rm(temporaryDirectory, { recursive: true, force: true });
399
+ await syncDirectory(originalDirectory);
400
+ const executionError = error instanceof DatabaseExecutionError ? error : undefined;
401
+ const diagnosticCode = executionError?.diagnosticCode ?? "DATABASE_VACUUM_FAILED";
402
+ entry = await persist(manifestPath, {
403
+ ...entry,
404
+ status: "restored",
405
+ restoredAt: clock().toISOString(),
406
+ diagnostic: {
407
+ severity: executionError?.outcome === "skipped-stale" ? "warning" : "error",
408
+ code: diagnosticCode,
409
+ message: error instanceof Error ? error.message : String(error),
410
+ adapter: action.adapter,
411
+ resourceId: action.resourceId,
412
+ },
413
+ }, options.backupDirectory);
414
+ throw new DatabaseExecutionError(error instanceof Error ? error.message : String(error), executionError?.outcome ?? "failed", diagnosticCode, entry);
415
+ }
416
+ if (error instanceof DatabaseExecutionError) {
417
+ throw error;
418
+ }
419
+ const sourceExists = await pathExists(action.target.path).catch(() => false);
420
+ const backupExists = await pathExists(backupPath).catch(() => false);
421
+ const outcome = !sourceExists && backupExists ? "partially-applied" : "failed";
422
+ entry = await persist(manifestPath, {
423
+ ...entry,
424
+ status: outcome === "partially-applied" ? "partial" : entry.status,
425
+ diagnostic: {
426
+ severity: "error",
427
+ code: outcome === "partially-applied" ? "DATABASE_VACUUM_PARTIAL" : "DATABASE_VACUUM_FAILED",
428
+ message: error instanceof Error ? error.message : String(error),
429
+ adapter: action.adapter,
430
+ resourceId: action.resourceId,
431
+ },
432
+ }, options.backupDirectory);
433
+ throw new DatabaseExecutionError(error instanceof Error ? error.message : String(error), outcome, outcome === "partially-applied" ? "DATABASE_VACUUM_PARTIAL" : "DATABASE_VACUUM_FAILED", entry);
434
+ }
435
+ }
436
+ //# sourceMappingURL=database-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-executor.js","sourceRoot":"","sources":["../../src/core/database-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { inspectCodexDatabase, inspectCodexProcesses, inspectDatabaseOpenHandles, verifyCodexDatabaseIntegrity, type CodexDatabaseDependencies } from "../adapters/codex-database.js";
2
+ import { type DatabaseBackupEntry } from "../contracts/database-backup.js";
3
+ import { acquireDatabaseExclusion } from "./database-exclusion.js";
4
+ import { exchangePaths, renameNoReplace } from "./no-clobber-rename.js";
5
+ export type DatabaseRecoveryDependencies = CodexDatabaseDependencies & {
6
+ clock?: () => Date;
7
+ inspectDatabase?: typeof inspectCodexDatabase;
8
+ inspectProcesses?: typeof inspectCodexProcesses;
9
+ inspectOpenHandles?: typeof inspectDatabaseOpenHandles;
10
+ verifyIntegrity?: typeof verifyCodexDatabaseIntegrity;
11
+ rename?: typeof renameNoReplace;
12
+ exchange?: typeof exchangePaths;
13
+ acquireExclusion?: typeof acquireDatabaseExclusion;
14
+ };
15
+ export type DatabaseRecoveryOptions = {
16
+ manifestPath: string;
17
+ backupDirectory: string;
18
+ dependencies?: DatabaseRecoveryDependencies;
19
+ };
20
+ export declare function undoDatabaseVacuum(input: DatabaseBackupEntry, options: DatabaseRecoveryOptions): Promise<DatabaseBackupEntry>;
21
+ export declare function purgeDatabaseBackup(input: DatabaseBackupEntry, options: DatabaseRecoveryOptions): Promise<{
22
+ entry: DatabaseBackupEntry;
23
+ reclaimedBytes: number;
24
+ }>;
25
+ //# sourceMappingURL=database-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-recovery.d.ts","sourceRoot":"","sources":["../../src/core/database-recovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,KAAK,yBAAyB,EAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,wBAAwB,EAGzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAExE,MAAM,MAAM,4BAA4B,GAAG,yBAAyB,GAAG;IACrE,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,oBAAoB,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,qBAAqB,CAAC;IAChD,kBAAkB,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACvD,eAAe,CAAC,EAAE,OAAO,4BAA4B,CAAC;IACtD,MAAM,CAAC,EAAE,OAAO,eAAe,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,wBAAwB,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,4BAA4B,CAAC;CAC7C,CAAC;AAmUF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAwX9B;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC;IAAE,KAAK,EAAE,mBAAmB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAyGjE"}