fix(coding-agent): handle missing session cwd
This commit is contained in:
59
packages/coding-agent/src/core/session-cwd.ts
Normal file
59
packages/coding-agent/src/core/session-cwd.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import { existsSync } from "node:fs";
|
||||
|
||||
export interface SessionCwdIssue {
|
||||
sessionFile?: string;
|
||||
sessionCwd: string;
|
||||
fallbackCwd: string;
|
||||
}
|
||||
|
||||
interface SessionCwdSource {
|
||||
getCwd(): string;
|
||||
getSessionFile(): string | undefined;
|
||||
}
|
||||
|
||||
export function getMissingSessionCwdIssue(
|
||||
sessionManager: SessionCwdSource,
|
||||
fallbackCwd: string,
|
||||
): SessionCwdIssue | undefined {
|
||||
const sessionFile = sessionManager.getSessionFile();
|
||||
if (!sessionFile) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const sessionCwd = sessionManager.getCwd();
|
||||
if (!sessionCwd || existsSync(sessionCwd)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
sessionFile,
|
||||
sessionCwd,
|
||||
fallbackCwd,
|
||||
};
|
||||
}
|
||||
|
||||
export function formatMissingSessionCwdError(issue: SessionCwdIssue): string {
|
||||
const sessionFile = issue.sessionFile ? `\nSession file: ${issue.sessionFile}` : "";
|
||||
return `Stored session working directory does not exist: ${issue.sessionCwd}${sessionFile}\nCurrent working directory: ${issue.fallbackCwd}`;
|
||||
}
|
||||
|
||||
export function formatMissingSessionCwdPrompt(issue: SessionCwdIssue): string {
|
||||
return `cwd from session file does not exist\n${issue.sessionCwd}\n\ncontinue in current cwd\n${issue.fallbackCwd}`;
|
||||
}
|
||||
|
||||
export class MissingSessionCwdError extends Error {
|
||||
readonly issue: SessionCwdIssue;
|
||||
|
||||
constructor(issue: SessionCwdIssue) {
|
||||
super(formatMissingSessionCwdError(issue));
|
||||
this.name = "MissingSessionCwdError";
|
||||
this.issue = issue;
|
||||
}
|
||||
}
|
||||
|
||||
export function assertSessionCwdExists(sessionManager: SessionCwdSource, fallbackCwd: string): void {
|
||||
const issue = getMissingSessionCwdIssue(sessionManager, fallbackCwd);
|
||||
if (issue) {
|
||||
throw new MissingSessionCwdError(issue);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user