diff --git a/web/storyforge-web-v4/assets/app.js b/web/storyforge-web-v4/assets/app.js index e056332..20cf50a 100644 --- a/web/storyforge-web-v4/assets/app.js +++ b/web/storyforge-web-v4/assets/app.js @@ -1714,10 +1714,6 @@ async function loadKnowledgeDocuments(knowledgeBases) { } async function loadStorageStatus(projectId = "") { - if (!backendSupports("/v2/storage/status")) { - appState.storageStatus = null; - return null; - } const suffix = projectId ? `?project_id=${encodeURIComponent(projectId)}` : ""; const payload = await storyforgeFetch(`/v2/storage/status${suffix}`).catch(() => null); appState.storageStatus = payload; @@ -1884,9 +1880,6 @@ async function loadOneLinerMessages(sessionId) { async function ensureOneLinerSession() { const projectId = getOneLinerProjectId(); if (!projectId) throw new Error("当前还没有项目,OneLiner 需要先绑定项目上下文。"); - if (!backendSupports("/v2/oneliner/sessions")) { - throw new Error("当前后端还没有接入 OneLiner 会话接口。"); - } let session = getCurrentOneLinerSession(); if (!session) { session = await storyforgeFetch("/v2/oneliner/sessions", { @@ -1895,6 +1888,11 @@ async function ensureOneLinerSession() { project_id: projectId, preferred_platform: getPreferredPlatform() } + }).catch((error) => { + if (isMissingBackendCapability(error)) { + throw new Error("当前实例还没有开放 OneLiner 会话接口。"); + } + throw error; }); appState.onelinerSessions = [session, ...safeArray(appState.onelinerSessions)]; appState.selectedOnelinerSessionId = session.id; @@ -1931,9 +1929,6 @@ async function submitOneLinerMessage(content) { } async function createOneLinerRun(runRequest) { - if (!backendSupports("/v2/oneliner/runs")) { - throw new Error("当前后端还没有接入主 Agent 运行层。"); - } const projectId = getOneLinerProjectId(); const payload = await storyforgeFetch("/v2/oneliner/runs", { method: "POST", @@ -1945,6 +1940,11 @@ async function createOneLinerRun(runRequest) { scheduling_mode: "queued", ...runRequest } + }).catch((error) => { + if (isMissingBackendCapability(error)) { + throw new Error("当前实例还没有开放主 Agent 运行层。"); + } + throw error; }); await loadAgentControlSurfaces(projectId); appState.selectedOnelinerRunId = payload?.id || choosePreferredOneLinerRunId(appState.onelinerRuns, ""); @@ -2229,9 +2229,6 @@ function collectOneLinerActionPayload(action) { } async function executeOneLinerAction(executorKey, options = {}) { - if (!backendSupports("/v2/oneliner/actions/execute")) { - throw new Error("当前后端还没有接入 OneLiner 动作执行器。"); - } const projectId = getOneLinerProjectId(); const session = getCurrentOneLinerSession() || await ensureOneLinerSession(); const payload = await storyforgeFetch("/v2/oneliner/actions/execute", { @@ -2243,6 +2240,11 @@ async function executeOneLinerAction(executorKey, options = {}) { session_id: options.sessionId || session?.id || "", payload: options.payload || {} } + }).catch((error) => { + if (isMissingBackendCapability(error)) { + throw new Error("当前实例还没有开放 OneLiner 动作执行器。"); + } + throw error; }); await loadAgentControlSurfaces(projectId); if (appState.selectedOnelinerSessionId) { @@ -2500,10 +2502,8 @@ async function bootstrap() { const runtimePlatforms = getRuntimePlatformValues(); const preferredPlatform = getCurrentPlatformValue(); setCurrentPlatform(preferredPlatform); - const supportsReviews = backendSupports("/v2/reviews"); const supportsIntegrationHealth = backendSupports("/v2/integrations/health"); const supportsLocalModels = backendSupports("/v2/integrations/local-models"); - const supportsStorageStatus = backendSupports("/v2/storage/status"); const supportsLiveRecorderSources = backendSupports("/v2/live-recorder/sources"); const supportsLiveRecorderStatus = backendSupports("/v2/live-recorder/status"); const supportsLiveRecorderFiles = backendSupports("/v2/live-recorder/files"); @@ -2545,7 +2545,7 @@ async function bootstrap() { trackingDigest }; })), - supportsReviews ? storyforgeFetch("/v2/reviews").catch(() => []) : Promise.resolve([]), + storyforgeFetch("/v2/reviews").catch(() => []), supportsIntegrationHealth ? storyforgeFetch("/v2/integrations/health").catch(() => null) : Promise.resolve(null), supportsLocalModels ? storyforgeFetch("/v2/integrations/local-models").catch(() => null) : Promise.resolve(null), supportsLiveRecorderSources ? storyforgeFetch("/v2/live-recorder/sources").catch(() => ({ items: [] })) : Promise.resolve({ items: [] }) @@ -2605,11 +2605,7 @@ async function bootstrap() { appState.liveRecorderHealth = liveRecorderHealth; appState.documents = await loadKnowledgeDocuments(dashboard.knowledge_bases); appState.selectedProjectId = appState.selectedProjectId || dashboard.projects?.[0]?.id || ""; - if (supportsStorageStatus) { - await loadStorageStatus(appState.selectedProjectId || ""); - } else { - appState.storageStatus = null; - } + await loadStorageStatus(appState.selectedProjectId || ""); await loadAgentControlSurfaces(appState.selectedProjectId || ""); if (appState.selectedOnelinerSessionId) { await loadOneLinerMessages(appState.selectedOnelinerSessionId); @@ -3220,11 +3216,7 @@ async function applySelectedProject(projectId = "") { appState.selectedProjectId = projectId || ""; setBusy(true, "正在切换项目视图..."); try { - if (backendSupports("/v2/storage/status")) { - await loadStorageStatus(appState.selectedProjectId || ""); - } else { - appState.storageStatus = null; - } + await loadStorageStatus(appState.selectedProjectId || ""); await loadAgentControlSurfaces(appState.selectedProjectId || ""); if (appState.selectedOnelinerSessionId) { await loadOneLinerMessages(appState.selectedOnelinerSessionId); @@ -3824,13 +3816,13 @@ function renderStorageStatusPanel() {
后端补上 storage/status 后,这里会自动显示账号 / 项目 / 任务分层、容量和最近写入路径。
+当 storage/status 暂时拿不到时,这里会自动退回到任务和录像文件的降级视图。