@nowcrew/daemon 0.6.10 → 0.6.11
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/dist/local-executor.js +10 -0
- package/dist/main.js +0 -0
- package/dist/memory-prune-diagnostics.js +65 -39
- package/package.json +9 -8
package/dist/local-executor.js
CHANGED
|
@@ -788,6 +788,16 @@ async function executeLocalUnlocked(input, callbacks, dependencies) {
|
|
|
788
788
|
changes_truncated: changesTruncated,
|
|
789
789
|
evidence_complete: noteDiff.evidence_complete
|
|
790
790
|
&& !changesTruncated,
|
|
791
|
+
before_manifest_error: noteDiff.before_manifest.error,
|
|
792
|
+
after_manifest_error: noteDiff.after_manifest.error,
|
|
793
|
+
before_manifest_truncated: noteDiff.before_manifest.truncated,
|
|
794
|
+
after_manifest_truncated: noteDiff.after_manifest.truncated,
|
|
795
|
+
before_total_count: noteDiff.before_manifest.total_count,
|
|
796
|
+
after_total_count: noteDiff.after_manifest.total_count,
|
|
797
|
+
before_omitted_count: noteDiff.before_manifest.omitted_count,
|
|
798
|
+
after_omitted_count: noteDiff.after_manifest.omitted_count,
|
|
799
|
+
before_incomplete_file_count: noteDiff.before_manifest.incomplete_file_count,
|
|
800
|
+
after_incomplete_file_count: noteDiff.after_manifest.incomplete_file_count,
|
|
791
801
|
changes: serializedChanges.json,
|
|
792
802
|
});
|
|
793
803
|
const postcondition = evaluateMemoryPrunePostcondition(memoryPruneBeforeSnapshot, snapshot, {
|
package/dist/main.js
CHANGED
|
File without changes
|
|
@@ -266,45 +266,69 @@ function fileChanged(before, after) {
|
|
|
266
266
|
}
|
|
267
267
|
return before.size !== after.size || before.mtime_ms !== after.mtime_ms;
|
|
268
268
|
}
|
|
269
|
+
function notePresence(file) {
|
|
270
|
+
if (file === undefined)
|
|
271
|
+
return "absent";
|
|
272
|
+
if (file.exists)
|
|
273
|
+
return "present";
|
|
274
|
+
if (!file.exists && (file.error === undefined || file.error === "ENOENT"))
|
|
275
|
+
return "absent";
|
|
276
|
+
return "unknown";
|
|
277
|
+
}
|
|
269
278
|
export function diffMemoryPruneNotes(before, after) {
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
.filter((file) => file.exists
|
|
275
|
-
|
|
279
|
+
const manifestDiagnostics = (manifest) => ({
|
|
280
|
+
total_count: manifest.total_count,
|
|
281
|
+
omitted_count: manifest.omitted_count,
|
|
282
|
+
truncated: manifest.truncated,
|
|
283
|
+
incomplete_file_count: manifest.files.filter((file) => !file.exists
|
|
284
|
+
|| file.sha256 === undefined
|
|
285
|
+
|| file.error !== undefined
|
|
286
|
+
|| file.hash_skipped_reason !== undefined).length,
|
|
287
|
+
...(manifest.error === undefined ? {} : { error: manifest.error }),
|
|
288
|
+
});
|
|
289
|
+
const beforeDiagnostics = manifestDiagnostics(before);
|
|
290
|
+
const afterDiagnostics = manifestDiagnostics(after);
|
|
291
|
+
const beforeByPath = new Map(before.files.map((file) => [file.relative_path, file]));
|
|
292
|
+
const afterByPath = new Map(after.files.map((file) => [file.relative_path, file]));
|
|
276
293
|
const paths = [...new Set([...beforeByPath.keys(), ...afterByPath.keys()])]
|
|
277
294
|
.sort(compareCodeUnits);
|
|
278
295
|
const allChanges = [];
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
const
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
296
|
+
if (before.error === undefined && after.error === undefined) {
|
|
297
|
+
const presenceDiffIsReliable = !before.truncated && !after.truncated;
|
|
298
|
+
for (const relativePath of paths) {
|
|
299
|
+
const beforeFile = beforeByPath.get(relativePath);
|
|
300
|
+
const afterFile = afterByPath.get(relativePath);
|
|
301
|
+
const beforePresence = notePresence(beforeFile);
|
|
302
|
+
const afterPresence = notePresence(afterFile);
|
|
303
|
+
if (presenceDiffIsReliable && beforePresence === "absent" && afterPresence === "present"
|
|
304
|
+
&& afterFile !== undefined) {
|
|
305
|
+
allChanges.push({
|
|
306
|
+
relative_path: relativePath,
|
|
307
|
+
change: "created",
|
|
308
|
+
...(afterFile.sha256 === undefined ? {} : { after_sha256: afterFile.sha256 }),
|
|
309
|
+
...(afterFile.size === undefined ? {} : { after_size: afterFile.size }),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
else if (presenceDiffIsReliable && beforePresence === "present" && afterPresence === "absent"
|
|
313
|
+
&& beforeFile !== undefined) {
|
|
314
|
+
allChanges.push({
|
|
315
|
+
relative_path: relativePath,
|
|
316
|
+
change: "deleted",
|
|
317
|
+
...(beforeFile.sha256 === undefined ? {} : { before_sha256: beforeFile.sha256 }),
|
|
318
|
+
...(beforeFile.size === undefined ? {} : { before_size: beforeFile.size }),
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
else if (beforePresence === "present" && afterPresence === "present"
|
|
322
|
+
&& beforeFile !== undefined && afterFile !== undefined && fileChanged(beforeFile, afterFile)) {
|
|
323
|
+
allChanges.push({
|
|
324
|
+
relative_path: relativePath,
|
|
325
|
+
change: "updated",
|
|
326
|
+
...(beforeFile.sha256 === undefined ? {} : { before_sha256: beforeFile.sha256 }),
|
|
327
|
+
...(afterFile.sha256 === undefined ? {} : { after_sha256: afterFile.sha256 }),
|
|
328
|
+
...(beforeFile.size === undefined ? {} : { before_size: beforeFile.size }),
|
|
329
|
+
...(afterFile.size === undefined ? {} : { after_size: afterFile.size }),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
308
332
|
}
|
|
309
333
|
}
|
|
310
334
|
return {
|
|
@@ -315,10 +339,12 @@ export function diffMemoryPruneNotes(before, after) {
|
|
|
315
339
|
&& after.error === undefined
|
|
316
340
|
&& !before.truncated
|
|
317
341
|
&& !after.truncated
|
|
318
|
-
&&
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
342
|
+
&& before.omitted_count === 0
|
|
343
|
+
&& after.omitted_count === 0
|
|
344
|
+
&& beforeDiagnostics.incomplete_file_count === 0
|
|
345
|
+
&& afterDiagnostics.incomplete_file_count === 0,
|
|
346
|
+
before_manifest: beforeDiagnostics,
|
|
347
|
+
after_manifest: afterDiagnostics,
|
|
322
348
|
};
|
|
323
349
|
}
|
|
324
350
|
export function evaluateMemoryPrunePostcondition(before, after, execution) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nowcrew/daemon",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "crew daemon — 运行在用户机器:拉起/管理 agent 进程,注入 crew CLI,归一化 runtime 事件",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -16,6 +16,13 @@
|
|
|
16
16
|
"publishConfig": {
|
|
17
17
|
"access": "public"
|
|
18
18
|
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"daemon": "pnpm --filter @nowcrew/cli build && tsx src/main.ts",
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"prepublishOnly": "pnpm build && node ../scripts/daemon-release-artifact.mjs --strict-registry",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"typecheck": "tsc --noEmit"
|
|
25
|
+
},
|
|
19
26
|
"dependencies": {
|
|
20
27
|
"@agentclientprotocol/sdk": "1.2.1",
|
|
21
28
|
"@nowcrew/cli": "^0.4.14",
|
|
@@ -34,11 +41,5 @@
|
|
|
34
41
|
"tsx": "^4.19.0",
|
|
35
42
|
"typescript": "^5.6.0",
|
|
36
43
|
"vitest": "^2.1.0"
|
|
37
|
-
},
|
|
38
|
-
"scripts": {
|
|
39
|
-
"daemon": "pnpm --filter @nowcrew/cli build && tsx src/main.ts",
|
|
40
|
-
"build": "tsc -p tsconfig.json",
|
|
41
|
-
"test": "vitest run",
|
|
42
|
-
"typecheck": "tsc --noEmit"
|
|
43
44
|
}
|
|
44
|
-
}
|
|
45
|
+
}
|