From 3b9bd216216631d3b7a43740646a80114069db71 Mon Sep 17 00:00:00 2001 From: evanlowe <62918515+evanlowe@users.noreply.github.com> Date: Sun, 9 Aug 2026 17:36:17 +0800 Subject: [PATCH 1/2] fix(studio): focus deployment detail on progress --- frontend/README.md | 7 +- frontend/src/App.tsx | 1 + frontend/src/ui/AgentWorkspace.css | 13 + frontend/src/ui/AgentWorkspace.tsx | 7 +- frontend/tests/agentWorkspace.test.mjs | 16 +- ...GL.js => MarkdownPromptEditor-DcKVyNOU.js} | 2 +- ...{index-CSryzStF.css => index-BMroDYCh.css} | 2 +- .../{index-v7mbHeUV.js => index-MyT3MzAo.js} | 266 +++++++++--------- veadk/webui/index.html | 4 +- 9 files changed, 175 insertions(+), 143 deletions(-) rename veadk/webui/assets/{MarkdownPromptEditor-CJ7ejKGL.js => MarkdownPromptEditor-DcKVyNOU.js} (99%) rename veadk/webui/assets/{index-CSryzStF.css => index-BMroDYCh.css} (56%) rename veadk/webui/assets/{index-v7mbHeUV.js => index-MyT3MzAo.js} (82%) diff --git a/frontend/README.md b/frontend/README.md index 825e33c1..e5681aa8 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -91,8 +91,11 @@ server that `veadk frontend` launches — no separate backend. probes and lists confirmed API Server and A2A integration endpoints; protocols that the Runtime does not expose are shown as unavailable. The integration panel switches between the detected protocols and provides a Python request - example for each one. Runtime API Keys stay masked as `****` and are fetched - only after the user explicitly reveals them; examples always use placeholders + example for each one. While a deployment is running, the detail page keeps the + Agent heading and a scrollable deployment panel visible, then reloads the + normal detail tabs after the Runtime connects. Runtime API Keys stay masked as + `****` and are fetched only after the user explicitly reveals them; examples + always use placeholders instead of credentials. Long descriptions, names, component summaries, IDs, and environment values stay inside the scrollable panel. - **Custom-agent workbench**: configure an agent with a rich Markdown diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index a3b4191c..f9887756 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1599,6 +1599,7 @@ export default function App() { editingDraftBaselineRef.current = null; setFocusedWorkspaceAgentId(agentId); setFocusedWorkspaceAgentSection("basic"); + setFocusedDeploymentTaskId(""); setCreateView(null); setManageAgents(true); setAppName(agentId); diff --git a/frontend/src/ui/AgentWorkspace.css b/frontend/src/ui/AgentWorkspace.css index 04cc0552..e1c265bf 100644 --- a/frontend/src/ui/AgentWorkspace.css +++ b/frontend/src/ui/AgentWorkspace.css @@ -1186,6 +1186,19 @@ padding: 0 24px 16px; } +.aw-detail-deployment.is-running { + flex: 1 1 auto; + min-height: 0; + overflow-y: auto; + overscroll-behavior: contain; +} + +.aw-main.is-deploying .aw-agent-tabs, +.aw-main.is-deploying .aw-content, +.aw-main.is-deploying .aw-basic-actions { + display: none; +} + .aw-deploy-progress-head, .aw-deploy-progress-head > div, .aw-deploy-progress-icon { diff --git a/frontend/src/ui/AgentWorkspace.tsx b/frontend/src/ui/AgentWorkspace.tsx index 617e232c..339d507f 100644 --- a/frontend/src/ui/AgentWorkspace.tsx +++ b/frontend/src/ui/AgentWorkspace.tsx @@ -1318,6 +1318,7 @@ export function AgentWorkspace({ || focusedDeploymentTaskActive ), ); + const deploymentInProgress = deploymentTask?.status === "running"; const draftFlowKey = useMemo(() => canvasDraftKey(draft), [draft]); const displayCurrentVersion = selectedAgent?.currentVersion ?? runtimeDetail?.currentVersion ?? null; @@ -2422,7 +2423,7 @@ export function AgentWorkspace({

未选择智能体

) : ( -
+
{selectedAgent && !selectedAgentInfo && loadingAgentInfo && (
@@ -2495,7 +2496,9 @@ export function AgentWorkspace({ )}
{deploymentTask && shouldShowDeploymentTask && ( -
+
)} diff --git a/frontend/tests/agentWorkspace.test.mjs b/frontend/tests/agentWorkspace.test.mjs index 13578767..469ca57e 100644 --- a/frontend/tests/agentWorkspace.test.mjs +++ b/frontend/tests/agentWorkspace.test.mjs @@ -248,7 +248,7 @@ test("workspace publish flow restores PR 748 deployment lifecycle hooks", () => ); assert.match( appSource, - /const finishDeployment = useCallback[\s\S]*?removeWorkspaceDraft\(editingDraftId\)[\s\S]*?setFocusedWorkspaceAgentId\(agentId\)[\s\S]*?setManageAgents\(true\)/, + /const finishDeployment = useCallback[\s\S]*?removeWorkspaceDraft\(editingDraftId\)[\s\S]*?setFocusedWorkspaceAgentId\(agentId\)[\s\S]*?setFocusedDeploymentTaskId\(""\)[\s\S]*?setManageAgents\(true\)/, ); assert.match(appSource, /onDeploymentStarted=\{startDeployment\}/); assert.match(appSource, /onDeploymentComplete=\{finishDeployment\}/); @@ -301,11 +301,15 @@ test("workspace publish flow restores PR 748 deployment lifecycle hooks", () => workspaceSource, /const shouldShowDeploymentTask = Boolean\([\s\S]*?deploymentTask\.status !== "success"[\s\S]*?focusedDeploymentTaskActive/, ); + assert.match( + workspaceSource, + /const deploymentInProgress = deploymentTask\?\.status === "running"/, + ); assert.match(workspaceSource, /if \(!focusedDeploymentTaskId\) return;/); assert.doesNotMatch(workspaceSource, /activeDeploymentTaskId/); assert.match( workspaceSource, - /className="aw-agent-head"[\s\S]*?\{deploymentTask && shouldShowDeploymentTask && \([\s\S]*?className="aw-detail-deployment"[\s\S]*?[\s\S]*?