@ue-shed/project-custodian 0.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UE Shed contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # `@ue-shed/project-custodian`
2
+
3
+ Headless discovery, policy, sizing, and guarded cleanup for regeneratable Unreal project and engine
4
+ storage. Scans and plans are read-only. Mutation requires a durable proposal containing exact target
5
+ IDs, its generated approval phrase, a fresh disk revalidation, and a stopped Unreal Editor. Cleanup
6
+ moves targets to the operating system Trash/Recycle Bin by default; permanent deletion is explicit.
7
+
8
+ ```ts
9
+ import { Custodian, CustodianNodeLive } from "@ue-shed/project-custodian";
10
+ import { Effect } from "effect";
11
+
12
+ const report = await Effect.runPromise(
13
+ Effect.flatMap(Custodian, (custodian) => custodian.scan({ root: "D:/Unreal" })).pipe(
14
+ Effect.provide(CustodianNodeLive)
15
+ )
16
+ );
17
+ ```
18
+
19
+ The scan root is explicit and depth-bounded. `Custodian.prepare` persists a proposal plus append-only
20
+ event log; `Custodian.execute` returns a per-target receipt and only acts on a proposal read back from
21
+ disk. `Custodian.cancel` stops before the next target. Browser-safe schemas are exported from
22
+ `@ue-shed/project-custodian/browser`.
23
+
24
+ The same lifecycle is available from the CLI:
25
+
26
+ ```powershell
27
+ pnpm ue-shed custodian plan D:\Unreal --ignore-pressure
28
+ pnpm ue-shed custodian prepare D:\Unreal --ignore-pressure --target <target-id> --output .\custodian-review
29
+ pnpm ue-shed custodian apply .\custodian-review\<proposal>.json --approve "RECLAIM <proposal-id>"
30
+ ```
31
+
32
+ ## License
33
+
34
+ MIT. Unreal Engine is a trademark of Epic Games, Inc. This project is not affiliated with or
35
+ endorsed by Epic Games.
@@ -0,0 +1,3 @@
1
+ export * from "./schema.js";
2
+ export { defaultCustodianPolicy, projectTargetDefinitions } from "./policy.js";
3
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./schema.js";
2
+ export { defaultCustodianPolicy, projectTargetDefinitions } from "./policy.js";
3
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./browser.js";
2
+ export * from "./service.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./browser.js";
2
+ export * from "./service.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Schema } from "effect";
2
+ import { CustodianProposal, type CustodianPrepareRequest, type CustodianReceipt } from "./schema.js";
3
+ interface RunningProcess {
4
+ readonly pid: number;
5
+ readonly name: string;
6
+ readonly command?: string;
7
+ readonly path?: string;
8
+ }
9
+ export interface CustodianExecutorDependencies {
10
+ readonly now: () => Date;
11
+ readonly newId: () => string;
12
+ readonly runningProcesses: () => Promise<readonly RunningProcess[]>;
13
+ readonly moveToTrash: (path: string) => Promise<void>;
14
+ readonly removePermanently: (path: string) => Promise<void>;
15
+ }
16
+ export declare function readCustodianProposalDocument(path: string): Promise<Schema.Json>;
17
+ export declare function custodianProposalStorageIsValid(proposal: CustodianProposal, sourcePath: string): boolean;
18
+ export declare function prepareCustodianProposal(request: CustodianPrepareRequest, signal: AbortSignal, dependencies?: CustodianExecutorDependencies): Promise<CustodianProposal>;
19
+ export declare function executeCustodianProposal(proposal: CustodianProposal, approvalPhrase: string, signal: AbortSignal, dependencies?: CustodianExecutorDependencies): Promise<CustodianReceipt>;
20
+ export {};
21
+ //# sourceMappingURL=node-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-executor.d.ts","sourceRoot":"","sources":["../src/node-executor.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,EACN,iBAAiB,EAIjB,KAAK,uBAAuB,EAE5B,KAAK,gBAAgB,EAErB,MAAM,aAAa,CAAC;AAErB,UAAU,cAAc;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AA2HD,wBAAsB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAEtF;AAED,wBAAgB,+BAA+B,CAC9C,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,EAAE,MAAM,GAChB,OAAO,CAOT;AAED,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,WAAW,EACnB,YAAY,GAAE,6BAAmD,GAC/D,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAgID,wBAAsB,wBAAwB,CAC7C,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,WAAW,EACnB,YAAY,GAAE,6BAAmD,GAC/D,OAAO,CAAC,gBAAgB,CAAC,CAyJ3B"}
@@ -0,0 +1,360 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { execFile } from "node:child_process";
3
+ import { appendFile, lstat, mkdir, readFile, realpath, rename, rm, writeFile } from "node:fs/promises";
4
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
5
+ import { Schema } from "effect";
6
+ import trash from "trash";
7
+ import { scanCustodian } from "./node-scanner.js";
8
+ import { CustodianProposal, CustodianProposalId } from "./schema.js";
9
+ function executeFile(file, args) {
10
+ return new Promise((resolveOutput, reject) => {
11
+ execFile(file, [...args], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024, windowsHide: true }, (error, stdout) => {
12
+ if (error)
13
+ reject(error);
14
+ else
15
+ resolveOutput(stdout);
16
+ });
17
+ });
18
+ }
19
+ function decodeTasklist(output) {
20
+ return output.split(/\r?\n/u).flatMap((line) => {
21
+ const fields = line.match(/^"((?:[^"]|"")*)","(\d+)"/u);
22
+ if (fields === null)
23
+ return [];
24
+ const name = fields[1]?.replaceAll('""', '"');
25
+ const pid = Number.parseInt(fields[2] ?? "", 10);
26
+ return name === undefined || !Number.isInteger(pid) ? [] : [{ name, pid }];
27
+ });
28
+ }
29
+ function decodePs(output) {
30
+ return output.split(/\r?\n/u).flatMap((line) => {
31
+ const fields = line.match(/^\s*(\d+)\s+(\S+)(?:\s+(.*))?$/u);
32
+ if (fields === null)
33
+ return [];
34
+ const pid = Number.parseInt(fields[1] ?? "", 10);
35
+ const name = fields[2];
36
+ const command = fields[3];
37
+ return name === undefined || !Number.isInteger(pid)
38
+ ? []
39
+ : [{ pid, name, ...(command === undefined ? undefined : { command }) }];
40
+ });
41
+ }
42
+ async function listRunningProcesses() {
43
+ return process.platform === "win32"
44
+ ? decodeTasklist(await executeFile("tasklist.exe", ["/FO", "CSV", "/NH"]))
45
+ : decodePs(await executeFile("ps", ["-A", "-o", "pid=", "-o", "comm=", "-o", "args="]));
46
+ }
47
+ const defaultDependencies = {
48
+ now: () => new Date(),
49
+ newId: randomUUID,
50
+ runningProcesses: listRunningProcesses,
51
+ moveToTrash: async (path) => trash(path, { glob: false }),
52
+ removePermanently: async (path) => rm(path, { force: true, recursive: true })
53
+ };
54
+ function abortReason(signal) {
55
+ return signal.reason instanceof Error
56
+ ? signal.reason
57
+ : new Error("Project Custodian cleanup was cancelled.");
58
+ }
59
+ function throwIfAborted(signal) {
60
+ if (signal.aborted)
61
+ throw abortReason(signal);
62
+ }
63
+ function isWithin(path, root) {
64
+ const fromRoot = relative(root, path);
65
+ return (fromRoot === "" ||
66
+ (!fromRoot.startsWith(`..${sep}`) && fromRoot !== ".." && !isAbsolute(fromRoot)));
67
+ }
68
+ function flattenPlanTargets(items) {
69
+ return items.flatMap((item) => item.targets.map((target) => ({
70
+ kind: item.kind,
71
+ name: item.name,
72
+ root: item.root,
73
+ target
74
+ })));
75
+ }
76
+ function proposalId(seed) {
77
+ return CustodianProposalId.make(`proposal-${createHash("sha256").update(seed).digest("hex").slice(0, 24)}`);
78
+ }
79
+ async function writeJsonAtomic(path, value) {
80
+ await mkdir(dirname(path), { recursive: true });
81
+ const temporaryPath = `${path}.${randomUUID()}.tmp`;
82
+ try {
83
+ await writeFile(temporaryPath, `${JSON.stringify(value, undefined, 2)}\n`, {
84
+ encoding: "utf8",
85
+ flag: "wx"
86
+ });
87
+ await rename(temporaryPath, path);
88
+ }
89
+ catch (cause) {
90
+ await rm(temporaryPath, { force: true }).catch(() => undefined);
91
+ throw cause;
92
+ }
93
+ }
94
+ async function appendLog(proposal, entry, dependencies) {
95
+ await mkdir(dirname(proposal.logPath), { recursive: true });
96
+ await appendFile(proposal.logPath, `${JSON.stringify({ at: dependencies.now().toISOString(), ...entry })}\n`, "utf8");
97
+ }
98
+ export async function readCustodianProposalDocument(path) {
99
+ return Schema.decodeUnknownSync(Schema.Json)(JSON.parse(await readFile(resolve(path), "utf8")));
100
+ }
101
+ export function custodianProposalStorageIsValid(proposal, sourcePath) {
102
+ const directory = dirname(resolve(sourcePath));
103
+ return (resolve(proposal.proposalPath) === resolve(sourcePath) &&
104
+ resolve(proposal.receiptPath) === join(directory, `${proposal.id}.receipt.json`) &&
105
+ resolve(proposal.logPath) === join(directory, `${proposal.id}.events.jsonl`));
106
+ }
107
+ export async function prepareCustodianProposal(request, signal, dependencies = defaultDependencies) {
108
+ throwIfAborted(signal);
109
+ const report = await scanCustodian({ root: request.root, ignorePressure: request.ignorePressure ?? false }, signal);
110
+ const requestedIds = new Set(request.targetIds);
111
+ if (requestedIds.size !== request.targetIds.length) {
112
+ throw new Error("Custodian target selection contains duplicate target IDs.");
113
+ }
114
+ const selected = flattenPlanTargets(report.plan.items).filter(({ target }) => requestedIds.has(target.id));
115
+ if (selected.length !== requestedIds.size) {
116
+ throw new Error("Custodian target selection is not an exact subset of the current cleanup plan.");
117
+ }
118
+ const createdAt = dependencies.now().toISOString();
119
+ const id = proposalId(JSON.stringify([
120
+ report.root,
121
+ createdAt,
122
+ dependencies.newId(),
123
+ request.mode,
124
+ selected.map(({ target }) => target.id)
125
+ ]));
126
+ const proposalDirectory = resolve(request.proposalDirectory);
127
+ const proposalPath = join(proposalDirectory, `${id}.proposal.json`);
128
+ const receiptPath = join(proposalDirectory, `${id}.receipt.json`);
129
+ const logPath = join(proposalDirectory, `${id}.events.jsonl`);
130
+ const proposal = CustodianProposal.make({
131
+ schemaVersion: 1,
132
+ id,
133
+ createdAt,
134
+ root: report.root,
135
+ ignorePressure: request.ignorePressure ?? false,
136
+ mode: request.mode,
137
+ proposalPath,
138
+ receiptPath,
139
+ logPath,
140
+ approvalPhrase: `RECLAIM ${id}`,
141
+ bytes: selected.reduce((total, { target }) => total + target.bytes, 0),
142
+ targets: selected
143
+ });
144
+ await writeJsonAtomic(proposalPath, proposal);
145
+ await appendLog(proposal, { event: "proposal_created", targetCount: selected.length }, dependencies);
146
+ return proposal;
147
+ }
148
+ function refusalReceipt(options) {
149
+ return {
150
+ schemaVersion: 1,
151
+ proposalId: options.proposal.id,
152
+ proposalPath: options.proposal.proposalPath,
153
+ receiptPath: options.proposal.receiptPath,
154
+ logPath: options.proposal.logPath,
155
+ root: options.proposal.root,
156
+ mode: options.proposal.mode,
157
+ startedAt: options.startedAt,
158
+ finishedAt: options.finishedAt,
159
+ status: "refused",
160
+ plannedBytes: options.proposal.bytes,
161
+ processedBytes: 0,
162
+ entries: [],
163
+ refusal: options.refusal
164
+ };
165
+ }
166
+ async function persistReceipt(receipt, proposal, dependencies) {
167
+ await writeJsonAtomic(proposal.receiptPath, receipt);
168
+ await appendLog(proposal, {
169
+ event: "execution_finished",
170
+ processedBytes: receipt.processedBytes,
171
+ status: receipt.status
172
+ }, dependencies);
173
+ return receipt;
174
+ }
175
+ async function refuse(options) {
176
+ await appendLog(options.proposal, { event: "execution_refused", refusal: options.refusal }, options.dependencies);
177
+ return persistReceipt(refusalReceipt({
178
+ proposal: options.proposal,
179
+ refusal: options.refusal,
180
+ startedAt: options.startedAt,
181
+ finishedAt: options.dependencies.now().toISOString()
182
+ }), options.proposal, options.dependencies);
183
+ }
184
+ function runningUnrealEditors(processes) {
185
+ const editor = /(?:^|[\\/\s])(?:UnrealEditor|UE4Editor)(?:-Cmd)?(?:\.exe)?(?:$|\s)/iu;
186
+ return processes.filter((process) => [process.name, process.command, process.path].some((value) => value !== undefined && editor.test(value)));
187
+ }
188
+ function targetMatches(planned, current) {
189
+ return (current !== undefined &&
190
+ current.kind === planned.kind &&
191
+ current.root === planned.root &&
192
+ current.target.id === planned.target.id &&
193
+ current.target.key === planned.target.key &&
194
+ current.target.path === planned.target.path &&
195
+ current.target.relativePath === planned.target.relativePath &&
196
+ current.target.bytes === planned.target.bytes);
197
+ }
198
+ async function validateTarget(options) {
199
+ const metadata = await lstat(options.target.path);
200
+ if (!metadata.isDirectory() || metadata.isSymbolicLink()) {
201
+ throw new Error("Cleanup target is no longer a plain directory.");
202
+ }
203
+ const [scanRoot, ownerRoot, target] = await Promise.all([
204
+ realpath(options.scanRoot),
205
+ realpath(options.ownerRoot),
206
+ realpath(options.target.path)
207
+ ]);
208
+ if (!isWithin(target, scanRoot) || !isWithin(target, ownerRoot) || target === ownerRoot) {
209
+ throw new Error("Cleanup target no longer resolves inside its approved roots.");
210
+ }
211
+ const currentRelativePath = relative(ownerRoot, target).split(sep).join("/");
212
+ if (currentRelativePath !== options.target.relativePath) {
213
+ throw new Error("Cleanup target identity changed after revalidation.");
214
+ }
215
+ }
216
+ function cancelledEntries(targets) {
217
+ return targets.map(({ target }) => ({
218
+ targetId: target.id,
219
+ path: target.path,
220
+ relativePath: target.relativePath,
221
+ bytes: target.bytes,
222
+ status: "cancelled",
223
+ message: "Cleanup was cancelled before this target started."
224
+ }));
225
+ }
226
+ export async function executeCustodianProposal(proposal, approvalPhrase, signal, dependencies = defaultDependencies) {
227
+ const startedAt = dependencies.now().toISOString();
228
+ await appendLog(proposal, { event: "execution_requested" }, dependencies);
229
+ if (approvalPhrase !== proposal.approvalPhrase) {
230
+ return refuse({
231
+ proposal,
232
+ startedAt,
233
+ dependencies,
234
+ refusal: {
235
+ code: "approval_mismatch",
236
+ message: "The cleanup approval phrase does not match this proposal.",
237
+ recovery: `Review the proposal and approve it with ${proposal.approvalPhrase}.`
238
+ }
239
+ });
240
+ }
241
+ const editors = runningUnrealEditors(await dependencies.runningProcesses());
242
+ if (editors.length > 0) {
243
+ return refuse({
244
+ proposal,
245
+ startedAt,
246
+ dependencies,
247
+ refusal: {
248
+ code: "editor_running",
249
+ message: `Cleanup refused while ${editors.length} Unreal Editor process(es) are running.`,
250
+ recovery: "Close every Unreal Editor process, prepare a fresh proposal, and retry."
251
+ }
252
+ });
253
+ }
254
+ if (signal.aborted) {
255
+ const entries = cancelledEntries(proposal.targets);
256
+ return persistReceipt({
257
+ schemaVersion: 1,
258
+ proposalId: proposal.id,
259
+ proposalPath: proposal.proposalPath,
260
+ receiptPath: proposal.receiptPath,
261
+ logPath: proposal.logPath,
262
+ root: proposal.root,
263
+ mode: proposal.mode,
264
+ startedAt,
265
+ finishedAt: dependencies.now().toISOString(),
266
+ status: "cancelled",
267
+ plannedBytes: proposal.bytes,
268
+ processedBytes: 0,
269
+ entries
270
+ }, proposal, dependencies);
271
+ }
272
+ const report = await scanCustodian({ root: proposal.root, ignorePressure: proposal.ignorePressure }, signal);
273
+ const currentById = new Map(flattenPlanTargets(report.plan.items).map((target) => [target.target.id, target]));
274
+ const currentTargets = [];
275
+ for (const planned of proposal.targets) {
276
+ const current = currentById.get(planned.target.id);
277
+ if (!targetMatches(planned, current)) {
278
+ return refuse({
279
+ proposal,
280
+ startedAt,
281
+ dependencies,
282
+ refusal: {
283
+ code: "proposal_stale",
284
+ message: `Cleanup target ${planned.target.relativePath} changed after review.`,
285
+ recovery: "Rescan, prepare a new proposal, and review the current target evidence."
286
+ }
287
+ });
288
+ }
289
+ currentTargets.push(current);
290
+ }
291
+ const entries = [];
292
+ for (let index = 0; index < currentTargets.length; index++) {
293
+ const current = currentTargets[index];
294
+ if (current === undefined)
295
+ continue;
296
+ if (signal.aborted) {
297
+ entries.push(...cancelledEntries(currentTargets.slice(index)));
298
+ break;
299
+ }
300
+ try {
301
+ await validateTarget({
302
+ scanRoot: proposal.root,
303
+ ownerRoot: current.root,
304
+ target: current.target
305
+ });
306
+ await appendLog(proposal, { event: "target_started", targetId: current.target.id }, dependencies);
307
+ if (proposal.mode === "trash") {
308
+ await dependencies.moveToTrash(current.target.path);
309
+ }
310
+ else {
311
+ await dependencies.removePermanently(current.target.path);
312
+ }
313
+ const entry = {
314
+ targetId: current.target.id,
315
+ path: current.target.path,
316
+ relativePath: current.target.relativePath,
317
+ bytes: current.target.bytes,
318
+ status: proposal.mode === "trash" ? "trashed" : "deleted"
319
+ };
320
+ entries.push(entry);
321
+ await appendLog(proposal, { event: "target_completed", ...entry }, dependencies);
322
+ }
323
+ catch (cause) {
324
+ const entry = {
325
+ targetId: current.target.id,
326
+ path: current.target.path,
327
+ relativePath: current.target.relativePath,
328
+ bytes: current.target.bytes,
329
+ status: "failed",
330
+ message: cause instanceof Error ? cause.message : String(cause)
331
+ };
332
+ entries.push(entry);
333
+ await appendLog(proposal, { event: "target_failed", ...entry }, dependencies);
334
+ }
335
+ }
336
+ const processedBytes = entries
337
+ .filter(({ status }) => status === "trashed" || status === "deleted")
338
+ .reduce((total, { bytes }) => total + bytes, 0);
339
+ const status = entries.some(({ status }) => status === "cancelled")
340
+ ? "cancelled"
341
+ : entries.some(({ status }) => status === "failed")
342
+ ? "partial"
343
+ : "completed";
344
+ return persistReceipt({
345
+ schemaVersion: 1,
346
+ proposalId: proposal.id,
347
+ proposalPath: proposal.proposalPath,
348
+ receiptPath: proposal.receiptPath,
349
+ logPath: proposal.logPath,
350
+ root: proposal.root,
351
+ mode: proposal.mode,
352
+ startedAt,
353
+ finishedAt: dependencies.now().toISOString(),
354
+ status,
355
+ plannedBytes: proposal.bytes,
356
+ processedBytes,
357
+ entries
358
+ }, proposal, dependencies);
359
+ }
360
+ //# sourceMappingURL=node-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-executor.js","sourceRoot":"","sources":["../src/node-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CustodianReport, CustodianScanRequest } from "./schema.js";
2
+ export interface NodeScannerDependencies {
3
+ readonly deviceOf: (path: string) => Promise<number>;
4
+ readonly freeBytesAt: (path: string) => Promise<number>;
5
+ }
6
+ export declare function scanCustodian(request: CustodianScanRequest, signal: AbortSignal, dependencies?: NodeScannerDependencies): Promise<CustodianReport>;
7
+ //# sourceMappingURL=node-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-scanner.d.ts","sourceRoot":"","sources":["../src/node-scanner.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EASX,eAAe,EACf,oBAAoB,EAGpB,MAAM,aAAa,CAAC;AA0HrB,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxD;AAg3BD,wBAAsB,aAAa,CAClC,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,WAAW,EACnB,YAAY,GAAE,uBAAwD,GACpE,OAAO,CAAC,eAAe,CAAC,CA8D1B"}