fix(gsd): resync managed resources on auto resume
This commit is contained in:
parent
0be7c44605
commit
9ed543f1c8
2 changed files with 20 additions and 5 deletions
|
|
@ -118,6 +118,7 @@ import {
|
||||||
formatTokenCount,
|
formatTokenCount,
|
||||||
} from "./metrics.js";
|
} from "./metrics.js";
|
||||||
import { setLogBasePath, logWarning, logError } from "./workflow-logger.js";
|
import { setLogBasePath, logWarning, logError } from "./workflow-logger.js";
|
||||||
|
import { homedir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
|
import { readFileSync, existsSync, mkdirSync, writeFileSync, unlinkSync } from "node:fs";
|
||||||
import { atomicWriteSync } from "./atomic-write.js";
|
import { atomicWriteSync } from "./atomic-write.js";
|
||||||
|
|
@ -1248,6 +1249,11 @@ export async function startAuto(
|
||||||
"info",
|
"info",
|
||||||
);
|
);
|
||||||
restoreHookState(s.basePath);
|
restoreHookState(s.basePath);
|
||||||
|
// Re-sync managed resources on resume so long-lived auto sessions pick up
|
||||||
|
// bundled extension updates before resume-time verification/state logic runs.
|
||||||
|
const agentDir = process.env.GSD_CODING_AGENT_DIR || join(process.env.GSD_HOME || homedir(), ".gsd", "agent");
|
||||||
|
const { initResources } = await import("../../../" + "resource-loader.js");
|
||||||
|
initResources(agentDir);
|
||||||
// Open the project DB before rebuild/derive so resume uses DB-backed
|
// Open the project DB before rebuild/derive so resume uses DB-backed
|
||||||
// state instead of falling back to stale markdown parsing (#2940).
|
// state instead of falling back to stale markdown parsing (#2940).
|
||||||
await openProjectDbIfPresent(s.basePath);
|
await openProjectDbIfPresent(s.basePath);
|
||||||
|
|
@ -1569,4 +1575,3 @@ export {
|
||||||
buildLoopRemediationSteps,
|
buildLoopRemediationSteps,
|
||||||
} from "./auto-recovery.js";
|
} from "./auto-recovery.js";
|
||||||
export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
export { resolveExpectedArtifactPath } from "./auto-artifact-paths.js";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,22 +18,33 @@ const { assertTrue, report } = createTestContext();
|
||||||
|
|
||||||
const autoSrc = readFileSync(join(import.meta.dirname, "..", "auto.ts"), "utf-8");
|
const autoSrc = readFileSync(join(import.meta.dirname, "..", "auto.ts"), "utf-8");
|
||||||
|
|
||||||
console.log("\n=== #2940: resume path opens DB before rebuildState/deriveState ===");
|
console.log("\n=== resume path refreshes resources and opens DB before rebuildState/deriveState ===");
|
||||||
|
|
||||||
// The resume block is the `if (s.paused) { ... }` section that calls rebuildState/deriveState.
|
// The resume block is the `if (s.paused) { ... }` section that calls rebuildState/deriveState.
|
||||||
// Locate the resume section by finding `s.paused = false;` followed by `rebuildState`.
|
// Locate the resume section by finding `s.paused = false;` followed by `rebuildState`.
|
||||||
const resumeSectionStart = autoSrc.indexOf("if (s.paused) {", autoSrc.indexOf("// If resuming from paused state"));
|
const resumeSectionStart = autoSrc.indexOf("if (s.paused) {", autoSrc.indexOf("// If resuming from paused state"));
|
||||||
assertTrue(resumeSectionStart > 0, "auto.ts has the paused-session resume block");
|
assertTrue(resumeSectionStart > 0, "auto.ts has the paused-session resume block");
|
||||||
|
|
||||||
const resumeSection = autoSrc.slice(resumeSectionStart, resumeSectionStart + 3000);
|
const resumeSectionEnd = autoSrc.indexOf("await autoLoop(", resumeSectionStart);
|
||||||
|
assertTrue(resumeSectionEnd > resumeSectionStart, "resume block reaches autoLoop");
|
||||||
|
|
||||||
// The resume path must open the DB before rebuildState/deriveState
|
const resumeSection = autoSrc.slice(resumeSectionStart, resumeSectionEnd);
|
||||||
|
|
||||||
|
// The resume path must refresh managed resources and open the DB before
|
||||||
|
// rebuildState/deriveState so resumed auto-mode uses current extension code.
|
||||||
const rebuildIdx = resumeSection.indexOf("rebuildState(");
|
const rebuildIdx = resumeSection.indexOf("rebuildState(");
|
||||||
assertTrue(rebuildIdx > 0, "resume block calls rebuildState");
|
assertTrue(rebuildIdx > 0, "resume block calls rebuildState");
|
||||||
|
|
||||||
const deriveIdx = resumeSection.indexOf("deriveState(");
|
const deriveIdx = resumeSection.indexOf("deriveState(");
|
||||||
assertTrue(deriveIdx > 0, "resume block calls deriveState");
|
assertTrue(deriveIdx > 0, "resume block calls deriveState");
|
||||||
|
|
||||||
|
const preDeriveSection = resumeSection.slice(0, rebuildIdx);
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
preDeriveSection.includes("initResources("),
|
||||||
|
"resume path must refresh managed resources before rebuildState/deriveState (#3761)",
|
||||||
|
);
|
||||||
|
|
||||||
// There must be a DB open call before the first rebuildState call
|
// There must be a DB open call before the first rebuildState call
|
||||||
const dbOpenPatterns = [
|
const dbOpenPatterns = [
|
||||||
"openProjectDbIfPresent(",
|
"openProjectDbIfPresent(",
|
||||||
|
|
@ -41,7 +52,6 @@ const dbOpenPatterns = [
|
||||||
"ensureDbOpen(",
|
"ensureDbOpen(",
|
||||||
];
|
];
|
||||||
|
|
||||||
const preDeriveSection = resumeSection.slice(0, rebuildIdx);
|
|
||||||
const hasDbOpen = dbOpenPatterns.some(pat => preDeriveSection.includes(pat));
|
const hasDbOpen = dbOpenPatterns.some(pat => preDeriveSection.includes(pat));
|
||||||
assertTrue(
|
assertTrue(
|
||||||
hasDbOpen,
|
hasDbOpen,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue