visionclaw 0.1.196-beta.6 → 0.1.196-beta.8
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/CHANGELOG.md +7 -0
- package/dist/agent/disk-monitor.d.ts +44 -0
- package/dist/agent/disk-monitor.d.ts.map +1 -0
- package/dist/agent/disk-monitor.js +466 -0
- package/dist/agent/disk-monitor.js.map +1 -0
- package/dist/agent/engines/pi-coding/session.d.ts.map +1 -1
- package/dist/agent/engines/pi-coding/session.js +8 -4
- package/dist/agent/engines/pi-coding/session.js.map +1 -1
- package/dist/agent/engines/pi-coding/todo-tool.d.ts +11 -0
- package/dist/agent/engines/pi-coding/todo-tool.d.ts.map +1 -0
- package/dist/agent/engines/pi-coding/todo-tool.js +49 -0
- package/dist/agent/engines/pi-coding/todo-tool.js.map +1 -0
- package/dist/agent/engines/pi-coding/tools.d.ts.map +1 -1
- package/dist/agent/engines/pi-coding/tools.js +3 -1
- package/dist/agent/engines/pi-coding/tools.js.map +1 -1
- package/dist/agent/heartbeat-manager.d.ts +2 -0
- package/dist/agent/heartbeat-manager.d.ts.map +1 -1
- package/dist/agent/heartbeat-manager.js +22 -0
- package/dist/agent/heartbeat-manager.js.map +1 -1
- package/dist/agent/interrupt-handler.d.ts +5 -4
- package/dist/agent/interrupt-handler.d.ts.map +1 -1
- package/dist/agent/interrupt-handler.js +26 -14
- package/dist/agent/interrupt-handler.js.map +1 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +6 -5
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/model-provider.d.ts +1 -1
- package/dist/agent/model-provider.d.ts.map +1 -1
- package/dist/agent/model-provider.js +21 -22
- package/dist/agent/model-provider.js.map +1 -1
- package/dist/agent/reply-target.d.ts +6 -0
- package/dist/agent/reply-target.d.ts.map +1 -0
- package/dist/agent/reply-target.js +20 -0
- package/dist/agent/reply-target.js.map +1 -0
- package/dist/agent/runtime-credentials.d.ts +2 -0
- package/dist/agent/runtime-credentials.d.ts.map +1 -1
- package/dist/agent/runtime-credentials.js +36 -0
- package/dist/agent/runtime-credentials.js.map +1 -1
- package/dist/agent/state.d.ts +6 -0
- package/dist/agent/state.d.ts.map +1 -1
- package/dist/agent/state.js.map +1 -1
- package/dist/agent/wake-cycle-runner.d.ts +1 -0
- package/dist/agent/wake-cycle-runner.d.ts.map +1 -1
- package/dist/agent/wake-cycle-runner.js +30 -2
- package/dist/agent/wake-cycle-runner.js.map +1 -1
- package/dist/channels/manager.d.ts.map +1 -1
- package/dist/channels/manager.js +2 -0
- package/dist/channels/manager.js.map +1 -1
- package/dist/channels/message-dedup.d.ts +3 -0
- package/dist/channels/message-dedup.d.ts.map +1 -0
- package/dist/channels/message-dedup.js +39 -0
- package/dist/channels/message-dedup.js.map +1 -0
- package/dist/channels/queue.d.ts +4 -0
- package/dist/channels/queue.d.ts.map +1 -1
- package/dist/channels/queue.js +48 -0
- package/dist/channels/queue.js.map +1 -1
- package/dist/channels/telegram.d.ts +2 -2
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +49 -9
- package/dist/channels/telegram.js.map +1 -1
- package/dist/channels/weixin.d.ts.map +1 -1
- package/dist/channels/weixin.js +104 -3
- package/dist/channels/weixin.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/models.d.ts +10 -0
- package/dist/config/models.d.ts.map +1 -0
- package/dist/config/models.js +10 -0
- package/dist/config/models.js.map +1 -0
- package/dist/config/types.d.ts +5 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +13 -6
- package/dist/config/types.js.map +1 -1
- package/dist/onboarding/index.d.ts.map +1 -1
- package/dist/onboarding/index.js +5 -4
- package/dist/onboarding/index.js.map +1 -1
- package/dist/onboarding/onboarding-service-client.d.ts +13 -0
- package/dist/onboarding/onboarding-service-client.d.ts.map +1 -1
- package/dist/onboarding/onboarding-service-client.js.map +1 -1
- package/dist/onboarding/setup-steps.d.ts.map +1 -1
- package/dist/onboarding/setup-steps.js +2 -1
- package/dist/onboarding/setup-steps.js.map +1 -1
- package/dist/reconfigure.d.ts.map +1 -1
- package/dist/reconfigure.js +7 -4
- package/dist/reconfigure.js.map +1 -1
- package/dist/tools/notify.js +11 -13
- package/dist/tools/notify.js.map +1 -1
- package/dist-agent/bundle.cjs +2302 -1497
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [0.1.196](https://github.com/babelcloud/visionclaw/compare/v0.1.195...v0.1.196) (2026-05-31)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* Improved browser automation reliability and compatibility with websites that use stricter bot-detection or dynamic browser behavior, including social media and web-crawling workflows.
|
|
6
|
+
* Improved reliability for GPT-backed agents by better handling transient model/API errors and malformed responses.
|
|
7
|
+
|
|
1
8
|
## [0.1.195](https://github.com/babelcloud/visionclaw/compare/v0.1.194...v0.1.195) (2026-05-24)
|
|
2
9
|
|
|
3
10
|
### Bug Fixes
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disk space monitor — heartbeat-driven disk monitoring and autonomous cleanup.
|
|
3
|
+
*
|
|
4
|
+
* Called after each heartbeat. Uses fs.statfs() to probe available space,
|
|
5
|
+
* runs two tiers of cleanup when low, and reports results via health events.
|
|
6
|
+
*
|
|
7
|
+
* Tier 1: Deterministic whitelist cleanup (caches, logs, temp files).
|
|
8
|
+
* Tier 2: LLM-guided smart cleanup — the agent analyses du results and
|
|
9
|
+
* decides which non-protected paths to remove.
|
|
10
|
+
*
|
|
11
|
+
* No owner notifications — all reporting goes through health events to
|
|
12
|
+
* the onboarding service for monitoring and audit.
|
|
13
|
+
*/
|
|
14
|
+
import type { HeartbeatHealthEvent } from "../onboarding/onboarding-service-client.js";
|
|
15
|
+
import type { VisionClawConfig } from "../config/types.js";
|
|
16
|
+
export interface DiskProbe {
|
|
17
|
+
totalBytes: number;
|
|
18
|
+
freeBytes: number;
|
|
19
|
+
availableBytes: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CleanupResult {
|
|
22
|
+
target: string;
|
|
23
|
+
freedBytes: number;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface DiskAnalysisEntry {
|
|
27
|
+
path: string;
|
|
28
|
+
sizeBytes: number;
|
|
29
|
+
suggestion: string | null;
|
|
30
|
+
}
|
|
31
|
+
export interface DiskCheckResult {
|
|
32
|
+
probe: DiskProbe;
|
|
33
|
+
cleanupResults: CleanupResult[];
|
|
34
|
+
totalFreed: number;
|
|
35
|
+
postCleanupAvailable: number;
|
|
36
|
+
analysis: DiskAnalysisEntry[];
|
|
37
|
+
healthEvents: HeartbeatHealthEvent[];
|
|
38
|
+
}
|
|
39
|
+
export declare function isUnderAllowedRoot(targetPath: string): boolean;
|
|
40
|
+
export declare function hasGitAncestor(targetPath: string): boolean;
|
|
41
|
+
export declare function resolveSafeDeletionTarget(targetPath: string): Promise<string | null>;
|
|
42
|
+
export declare function probeDisk(mountPoint?: string): Promise<DiskProbe>;
|
|
43
|
+
export declare function checkDisk(config?: VisionClawConfig): Promise<DiskCheckResult | null>;
|
|
44
|
+
//# sourceMappingURL=disk-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-monitor.d.ts","sourceRoot":"","sources":["../../src/agent/disk-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAGvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AA4B3D,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,YAAY,EAAE,oBAAoB,EAAE,CAAC;CACtC;AA4CD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB1F;AAKD,wBAAsB,SAAS,CAAC,UAAU,SAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAOpE;AAsQD,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA6H1F"}
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disk space monitor — heartbeat-driven disk monitoring and autonomous cleanup.
|
|
3
|
+
*
|
|
4
|
+
* Called after each heartbeat. Uses fs.statfs() to probe available space,
|
|
5
|
+
* runs two tiers of cleanup when low, and reports results via health events.
|
|
6
|
+
*
|
|
7
|
+
* Tier 1: Deterministic whitelist cleanup (caches, logs, temp files).
|
|
8
|
+
* Tier 2: LLM-guided smart cleanup — the agent analyses du results and
|
|
9
|
+
* decides which non-protected paths to remove.
|
|
10
|
+
*
|
|
11
|
+
* No owner notifications — all reporting goes through health events to
|
|
12
|
+
* the onboarding service for monitoring and audit.
|
|
13
|
+
*/
|
|
14
|
+
import { statfs, realpath } from "node:fs/promises";
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
import { execFile } from "node:child_process";
|
|
17
|
+
import { promisify } from "node:util";
|
|
18
|
+
import { homedir } from "node:os";
|
|
19
|
+
import { join, resolve, normalize, dirname } from "node:path";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { logger } from "../logger.js";
|
|
22
|
+
import { runSideCall } from "./model-provider.js";
|
|
23
|
+
const execFileAsync = promisify(execFile);
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Thresholds (bytes)
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const GB = 1_073_741_824;
|
|
28
|
+
const THRESHOLD_LOW = 10 * GB;
|
|
29
|
+
const THRESHOLD_CRITICAL = 5 * GB;
|
|
30
|
+
const THRESHOLD_RECOVERED = 15 * GB;
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Cooldowns
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
const CLEANUP_COOLDOWN_MS = 6 * 60 * 60 * 1000; // 6 hours
|
|
35
|
+
let currentState = "normal";
|
|
36
|
+
let lastCleanupAt = 0;
|
|
37
|
+
let cleanupRunning = false;
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Suggestion templates for du analysis
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
const SUGGESTIONS = [
|
|
42
|
+
{ pattern: /\/opt\/homebrew/i, suggestion: "`brew cleanup` or uninstall unused packages" },
|
|
43
|
+
{ pattern: /\/Library\/Application Support/i, suggestion: "May contain Xcode/Docker caches — inspect and clean" },
|
|
44
|
+
{ pattern: /\/Library\/Developer/i, suggestion: "Xcode caches/simulators — can be cleaned" },
|
|
45
|
+
{ pattern: /node_modules/i, suggestion: "Delete node_modules in unused projects" },
|
|
46
|
+
{ pattern: /\/Library\/Caches/i, suggestion: "Application caches — generally safe to trim" },
|
|
47
|
+
{ pattern: /\.Trash/i, suggestion: "Empty the Trash" },
|
|
48
|
+
];
|
|
49
|
+
function getSuggestion(dirPath) {
|
|
50
|
+
for (const { pattern, suggestion } of SUGGESTIONS) {
|
|
51
|
+
if (pattern.test(dirPath))
|
|
52
|
+
return suggestion;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Path safety — tier 2 uses a positive allowlist ("deny unless under a known
|
|
58
|
+
// cleanup root"), NOT a denylist. A denylist always has gaps.
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
const home = homedir();
|
|
61
|
+
// Tier 2 LLM cleanup may ONLY delete paths under these roots.
|
|
62
|
+
const TIER2_ALLOWED_ROOTS = [
|
|
63
|
+
join(home, "Library/Caches"),
|
|
64
|
+
join(home, "Library/Logs"),
|
|
65
|
+
join(home, "Library/Developer"),
|
|
66
|
+
join(home, ".cache"),
|
|
67
|
+
"/tmp",
|
|
68
|
+
join(home, "screenshots"),
|
|
69
|
+
];
|
|
70
|
+
const MIN_DELETE_DEPTH = 4;
|
|
71
|
+
function normalizePath(targetPath) {
|
|
72
|
+
const expanded = targetPath.startsWith("~") ? targetPath.replace("~", home) : targetPath;
|
|
73
|
+
return normalize(resolve(expanded));
|
|
74
|
+
}
|
|
75
|
+
export function isUnderAllowedRoot(targetPath) {
|
|
76
|
+
const resolved = normalizePath(targetPath);
|
|
77
|
+
for (const root of TIER2_ALLOWED_ROOTS) {
|
|
78
|
+
if (resolved === root || resolved.startsWith(root + "/"))
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
export function hasGitAncestor(targetPath) {
|
|
84
|
+
let dir = normalizePath(targetPath);
|
|
85
|
+
const fsRoot = resolve("/");
|
|
86
|
+
while (dir !== fsRoot) {
|
|
87
|
+
if (existsSync(join(dir, ".git")))
|
|
88
|
+
return true;
|
|
89
|
+
const parent = dirname(dir);
|
|
90
|
+
if (parent === dir)
|
|
91
|
+
break;
|
|
92
|
+
dir = parent;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
export async function resolveSafeDeletionTarget(targetPath) {
|
|
97
|
+
const normalized = normalizePath(targetPath);
|
|
98
|
+
const segments = normalized.split("/").filter(Boolean);
|
|
99
|
+
if (segments.length < MIN_DELETE_DEPTH)
|
|
100
|
+
return null;
|
|
101
|
+
if (!isUnderAllowedRoot(normalized))
|
|
102
|
+
return null;
|
|
103
|
+
if (hasGitAncestor(normalized))
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
const real = await realpath(normalized);
|
|
107
|
+
if (!isUnderAllowedRoot(real))
|
|
108
|
+
return null;
|
|
109
|
+
if (hasGitAncestor(real))
|
|
110
|
+
return null;
|
|
111
|
+
return real;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return normalized;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Disk probe
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
export async function probeDisk(mountPoint = "/") {
|
|
121
|
+
const stats = await statfs(mountPoint);
|
|
122
|
+
return {
|
|
123
|
+
totalBytes: stats.blocks * stats.bsize,
|
|
124
|
+
freeBytes: stats.bfree * stats.bsize,
|
|
125
|
+
availableBytes: stats.bavail * stats.bsize,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// Cleanup primitives
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Tier 1 primitives — no safety gate. Callers are responsible for passing
|
|
132
|
+
// known-safe paths (tier 1 whitelist) or pre-validated paths (tier 2 via
|
|
133
|
+
// resolveSafeDeletionTarget).
|
|
134
|
+
async function deleteOldFiles(dir, daysOld, minSizeMb = 0, namePattern) {
|
|
135
|
+
try {
|
|
136
|
+
const { stdout: beforeOut } = await execFileAsync("du", ["-sk", dir], { timeout: 30_000 });
|
|
137
|
+
const beforeKb = parseInt(beforeOut.split("\t")[0] ?? "0", 10);
|
|
138
|
+
const findArgs = [dir, "-type", "f", "-mtime", `+${daysOld}`];
|
|
139
|
+
if (namePattern) {
|
|
140
|
+
findArgs.push("-name", namePattern);
|
|
141
|
+
}
|
|
142
|
+
if (minSizeMb > 0) {
|
|
143
|
+
findArgs.push("-size", `+${minSizeMb}M`);
|
|
144
|
+
}
|
|
145
|
+
findArgs.push("-delete");
|
|
146
|
+
await execFileAsync("find", findArgs, { timeout: 60_000 });
|
|
147
|
+
await execFileAsync("find", [dir, "-type", "d", "-empty", "-delete"], { timeout: 30_000 }).catch(() => { });
|
|
148
|
+
const { stdout: afterOut } = await execFileAsync("du", ["-sk", dir], { timeout: 30_000 }).catch(() => ({ stdout: "0\t" }));
|
|
149
|
+
const afterKb = parseInt(afterOut.split("\t")[0] ?? "0", 10);
|
|
150
|
+
const freedBytes = Math.max(0, (beforeKb - afterKb) * 1024);
|
|
151
|
+
return { target: dir, freedBytes };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return { target: dir, freedBytes: 0, error: err instanceof Error ? err.message : String(err) };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function deleteDirectory(dir) {
|
|
158
|
+
try {
|
|
159
|
+
const { stdout: beforeOut } = await execFileAsync("du", ["-sk", dir], { timeout: 30_000 });
|
|
160
|
+
const beforeKb = parseInt(beforeOut.split("\t")[0] ?? "0", 10);
|
|
161
|
+
if (beforeKb === 0)
|
|
162
|
+
return { target: dir, freedBytes: 0 };
|
|
163
|
+
await execFileAsync("rm", ["-rf", dir], { timeout: 60_000 });
|
|
164
|
+
return { target: dir, freedBytes: beforeKb * 1024 };
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
return { target: dir, freedBytes: 0, error: err instanceof Error ? err.message : String(err) };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async function prunePnpmStore() {
|
|
171
|
+
const target = "pnpm store";
|
|
172
|
+
try {
|
|
173
|
+
const before = await probeDisk();
|
|
174
|
+
await execFileAsync("pnpm", ["store", "prune"], { timeout: 120_000 });
|
|
175
|
+
const after = await probeDisk();
|
|
176
|
+
return { target, freedBytes: Math.max(0, after.availableBytes - before.availableBytes) };
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return { target, freedBytes: 0, error: err instanceof Error ? err.message : String(err) };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async function dockerSystemPrune() {
|
|
183
|
+
const target = "docker system prune";
|
|
184
|
+
try {
|
|
185
|
+
const before = await probeDisk();
|
|
186
|
+
await execFileAsync("docker", ["system", "prune", "-f"], { timeout: 120_000 });
|
|
187
|
+
const after = await probeDisk();
|
|
188
|
+
return { target, freedBytes: Math.max(0, after.availableBytes - before.availableBytes) };
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return { target, freedBytes: 0, error: err instanceof Error ? err.message : String(err) };
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// Tier 1: Deterministic whitelist cleanup
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
async function runTier1Cleanup() {
|
|
198
|
+
const results = [];
|
|
199
|
+
// ~/screenshots/ — files older than 7 days
|
|
200
|
+
results.push(await deleteOldFiles(join(home, "screenshots"), 7));
|
|
201
|
+
// ~/Library/Caches/Google/Chrome/ — browser caches
|
|
202
|
+
results.push(await deleteDirectory(join(home, "Library/Caches/Google/Chrome/Default/Cache")));
|
|
203
|
+
results.push(await deleteDirectory(join(home, "Library/Caches/Google/Chrome/Default/Code Cache")));
|
|
204
|
+
// Package manager caches
|
|
205
|
+
results.push(await deleteDirectory(join(home, "Library/Caches/pip")));
|
|
206
|
+
results.push(await deleteDirectory(join(home, "Library/Caches/go-build")));
|
|
207
|
+
results.push(await deleteDirectory(join(home, ".npm/_cacache")));
|
|
208
|
+
results.push(await deleteDirectory(join(home, ".local/share/pnpm/store")));
|
|
209
|
+
results.push(await deleteDirectory(join(home, ".cache")));
|
|
210
|
+
// /tmp — files >100MB older than 7 days
|
|
211
|
+
results.push(await deleteOldFiles("/tmp", 7, 100));
|
|
212
|
+
// ~/Library/Logs — files older than 30 days
|
|
213
|
+
results.push(await deleteOldFiles(join(home, "Library/Logs"), 30));
|
|
214
|
+
// ~/.claude/projects — only old transcript/archive .jsonl files
|
|
215
|
+
results.push(await deleteOldFiles(join(home, ".claude/projects"), 30, 0, "*.jsonl"));
|
|
216
|
+
// pnpm store prune
|
|
217
|
+
results.push(await prunePnpmStore());
|
|
218
|
+
// docker system prune -f
|
|
219
|
+
results.push(await dockerSystemPrune());
|
|
220
|
+
return results.filter((r) => r.freedBytes > 0 || r.error);
|
|
221
|
+
}
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
// Deep analysis (du scan top N)
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
async function deepAnalysis(topN = 15) {
|
|
226
|
+
// Scan home at depth 2 (~/Library/Caches, ~/Library/Developer, etc.)
|
|
227
|
+
// and other top-level dirs at depth 2 for granularity.
|
|
228
|
+
// Never scan /Users at depth 1 — that would surface home dirs as candidates.
|
|
229
|
+
const scanTargets = [
|
|
230
|
+
{ dir: home, depth: 2 },
|
|
231
|
+
{ dir: "/Library", depth: 1 },
|
|
232
|
+
{ dir: "/opt", depth: 1 },
|
|
233
|
+
{ dir: "/tmp", depth: 1 },
|
|
234
|
+
];
|
|
235
|
+
const entries = [];
|
|
236
|
+
for (const { dir, depth } of scanTargets) {
|
|
237
|
+
try {
|
|
238
|
+
const { stdout } = await execFileAsync("du", ["-d", String(depth), "-k", dir], { timeout: 60_000 });
|
|
239
|
+
for (const line of stdout.trim().split("\n")) {
|
|
240
|
+
const parts = line.split("\t");
|
|
241
|
+
if (parts.length < 2)
|
|
242
|
+
continue;
|
|
243
|
+
const sizeKb = parseInt(parts[0] ?? "0", 10);
|
|
244
|
+
const duPath = parts[1] ?? "";
|
|
245
|
+
if (!duPath || duPath === dir)
|
|
246
|
+
continue;
|
|
247
|
+
if (sizeKb < 1024 * 100)
|
|
248
|
+
continue; // skip < 100MB
|
|
249
|
+
entries.push({
|
|
250
|
+
path: duPath,
|
|
251
|
+
sizeBytes: sizeKb * 1024,
|
|
252
|
+
suggestion: getSuggestion(duPath),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// du may fail on permission-denied directories — skip
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
entries.sort((a, b) => b.sizeBytes - a.sizeBytes);
|
|
261
|
+
return entries.slice(0, topN);
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// Tier 2: LLM-guided smart cleanup
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
const LlmCleanupSchema = z.object({
|
|
267
|
+
deletions: z.array(z.object({
|
|
268
|
+
path: z.string().describe("Absolute path to delete"),
|
|
269
|
+
reason: z.string().describe("Why this is safe to delete"),
|
|
270
|
+
})).describe("Paths the agent recommends deleting"),
|
|
271
|
+
skipped: z.array(z.object({
|
|
272
|
+
path: z.string(),
|
|
273
|
+
reason: z.string().describe("Why this was NOT selected for deletion"),
|
|
274
|
+
})).describe("Paths considered but intentionally kept"),
|
|
275
|
+
});
|
|
276
|
+
const LLM_CLEANUP_SYSTEM_PROMPT = [
|
|
277
|
+
"You are a disk cleanup agent on a macOS machine running the VisionClaw AI agent.",
|
|
278
|
+
"The machine is running low on disk space. Tier 1 (deterministic) cleanup already ran but did not free enough space.",
|
|
279
|
+
"",
|
|
280
|
+
"You will receive a list of the largest directories on disk. Your job is to decide which ones can be safely deleted.",
|
|
281
|
+
"",
|
|
282
|
+
"## Rules",
|
|
283
|
+
"1. You may ONLY select paths under these allowed roots (all others are rejected by the safety gate):",
|
|
284
|
+
" - ~/Library/Caches/",
|
|
285
|
+
" - ~/Library/Logs/",
|
|
286
|
+
" - ~/Library/Developer/",
|
|
287
|
+
" - ~/.cache/",
|
|
288
|
+
" - /tmp/",
|
|
289
|
+
" - ~/screenshots/",
|
|
290
|
+
"2. Paths inside git repositories are automatically rejected.",
|
|
291
|
+
"3. Prefer deleting caches, build artifacts, old logs, and temporary files.",
|
|
292
|
+
"4. Be conservative — only delete things you are confident are regenerable.",
|
|
293
|
+
"5. Include a clear reason for every deletion AND every skip.",
|
|
294
|
+
"",
|
|
295
|
+
"Respond with the structured JSON schema provided.",
|
|
296
|
+
].join("\n");
|
|
297
|
+
async function runTier2Cleanup(analysis, config) {
|
|
298
|
+
const userMessage = [
|
|
299
|
+
"## Disk usage — largest directories (after tier 1 cleanup)",
|
|
300
|
+
"",
|
|
301
|
+
...analysis.map((e) => `- ${e.path}: ${formatBytes(e.sizeBytes)}${e.suggestion ? ` (hint: ${e.suggestion})` : ""}`),
|
|
302
|
+
"",
|
|
303
|
+
"Which of these should be deleted to free space? Remember: only delete what you are confident is safe.",
|
|
304
|
+
].join("\n");
|
|
305
|
+
let decision = null;
|
|
306
|
+
try {
|
|
307
|
+
decision = await runSideCall(config, {
|
|
308
|
+
systemPrompt: LLM_CLEANUP_SYSTEM_PROMPT,
|
|
309
|
+
userMessage,
|
|
310
|
+
schema: LlmCleanupSchema,
|
|
311
|
+
schemaName: "disk_cleanup_decision",
|
|
312
|
+
maxTokens: 1024,
|
|
313
|
+
timeoutMs: 30_000,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
logger.warn(`Tier 2 LLM cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
318
|
+
return { decision: null, results: [] };
|
|
319
|
+
}
|
|
320
|
+
if (decision.deletions.length === 0) {
|
|
321
|
+
return { decision, results: [] };
|
|
322
|
+
}
|
|
323
|
+
const results = [];
|
|
324
|
+
for (const del of decision.deletions) {
|
|
325
|
+
const safePath = await resolveSafeDeletionTarget(del.path);
|
|
326
|
+
if (!safePath) {
|
|
327
|
+
results.push({ target: del.path, freedBytes: 0, error: "protected — LLM override blocked" });
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
results.push(await deleteDirectory(safePath));
|
|
331
|
+
}
|
|
332
|
+
return { decision, results };
|
|
333
|
+
}
|
|
334
|
+
// ---------------------------------------------------------------------------
|
|
335
|
+
// Format helpers
|
|
336
|
+
// ---------------------------------------------------------------------------
|
|
337
|
+
function formatBytes(bytes) {
|
|
338
|
+
if (bytes >= GB)
|
|
339
|
+
return `${(bytes / GB).toFixed(1)}GB`;
|
|
340
|
+
const MB = 1_048_576;
|
|
341
|
+
if (bytes >= MB)
|
|
342
|
+
return `${(bytes / MB).toFixed(0)}MB`;
|
|
343
|
+
return `${(bytes / 1024).toFixed(0)}KB`;
|
|
344
|
+
}
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Main entry point — called from HeartbeatManager after each heartbeat
|
|
347
|
+
//
|
|
348
|
+
// State machine:
|
|
349
|
+
// ≥ 10GB → normal (no action)
|
|
350
|
+
// < 10GB → tier 1 whitelist cleanup + du analysis + health event
|
|
351
|
+
// still < 10GB → tier 2 LLM smart cleanup (protection-list constrained)
|
|
352
|
+
// < 5GB → critical health event
|
|
353
|
+
// > 15GB → recovered health event
|
|
354
|
+
// ---------------------------------------------------------------------------
|
|
355
|
+
export async function checkDisk(config) {
|
|
356
|
+
if (cleanupRunning)
|
|
357
|
+
return null;
|
|
358
|
+
let probe;
|
|
359
|
+
try {
|
|
360
|
+
probe = await probeDisk();
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
logger.warn(`Disk probe failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
const healthEvents = [];
|
|
367
|
+
const now = Date.now();
|
|
368
|
+
// Recovery: crossed back above the hysteresis threshold
|
|
369
|
+
if (currentState !== "normal" && probe.availableBytes >= THRESHOLD_RECOVERED) {
|
|
370
|
+
const prevState = currentState;
|
|
371
|
+
currentState = "normal";
|
|
372
|
+
lastCleanupAt = 0;
|
|
373
|
+
healthEvents.push({
|
|
374
|
+
eventType: "disk_space_recovered",
|
|
375
|
+
severity: "info",
|
|
376
|
+
message: `Disk space recovered: ${formatBytes(probe.availableBytes)} available (was ${prevState})`,
|
|
377
|
+
details: { availableBytes: probe.availableBytes },
|
|
378
|
+
});
|
|
379
|
+
return {
|
|
380
|
+
probe,
|
|
381
|
+
cleanupResults: [],
|
|
382
|
+
totalFreed: 0,
|
|
383
|
+
postCleanupAvailable: probe.availableBytes,
|
|
384
|
+
analysis: [],
|
|
385
|
+
healthEvents,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
// Normal — nothing to do
|
|
389
|
+
if (probe.availableBytes >= THRESHOLD_LOW) {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
// Below 10GB — decide whether to run expensive cleanup or just report.
|
|
393
|
+
const enteringLow = currentState === "normal";
|
|
394
|
+
const enteringCritical = currentState !== "critical" && probe.availableBytes < THRESHOLD_CRITICAL;
|
|
395
|
+
const cleanupCooldownElapsed = (now - lastCleanupAt) >= CLEANUP_COOLDOWN_MS;
|
|
396
|
+
const shouldCleanup = enteringLow || enteringCritical || cleanupCooldownElapsed;
|
|
397
|
+
let cleanupResults = [];
|
|
398
|
+
let analysis = [];
|
|
399
|
+
let totalFreed = 0;
|
|
400
|
+
let postCleanupAvailable = probe.availableBytes;
|
|
401
|
+
if (shouldCleanup) {
|
|
402
|
+
cleanupRunning = true;
|
|
403
|
+
try {
|
|
404
|
+
logger.system(`Disk space low: ${formatBytes(probe.availableBytes)} available — running tier 1 cleanup`);
|
|
405
|
+
// Tier 1: deterministic whitelist cleanup + du analysis
|
|
406
|
+
const [tier1Results, duAnalysis] = await Promise.all([
|
|
407
|
+
runTier1Cleanup(),
|
|
408
|
+
deepAnalysis(),
|
|
409
|
+
]);
|
|
410
|
+
cleanupResults = tier1Results;
|
|
411
|
+
analysis = duAnalysis;
|
|
412
|
+
totalFreed = cleanupResults.reduce((sum, r) => sum + r.freedBytes, 0);
|
|
413
|
+
postCleanupAvailable = probe.availableBytes + totalFreed;
|
|
414
|
+
logger.system(`Tier 1 cleanup complete: freed ${formatBytes(totalFreed)}, ${formatBytes(postCleanupAvailable)} available`);
|
|
415
|
+
// Tier 2: LLM smart cleanup — if still below threshold and config is available
|
|
416
|
+
if (postCleanupAvailable < THRESHOLD_LOW && config) {
|
|
417
|
+
logger.system("Tier 1 insufficient — running tier 2 LLM cleanup");
|
|
418
|
+
const tier2 = await runTier2Cleanup(analysis, config);
|
|
419
|
+
if (tier2.results.length > 0) {
|
|
420
|
+
cleanupResults.push(...tier2.results);
|
|
421
|
+
const tier2Freed = tier2.results.reduce((sum, r) => sum + r.freedBytes, 0);
|
|
422
|
+
totalFreed += tier2Freed;
|
|
423
|
+
postCleanupAvailable += tier2Freed;
|
|
424
|
+
logger.system(`Tier 2 cleanup complete: freed ${formatBytes(tier2Freed)}, ${formatBytes(postCleanupAvailable)} available`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
lastCleanupAt = now;
|
|
428
|
+
}
|
|
429
|
+
finally {
|
|
430
|
+
cleanupRunning = false;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
// Determine final state
|
|
434
|
+
const isCritical = postCleanupAvailable < THRESHOLD_CRITICAL;
|
|
435
|
+
currentState = isCritical ? "critical" : "low";
|
|
436
|
+
// Health event — always emitted (keeps dashboard current)
|
|
437
|
+
healthEvents.push({
|
|
438
|
+
eventType: isCritical ? "disk_space_critical" : "disk_space_low",
|
|
439
|
+
severity: isCritical ? "critical" : "warning",
|
|
440
|
+
message: shouldCleanup
|
|
441
|
+
? `Disk space ${isCritical ? "critical" : "low"}: ${formatBytes(probe.availableBytes)} available, cleaned ${formatBytes(totalFreed)}`
|
|
442
|
+
: `Disk space ${isCritical ? "critical" : "low"}: ${formatBytes(probe.availableBytes)} available (cleanup on cooldown)`,
|
|
443
|
+
details: {
|
|
444
|
+
availableBytes: probe.availableBytes,
|
|
445
|
+
...(shouldCleanup ? {
|
|
446
|
+
totalFreed,
|
|
447
|
+
postCleanupAvailable,
|
|
448
|
+
cleanupResults: cleanupResults.map((r) => ({
|
|
449
|
+
target: r.target,
|
|
450
|
+
freedBytes: r.freedBytes,
|
|
451
|
+
...(r.error ? { error: r.error } : {}),
|
|
452
|
+
})),
|
|
453
|
+
topDirs: analysis.slice(0, 5).map((e) => ({ path: e.path, sizeBytes: e.sizeBytes })),
|
|
454
|
+
} : { postCleanupAvailable }),
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
return {
|
|
458
|
+
probe,
|
|
459
|
+
cleanupResults,
|
|
460
|
+
totalFreed,
|
|
461
|
+
postCleanupAvailable,
|
|
462
|
+
analysis,
|
|
463
|
+
healthEvents,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=disk-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disk-monitor.js","sourceRoot":"","sources":["../../src/agent/disk-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/session.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -345,21 +345,25 @@ export class PiCodingAgentSession {
|
|
|
345
345
|
});
|
|
346
346
|
const sessionManager = this.getSessionManager();
|
|
347
347
|
const mcpAdapter = await loadMcpAdapter();
|
|
348
|
+
const profileDir = getConfigDir();
|
|
348
349
|
// Share the Claude `.claude/skills` directory so PiCodingAgentSession and
|
|
349
350
|
// ClaudeAgentSession see the same set of skills (installed by
|
|
350
|
-
// `installBuiltinSkills()` and the `skill` tool).
|
|
351
|
+
// `installBuiltinSkills()` and the `skill` tool). Also use the profile
|
|
352
|
+
// directory as the Pi resource-loader `agentDir` and enable context-file
|
|
353
|
+
// loading so GPT/Pi sessions pick up profile-level CLAUDE.md/AGENTS.md in
|
|
354
|
+
// the same profile cwd that Claude Code sees.
|
|
351
355
|
const skillsDir = getSkillsDir();
|
|
352
356
|
const additionalSkillPaths = fs.existsSync(skillsDir) ? [skillsDir] : [];
|
|
353
357
|
const loader = new DefaultResourceLoader({
|
|
354
|
-
cwd:
|
|
355
|
-
agentDir:
|
|
358
|
+
cwd: profileDir,
|
|
359
|
+
agentDir: profileDir,
|
|
356
360
|
settingsManager,
|
|
357
361
|
extensionFactories: [this.createVisionClawRuntimeExtension(), mcpAdapter],
|
|
358
362
|
additionalSkillPaths,
|
|
359
363
|
noSkills: false,
|
|
360
364
|
noPromptTemplates: true,
|
|
361
365
|
noThemes: true,
|
|
362
|
-
noContextFiles:
|
|
366
|
+
noContextFiles: false,
|
|
363
367
|
systemPrompt: renderedSystemPrompt,
|
|
364
368
|
});
|
|
365
369
|
await loader.reload();
|