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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)}/*`,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user