visionclaw 0.1.196-beta.7 → 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.
Files changed (44) hide show
  1. package/dist/agent/disk-monitor.d.ts +44 -0
  2. package/dist/agent/disk-monitor.d.ts.map +1 -0
  3. package/dist/agent/disk-monitor.js +466 -0
  4. package/dist/agent/disk-monitor.js.map +1 -0
  5. package/dist/agent/engines/pi-coding/todo-tool.d.ts +11 -0
  6. package/dist/agent/engines/pi-coding/todo-tool.d.ts.map +1 -0
  7. package/dist/agent/engines/pi-coding/todo-tool.js +49 -0
  8. package/dist/agent/engines/pi-coding/todo-tool.js.map +1 -0
  9. package/dist/agent/engines/pi-coding/tools.d.ts.map +1 -1
  10. package/dist/agent/engines/pi-coding/tools.js +3 -1
  11. package/dist/agent/engines/pi-coding/tools.js.map +1 -1
  12. package/dist/agent/heartbeat-manager.d.ts +2 -0
  13. package/dist/agent/heartbeat-manager.d.ts.map +1 -1
  14. package/dist/agent/heartbeat-manager.js +22 -0
  15. package/dist/agent/heartbeat-manager.js.map +1 -1
  16. package/dist/agent/model-provider.d.ts +1 -1
  17. package/dist/agent/model-provider.d.ts.map +1 -1
  18. package/dist/agent/model-provider.js +21 -22
  19. package/dist/agent/model-provider.js.map +1 -1
  20. package/dist/channels/telegram.d.ts.map +1 -1
  21. package/dist/channels/telegram.js +2 -1
  22. package/dist/channels/telegram.js.map +1 -1
  23. package/dist/config/index.d.ts.map +1 -1
  24. package/dist/config/index.js +5 -0
  25. package/dist/config/index.js.map +1 -1
  26. package/dist/config/models.d.ts +10 -0
  27. package/dist/config/models.d.ts.map +1 -0
  28. package/dist/config/models.js +10 -0
  29. package/dist/config/models.js.map +1 -0
  30. package/dist/config/types.d.ts +5 -2
  31. package/dist/config/types.d.ts.map +1 -1
  32. package/dist/config/types.js +13 -6
  33. package/dist/config/types.js.map +1 -1
  34. package/dist/onboarding/index.d.ts.map +1 -1
  35. package/dist/onboarding/index.js +5 -4
  36. package/dist/onboarding/index.js.map +1 -1
  37. package/dist/onboarding/setup-steps.d.ts.map +1 -1
  38. package/dist/onboarding/setup-steps.js +2 -1
  39. package/dist/onboarding/setup-steps.js.map +1 -1
  40. package/dist/reconfigure.d.ts.map +1 -1
  41. package/dist/reconfigure.js +7 -4
  42. package/dist/reconfigure.js.map +1 -1
  43. package/dist-agent/bundle.cjs +1936 -1451
  44. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,11 @@
