@prompts-gpt/client 0.2.2 → 0.2.4

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/sweep.js ADDED
@@ -0,0 +1,606 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { mkdir, readFile, writeFile, readdir, unlink, stat, rm } from "node:fs/promises";
4
+ import { spawnSync } from "node:child_process";
5
+ import { loadRunConfig, detectProviders, normalizeOrchestrationAgent, resolveRunProvider, resolveTimeoutSeconds, resolveDefaultPromptFile, assertPromptFitsLaunch, executeProviderCommandWithRetries, captureWorktreeStatus, buildWorktreeDelta, appendFileSafe, aggregateTokenUsage, DEFAULT_MODELS, extractTokenUsageFromLog, } from "./runtime.js";
6
+ import { getAttribution } from "./index.js";
7
+ const LOCK_FILE_NAME = ".sweep.lock";
8
+ const LOCK_STALE_MS = 6 * 60 * 60 * 1000; // 6 hours
9
+ const DEFAULT_ITERATIONS = 1;
10
+ const DEFAULT_MAX_RETRIES = 2;
11
+ const DEFAULT_ITERATION_TIMEOUT = 5400;
12
+ const DEFAULT_SUMMARY_LINES = 40;
13
+ const DEFAULT_MAX_RUN_DIRS = 20;
14
+ const GIT_SAFETY_RULE = "\nNEVER run `git stash`, `git reset`, `git checkout`, `git commit`, `git push`, or any destructive git command.\n";
15
+ // ── Lock management ──────────────────────────────────────────────────────────
16
+ export async function acquireSweepLock(cwd) {
17
+ const lockPath = path.resolve(cwd, LOCK_FILE_NAME);
18
+ if (existsSync(lockPath)) {
19
+ try {
20
+ const content = JSON.parse(await readFile(lockPath, "utf8"));
21
+ const lockAge = Date.now() - new Date(content.startedAt ?? 0).getTime();
22
+ const pidAlive = typeof content.pid === "number" && content.pid > 0
23
+ ? isProcessAlive(content.pid)
24
+ : false;
25
+ if (pidAlive && lockAge < LOCK_STALE_MS) {
26
+ throw new Error(`Another sweep is running (PID ${content.pid}, started ${content.startedAt}).\n` +
27
+ `If the process is dead, remove the lock manually:\n` +
28
+ ` rm ${lockPath}`);
29
+ }
30
+ if (lockAge >= LOCK_STALE_MS) {
31
+ // Stale lock — process likely crashed without cleanup
32
+ }
33
+ try {
34
+ await unlink(lockPath);
35
+ }
36
+ catch { }
37
+ }
38
+ catch (error) {
39
+ if (error.message.includes("Another sweep"))
40
+ throw error;
41
+ }
42
+ }
43
+ const payload = {
44
+ pid: process.pid,
45
+ startedAt: new Date().toISOString(),
46
+ cwd,
47
+ };
48
+ const lockWriteController = new AbortController();
49
+ const lockTimeout = setTimeout(() => lockWriteController.abort(), 10_000);
50
+ lockTimeout.unref?.();
51
+ try {
52
+ await writeFile(lockPath, JSON.stringify(payload, null, 2), { mode: 0o644, signal: lockWriteController.signal });
53
+ if (!existsSync(lockPath)) {
54
+ throw new Error(`Failed to create sweep lock file: ${lockPath}. Filesystem may be full.`);
55
+ }
56
+ }
57
+ finally {
58
+ clearTimeout(lockTimeout);
59
+ }
60
+ return lockPath;
61
+ }
62
+ export async function releaseSweepLock(cwd) {
63
+ const lockPath = path.resolve(cwd, LOCK_FILE_NAME);
64
+ try {
65
+ await unlink(lockPath);
66
+ }
67
+ catch {
68
+ // Lock already removed
69
+ }
70
+ }
71
+ function isProcessAlive(pid) {
72
+ if (!Number.isInteger(pid) || pid <= 0)
73
+ return false;
74
+ try {
75
+ process.kill(pid, 0);
76
+ return true;
77
+ }
78
+ catch (err) {
79
+ return err.code === "EPERM";
80
+ }
81
+ }
82
+ // ── Stream-JSON parsing ──────────────────────────────────────────────────────
83
+ export function parseStreamJsonToolCounts(logContent) {
84
+ const counts = { reads: 0, writes: 0, shells: 0, searches: 0, webSearches: 0, total: 0 };
85
+ if (!logContent || !logContent.includes('"tool_use"'))
86
+ return counts;
87
+ for (const line of logContent.split("\n")) {
88
+ const trimmed = line.trim();
89
+ if (!trimmed.startsWith("{") || !trimmed.includes("tool_use"))
90
+ continue;
91
+ let parsed = null;
92
+ try {
93
+ parsed = JSON.parse(trimmed);
94
+ }
95
+ catch {
96
+ continue;
97
+ }
98
+ if (!parsed || parsed.type !== "tool_use")
99
+ continue;
100
+ const tool = (parsed.tool ?? parsed.toolName ?? "").toLowerCase();
101
+ if (tool.includes("read") || tool === "file_read")
102
+ counts.reads++;
103
+ else if (tool.includes("write") || tool.includes("edit") || tool === "file_write" || tool === "str_replace")
104
+ counts.writes++;
105
+ else if (tool.includes("shell") || tool === "bash" || tool === "command")
106
+ counts.shells++;
107
+ else if (tool.includes("grep") || tool.includes("glob") || tool.includes("search") || tool === "file_search") {
108
+ if (tool.includes("web"))
109
+ counts.webSearches++;
110
+ else
111
+ counts.searches++;
112
+ }
113
+ else if (tool.includes("web"))
114
+ counts.webSearches++;
115
+ counts.total++;
116
+ }
117
+ return counts;
118
+ }
119
+ export function streamJsonHasResult(logContent) {
120
+ for (const line of logContent.split("\n")) {
121
+ const trimmed = line.trim();
122
+ if (!trimmed.startsWith("{"))
123
+ continue;
124
+ try {
125
+ const parsed = JSON.parse(trimmed);
126
+ if (parsed.type === "result")
127
+ return true;
128
+ }
129
+ catch {
130
+ continue;
131
+ }
132
+ }
133
+ return false;
134
+ }
135
+ // ── Summary extraction ───────────────────────────────────────────────────────
136
+ export function extractIterationSummary(logContent, maxLines) {
137
+ const lines = [];
138
+ for (const rawLine of logContent.split("\n")) {
139
+ const trimmed = rawLine.trim();
140
+ if (!trimmed.startsWith("{"))
141
+ continue;
142
+ try {
143
+ const parsed = JSON.parse(trimmed);
144
+ if (parsed.type === "assistant" || parsed.type === "text") {
145
+ const text = parsed.content ?? parsed.message ?? "";
146
+ if (text.trim()) {
147
+ lines.push(...text.split("\n"));
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ continue;
153
+ }
154
+ if (lines.length >= maxLines * 2)
155
+ break;
156
+ }
157
+ return lines.slice(0, maxLines);
158
+ }
159
+ // ── Prompt building ──────────────────────────────────────────────────────────
160
+ export function buildIterationPrompt(basePrompt, iteration, totalIterations, previousSummary, config) {
161
+ const parts = [];
162
+ if (totalIterations > 1) {
163
+ parts.push(`[Iteration ${iteration}/${totalIterations}]`);
164
+ }
165
+ if (config.phase) {
166
+ parts.push(`[Phase: ${config.phase}]`);
167
+ }
168
+ if (parts.length > 0)
169
+ parts.push("");
170
+ parts.push(basePrompt);
171
+ if (config.disallowDestructiveGit) {
172
+ parts.push(GIT_SAFETY_RULE);
173
+ }
174
+ if (previousSummary && previousSummary.length > 0) {
175
+ parts.push("");
176
+ parts.push("## Previous iteration summary");
177
+ parts.push("");
178
+ parts.push("The previous iteration completed the following work. Continue from where it left off — do NOT repeat already-completed items:");
179
+ parts.push("");
180
+ parts.push(previousSummary.join("\n"));
181
+ }
182
+ return parts.join("\n");
183
+ }
184
+ export async function runPreFlight(input) {
185
+ const errors = [];
186
+ const warnings = [];
187
+ if (!input.providerHealth.available) {
188
+ errors.push(`Provider ${input.provider} is not available. Install CLI or set PATH.`);
189
+ }
190
+ let promptSizeBytes = 0;
191
+ if (existsSync(input.promptFile)) {
192
+ const promptStat = await stat(input.promptFile);
193
+ promptSizeBytes = promptStat.size;
194
+ if (promptSizeBytes === 0) {
195
+ errors.push(`Prompt file is empty: ${input.promptFile}`);
196
+ }
197
+ }
198
+ else {
199
+ errors.push(`Prompt file not found: ${input.promptFile}`);
200
+ }
201
+ const gitBranchResult = spawnSync("git", ["-C", input.cwd, "branch", "--show-current"], { encoding: "utf8", timeout: 10_000 });
202
+ const gitBranch = gitBranchResult.stdout?.trim() ?? "unknown";
203
+ const gitStatusResult = spawnSync("git", ["-C", input.cwd, "status", "--porcelain=v1", "-uall"], { encoding: "utf8", timeout: 30_000 });
204
+ const gitDirtyFiles = (gitStatusResult.stdout?.trim().split("\n").filter(Boolean) ?? []).length;
205
+ let diskFreeMb = 0;
206
+ try {
207
+ if (process.platform === "win32") {
208
+ const wmicResult = spawnSync("wmic", ["logicaldisk", "where", `DeviceID='${input.cwd.charAt(0)}:'`, "get", "FreeSpace", "/value"], { encoding: "utf8", timeout: 10_000 });
209
+ const match = wmicResult.stdout?.match(/FreeSpace=(\d+)/);
210
+ diskFreeMb = match ? Math.floor(parseInt(match[1], 10) / (1024 * 1024)) : 0;
211
+ }
212
+ else {
213
+ const dfResult = spawnSync("df", ["-m", input.cwd], { encoding: "utf8", timeout: 10_000 });
214
+ const dfLine = dfResult.stdout?.split("\n")[1] ?? "";
215
+ const dfParts = dfLine.trim().split(/\s+/);
216
+ diskFreeMb = parseInt(dfParts[3] ?? "0", 10) || 0;
217
+ }
218
+ if (diskFreeMb > 0 && diskFreeMb < 500) {
219
+ warnings.push(`Low disk space: ${diskFreeMb}MB free`);
220
+ }
221
+ }
222
+ catch {
223
+ warnings.push("Could not determine disk space");
224
+ }
225
+ if (input.iterations < 1 || input.iterations > 50) {
226
+ errors.push(`Iterations must be between 1 and 50, got ${input.iterations}`);
227
+ }
228
+ return {
229
+ cwd: input.cwd,
230
+ provider: input.provider,
231
+ providerBin: input.providerHealth.bin,
232
+ providerAvailable: input.providerHealth.available,
233
+ model: input.model,
234
+ nodeVersion: process.version,
235
+ gitBranch,
236
+ gitDirtyFiles,
237
+ diskFreeMb,
238
+ promptFile: input.promptFile,
239
+ promptSizeBytes,
240
+ iterations: input.iterations,
241
+ iterationTimeoutSeconds: input.iterationTimeoutSeconds,
242
+ maxRetries: input.maxRetries,
243
+ disallowDestructiveGit: input.config.safety.disallowDestructiveGit,
244
+ errors,
245
+ warnings,
246
+ };
247
+ }
248
+ // ── Run directory rotation ───────────────────────────────────────────────────
249
+ async function rotateRunDirs(artifactsDir, maxDirs) {
250
+ if (!existsSync(artifactsDir))
251
+ return;
252
+ if (maxDirs < 1)
253
+ return;
254
+ try {
255
+ const resolvedArtifactsDir = path.resolve(artifactsDir);
256
+ const entries = await readdir(resolvedArtifactsDir, { withFileTypes: true });
257
+ const dirs = entries
258
+ .filter((e) => e.isDirectory())
259
+ .map((e) => {
260
+ const fullPath = path.join(resolvedArtifactsDir, e.name);
261
+ return { name: e.name, path: fullPath };
262
+ })
263
+ .filter((d) => {
264
+ const normalized = path.resolve(d.path);
265
+ return normalized.startsWith(resolvedArtifactsDir + path.sep) && normalized !== resolvedArtifactsDir;
266
+ });
267
+ if (dirs.length <= maxDirs)
268
+ return;
269
+ const withStats = await Promise.all(dirs.map(async (d) => {
270
+ const s = await stat(d.path).catch(() => null);
271
+ return { ...d, mtime: s?.mtimeMs ?? 0 };
272
+ }));
273
+ withStats.sort((a, b) => a.mtime - b.mtime || a.name.localeCompare(b.name));
274
+ const toRemove = withStats.slice(0, withStats.length - maxDirs);
275
+ for (const dir of toRemove) {
276
+ await rm(dir.path, { recursive: true, force: true }).catch(() => undefined);
277
+ }
278
+ }
279
+ catch {
280
+ // Best-effort rotation
281
+ }
282
+ }
283
+ // ── Manifest writer ──────────────────────────────────────────────────────────
284
+ export async function writeSweepManifest(runDir, result, config) {
285
+ const attribution = getAttribution();
286
+ const manifest = {
287
+ version: 2,
288
+ runId: result.runId,
289
+ model: result.model,
290
+ provider: result.provider,
291
+ cwd: path.basename(result.cwd),
292
+ runDir: path.relative(result.cwd, result.runDir) || ".",
293
+ started: result.startedAt,
294
+ finished: result.finishedAt,
295
+ totalIterations: result.totalIterations,
296
+ succeeded: result.succeeded,
297
+ failed: result.failed,
298
+ elapsedMs: result.totalDurationMs,
299
+ promptFile: result.promptFile,
300
+ safety: { disallowDestructiveGit: config.safety.disallowDestructiveGit },
301
+ attribution: {
302
+ generatedBy: `@prompts-gpt/client@${attribution.version}`,
303
+ accountId: attribution.accountId,
304
+ buildFingerprint: `${attribution.version}/${attribution.buildTs}/${attribution.accountId}`,
305
+ },
306
+ iterations: result.iterations.map((iter) => ({
307
+ iteration: iter.iteration,
308
+ status: iter.status,
309
+ exitCode: iter.exitCode,
310
+ durationMs: iter.durationMs,
311
+ attempts: iter.attempts,
312
+ toolCounts: iter.toolCounts,
313
+ tokenUsage: iter.tokenUsage,
314
+ summaryLines: iter.summary.length,
315
+ })),
316
+ tokenUsage: result.tokenUsage,
317
+ };
318
+ const manifestPath = path.join(runDir, "sweep-manifest.json");
319
+ await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
320
+ return manifestPath;
321
+ }
322
+ // ── Main sweep engine ────────────────────────────────────────────────────────
323
+ export async function sweepPrompt(input) {
324
+ const cwd = path.resolve(input.cwd ?? process.cwd());
325
+ const config = await loadRunConfig(cwd);
326
+ const providers = await detectProviders(cwd);
327
+ const agent = normalizeOrchestrationAgent(input.agent ?? config.defaultAgent);
328
+ const provider = resolveRunProvider(agent, providers, config.providerOrder);
329
+ const providerHealth = providers.find((p) => p.provider === provider);
330
+ if (!providerHealth || !providerHealth.available) {
331
+ throw new Error(`Provider ${provider} is not available. ` +
332
+ `Run \`prompts-gpt doctor\` to check provider installation, ` +
333
+ `or use \`--agent <provider>\` to select a different provider.`);
334
+ }
335
+ const model = input.model?.trim() || config.modelOverrides[provider]?.trim() || DEFAULT_MODELS[provider] || "auto";
336
+ const promptFile = input.promptFile
337
+ ? path.resolve(cwd, input.promptFile)
338
+ : await resolveDefaultPromptFile(cwd, config);
339
+ const rawIterations = input.iterations ?? DEFAULT_ITERATIONS;
340
+ const iterations = Math.max(1, Math.min(Math.trunc(rawIterations), 50));
341
+ const iterationTimeoutSeconds = resolveTimeoutSeconds(input.iterationTimeoutSeconds, DEFAULT_ITERATION_TIMEOUT);
342
+ const maxRetries = Math.max(0, Math.min(Math.trunc(input.maxRetries ?? DEFAULT_MAX_RETRIES), 10));
343
+ const maxRunDirs = Math.max(1, Math.min(Math.trunc(input.maxRunDirs ?? DEFAULT_MAX_RUN_DIRS), 200));
344
+ const summaryLines = input.summaryLines ?? DEFAULT_SUMMARY_LINES;
345
+ const notify = input.onProgress ?? (() => undefined);
346
+ // Pre-flight
347
+ const preflight = await runPreFlight({
348
+ cwd,
349
+ provider,
350
+ providerHealth,
351
+ model,
352
+ promptFile,
353
+ iterations,
354
+ iterationTimeoutSeconds,
355
+ maxRetries,
356
+ config,
357
+ });
358
+ notify({ type: "preflight", message: JSON.stringify(preflight) });
359
+ if (preflight.errors.length > 0) {
360
+ throw new Error(`Pre-flight failed:\n${preflight.errors.map((e) => ` - ${e}`).join("\n")}`);
361
+ }
362
+ // Dry-run mode — no lock needed
363
+ if (input.dryRun) {
364
+ const dryResult = {
365
+ runId: "dry-run",
366
+ provider,
367
+ model,
368
+ cwd,
369
+ runDir: "",
370
+ manifestFile: "",
371
+ iterations: [],
372
+ totalIterations: iterations,
373
+ succeeded: 0,
374
+ failed: 0,
375
+ startedAt: new Date().toISOString(),
376
+ finishedAt: new Date().toISOString(),
377
+ totalDurationMs: 0,
378
+ worktreeBeforeFile: "",
379
+ worktreeAfterFile: "",
380
+ worktreeDeltaFile: "",
381
+ promptFile,
382
+ dryRun: true,
383
+ tokenUsage: null,
384
+ };
385
+ notify({ type: "sweep_end", result: dryResult });
386
+ return dryResult;
387
+ }
388
+ // Acquire lock after pre-flight passes and dry-run is handled
389
+ await acquireSweepLock(cwd);
390
+ const runId = input.runId?.trim() || `sweep-${new Date().toISOString().replace(/[-:T]/g, "").slice(0, 14)}-${process.pid}`;
391
+ const artifactsDir = input.artifactsDir ? path.resolve(cwd, input.artifactsDir) : config.artifactsDir;
392
+ const runDir = path.resolve(artifactsDir, runId);
393
+ let basePrompt;
394
+ try {
395
+ await mkdir(runDir, { recursive: true });
396
+ basePrompt = await readFile(promptFile, "utf8");
397
+ }
398
+ catch (err) {
399
+ await rm(runDir, { recursive: true, force: true }).catch(() => undefined);
400
+ await releaseSweepLock(cwd);
401
+ throw err;
402
+ }
403
+ await rotateRunDirs(artifactsDir, maxRunDirs);
404
+ const worktreeBeforeFile = path.join(runDir, "worktree-before.txt");
405
+ const worktreeAfterFile = path.join(runDir, "worktree-after.txt");
406
+ const worktreeDeltaFile = path.join(runDir, "worktree-delta.diff");
407
+ const worktreeBefore = captureWorktreeStatus(cwd);
408
+ await writeFile(worktreeBeforeFile, worktreeBefore);
409
+ const startedAt = new Date();
410
+ const startedMs = Date.now();
411
+ const iterationResults = [];
412
+ let previousSummary = null;
413
+ await writeFile(path.join(runDir, "base-prompt.md"), basePrompt);
414
+ let cleanedUp = false;
415
+ let cancelled = false;
416
+ const onExit = () => {
417
+ if (cleanedUp)
418
+ return;
419
+ cleanedUp = true;
420
+ releaseSweepLock(cwd).catch(() => undefined);
421
+ };
422
+ const onSigterm = () => {
423
+ cancelled = true;
424
+ onExit();
425
+ removeSignalHandlers();
426
+ process.kill(process.pid, "SIGTERM");
427
+ };
428
+ const onSigint = () => {
429
+ cancelled = true;
430
+ onExit();
431
+ removeSignalHandlers();
432
+ process.kill(process.pid, "SIGINT");
433
+ };
434
+ const removeSignalHandlers = () => {
435
+ process.removeListener("exit", onExit);
436
+ process.removeListener("SIGTERM", onSigterm);
437
+ process.removeListener("SIGINT", onSigint);
438
+ };
439
+ process.on("exit", onExit);
440
+ process.on("SIGTERM", onSigterm);
441
+ process.on("SIGINT", onSigint);
442
+ try {
443
+ for (let i = 1; i <= iterations; i++) {
444
+ if (cancelled)
445
+ break;
446
+ notify({ type: "iteration_start", iteration: i, total: iterations, provider, model });
447
+ const iterPrompt = buildIterationPrompt(basePrompt, i, iterations, previousSummary, { disallowDestructiveGit: config.safety.disallowDestructiveGit, phase: input.phase });
448
+ const iterPromptFile = path.join(runDir, `iteration-${i}-prompt.md`);
449
+ await writeFile(iterPromptFile, iterPrompt);
450
+ assertPromptFitsLaunch(provider, iterPrompt, iterPromptFile);
451
+ const iterLogFile = path.join(runDir, `iteration-${i}.log`);
452
+ const iterSummaryFile = path.join(runDir, `iteration-${i}.summary.md`);
453
+ const iterStartMs = Date.now();
454
+ let exitCode = 1;
455
+ let attempts = 0;
456
+ let commandPreview = "";
457
+ let iterStatus = "failed";
458
+ const maxAttempts = maxRetries + 1;
459
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
460
+ attempts = attempt;
461
+ try {
462
+ const result = await executeProviderCommandWithRetries({
463
+ provider,
464
+ bin: providerHealth.bin,
465
+ model,
466
+ cwd,
467
+ promptText: iterPrompt,
468
+ promptFile: iterPromptFile,
469
+ summaryFile: iterSummaryFile,
470
+ logFile: iterLogFile,
471
+ timeoutSeconds: iterationTimeoutSeconds,
472
+ retryCount: 0,
473
+ approveMcps: input.approveMcps ?? true,
474
+ sandboxMode: input.sandboxMode ?? "workspace-write",
475
+ background: input.background,
476
+ permissionMode: input.permissionMode,
477
+ });
478
+ exitCode = result.exitCode;
479
+ commandPreview = result.commandPreview;
480
+ break;
481
+ }
482
+ catch (error) {
483
+ const errMsg = error instanceof Error ? error.message : String(error);
484
+ if (errMsg.includes("timed out") || errMsg.includes("PROVIDER_TIMEOUT")) {
485
+ iterStatus = "timeout";
486
+ }
487
+ if (attempt < maxAttempts) {
488
+ const backoffMs = Math.min(5_000 * (1 << Math.min(attempt - 1, 4)), 60_000);
489
+ notify({ type: "attempt_retry", iteration: i, attempt, maxAttempts, backoffMs });
490
+ await appendFileSafe(iterLogFile, `\n[retry] iteration ${i}, attempt ${attempt}/${maxAttempts}, backoff ${backoffMs}ms\n`);
491
+ await sleep(backoffMs);
492
+ continue;
493
+ }
494
+ exitCode = 1;
495
+ }
496
+ }
497
+ // Read log for analysis
498
+ let logContent = "";
499
+ try {
500
+ logContent = await readFile(iterLogFile, "utf8");
501
+ }
502
+ catch { /* no log */ }
503
+ // SIGTERM (143) with result in log = success
504
+ if (exitCode === 143 && streamJsonHasResult(logContent)) {
505
+ exitCode = 0;
506
+ }
507
+ // Classify status
508
+ if (exitCode === 0) {
509
+ iterStatus = "success";
510
+ }
511
+ else if (iterStatus !== "timeout") {
512
+ // Check stderr for auth errors (NOT the agent log which contains code discussions)
513
+ let stderrContent = "";
514
+ try {
515
+ const stderrFile = iterLogFile.replace(/\.log$/, ".stderr");
516
+ if (existsSync(stderrFile)) {
517
+ stderrContent = await readFile(stderrFile, "utf8");
518
+ }
519
+ }
520
+ catch { /* no stderr */ }
521
+ const authCheckContent = `${stderrContent}\n${logContent}`;
522
+ if (/unauthorized|authentication.*fail|not.*logged.*in/i.test(authCheckContent)) {
523
+ iterStatus = "auth_error";
524
+ }
525
+ else if (/cannot use this model/i.test(authCheckContent)) {
526
+ iterStatus = "model_error";
527
+ }
528
+ else {
529
+ iterStatus = "failed";
530
+ }
531
+ }
532
+ const toolCounts = parseStreamJsonToolCounts(logContent);
533
+ const tokenUsage = extractTokenUsageFromLog(logContent);
534
+ const summary = extractIterationSummary(logContent, summaryLines);
535
+ const iterDurationMs = Date.now() - iterStartMs;
536
+ // Write summary to file
537
+ if (summary.length > 0) {
538
+ await writeFile(iterSummaryFile, summary.join("\n"));
539
+ }
540
+ const iterResult = {
541
+ iteration: i,
542
+ status: iterStatus,
543
+ exitCode,
544
+ durationMs: iterDurationMs,
545
+ promptFile: iterPromptFile,
546
+ logFile: iterLogFile,
547
+ summaryFile: iterSummaryFile,
548
+ summary,
549
+ toolCounts,
550
+ tokenUsage,
551
+ attempts,
552
+ commandPreview,
553
+ };
554
+ iterationResults.push(iterResult);
555
+ notify({ type: "iteration_end", iteration: i, status: iterStatus, durationMs: iterDurationMs, provider, model });
556
+ if (summary.length > 0) {
557
+ notify({ type: "summary", iteration: i, lines: summary });
558
+ }
559
+ previousSummary = summary;
560
+ // Fatal errors stop the sweep
561
+ if (iterStatus === "auth_error" || iterStatus === "model_error") {
562
+ break;
563
+ }
564
+ }
565
+ }
566
+ finally {
567
+ removeSignalHandlers();
568
+ const worktreeAfter = captureWorktreeStatus(cwd);
569
+ await writeFile(worktreeAfterFile, worktreeAfter);
570
+ await writeFile(worktreeDeltaFile, buildWorktreeDelta(worktreeBefore, worktreeAfter));
571
+ await releaseSweepLock(cwd);
572
+ }
573
+ const totalDurationMs = Date.now() - startedMs;
574
+ const finishedAt = new Date();
575
+ const succeeded = iterationResults.filter((r) => r.status === "success").length;
576
+ const failed = iterationResults.filter((r) => r.status !== "success").length;
577
+ const result = {
578
+ runId,
579
+ provider,
580
+ model,
581
+ cwd,
582
+ runDir,
583
+ manifestFile: "",
584
+ iterations: iterationResults,
585
+ totalIterations: iterations,
586
+ succeeded,
587
+ failed,
588
+ startedAt: startedAt.toISOString(),
589
+ finishedAt: finishedAt.toISOString(),
590
+ totalDurationMs,
591
+ worktreeBeforeFile,
592
+ worktreeAfterFile,
593
+ worktreeDeltaFile,
594
+ promptFile,
595
+ dryRun: false,
596
+ tokenUsage: aggregateTokenUsage(iterationResults.map((iteration) => iteration.tokenUsage)),
597
+ };
598
+ const manifestFile = await writeSweepManifest(runDir, result, config).catch(() => "");
599
+ result.manifestFile = manifestFile;
600
+ notify({ type: "sweep_end", result });
601
+ return result;
602
+ }
603
+ function sleep(ms) {
604
+ return new Promise((resolve) => setTimeout(resolve, ms));
605
+ }
606
+ //# sourceMappingURL=sweep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../src/sweep.ts"],"names":[],"mappings":"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"}