diff --git a/backend/src/workspace-maintenance.ts b/backend/src/workspace-maintenance.ts index dbb06eb5..248a96f9 100644 --- a/backend/src/workspace-maintenance.ts +++ b/backend/src/workspace-maintenance.ts @@ -20,11 +20,15 @@ export interface WorkspaceMaintenanceIo { type Command = "inspect" | "preprocess-dwh" | "schema-suggest-fks" | "schema-check" | "index-schema" | "preprocess-evidence" | "preprocess-run"; -function failureResult(operation: string, workspaceId = ""): WorkspaceOperationResult { +function failureResult( + operation: string, + workspaceId = "", + code: WorkspaceOperationResult["code"] = "workspace_not_activatable", +): WorkspaceOperationResult { return { schemaVersion: 1, status: "failed", - code: "workspace_not_activatable", + code, workspaceId, workspaceRevision: "", descriptorBlob: "", @@ -33,6 +37,11 @@ function failureResult(operation: string, workspaceId = ""): WorkspaceOperationR }; } +const STATE_ERROR_CODES: Record = { + preprocessing_resume_mismatch: "preprocessing_resume_mismatch", + preprocessing_conflict: "preprocessing_conflict", +}; + function boundedJson(result: WorkspaceOperationResult): string { const encoded = JSON.stringify(result); if (Buffer.byteLength(encoded, "utf8") > 1024 * 1024) { @@ -131,9 +140,15 @@ export async function runWorkspaceMaintenanceCli( io.writeStdout(boundedJson(result)); return exitCodeFor(result); } catch (error) { + const failureCode = error instanceof Error + && "code" in error + && typeof (error as { code?: unknown }).code === "string" + && (error as { code: string }).code in STATE_ERROR_CODES + ? STATE_ERROR_CODES[(error as { code: string }).code] + : "workspace_not_activatable"; const result = failureResult(command, (() => { try { return JSON.parse(io.stdin).workspaceId ?? ""; } catch { return ""; } - })()); + })(), failureCode); if (process.env.P2_CHILD_DEBUG === "1") { const detail = String((error as Error).message ?? "").replace(/[\r\n]+/g, " ").slice(0, 2048); result.warnings = detail.length > 0 ? [detail] : undefined;