1
+ import { Type } from "typebox";
2
+ import type { ToolDefinition } from "@earendil-works/pi-coding-agent";
3
+ declare const todoWriteParams: Type.TObject<{
4
+ todos: Type.TArray<Type.TObject<{
5
+ content: Type.TString;
6
+ status: Type.TUnion<[Type.TLiteral<"pending">, Type.TLiteral<"in_progress">, Type.TLiteral<"completed">]>;
7
+ }>>;
8
+ }>;
9
+ export declare const todoWriteTool: ToolDefinition<typeof todoWriteParams>;
10
+ export {};
11
+ //# sourceMappingURL=todo-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-tool.d.ts","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/todo-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AActE,QAAA,MAAM,eAAe;;;;;EAInB,CAAC;AAiBH,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,OAAO,eAAe,CAkBhE,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Type } from "typebox";
2
+ import { getAgentState } from "../../state.js";
3
+ const todoStatusSchema = Type.Union([
4
+ Type.Literal("pending"),
5
+ Type.Literal("in_progress"),
6
+ Type.Literal("completed"),
7
+ ]);
8
+ const todoItemSchema = Type.Object({
9
+ content: Type.String({ description: "The task description." }),
10
+ status: todoStatusSchema,
11
+ });
12
+ const todoWriteParams = Type.Object({
13
+ todos: Type.Array(todoItemSchema, {
14
+ description: "The full current todo list. Always provide the complete list, not just changed items.",
15
+ }),
16
+ });
17
+ function summarizeTodos(todos) {
18
+ if (todos.length === 0)
19
+ return "Todo list cleared.";
20
+ const counts = todos.reduce((acc, todo) => {
21
+ acc[todo.status] = (acc[todo.status] ?? 0) + 1;
22
+ return acc;
23
+ }, {});
24
+ const parts = ["pending", "in_progress", "completed"]
25
+ .filter((status) => counts[status])
26
+ .map((status) => `${status}: ${counts[status]}`)
27
+ .join(", ");
28
+ return `Todo list updated (${todos.length} item${todos.length === 1 ? "" : "s"}${parts ? `; ${parts}` : ""}).`;
29
+ }
30
+ export const todoWriteTool = {
31
+ name: "TodoWrite",
32
+ label: "TodoWrite",
33
+ description: "Create or update the current task todo list. Use this for multi-step coding work so progress is visible and recoverable.",
34
+ promptSnippet: "TodoWrite — create or update the current task todo list for multi-step work.",
35
+ promptGuidelines: [
36
+ "Use TodoWrite for non-trivial multi-step tasks; keep exactly one item in_progress when actively working.",
37
+ "Update todos as work progresses and mark items completed promptly.",
38
+ ],
39
+ parameters: todoWriteParams,
40
+ execute: (_toolCallId, params) => {
41
+ const todos = params.todos.map((todo) => ({
42
+ content: todo.content,
43
+ status: todo.status,
44
+ }));
45
+ getAgentState().activityTracker.recordTodos(todos);
46
+ return Promise.resolve({ content: [{ type: "text", text: summarizeTodos(todos) }], details: undefined });
47
+ },
48
+ };
49
+ //# sourceMappingURL=todo-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-tool.js","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/todo-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;CAC1B,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;IAC9D,MAAM,EAAE,gBAAgB;CACzB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAChC,WAAW,EAAE,uFAAuF;KACrG,CAAC;CACH,CAAC,CAAC;AAIH,SAAS,cAAc,CAAC,KAA+B;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QAChE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC;SAClD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,sBAAsB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AACjH,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA2C;IACnE,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE,0HAA0H;IACvI,aAAa,EAAE,8EAA8E;IAC7F,gBAAgB,EAAE;QAChB,0GAA0G;QAC1G,oEAAoE;KACrE;IACD,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,EAAqC,EAAE;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC,CAAC;QACJ,aAAa,EAAE,CAAC,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3G,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,WAAW,CAAC;CACnB,GAAG,cAAc,EAAE,CAcnB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,WAAW,CAAC;CACnB,GAAG,cAAc,EAAE,CAenB"}
@@ -1,7 +1,8 @@
1
1
  import { createPiTools } from "../pi/tools.js";
2
+ import { todoWriteTool } from "./todo-tool.js";
2
3
  const PI_BUILTIN_TOOL_NAMES = new Set(["read", "bash", "edit", "write", "grep", "find", "ls"]);
3
4
  export function createPiCodingCustomTools(options) {
4
- return createPiTools(options).map((tool) => {
5
+ const tools = createPiTools(options).map((tool) => {
5
6
  const name = PI_BUILTIN_TOOL_NAMES.has(tool.name) ? `visionclaw_${tool.name}` : tool.name;
6
7
  return {
7
8
  name,
@@ -14,5 +15,6 @@ export function createPiCodingCustomTools(options) {
14
15
  execute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),
15
16
  };
16
17
  });
18
+ return [...tools, todoWriteTool];
17
19
  }
18
20
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAE/F,MAAM,UAAU,yBAAyB,CAAC,OAKzC;IACC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1F,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,WAAW;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SACnF,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../src/agent/engines/pi-coding/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAE/F,MAAM,UAAU,yBAAyB,CAAC,OAKzC;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1F,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,WAAW;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;SACnF,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,KAAK,EAAE,aAAa,CAAC,CAAC;AACnC,CAAC"}