fix(FN-4606): honor configured worktreesDir in runtime and cleanup paths

Ref: Runfusion/Fusion#321
Fusion-Task-Id: FN-4606
Fusion-Task-Lineage: 94b23f37-944e-4bcd-bfa1-67d0a8c0a267
This commit is contained in:
Fusion
2026-05-15 08:18:49 -07:00
committed by gsxdsm
parent 2799c101ac
commit 8032f6c3cc
4 changed files with 10 additions and 8 deletions

View File

@@ -391,7 +391,7 @@ export function registerTaskWorkflowRoutes(ctx: ApiRoutesContext, deps: TaskWork
const settings = await scopedStore.getSettings();
const rootDir = scopedStore.getRootDir();
allocateWorktree = (reservedNames) =>
planTaskWorktreePath(existing, rootDir, settings.worktreeNaming, reservedNames);
planTaskWorktreePath(existing, rootDir, settings.worktreeNaming, reservedNames, settings);
}
}

View File

@@ -2766,7 +2766,7 @@ export class TaskExecutor {
}
if (livenessFailure) {
const expected = `<repo>/.worktrees/* (usable, registered)`;
const expected = `${resolveWorktreesDir(this.rootDir, settings)}/* (usable, registered)`;
const observed = `${worktreePath} (${observedWorktreeRealpath})`;
const failureMessage = `worktree liveness assertion failed: ${livenessFailure} — observed=${observed}, expected=${expected}`;
executorLog.error(`${task.id}: ${failureMessage}`);
@@ -4930,7 +4930,7 @@ export class TaskExecutor {
ok: false,
reason: "wrong_toplevel",
observed: "missing task.worktree",
expected: "registered task worktree under <repo>/.worktrees/*",
expected: `registered task worktree under ${resolveWorktreesDir(this.rootDir, settings)}/*`,
};
}
@@ -4943,7 +4943,7 @@ export class TaskExecutor {
ok: false,
reason: "wrong_toplevel",
observed: `unresolvable task.worktree (${worktreePath}): ${error instanceof Error ? error.message : String(error)}`,
expected: "resolvable task worktree under <repo>/.worktrees/*",
expected: `resolvable task worktree under ${resolveWorktreesDir(this.rootDir, settings)}/*`,
};
}

View File

@@ -212,8 +212,9 @@ export class InProcessRuntime
// ensures scanIdleWorktrees / rehydrate never sees broken entries, and
// prevents assertValidWorktreeSession from permanently blocking retries.
const { reapOrphanWorktrees, scanIdleWorktrees } = await import("../worktree-pool.js");
const settings = await this.taskStore.getSettings();
try {
const reaped = await reapOrphanWorktrees(this.config.workingDirectory);
const reaped = await reapOrphanWorktrees(this.config.workingDirectory, settings);
if (reaped > 0) {
runtimeLog.log(`Reaped ${reaped} half-initialized orphan worktree(s) on startup`);
}
@@ -236,7 +237,8 @@ export class InProcessRuntime
// Rehydrate pool from disk state (idle worktrees)
const idleWorktrees = await scanIdleWorktrees(
this.config.workingDirectory,
this.taskStore
this.taskStore,
settings,
);
if (idleWorktrees.length > 0) {
this.worktreePool.rehydrate(idleWorktrees);

View File

@@ -4364,7 +4364,7 @@ export class SelfHealingManager {
return await this.reapUnregisteredOrphans();
}
const orphaned = await scanIdleWorktrees(this.options.rootDir, this.store);
const orphaned = await scanIdleWorktrees(this.options.rootDir, this.store, settings);
if (orphaned.length === 0) return 0;
let cleaned = 0;
@@ -4666,7 +4666,7 @@ export class SelfHealingManager {
if (dirs.length <= cap) return;
// Find idle worktrees that can be safely removed
const idle = await scanIdleWorktrees(this.options.rootDir, this.store);
const idle = await scanIdleWorktrees(this.options.rootDir, this.store, settings);
if (idle.length === 0) return;
// Sort by mtime ascending (oldest first)