Fix workspace policy loading

This commit is contained in:
2026-08-13 23:24:45 +02:00
parent 10edca5a09
commit 25b2835e73
8 changed files with 92 additions and 17 deletions
+28 -7
View File
@@ -50,23 +50,44 @@ async function ensureWorkspaceSelectionPolicy(): Promise<WorkspacePreference> {
const workspaceId = preferences.workspaceId;
if (!workspaceId) return preferences;
workspacePolicyGate.beginSummary(workspaceId);
let workspace;
let workspaces: Awaited<ReturnType<typeof listWorkspaces>>;
try {
workspace = (await listWorkspaces()).find((candidate) => candidate.id === workspaceId);
workspaces = await listWorkspaces();
} catch {
if (workspacePreferences.load().workspaceId !== workspaceId) continue;
workspacePolicyGate.rejectSummary(workspaceId);
throw new WorkspaceSelectionError(WORKSPACE_SUMMARY_ERROR);
}
if (workspacePreferences.load().workspaceId !== workspaceId) continue;
if (workspace && !workspace.revision) {
const workspace = workspaces.find((candidate) => candidate.id === workspaceId);
if (!workspace) {
if (workspaces.length === 0) {
workspacePolicyGate.allowLegacy(workspaceId);
return workspacePreferences.load();
}
let installationDefault: string | undefined;
try {
installationDefault = (await getSettings()).workspace;
} catch {
if (workspacePreferences.load().workspaceId !== workspaceId) continue;
workspacePolicyGate.rejectSummary(workspaceId);
throw new WorkspaceSelectionError(WORKSPACE_SUMMARY_ERROR);
}
if (workspacePreferences.load().workspaceId !== workspaceId) continue;
const replacement = workspaces.find(
(candidate) => candidate.id === installationDefault && candidate.revision,
) ?? workspaces.find((candidate) => candidate.revision);
if (!replacement) {
workspacePolicyGate.reject(workspaceId);
throw new WorkspaceSelectionError(WORKSPACE_POLICY_ERROR);
}
workspacePreferences.save({ ...preferences, workspaceId: replacement.id });
continue;
}
if (!workspace.revision) {
workspacePolicyGate.reject(workspaceId);
throw new WorkspaceSelectionError(WORKSPACE_POLICY_ERROR);
}
if (!workspace?.revision) {
workspacePolicyGate.allowLegacy(workspaceId);
return workspacePreferences.load();
}
workspacePolicyGate.select(workspaceId);
const outcome = await Promise.race([
getWorkspace(workspaceId).then(