From 2e7c9f4de4955238bf4a561aa24f36303296338e Mon Sep 17 00:00:00 2001 From: lyon Date: Sun, 14 Jun 2026 13:48:35 +0800 Subject: [PATCH] fix: harden v03 workbench bootstrap fallback --- .../src/components/workbench/SessionRail.vue | 2 +- .../src/composables/useWorkspaceBootstrap.ts | 34 +++++++++++++++++-- .../src/views/workbench/CodeWorkbenchView.vue | 2 +- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/web/hwlab-cloud-web/src/components/workbench/SessionRail.vue b/web/hwlab-cloud-web/src/components/workbench/SessionRail.vue index 5177348d..5187d95e 100644 --- a/web/hwlab-cloud-web/src/components/workbench/SessionRail.vue +++ b/web/hwlab-cloud-web/src/components/workbench/SessionRail.vue @@ -60,7 +60,7 @@ function readWidth(): number {

Sessions

显式会话

- +
模型通道:{{ workbench.providerProfile }}
diff --git a/web/hwlab-cloud-web/src/composables/useWorkspaceBootstrap.ts b/web/hwlab-cloud-web/src/composables/useWorkspaceBootstrap.ts index 6e48d357..0eeacdc5 100644 --- a/web/hwlab-cloud-web/src/composables/useWorkspaceBootstrap.ts +++ b/web/hwlab-cloud-web/src/composables/useWorkspaceBootstrap.ts @@ -1,4 +1,4 @@ -import { authAPI, type WorkspaceBootstrapResponse } from "@/api"; +import { authAPI, workbenchAPI, type WorkspaceBootstrapResponse } from "@/api"; import type { ApiResult, WorkspaceRecord } from "@/types"; import { DEFAULT_WORKBENCH_PROJECT_ID, asRecord, normalizeWorkbenchProjectId } from "@/utils"; @@ -20,8 +20,36 @@ export async function consumeEarlyWorkspaceBootstrap(projectId: string): Promise export async function resolveWorkspaceBootstrap(projectId: string): Promise> { const normalizedProjectId = normalizeWorkbenchProjectId(projectId) ?? DEFAULT_WORKBENCH_PROJECT_ID; const early = await consumeEarlyWorkspaceBootstrap(normalizedProjectId); - if (early) return early; - return authAPI.workspaceBootstrap(normalizedProjectId); + if (early && (early.ok || early.status !== 404)) return early; + const primary = await authAPI.workspaceBootstrap(normalizedProjectId); + if (primary.ok || primary.status !== 404) return primary; + return resolveWorkspaceBootstrapFallback(normalizedProjectId, primary); +} + +async function resolveWorkspaceBootstrapFallback(projectId: string, primary: ApiResult): Promise> { + const session = await authAPI.session(); + const sessionPayload = session.data ?? { authenticated: false, mode: "server" as const }; + if (!session.ok || sessionPayload.authenticated !== true) { + return { + ok: session.ok, + status: session.status, + data: { ...sessionPayload, projectId, workspace: null, workspaceStatus: null, workspaceError: primary.error ?? primary.status }, + error: session.error + }; + } + const workspace = await workbenchAPI.workspace(projectId); + return { + ok: true, + status: session.status, + data: { + ...sessionPayload, + projectId, + workspace: workspace.ok ? workspace.data?.workspace ?? null : null, + workspaceStatus: workspace.status, + workspaceError: workspace.ok ? null : workspace.error ?? workspace.status + }, + error: null + }; } export function publishWorkspaceBootstrap(projectId: string, workspace: WorkspaceRecord | null | undefined): void { diff --git a/web/hwlab-cloud-web/src/views/workbench/CodeWorkbenchView.vue b/web/hwlab-cloud-web/src/views/workbench/CodeWorkbenchView.vue index 60293d9c..e0ccd3f1 100644 --- a/web/hwlab-cloud-web/src/views/workbench/CodeWorkbenchView.vue +++ b/web/hwlab-cloud-web/src/views/workbench/CodeWorkbenchView.vue @@ -17,7 +17,7 @@ useAutoRefresh(() => workbench.refreshLive(), 30_000);