diff --git a/Makefile b/Makefile index d616ba3..d7ebe96 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # ZCLAW Makefile # Cross-platform task runner -.PHONY: help start start-dev start-no-browser start-no-gateway desktop desktop-build setup test clean +.PHONY: help start start-dev start-no-browser desktop desktop-build setup test clean help: ## Show this help message @echo "ZCLAW - OpenFang Desktop Client" @@ -13,16 +13,16 @@ help: ## Show this help message # === Startup Commands === start: ## Start all services (Windows: PowerShell) - @pwsh -File ./start.ps1 + @powershell -ExecutionPolicy Bypass -File ./start-all.ps1 start-dev: ## Start all services in dev mode - @pwsh -File ./start.ps1 -Dev + @powershell -ExecutionPolicy Bypass -File ./start-all.ps1 -Dev start-no-browser: ## Start without ChromeDriver - @pwsh -File ./start.ps1 -NoBrowser + @powershell -ExecutionPolicy Bypass -File ./start-all.ps1 -NoBrowser -start-no-gateway: ## Start without OpenFang gateway - @pwsh -File ./start.ps1 -NoGateway +start-desktop-only: ## Start desktop only (no external services) + @powershell -ExecutionPolicy Bypass -File ./start-all.ps1 -DesktopOnly start-unix: ## Start all services (Unix: macOS/Linux) @chmod +x ./start.sh && ./start.sh @@ -54,12 +54,6 @@ typecheck: ## Run TypeScript type check # === Services === -gateway: ## Start OpenFang gateway - @openfang gateway start - -gateway-status: ## Check gateway status - @openfang gateway status - chromedriver: ## Start ChromeDriver on port 4444 @chromedriver --port=4444 diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml index 5158939..8131e27 100644 --- a/desktop/pnpm-lock.yaml +++ b/desktop/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: specifier: ^5.0.11 version: 5.0.11(@types/react@19.2.14)(react@19.2.4) devDependencies: + '@playwright/test': + specifier: ^1.58.2 + version: 1.58.2 '@tailwindcss/vite': specifier: ^4.2.1 version: 4.2.1(vite@7.3.1(jiti@2.6.1)(lightningcss@1.31.1)) @@ -75,6 +78,9 @@ importers: autoprefixer: specifier: ^10.4.27 version: 10.4.27(postcss@8.5.8) + playwright: + specifier: ^1.58.2 + version: 1.58.2 postcss: specifier: ^8.5.8 version: 8.5.8 @@ -345,6 +351,11 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@playwright/test@1.58.2': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + engines: {node: '>=18'} + hasBin: true + '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} @@ -786,6 +797,11 @@ packages: react-dom: optional: true + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -924,6 +940,16 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + engines: {node: '>=18'} + hasBin: true + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -1277,6 +1303,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@playwright/test@1.58.2': + dependencies: + playwright: 1.58.2 + '@rolldown/pluginutils@1.0.0-beta.27': {} '@rollup/rollup-android-arm-eabi@4.59.0': @@ -1615,6 +1645,9 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -1707,6 +1740,14 @@ snapshots: picomatch@4.0.3: {} + playwright-core@1.58.2: {} + + playwright@1.58.2: + dependencies: + playwright-core: 1.58.2 + optionalDependencies: + fsevents: 2.3.2 + postcss-value-parser@4.2.0: {} postcss@8.5.8: diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 7a6f304..2496fca 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -14,16 +14,31 @@ import { useTeamStore } from './store/teamStore'; import { getStoredGatewayToken } from './lib/gateway-client'; import { pageVariants, defaultTransition, fadeInVariants } from './lib/animations'; import { silentErrorHandler } from './lib/error-utils'; -import { Bot, Users } from 'lucide-react'; +import { Bot, Users, Loader2 } from 'lucide-react'; import { EmptyState } from './components/ui'; +import { isTauriRuntime, getLocalGatewayStatus, startLocalGateway } from './lib/tauri-gateway'; type View = 'main' | 'settings'; +// Bootstrap component that ensures OpenFang is running before rendering main UI +function BootstrapScreen({ status }: { status: string }) { + return ( +
+
+ +

{status}

+
+
+ ); +} + function App() { const [view, setView] = useState('main'); const [mainContentView, setMainContentView] = useState('chat'); const [selectedHandId, setSelectedHandId] = useState(undefined); const [selectedTeamId, setSelectedTeamId] = useState(undefined); + const [bootstrapping, setBootstrapping] = useState(true); + const [bootstrapStatus, setBootstrapStatus] = useState('Initializing...'); const { connect, connectionState } = useGatewayStore(); const { activeTeam, setActiveTeam, teams } = useTeamStore(); @@ -31,12 +46,61 @@ function App() { document.title = 'ZCLAW'; }, []); + // Bootstrap: Start OpenFang Gateway before rendering main UI useEffect(() => { - if (connectionState === 'disconnected') { - const gatewayToken = getStoredGatewayToken(); - connect(undefined, gatewayToken).catch(silentErrorHandler('App')); - } - }, [connect, connectionState]); + let mounted = true; + + const bootstrap = async () => { + try { + // Step 1: Check and start local gateway in Tauri environment + if (isTauriRuntime()) { + setBootstrapStatus('Checking gateway status...'); + + try { + const status = await getLocalGatewayStatus(); + const isRunning = status.portStatus === 'busy' || status.listenerPids.length > 0; + + if (!isRunning && status.cliAvailable) { + setBootstrapStatus('Starting OpenFang Gateway...'); + console.log('[App] Local gateway not running, auto-starting...'); + + await startLocalGateway(); + + // Wait for gateway to be ready + await new Promise(resolve => setTimeout(resolve, 2000)); + console.log('[App] Local gateway started'); + } else if (isRunning) { + console.log('[App] Local gateway already running'); + } + } catch (err) { + console.warn('[App] Failed to check/start local gateway:', err); + } + } + + if (!mounted) return; + + // Step 2: Connect to gateway + setBootstrapStatus('Connecting to gateway...'); + const gatewayToken = getStoredGatewayToken(); + await connect(undefined, gatewayToken); + + if (!mounted) return; + + // Step 3: Bootstrap complete + setBootstrapping(false); + } catch (err) { + console.error('[App] Bootstrap failed:', err); + // Still allow app to load, connection status will show error + setBootstrapping(false); + } + }; + + bootstrap(); + + return () => { + mounted = false; + }; + }, [connect]); // 当切换到非 hands 视图时清除选中的 Hand const handleMainViewChange = (view: MainViewType) => { @@ -59,6 +123,11 @@ function App() { return setView('main')} />; } + // Show bootstrap screen while starting gateway + if (bootstrapping) { + return ; + } + return (
{/* 左侧边栏 */} diff --git a/desktop/src/lib/gateway-client.ts b/desktop/src/lib/gateway-client.ts index c1c855e..ee7c21d 100644 --- a/desktop/src/lib/gateway-client.ts +++ b/desktop/src/lib/gateway-client.ts @@ -1086,7 +1086,28 @@ export class GatewayClient { } async getQuickConfig(): Promise { try { - return await this.restGet('/api/config/quick'); + // Use /api/config endpoint (OpenFang's actual config endpoint) + const config = await this.restGet('/api/config'); + // Map OpenFang config to frontend expected format + return { + quickConfig: { + agentName: 'ZCLAW', + agentRole: 'AI 助手', + userName: '用户', + userRole: '用户', + agentNickname: 'ZCLAW', + scenarios: ['通用对话', '代码助手', '文档编写'], + workspaceDir: config.data_dir || config.home_dir, + gatewayUrl: this.baseUrl, + defaultModel: config.default_model?.model, + defaultProvider: config.default_model?.provider, + theme: 'dark', + showToolCalls: true, + autoSaveContext: true, + fileWatching: true, + privacyOptIn: false, + } + }; } catch (error) { // Return structured fallback if API not available (404) if (isNotFoundError(error)) { @@ -1096,7 +1117,16 @@ export class GatewayClient { } } async saveQuickConfig(config: Record): Promise { - return this.restPut('/api/config/quick', config); + // Use /api/config endpoint for saving config + // Map frontend config back to OpenFang format + const openfangConfig = { + data_dir: config.workspaceDir, + default_model: config.defaultModel ? { + model: config.defaultModel, + provider: config.defaultProvider || 'bailian', + } : undefined, + }; + return this.restPut('/api/config', openfangConfig); } async listSkills(): Promise { return this.restGet('/api/skills'); diff --git a/desktop/src/store/connectionStore.ts b/desktop/src/store/connectionStore.ts index faa8eea..6a74131 100644 --- a/desktop/src/store/connectionStore.ts +++ b/desktop/src/store/connectionStore.ts @@ -219,6 +219,26 @@ export const useConnectionStore = create((set, get) => { } catch { /* ignore local gateway preparation failures during connection bootstrap */ } + + // Auto-start local gateway if not running + try { + const localStatus = await fetchLocalGatewayStatus(); + const isRunning = localStatus.portStatus === 'busy' || localStatus.listenerPids.length > 0; + + if (!isRunning && localStatus.cliAvailable) { + console.log('[ConnectionStore] Local gateway not running, auto-starting...'); + set({ localGatewayBusy: true }); + await startLocalGatewayCommand(); + set({ localGatewayBusy: false }); + + // Wait for gateway to be ready + await new Promise(resolve => setTimeout(resolve, 1500)); + console.log('[ConnectionStore] Local gateway started'); + } + } catch (startError) { + console.warn('[ConnectionStore] Failed to auto-start local gateway:', startError); + set({ localGatewayBusy: false }); + } } // Resolve effective token: param > quickConfig > localStorage > local auth diff --git a/desktop/src/store/gatewayStore.ts b/desktop/src/store/gatewayStore.ts index 02a5637..e74934b 100644 --- a/desktop/src/store/gatewayStore.ts +++ b/desktop/src/store/gatewayStore.ts @@ -659,12 +659,34 @@ export const useGatewayStore = create((set, get) => { try { set({ error: null }); + + // Prepare local gateway for Tauri if (isTauriRuntime()) { try { await prepareLocalGatewayForTauri(); } catch { /* ignore local gateway preparation failures during connection bootstrap */ } + + // Auto-start local gateway if not running + try { + const localStatus = await getLocalGatewayStatus(); + const isRunning = localStatus.portStatus === 'busy' || localStatus.listenerPids.length > 0; + + if (!isRunning && localStatus.cliAvailable) { + console.log('[GatewayStore] Local gateway not running, auto-starting...'); + set({ localGatewayBusy: true }); + await startLocalGatewayCommand(); + set({ localGatewayBusy: false }); + + // Wait for gateway to be ready + await new Promise(resolve => setTimeout(resolve, 1500)); + console.log('[GatewayStore] Local gateway started'); + } + } catch (startError) { + console.warn('[GatewayStore] Failed to auto-start local gateway:', startError); + set({ localGatewayBusy: false }); + } } // Use the first non-empty token from: param > quickConfig > localStorage let effectiveToken = token || get().quickConfig.gatewayToken || getStoredGatewayToken(); diff --git a/desktop/test-results/.last-run.json b/desktop/test-results/.last-run.json new file mode 100644 index 0000000..f28959e --- /dev/null +++ b/desktop/test-results/.last-run.json @@ -0,0 +1,11 @@ +{ + "status": "failed", + "failedTests": [ + "ea562bc8f2f5f42dadea-a9ad995be4600240d5d9", + "ea562bc8f2f5f42dadea-aa98d5dacb19aae6a62f", + "ea562bc8f2f5f42dadea-24005574dbd87061e5f7", + "ea562bc8f2f5f42dadea-faee21c3e777f7004b5c", + "ea562bc8f2f5f42dadea-27f22490c6765498e906", + "ea562bc8f2f5f42dadea-233185470e18cdb79c26" + ] +} \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/error-context.md b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/error-context.md new file mode 100644 index 0000000..691d255 --- /dev/null +++ b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/error-context.md @@ -0,0 +1,246 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - tablist [ref=e5]: + - tab "分身" [selected] [ref=e6]: + - img [ref=e7] + - generic [ref=e10]: 分身 + - tab "Hands" [ref=e11]: + - img [ref=e12] + - generic [ref=e14]: Hands + - tab "工作流" [ref=e15]: + - img [ref=e16] + - generic [ref=e20]: 工作流 + - tab "团队" [ref=e21]: + - img [ref=e22] + - generic [ref=e27]: 团队 + - tab "协作" [ref=e28]: + - img [ref=e29] + - generic [ref=e33]: 协作 + - generic [ref=e37]: + - generic [ref=e38] [cursor=pointer]: + - img [ref=e40] + - generic [ref=e43]: + - generic [ref=e44]: + - generic [ref=e45]: trader-hand + - generic [ref=e46]: 当前 + - paragraph [ref=e47]: 新分身 + - button "删除": + - img + - generic [ref=e48] [cursor=pointer]: + - img [ref=e50] + - generic [ref=e53]: + - generic [ref=e55]: researcher + - paragraph [ref=e56]: 新分身 + - button "删除": + - img + - generic [ref=e57] [cursor=pointer]: + - img [ref=e59] + - generic [ref=e62]: + - generic [ref=e64]: browser-hand + - paragraph [ref=e65]: 新分身 + - button "删除": + - img + - generic [ref=e66] [cursor=pointer]: + - img [ref=e68] + - generic [ref=e71]: + - generic [ref=e73]: collector-hand + - paragraph [ref=e74]: 新分身 + - button "删除": + - img + - generic [ref=e75] [cursor=pointer]: + - img [ref=e77] + - generic [ref=e80]: + - generic [ref=e82]: researcher-hand + - paragraph [ref=e83]: 新分身 + - button "删除": + - img + - generic [ref=e84] [cursor=pointer]: + - img [ref=e86] + - generic [ref=e89]: + - generic [ref=e91]: lead-hand + - paragraph [ref=e92]: 新分身 + - button "删除": + - img + - generic [ref=e93] [cursor=pointer]: + - img [ref=e95] + - generic [ref=e98]: + - generic [ref=e100]: test-agent + - paragraph [ref=e101]: 新分身 + - button "删除": + - img + - generic [ref=e102] [cursor=pointer]: + - img [ref=e104] + - generic [ref=e107]: + - generic [ref=e109]: predictor-hand + - paragraph [ref=e110]: 新分身 + - button "删除": + - img + - generic [ref=e111] [cursor=pointer]: + - img [ref=e113] + - generic [ref=e116]: + - generic [ref=e118]: 测试助手 + - paragraph [ref=e119]: 新分身 + - button "删除": + - img + - generic [ref=e120] [cursor=pointer]: + - img [ref=e122] + - generic [ref=e125]: 创建新 Agent + - generic [ref=e127]: + - generic [ref=e128]: 用 + - generic [ref=e129]: 用户 + - button "打开设置" [ref=e130]: + - img [ref=e131] + - main [ref=e134]: + - generic [ref=e136]: + - heading "trader-hand" [level=2] [ref=e137] + - generic [ref=e138]: Gateway 已连接 + - generic [ref=e142]: + - generic [ref=e145]: 🦞 + - paragraph [ref=e147]: 你好! 我是 trader-hand。有什么我可以帮你的吗? + - generic [ref=e148]: + - generic [ref=e149]: + - img [ref=e150] + - generic [ref=e152]: 快速开始 + - button "💡 帮我写一个 Python 脚本处理 Excel 文件" [ref=e153]: + - generic [ref=e154]: 💡 + - generic [ref=e155]: 帮我写一个 Python 脚本处理 Excel 文件 + - img [ref=e156] + - button "📊 分析这个数据集的趋势和关键指标" [ref=e158]: + - generic [ref=e159]: 📊 + - generic [ref=e160]: 分析这个数据集的趋势和关键指标 + - img [ref=e161] + - button "✍️ 帮我起草一份产品需求文档" [ref=e163]: + - generic [ref=e164]: ✍️ + - generic [ref=e165]: 帮我起草一份产品需求文档 + - img [ref=e166] + - paragraph [ref=e168]: 发送消息开始对话,或点击上方建议 + - generic [ref=e170]: + - generic [ref=e171]: + - button "添加附件" [ref=e172]: + - img [ref=e173] + - textbox "发送给 trader-hand" [ref=e176] + - generic [ref=e177]: + - button "选择模型" [ref=e178]: + - generic [ref=e179]: glm-5 + - img [ref=e180] + - button "发送消息" [disabled] [ref=e182]: + - img [ref=e183] + - generic [ref=e185]: Agent 在本地运行,内容由 AI 生成 + - complementary [ref=e186]: + - generic [ref=e187]: + - generic [ref=e188]: + - generic [ref=e189]: + - img [ref=e190] + - generic [ref=e192]: "0" + - generic [ref=e193]: 当前消息 + - tablist [ref=e194]: + - tab "Status" [selected] [ref=e195]: + - img [ref=e196] + - tab "Files" [ref=e198]: + - img [ref=e199] + - tab "Agent" [ref=e202]: + - img [ref=e203] + - tab "Memory" [ref=e206]: + - img [ref=e207] + - generic [ref=e215]: + - generic [ref=e216]: + - generic [ref=e217]: + - generic [ref=e218]: + - img [ref=e219] + - generic [ref=e223]: Gateway Connected + - button "Refresh data" [ref=e224]: + - img [ref=e225] + - generic [ref=e230]: + - generic [ref=e231]: + - generic [ref=e232]: 地址 + - generic [ref=e233]: ws://127.0.0.1:50051/ws + - generic [ref=e234]: + - generic [ref=e235]: 当前模型 + - generic [ref=e236]: glm-5 + - generic [ref=e237]: + - heading "当前会话" [level=3] [ref=e238]: + - img [ref=e239] + - text: 当前会话 + - generic [ref=e241]: + - generic [ref=e242]: + - generic [ref=e243]: 用户消息 + - generic [ref=e244]: "0" + - generic [ref=e245]: + - generic [ref=e246]: 助手回复 + - generic [ref=e247]: "0" + - generic [ref=e248]: + - generic [ref=e249]: 工具调用 + - generic [ref=e250]: "0" + - generic [ref=e251]: + - generic [ref=e252]: 总消息数 + - generic [ref=e253]: "0" + - generic [ref=e254]: + - heading "分身状态" [level=3] [ref=e255]: + - img [ref=e256] + - text: 分身状态 + - generic [ref=e259]: + - generic [ref=e260]: + - img [ref=e262] + - generic [ref=e265]: trader-hand + - generic [ref=e266]: + - img [ref=e268] + - generic [ref=e271]: researcher + - generic [ref=e272]: + - img [ref=e274] + - generic [ref=e277]: browser-hand + - generic [ref=e278]: + - img [ref=e280] + - generic [ref=e283]: collector-hand + - generic [ref=e284]: + - img [ref=e286] + - generic [ref=e289]: researcher-hand + - paragraph [ref=e290]: +4 个分身 + - generic [ref=e291]: + - heading "用量统计" [level=3] [ref=e292]: + - img [ref=e293] + - text: 用量统计 + - generic [ref=e295]: + - generic [ref=e296]: + - generic [ref=e297]: 总会话数 + - generic [ref=e298]: "0" + - generic [ref=e299]: + - generic [ref=e300]: 总消息数 + - generic [ref=e301]: "0" + - generic [ref=e302]: + - generic [ref=e303]: 总 Token + - generic [ref=e304]: "0" + - generic [ref=e305]: + - heading "插件 (3)" [level=3] [ref=e306]: + - img [ref=e307] + - text: 插件 (3) + - generic [ref=e309]: + - generic [ref=e310]: + - generic [ref=e311]: Chat + - generic [ref=e312]: 运行中 + - generic [ref=e313]: + - generic [ref=e314]: Code + - generic [ref=e315]: 运行中 + - generic [ref=e316]: + - generic [ref=e317]: File + - generic [ref=e318]: 运行中 + - generic [ref=e319]: + - heading "运行概览" [level=3] [ref=e320]: + - img [ref=e321] + - text: 运行概览 + - generic [ref=e324]: + - generic [ref=e325]: + - generic [ref=e326]: 连接状态 + - generic [ref=e327]: 已连接 + - generic [ref=e328]: + - generic [ref=e329]: Gateway 版本 + - generic [ref=e330]: "-" + - generic [ref=e331]: + - generic [ref=e332]: 已加载分身 + - generic [ref=e333]: "9" + - generic [ref=e334]: + - generic [ref=e335]: 已加载插件 + - generic [ref=e336]: "3" +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/test-failed-1.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/video.webm b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/video.webm new file mode 100644 index 0000000..97eea70 Binary files /dev/null and b/desktop/test-results/functional-scenarios-1-应用启动与初始化-1-1-应用正常启动并渲染所有核心组件-chromium/video.webm differ diff --git a/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/error-context.md b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/error-context.md new file mode 100644 index 0000000..8c385ff --- /dev/null +++ b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/error-context.md @@ -0,0 +1,243 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - tablist [ref=e5]: + - tab "分身" [selected] [ref=e6]: + - img [ref=e7] + - generic [ref=e10]: 分身 + - tab "Hands" [ref=e11]: + - img [ref=e12] + - generic [ref=e14]: Hands + - tab "工作流" [ref=e15]: + - img [ref=e16] + - generic [ref=e20]: 工作流 + - tab "团队" [ref=e21]: + - img [ref=e22] + - generic [ref=e27]: 团队 + - tab "协作" [ref=e28]: + - img [ref=e29] + - generic [ref=e33]: 协作 + - generic [ref=e37]: + - generic [ref=e38] [cursor=pointer]: + - img [ref=e40] + - generic [ref=e43]: + - generic [ref=e44]: + - generic [ref=e45]: trader-hand + - generic [ref=e46]: 当前 + - paragraph [ref=e47]: 新分身 + - button "删除": + - img + - generic [ref=e48] [cursor=pointer]: + - img [ref=e50] + - generic [ref=e53]: + - generic [ref=e55]: researcher + - paragraph [ref=e56]: 新分身 + - button "删除": + - img + - generic [ref=e57] [cursor=pointer]: + - img [ref=e59] + - generic [ref=e62]: + - generic [ref=e64]: browser-hand + - paragraph [ref=e65]: 新分身 + - button "删除": + - img + - generic [ref=e66] [cursor=pointer]: + - img [ref=e68] + - generic [ref=e71]: + - generic [ref=e73]: collector-hand + - paragraph [ref=e74]: 新分身 + - button "删除": + - img + - generic [ref=e75] [cursor=pointer]: + - img [ref=e77] + - generic [ref=e80]: + - generic [ref=e82]: researcher-hand + - paragraph [ref=e83]: 新分身 + - button "删除": + - img + - generic [ref=e84] [cursor=pointer]: + - img [ref=e86] + - generic [ref=e89]: + - generic [ref=e91]: lead-hand + - paragraph [ref=e92]: 新分身 + - button "删除": + - img + - generic [ref=e93] [cursor=pointer]: + - img [ref=e95] + - generic [ref=e98]: + - generic [ref=e100]: test-agent + - paragraph [ref=e101]: 新分身 + - button "删除": + - img + - generic [ref=e102] [cursor=pointer]: + - img [ref=e104] + - generic [ref=e107]: + - generic [ref=e109]: predictor-hand + - paragraph [ref=e110]: 新分身 + - button "删除": + - img + - generic [ref=e111] [cursor=pointer]: + - img [ref=e113] + - generic [ref=e116]: + - generic [ref=e118]: 测试助手 + - paragraph [ref=e119]: 新分身 + - button "删除": + - img + - generic [ref=e120] [cursor=pointer]: + - img [ref=e122] + - generic [ref=e125]: 创建新 Agent + - generic [ref=e127]: + - generic [ref=e128]: 用 + - generic [ref=e129]: 用户 + - button "打开设置" [ref=e130]: + - img [ref=e131] + - main [ref=e134]: + - generic [ref=e135]: + - generic [ref=e136]: + - heading "trader-hand" [level=2] [ref=e137] + - generic [ref=e138]: 正在输入中 + - button "开始新对话" [ref=e141]: + - img [ref=e142] + - text: 新对话 + - generic [ref=e145]: + - generic [ref=e147]: + - generic [ref=e148]: 用 + - generic [ref=e151]: 你好 + - generic [ref=e153]: + - generic [ref=e154]: Z + - generic [ref=e156]: + - generic [ref=e157]: "⚠️ Request failed: Request failed: Missing API key: No LLM provider configured. Set an API key (e.g. GROQ_API_KEY) and restart, configure a provider via the dashboard, or use Ollama for local models (no API key neede..." + - paragraph [ref=e158]: "Request failed: Request failed: Missing API key: No LLM provider configured. Set an API key (e.g. GROQ_API_KEY) and restart, configure a provider via the dashboard, or use Ollama for local models (no API key neede..." + - generic [ref=e160]: + - generic [ref=e161]: 用 + - generic [ref=e164]: 请帮我写一个简单的函数 + - generic [ref=e167]: Z + - generic [ref=e173]: + - generic [ref=e174]: + - button "添加附件" [ref=e175]: + - img [ref=e176] + - textbox "Agent 正在回复..." [disabled] [ref=e179] + - generic [ref=e180]: + - button "选择模型" [ref=e181]: + - generic [ref=e182]: glm-5 + - img [ref=e183] + - button "发送消息" [disabled] [ref=e185]: + - img [ref=e186] + - generic [ref=e188]: Agent 在本地运行,内容由 AI 生成 + - complementary [ref=e189]: + - generic [ref=e190]: + - generic [ref=e191]: + - generic [ref=e192]: + - img [ref=e193] + - generic [ref=e195]: "4" + - generic [ref=e196]: 当前消息 + - tablist [ref=e197]: + - tab "Status" [selected] [ref=e198]: + - img [ref=e199] + - tab "Files" [ref=e201]: + - img [ref=e202] + - tab "Agent" [ref=e205]: + - img [ref=e206] + - tab "Memory" [ref=e209]: + - img [ref=e210] + - generic [ref=e218]: + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e222] + - generic [ref=e226]: Gateway Connected + - button "Refresh data" [ref=e227]: + - img [ref=e228] + - generic [ref=e233]: + - generic [ref=e234]: + - generic [ref=e235]: 地址 + - generic [ref=e236]: ws://127.0.0.1:50051/ws + - generic [ref=e237]: + - generic [ref=e238]: 当前模型 + - generic [ref=e239]: glm-5 + - generic [ref=e240]: + - heading "当前会话" [level=3] [ref=e241]: + - img [ref=e242] + - text: 当前会话 + - generic [ref=e244]: + - generic [ref=e245]: + - generic [ref=e246]: 用户消息 + - generic [ref=e247]: "2" + - generic [ref=e248]: + - generic [ref=e249]: 助手回复 + - generic [ref=e250]: "2" + - generic [ref=e251]: + - generic [ref=e252]: 工具调用 + - generic [ref=e253]: "0" + - generic [ref=e254]: + - generic [ref=e255]: 总消息数 + - generic [ref=e256]: "4" + - generic [ref=e257]: + - heading "分身状态" [level=3] [ref=e258]: + - img [ref=e259] + - text: 分身状态 + - generic [ref=e262]: + - generic [ref=e263]: + - img [ref=e265] + - generic [ref=e268]: trader-hand + - generic [ref=e269]: + - img [ref=e271] + - generic [ref=e274]: researcher + - generic [ref=e275]: + - img [ref=e277] + - generic [ref=e280]: browser-hand + - generic [ref=e281]: + - img [ref=e283] + - generic [ref=e286]: collector-hand + - generic [ref=e287]: + - img [ref=e289] + - generic [ref=e292]: researcher-hand + - paragraph [ref=e293]: +4 个分身 + - generic [ref=e294]: + - heading "用量统计" [level=3] [ref=e295]: + - img [ref=e296] + - text: 用量统计 + - generic [ref=e298]: + - generic [ref=e299]: + - generic [ref=e300]: 总会话数 + - generic [ref=e301]: "0" + - generic [ref=e302]: + - generic [ref=e303]: 总消息数 + - generic [ref=e304]: "0" + - generic [ref=e305]: + - generic [ref=e306]: 总 Token + - generic [ref=e307]: "0" + - generic [ref=e308]: + - heading "插件 (3)" [level=3] [ref=e309]: + - img [ref=e310] + - text: 插件 (3) + - generic [ref=e312]: + - generic [ref=e313]: + - generic [ref=e314]: Chat + - generic [ref=e315]: 运行中 + - generic [ref=e316]: + - generic [ref=e317]: Code + - generic [ref=e318]: 运行中 + - generic [ref=e319]: + - generic [ref=e320]: File + - generic [ref=e321]: 运行中 + - generic [ref=e322]: + - heading "运行概览" [level=3] [ref=e323]: + - img [ref=e324] + - text: 运行概览 + - generic [ref=e327]: + - generic [ref=e328]: + - generic [ref=e329]: 连接状态 + - generic [ref=e330]: 已连接 + - generic [ref=e331]: + - generic [ref=e332]: Gateway 版本 + - generic [ref=e333]: "-" + - generic [ref=e334]: + - generic [ref=e335]: 已加载分身 + - generic [ref=e336]: "9" + - generic [ref=e337]: + - generic [ref=e338]: 已加载插件 + - generic [ref=e339]: "3" +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/test-failed-1.png new file mode 100644 index 0000000..063154f Binary files /dev/null and b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/video.webm b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/video.webm new file mode 100644 index 0000000..5e87e63 Binary files /dev/null and b/desktop/test-results/functional-scenarios-10-完整用户流程-10-2-完整聊天流程-chromium/video.webm differ diff --git a/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/error-context.md b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/error-context.md new file mode 100644 index 0000000..c1cac1b --- /dev/null +++ b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/error-context.md @@ -0,0 +1,243 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - tablist [ref=e5]: + - tab "分身" [selected] [ref=e6]: + - img [ref=e7] + - generic [ref=e10]: 分身 + - tab "Hands" [ref=e11]: + - img [ref=e12] + - generic [ref=e14]: Hands + - tab "工作流" [ref=e15]: + - img [ref=e16] + - generic [ref=e20]: 工作流 + - tab "团队" [ref=e21]: + - img [ref=e22] + - generic [ref=e27]: 团队 + - tab "协作" [ref=e28]: + - img [ref=e29] + - generic [ref=e33]: 协作 + - generic [ref=e37]: + - generic [ref=e38] [cursor=pointer]: + - img [ref=e40] + - generic [ref=e43]: + - generic [ref=e44]: + - generic [ref=e45]: trader-hand + - generic [ref=e46]: 当前 + - paragraph [ref=e47]: 新分身 + - button "删除": + - img + - generic [ref=e48] [cursor=pointer]: + - img [ref=e50] + - generic [ref=e53]: + - generic [ref=e55]: researcher + - paragraph [ref=e56]: 新分身 + - button "删除": + - img + - generic [ref=e57] [cursor=pointer]: + - img [ref=e59] + - generic [ref=e62]: + - generic [ref=e64]: browser-hand + - paragraph [ref=e65]: 新分身 + - button "删除": + - img + - generic [ref=e66] [cursor=pointer]: + - img [ref=e68] + - generic [ref=e71]: + - generic [ref=e73]: collector-hand + - paragraph [ref=e74]: 新分身 + - button "删除": + - img + - generic [ref=e75] [cursor=pointer]: + - img [ref=e77] + - generic [ref=e80]: + - generic [ref=e82]: researcher-hand + - paragraph [ref=e83]: 新分身 + - button "删除": + - img + - generic [ref=e84] [cursor=pointer]: + - img [ref=e86] + - generic [ref=e89]: + - generic [ref=e91]: lead-hand + - paragraph [ref=e92]: 新分身 + - button "删除": + - img + - generic [ref=e93] [cursor=pointer]: + - img [ref=e95] + - generic [ref=e98]: + - generic [ref=e100]: test-agent + - paragraph [ref=e101]: 新分身 + - button "删除": + - img + - generic [ref=e102] [cursor=pointer]: + - img [ref=e104] + - generic [ref=e107]: + - generic [ref=e109]: predictor-hand + - paragraph [ref=e110]: 新分身 + - button "删除": + - img + - generic [ref=e111] [cursor=pointer]: + - img [ref=e113] + - generic [ref=e116]: + - generic [ref=e118]: 测试助手 + - paragraph [ref=e119]: 新分身 + - button "删除": + - img + - generic [ref=e120] [cursor=pointer]: + - img [ref=e122] + - generic [ref=e125]: 创建新 Agent + - generic [ref=e127]: + - generic [ref=e128]: 用 + - generic [ref=e129]: 用户 + - button "打开设置" [ref=e130]: + - img [ref=e131] + - main [ref=e134]: + - generic [ref=e135]: + - generic [ref=e136]: + - heading "trader-hand" [level=2] [ref=e137] + - generic [ref=e138]: 正在输入中 + - button "开始新对话" [ref=e141]: + - img [ref=e142] + - text: 新对话 + - generic [ref=e145]: + - generic [ref=e147]: + - generic [ref=e148]: 用 + - generic [ref=e151]: 测试消息 1 + - generic [ref=e153]: + - generic [ref=e154]: Z + - generic [ref=e156]: + - generic [ref=e157]: "⚠️ Request failed: Request failed: Missing API key: No LLM provider configured. Set an API key (e.g. GROQ_API_KEY) and restart, configure a provider via the dashboard, or use Ollama for local models (no API key neede..." + - paragraph [ref=e158]: "Request failed: Request failed: Missing API key: No LLM provider configured. Set an API key (e.g. GROQ_API_KEY) and restart, configure a provider via the dashboard, or use Ollama for local models (no API key neede..." + - generic [ref=e160]: + - generic [ref=e161]: 用 + - generic [ref=e164]: 测试消息 2 + - generic [ref=e167]: Z + - generic [ref=e173]: + - generic [ref=e174]: + - button "添加附件" [ref=e175]: + - img [ref=e176] + - textbox "Agent 正在回复..." [disabled] [ref=e179] + - generic [ref=e180]: + - button "选择模型" [ref=e181]: + - generic [ref=e182]: glm-5 + - img [ref=e183] + - button "发送消息" [disabled] [ref=e185]: + - img [ref=e186] + - generic [ref=e188]: Agent 在本地运行,内容由 AI 生成 + - complementary [ref=e189]: + - generic [ref=e190]: + - generic [ref=e191]: + - generic [ref=e192]: + - img [ref=e193] + - generic [ref=e195]: "4" + - generic [ref=e196]: 当前消息 + - tablist [ref=e197]: + - tab "Status" [selected] [ref=e198]: + - img [ref=e199] + - tab "Files" [ref=e201]: + - img [ref=e202] + - tab "Agent" [ref=e205]: + - img [ref=e206] + - tab "Memory" [ref=e209]: + - img [ref=e210] + - generic [ref=e218]: + - generic [ref=e219]: + - generic [ref=e220]: + - generic [ref=e221]: + - img [ref=e222] + - generic [ref=e226]: Gateway Connected + - button "Refresh data" [ref=e227]: + - img [ref=e228] + - generic [ref=e233]: + - generic [ref=e234]: + - generic [ref=e235]: 地址 + - generic [ref=e236]: ws://127.0.0.1:50051/ws + - generic [ref=e237]: + - generic [ref=e238]: 当前模型 + - generic [ref=e239]: glm-5 + - generic [ref=e240]: + - heading "当前会话" [level=3] [ref=e241]: + - img [ref=e242] + - text: 当前会话 + - generic [ref=e244]: + - generic [ref=e245]: + - generic [ref=e246]: 用户消息 + - generic [ref=e247]: "2" + - generic [ref=e248]: + - generic [ref=e249]: 助手回复 + - generic [ref=e250]: "2" + - generic [ref=e251]: + - generic [ref=e252]: 工具调用 + - generic [ref=e253]: "0" + - generic [ref=e254]: + - generic [ref=e255]: 总消息数 + - generic [ref=e256]: "4" + - generic [ref=e257]: + - heading "分身状态" [level=3] [ref=e258]: + - img [ref=e259] + - text: 分身状态 + - generic [ref=e262]: + - generic [ref=e263]: + - img [ref=e265] + - generic [ref=e268]: trader-hand + - generic [ref=e269]: + - img [ref=e271] + - generic [ref=e274]: researcher + - generic [ref=e275]: + - img [ref=e277] + - generic [ref=e280]: browser-hand + - generic [ref=e281]: + - img [ref=e283] + - generic [ref=e286]: collector-hand + - generic [ref=e287]: + - img [ref=e289] + - generic [ref=e292]: researcher-hand + - paragraph [ref=e293]: +4 个分身 + - generic [ref=e294]: + - heading "用量统计" [level=3] [ref=e295]: + - img [ref=e296] + - text: 用量统计 + - generic [ref=e298]: + - generic [ref=e299]: + - generic [ref=e300]: 总会话数 + - generic [ref=e301]: "0" + - generic [ref=e302]: + - generic [ref=e303]: 总消息数 + - generic [ref=e304]: "0" + - generic [ref=e305]: + - generic [ref=e306]: 总 Token + - generic [ref=e307]: "0" + - generic [ref=e308]: + - heading "插件 (3)" [level=3] [ref=e309]: + - img [ref=e310] + - text: 插件 (3) + - generic [ref=e312]: + - generic [ref=e313]: + - generic [ref=e314]: Chat + - generic [ref=e315]: 运行中 + - generic [ref=e316]: + - generic [ref=e317]: Code + - generic [ref=e318]: 运行中 + - generic [ref=e319]: + - generic [ref=e320]: File + - generic [ref=e321]: 运行中 + - generic [ref=e322]: + - heading "运行概览" [level=3] [ref=e323]: + - img [ref=e324] + - text: 运行概览 + - generic [ref=e327]: + - generic [ref=e328]: + - generic [ref=e329]: 连接状态 + - generic [ref=e330]: 已连接 + - generic [ref=e331]: + - generic [ref=e332]: Gateway 版本 + - generic [ref=e333]: "-" + - generic [ref=e334]: + - generic [ref=e335]: 已加载分身 + - generic [ref=e336]: "9" + - generic [ref=e337]: + - generic [ref=e338]: 已加载插件 + - generic [ref=e339]: "3" +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/test-failed-1.png new file mode 100644 index 0000000..f5d6e37 Binary files /dev/null and b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/video.webm b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/video.webm new file mode 100644 index 0000000..056f6b8 Binary files /dev/null and b/desktop/test-results/functional-scenarios-11-性能与稳定性-11-4-长时间运行稳定性-chromium/video.webm differ diff --git a/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/error-context.md b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/error-context.md new file mode 100644 index 0000000..691d255 --- /dev/null +++ b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/error-context.md @@ -0,0 +1,246 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - tablist [ref=e5]: + - tab "分身" [selected] [ref=e6]: + - img [ref=e7] + - generic [ref=e10]: 分身 + - tab "Hands" [ref=e11]: + - img [ref=e12] + - generic [ref=e14]: Hands + - tab "工作流" [ref=e15]: + - img [ref=e16] + - generic [ref=e20]: 工作流 + - tab "团队" [ref=e21]: + - img [ref=e22] + - generic [ref=e27]: 团队 + - tab "协作" [ref=e28]: + - img [ref=e29] + - generic [ref=e33]: 协作 + - generic [ref=e37]: + - generic [ref=e38] [cursor=pointer]: + - img [ref=e40] + - generic [ref=e43]: + - generic [ref=e44]: + - generic [ref=e45]: trader-hand + - generic [ref=e46]: 当前 + - paragraph [ref=e47]: 新分身 + - button "删除": + - img + - generic [ref=e48] [cursor=pointer]: + - img [ref=e50] + - generic [ref=e53]: + - generic [ref=e55]: researcher + - paragraph [ref=e56]: 新分身 + - button "删除": + - img + - generic [ref=e57] [cursor=pointer]: + - img [ref=e59] + - generic [ref=e62]: + - generic [ref=e64]: browser-hand + - paragraph [ref=e65]: 新分身 + - button "删除": + - img + - generic [ref=e66] [cursor=pointer]: + - img [ref=e68] + - generic [ref=e71]: + - generic [ref=e73]: collector-hand + - paragraph [ref=e74]: 新分身 + - button "删除": + - img + - generic [ref=e75] [cursor=pointer]: + - img [ref=e77] + - generic [ref=e80]: + - generic [ref=e82]: researcher-hand + - paragraph [ref=e83]: 新分身 + - button "删除": + - img + - generic [ref=e84] [cursor=pointer]: + - img [ref=e86] + - generic [ref=e89]: + - generic [ref=e91]: lead-hand + - paragraph [ref=e92]: 新分身 + - button "删除": + - img + - generic [ref=e93] [cursor=pointer]: + - img [ref=e95] + - generic [ref=e98]: + - generic [ref=e100]: test-agent + - paragraph [ref=e101]: 新分身 + - button "删除": + - img + - generic [ref=e102] [cursor=pointer]: + - img [ref=e104] + - generic [ref=e107]: + - generic [ref=e109]: predictor-hand + - paragraph [ref=e110]: 新分身 + - button "删除": + - img + - generic [ref=e111] [cursor=pointer]: + - img [ref=e113] + - generic [ref=e116]: + - generic [ref=e118]: 测试助手 + - paragraph [ref=e119]: 新分身 + - button "删除": + - img + - generic [ref=e120] [cursor=pointer]: + - img [ref=e122] + - generic [ref=e125]: 创建新 Agent + - generic [ref=e127]: + - generic [ref=e128]: 用 + - generic [ref=e129]: 用户 + - button "打开设置" [ref=e130]: + - img [ref=e131] + - main [ref=e134]: + - generic [ref=e136]: + - heading "trader-hand" [level=2] [ref=e137] + - generic [ref=e138]: Gateway 已连接 + - generic [ref=e142]: + - generic [ref=e145]: 🦞 + - paragraph [ref=e147]: 你好! 我是 trader-hand。有什么我可以帮你的吗? + - generic [ref=e148]: + - generic [ref=e149]: + - img [ref=e150] + - generic [ref=e152]: 快速开始 + - button "💡 帮我写一个 Python 脚本处理 Excel 文件" [ref=e153]: + - generic [ref=e154]: 💡 + - generic [ref=e155]: 帮我写一个 Python 脚本处理 Excel 文件 + - img [ref=e156] + - button "📊 分析这个数据集的趋势和关键指标" [ref=e158]: + - generic [ref=e159]: 📊 + - generic [ref=e160]: 分析这个数据集的趋势和关键指标 + - img [ref=e161] + - button "✍️ 帮我起草一份产品需求文档" [ref=e163]: + - generic [ref=e164]: ✍️ + - generic [ref=e165]: 帮我起草一份产品需求文档 + - img [ref=e166] + - paragraph [ref=e168]: 发送消息开始对话,或点击上方建议 + - generic [ref=e170]: + - generic [ref=e171]: + - button "添加附件" [ref=e172]: + - img [ref=e173] + - textbox "发送给 trader-hand" [ref=e176] + - generic [ref=e177]: + - button "选择模型" [ref=e178]: + - generic [ref=e179]: glm-5 + - img [ref=e180] + - button "发送消息" [disabled] [ref=e182]: + - img [ref=e183] + - generic [ref=e185]: Agent 在本地运行,内容由 AI 生成 + - complementary [ref=e186]: + - generic [ref=e187]: + - generic [ref=e188]: + - generic [ref=e189]: + - img [ref=e190] + - generic [ref=e192]: "0" + - generic [ref=e193]: 当前消息 + - tablist [ref=e194]: + - tab "Status" [selected] [ref=e195]: + - img [ref=e196] + - tab "Files" [ref=e198]: + - img [ref=e199] + - tab "Agent" [ref=e202]: + - img [ref=e203] + - tab "Memory" [ref=e206]: + - img [ref=e207] + - generic [ref=e215]: + - generic [ref=e216]: + - generic [ref=e217]: + - generic [ref=e218]: + - img [ref=e219] + - generic [ref=e223]: Gateway Connected + - button "Refresh data" [ref=e224]: + - img [ref=e225] + - generic [ref=e230]: + - generic [ref=e231]: + - generic [ref=e232]: 地址 + - generic [ref=e233]: ws://127.0.0.1:50051/ws + - generic [ref=e234]: + - generic [ref=e235]: 当前模型 + - generic [ref=e236]: glm-5 + - generic [ref=e237]: + - heading "当前会话" [level=3] [ref=e238]: + - img [ref=e239] + - text: 当前会话 + - generic [ref=e241]: + - generic [ref=e242]: + - generic [ref=e243]: 用户消息 + - generic [ref=e244]: "0" + - generic [ref=e245]: + - generic [ref=e246]: 助手回复 + - generic [ref=e247]: "0" + - generic [ref=e248]: + - generic [ref=e249]: 工具调用 + - generic [ref=e250]: "0" + - generic [ref=e251]: + - generic [ref=e252]: 总消息数 + - generic [ref=e253]: "0" + - generic [ref=e254]: + - heading "分身状态" [level=3] [ref=e255]: + - img [ref=e256] + - text: 分身状态 + - generic [ref=e259]: + - generic [ref=e260]: + - img [ref=e262] + - generic [ref=e265]: trader-hand + - generic [ref=e266]: + - img [ref=e268] + - generic [ref=e271]: researcher + - generic [ref=e272]: + - img [ref=e274] + - generic [ref=e277]: browser-hand + - generic [ref=e278]: + - img [ref=e280] + - generic [ref=e283]: collector-hand + - generic [ref=e284]: + - img [ref=e286] + - generic [ref=e289]: researcher-hand + - paragraph [ref=e290]: +4 个分身 + - generic [ref=e291]: + - heading "用量统计" [level=3] [ref=e292]: + - img [ref=e293] + - text: 用量统计 + - generic [ref=e295]: + - generic [ref=e296]: + - generic [ref=e297]: 总会话数 + - generic [ref=e298]: "0" + - generic [ref=e299]: + - generic [ref=e300]: 总消息数 + - generic [ref=e301]: "0" + - generic [ref=e302]: + - generic [ref=e303]: 总 Token + - generic [ref=e304]: "0" + - generic [ref=e305]: + - heading "插件 (3)" [level=3] [ref=e306]: + - img [ref=e307] + - text: 插件 (3) + - generic [ref=e309]: + - generic [ref=e310]: + - generic [ref=e311]: Chat + - generic [ref=e312]: 运行中 + - generic [ref=e313]: + - generic [ref=e314]: Code + - generic [ref=e315]: 运行中 + - generic [ref=e316]: + - generic [ref=e317]: File + - generic [ref=e318]: 运行中 + - generic [ref=e319]: + - heading "运行概览" [level=3] [ref=e320]: + - img [ref=e321] + - text: 运行概览 + - generic [ref=e324]: + - generic [ref=e325]: + - generic [ref=e326]: 连接状态 + - generic [ref=e327]: 已连接 + - generic [ref=e328]: + - generic [ref=e329]: Gateway 版本 + - generic [ref=e330]: "-" + - generic [ref=e331]: + - generic [ref=e332]: 已加载分身 + - generic [ref=e333]: "9" + - generic [ref=e334]: + - generic [ref=e335]: 已加载插件 + - generic [ref=e336]: "3" +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/test-failed-1.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/video.webm b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/video.webm new file mode 100644 index 0000000..c54e6ef Binary files /dev/null and b/desktop/test-results/functional-scenarios-3-Agent-分身管理-3-1-分身列表显示-chromium/video.webm differ diff --git a/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/error-context.md b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/error-context.md new file mode 100644 index 0000000..691d255 --- /dev/null +++ b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/error-context.md @@ -0,0 +1,246 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - tablist [ref=e5]: + - tab "分身" [selected] [ref=e6]: + - img [ref=e7] + - generic [ref=e10]: 分身 + - tab "Hands" [ref=e11]: + - img [ref=e12] + - generic [ref=e14]: Hands + - tab "工作流" [ref=e15]: + - img [ref=e16] + - generic [ref=e20]: 工作流 + - tab "团队" [ref=e21]: + - img [ref=e22] + - generic [ref=e27]: 团队 + - tab "协作" [ref=e28]: + - img [ref=e29] + - generic [ref=e33]: 协作 + - generic [ref=e37]: + - generic [ref=e38] [cursor=pointer]: + - img [ref=e40] + - generic [ref=e43]: + - generic [ref=e44]: + - generic [ref=e45]: trader-hand + - generic [ref=e46]: 当前 + - paragraph [ref=e47]: 新分身 + - button "删除": + - img + - generic [ref=e48] [cursor=pointer]: + - img [ref=e50] + - generic [ref=e53]: + - generic [ref=e55]: researcher + - paragraph [ref=e56]: 新分身 + - button "删除": + - img + - generic [ref=e57] [cursor=pointer]: + - img [ref=e59] + - generic [ref=e62]: + - generic [ref=e64]: browser-hand + - paragraph [ref=e65]: 新分身 + - button "删除": + - img + - generic [ref=e66] [cursor=pointer]: + - img [ref=e68] + - generic [ref=e71]: + - generic [ref=e73]: collector-hand + - paragraph [ref=e74]: 新分身 + - button "删除": + - img + - generic [ref=e75] [cursor=pointer]: + - img [ref=e77] + - generic [ref=e80]: + - generic [ref=e82]: researcher-hand + - paragraph [ref=e83]: 新分身 + - button "删除": + - img + - generic [ref=e84] [cursor=pointer]: + - img [ref=e86] + - generic [ref=e89]: + - generic [ref=e91]: lead-hand + - paragraph [ref=e92]: 新分身 + - button "删除": + - img + - generic [ref=e93] [cursor=pointer]: + - img [ref=e95] + - generic [ref=e98]: + - generic [ref=e100]: test-agent + - paragraph [ref=e101]: 新分身 + - button "删除": + - img + - generic [ref=e102] [cursor=pointer]: + - img [ref=e104] + - generic [ref=e107]: + - generic [ref=e109]: predictor-hand + - paragraph [ref=e110]: 新分身 + - button "删除": + - img + - generic [ref=e111] [cursor=pointer]: + - img [ref=e113] + - generic [ref=e116]: + - generic [ref=e118]: 测试助手 + - paragraph [ref=e119]: 新分身 + - button "删除": + - img + - generic [ref=e120] [cursor=pointer]: + - img [ref=e122] + - generic [ref=e125]: 创建新 Agent + - generic [ref=e127]: + - generic [ref=e128]: 用 + - generic [ref=e129]: 用户 + - button "打开设置" [ref=e130]: + - img [ref=e131] + - main [ref=e134]: + - generic [ref=e136]: + - heading "trader-hand" [level=2] [ref=e137] + - generic [ref=e138]: Gateway 已连接 + - generic [ref=e142]: + - generic [ref=e145]: 🦞 + - paragraph [ref=e147]: 你好! 我是 trader-hand。有什么我可以帮你的吗? + - generic [ref=e148]: + - generic [ref=e149]: + - img [ref=e150] + - generic [ref=e152]: 快速开始 + - button "💡 帮我写一个 Python 脚本处理 Excel 文件" [ref=e153]: + - generic [ref=e154]: 💡 + - generic [ref=e155]: 帮我写一个 Python 脚本处理 Excel 文件 + - img [ref=e156] + - button "📊 分析这个数据集的趋势和关键指标" [ref=e158]: + - generic [ref=e159]: 📊 + - generic [ref=e160]: 分析这个数据集的趋势和关键指标 + - img [ref=e161] + - button "✍️ 帮我起草一份产品需求文档" [ref=e163]: + - generic [ref=e164]: ✍️ + - generic [ref=e165]: 帮我起草一份产品需求文档 + - img [ref=e166] + - paragraph [ref=e168]: 发送消息开始对话,或点击上方建议 + - generic [ref=e170]: + - generic [ref=e171]: + - button "添加附件" [ref=e172]: + - img [ref=e173] + - textbox "发送给 trader-hand" [ref=e176] + - generic [ref=e177]: + - button "选择模型" [ref=e178]: + - generic [ref=e179]: glm-5 + - img [ref=e180] + - button "发送消息" [disabled] [ref=e182]: + - img [ref=e183] + - generic [ref=e185]: Agent 在本地运行,内容由 AI 生成 + - complementary [ref=e186]: + - generic [ref=e187]: + - generic [ref=e188]: + - generic [ref=e189]: + - img [ref=e190] + - generic [ref=e192]: "0" + - generic [ref=e193]: 当前消息 + - tablist [ref=e194]: + - tab "Status" [selected] [ref=e195]: + - img [ref=e196] + - tab "Files" [ref=e198]: + - img [ref=e199] + - tab "Agent" [ref=e202]: + - img [ref=e203] + - tab "Memory" [ref=e206]: + - img [ref=e207] + - generic [ref=e215]: + - generic [ref=e216]: + - generic [ref=e217]: + - generic [ref=e218]: + - img [ref=e219] + - generic [ref=e223]: Gateway Connected + - button "Refresh data" [ref=e224]: + - img [ref=e225] + - generic [ref=e230]: + - generic [ref=e231]: + - generic [ref=e232]: 地址 + - generic [ref=e233]: ws://127.0.0.1:50051/ws + - generic [ref=e234]: + - generic [ref=e235]: 当前模型 + - generic [ref=e236]: glm-5 + - generic [ref=e237]: + - heading "当前会话" [level=3] [ref=e238]: + - img [ref=e239] + - text: 当前会话 + - generic [ref=e241]: + - generic [ref=e242]: + - generic [ref=e243]: 用户消息 + - generic [ref=e244]: "0" + - generic [ref=e245]: + - generic [ref=e246]: 助手回复 + - generic [ref=e247]: "0" + - generic [ref=e248]: + - generic [ref=e249]: 工具调用 + - generic [ref=e250]: "0" + - generic [ref=e251]: + - generic [ref=e252]: 总消息数 + - generic [ref=e253]: "0" + - generic [ref=e254]: + - heading "分身状态" [level=3] [ref=e255]: + - img [ref=e256] + - text: 分身状态 + - generic [ref=e259]: + - generic [ref=e260]: + - img [ref=e262] + - generic [ref=e265]: trader-hand + - generic [ref=e266]: + - img [ref=e268] + - generic [ref=e271]: researcher + - generic [ref=e272]: + - img [ref=e274] + - generic [ref=e277]: browser-hand + - generic [ref=e278]: + - img [ref=e280] + - generic [ref=e283]: collector-hand + - generic [ref=e284]: + - img [ref=e286] + - generic [ref=e289]: researcher-hand + - paragraph [ref=e290]: +4 个分身 + - generic [ref=e291]: + - heading "用量统计" [level=3] [ref=e292]: + - img [ref=e293] + - text: 用量统计 + - generic [ref=e295]: + - generic [ref=e296]: + - generic [ref=e297]: 总会话数 + - generic [ref=e298]: "0" + - generic [ref=e299]: + - generic [ref=e300]: 总消息数 + - generic [ref=e301]: "0" + - generic [ref=e302]: + - generic [ref=e303]: 总 Token + - generic [ref=e304]: "0" + - generic [ref=e305]: + - heading "插件 (3)" [level=3] [ref=e306]: + - img [ref=e307] + - text: 插件 (3) + - generic [ref=e309]: + - generic [ref=e310]: + - generic [ref=e311]: Chat + - generic [ref=e312]: 运行中 + - generic [ref=e313]: + - generic [ref=e314]: Code + - generic [ref=e315]: 运行中 + - generic [ref=e316]: + - generic [ref=e317]: File + - generic [ref=e318]: 运行中 + - generic [ref=e319]: + - heading "运行概览" [level=3] [ref=e320]: + - img [ref=e321] + - text: 运行概览 + - generic [ref=e324]: + - generic [ref=e325]: + - generic [ref=e326]: 连接状态 + - generic [ref=e327]: 已连接 + - generic [ref=e328]: + - generic [ref=e329]: Gateway 版本 + - generic [ref=e330]: "-" + - generic [ref=e331]: + - generic [ref=e332]: 已加载分身 + - generic [ref=e333]: "9" + - generic [ref=e334]: + - generic [ref=e335]: 已加载插件 + - generic [ref=e336]: "3" +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/test-failed-1.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/video.webm b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/video.webm new file mode 100644 index 0000000..2e8c5ff Binary files /dev/null and b/desktop/test-results/functional-scenarios-4-Hands-系统-4-1-Hands-列表显示-chromium/video.webm differ diff --git a/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/error-context.md b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/error-context.md new file mode 100644 index 0000000..094c1da --- /dev/null +++ b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/error-context.md @@ -0,0 +1,89 @@ +# Page snapshot + +```yaml +- generic [ref=e3]: + - complementary [ref=e4]: + - button "返回应用" [ref=e6]: + - img [ref=e7] + - generic [ref=e9]: 返回应用 + - navigation [ref=e10]: + - button "通用" [ref=e11]: + - img [ref=e12] + - generic [ref=e15]: 通用 + - button "用量统计" [ref=e16]: + - img [ref=e17] + - generic [ref=e19]: 用量统计 + - button "积分详情" [ref=e20]: + - img [ref=e21] + - generic [ref=e26]: 积分详情 + - button "模型与 API" [ref=e27]: + - img [ref=e28] + - generic [ref=e31]: 模型与 API + - button "MCP 服务" [ref=e32]: + - img [ref=e33] + - generic [ref=e35]: MCP 服务 + - button "技能" [ref=e36]: + - img [ref=e37] + - generic [ref=e39]: 技能 + - button "IM 频道" [ref=e40]: + - img [ref=e41] + - generic [ref=e43]: IM 频道 + - button "工作区" [ref=e44]: + - img [ref=e45] + - generic [ref=e47]: 工作区 + - button "数据与隐私" [ref=e48]: + - img [ref=e49] + - generic [ref=e51]: 数据与隐私 + - button "安全状态" [ref=e52]: + - img [ref=e53] + - generic [ref=e55]: 安全状态 + - button "审计日志" [ref=e56]: + - img [ref=e57] + - generic [ref=e60]: 审计日志 + - button "定时任务" [ref=e61]: + - img [ref=e62] + - generic [ref=e65]: 定时任务 + - button "提交反馈" [ref=e66]: + - img [ref=e67] + - generic [ref=e70]: 提交反馈 + - button "关于" [ref=e71]: + - img [ref=e72] + - generic [ref=e74]: 关于 + - main [ref=e75]: + - generic [ref=e76]: + - heading "通用设置" [level=1] [ref=e77] + - heading "Gateway 连接" [level=2] [ref=e78] + - generic [ref=e79]: + - generic [ref=e80]: + - generic [ref=e81]: 状态 + - generic [ref=e84]: 已连接 + - generic [ref=e85]: + - generic [ref=e86]: 地址 + - generic [ref=e87]: ws://127.0.0.1:50051 + - generic [ref=e88]: + - generic [ref=e89]: Token + - textbox "可选:Gateway auth token" [ref=e90] + - generic [ref=e91]: + - generic [ref=e92]: 当前模型 + - generic [ref=e93]: glm-5 + - button "断开连接" [ref=e95] + - heading "外观与行为" [level=2] [ref=e96] + - generic [ref=e97]: + - generic [ref=e98]: + - generic [ref=e99]: + - generic [ref=e100]: 主题模式 + - generic [ref=e101]: 选择浅色或深色模式。 + - generic [ref=e102]: + - button [ref=e103] + - button [ref=e104] + - generic [ref=e105]: + - generic [ref=e106]: + - generic [ref=e107]: 开机自启 + - generic [ref=e108]: 登录时自动启动 ZCLAW。 + - button [ref=e109] + - generic [ref=e111]: + - generic [ref=e112]: + - generic [ref=e113]: 显示工具调用 + - generic [ref=e114]: 在对话消息中显示模型的工具调用详情块。 + - button [ref=e115] +``` \ No newline at end of file diff --git a/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/test-failed-1.png b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/test-failed-1.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/test-failed-1.png differ diff --git a/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/video.webm b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/video.webm new file mode 100644 index 0000000..17db473 Binary files /dev/null and b/desktop/test-results/functional-scenarios-8-设置页面-8-3-模型配置-chromium/video.webm differ diff --git a/desktop/test-results/screenshots/01-app-layout.png b/desktop/test-results/screenshots/01-app-layout.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/01-app-layout.png differ diff --git a/desktop/test-results/screenshots/02-connection-state.png b/desktop/test-results/screenshots/02-connection-state.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/02-connection-state.png differ diff --git a/desktop/test-results/screenshots/02-sidebar-navigation.png b/desktop/test-results/screenshots/02-sidebar-navigation.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/02-sidebar-navigation.png differ diff --git a/desktop/test-results/screenshots/03-chat-input.png b/desktop/test-results/screenshots/03-chat-input.png new file mode 100644 index 0000000..d452756 Binary files /dev/null and b/desktop/test-results/screenshots/03-chat-input.png differ diff --git a/desktop/test-results/screenshots/03-navigation-switch.png b/desktop/test-results/screenshots/03-navigation-switch.png new file mode 100644 index 0000000..f7dfb18 Binary files /dev/null and b/desktop/test-results/screenshots/03-navigation-switch.png differ diff --git a/desktop/test-results/screenshots/04-chat-response.png b/desktop/test-results/screenshots/04-chat-response.png new file mode 100644 index 0000000..10417a6 Binary files /dev/null and b/desktop/test-results/screenshots/04-chat-response.png differ diff --git a/desktop/test-results/screenshots/04-settings-access.png b/desktop/test-results/screenshots/04-settings-access.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/04-settings-access.png differ diff --git a/desktop/test-results/screenshots/05-chat-area.png b/desktop/test-results/screenshots/05-chat-area.png new file mode 100644 index 0000000..1d548e2 Binary files /dev/null and b/desktop/test-results/screenshots/05-chat-area.png differ diff --git a/desktop/test-results/screenshots/06-message-send.png b/desktop/test-results/screenshots/06-message-send.png new file mode 100644 index 0000000..2f8df63 Binary files /dev/null and b/desktop/test-results/screenshots/06-message-send.png differ diff --git a/desktop/test-results/screenshots/07-conversation-list.png b/desktop/test-results/screenshots/07-conversation-list.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/07-conversation-list.png differ diff --git a/desktop/test-results/screenshots/07-streaming-response.png b/desktop/test-results/screenshots/07-streaming-response.png new file mode 100644 index 0000000..586abe2 Binary files /dev/null and b/desktop/test-results/screenshots/07-streaming-response.png differ diff --git a/desktop/test-results/screenshots/08-hands-list.png b/desktop/test-results/screenshots/08-hands-list.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/08-hands-list.png differ diff --git a/desktop/test-results/screenshots/08-offline-error.png b/desktop/test-results/screenshots/08-offline-error.png new file mode 100644 index 0000000..279ceb1 Binary files /dev/null and b/desktop/test-results/screenshots/08-offline-error.png differ diff --git a/desktop/test-results/screenshots/10-scheduler-panel.png b/desktop/test-results/screenshots/10-scheduler-panel.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/10-scheduler-panel.png differ diff --git a/desktop/test-results/screenshots/12-team-view.png b/desktop/test-results/screenshots/12-team-view.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/12-team-view.png differ diff --git a/desktop/test-results/screenshots/13-swarm-dashboard.png b/desktop/test-results/screenshots/13-swarm-dashboard.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/13-swarm-dashboard.png differ diff --git a/desktop/test-results/screenshots/14-settings-page.png b/desktop/test-results/screenshots/14-settings-page.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/14-settings-page.png differ diff --git a/desktop/test-results/screenshots/15-general-settings.png b/desktop/test-results/screenshots/15-general-settings.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/15-general-settings.png differ diff --git a/desktop/test-results/screenshots/16-model-settings.png b/desktop/test-results/screenshots/16-model-settings.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/16-model-settings.png differ diff --git a/desktop/test-results/screenshots/17-right-panel.png b/desktop/test-results/screenshots/17-right-panel.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/17-right-panel.png differ diff --git a/desktop/test-results/screenshots/17-workflow-list.png b/desktop/test-results/screenshots/17-workflow-list.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/17-workflow-list.png differ diff --git a/desktop/test-results/screenshots/18-offline-error.png b/desktop/test-results/screenshots/18-offline-error.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/18-offline-error.png differ diff --git a/desktop/test-results/screenshots/18-workflow-create.png b/desktop/test-results/screenshots/18-workflow-create.png new file mode 100644 index 0000000..1274e56 Binary files /dev/null and b/desktop/test-results/screenshots/18-workflow-create.png differ diff --git a/desktop/test-results/screenshots/20-mobile-layout.png b/desktop/test-results/screenshots/20-mobile-layout.png new file mode 100644 index 0000000..77c4e3d Binary files /dev/null and b/desktop/test-results/screenshots/20-mobile-layout.png differ diff --git a/desktop/test-results/screenshots/21-tablet-layout.png b/desktop/test-results/screenshots/21-tablet-layout.png new file mode 100644 index 0000000..396795e Binary files /dev/null and b/desktop/test-results/screenshots/21-tablet-layout.png differ diff --git a/desktop/test-results/screenshots/21-team-list.png b/desktop/test-results/screenshots/21-team-list.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/21-team-list.png differ diff --git a/desktop/test-results/screenshots/22-desktop-layout.png b/desktop/test-results/screenshots/22-desktop-layout.png new file mode 100644 index 0000000..7618cc5 Binary files /dev/null and b/desktop/test-results/screenshots/22-desktop-layout.png differ diff --git a/desktop/test-results/screenshots/24-swarm-dashboard.png b/desktop/test-results/screenshots/24-swarm-dashboard.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/24-swarm-dashboard.png differ diff --git a/desktop/test-results/screenshots/27-settings-page.png b/desktop/test-results/screenshots/27-settings-page.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/27-settings-page.png differ diff --git a/desktop/test-results/screenshots/28-general-settings.png b/desktop/test-results/screenshots/28-general-settings.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/28-general-settings.png differ diff --git a/desktop/test-results/screenshots/30-gateway-settings.png b/desktop/test-results/screenshots/30-gateway-settings.png new file mode 100644 index 0000000..dae5e58 Binary files /dev/null and b/desktop/test-results/screenshots/30-gateway-settings.png differ diff --git a/desktop/test-results/screenshots/32-right-panel.png b/desktop/test-results/screenshots/32-right-panel.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/32-right-panel.png differ diff --git a/desktop/test-results/screenshots/35-first-time-user.png b/desktop/test-results/screenshots/35-first-time-user.png new file mode 100644 index 0000000..a798ec2 Binary files /dev/null and b/desktop/test-results/screenshots/35-first-time-user.png differ diff --git a/desktop/test-results/screenshots/37-view-switching.png b/desktop/test-results/screenshots/37-view-switching.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/37-view-switching.png differ diff --git a/desktop/test-results/screenshots/38-session-persistence.png b/desktop/test-results/screenshots/38-session-persistence.png new file mode 100644 index 0000000..e8e1564 Binary files /dev/null and b/desktop/test-results/screenshots/38-session-persistence.png differ diff --git a/desktop/test-results/screenshots/39-rapid-switching.png b/desktop/test-results/screenshots/39-rapid-switching.png new file mode 100644 index 0000000..f872849 Binary files /dev/null and b/desktop/test-results/screenshots/39-rapid-switching.png differ diff --git a/desktop/test-results/screenshots/41-keyboard-nav.png b/desktop/test-results/screenshots/41-keyboard-nav.png new file mode 100644 index 0000000..a4fc7c5 Binary files /dev/null and b/desktop/test-results/screenshots/41-keyboard-nav.png differ diff --git a/desktop/tests/e2e/KNOWN_ISSUES.md b/desktop/tests/e2e/KNOWN_ISSUES.md new file mode 100644 index 0000000..035d465 --- /dev/null +++ b/desktop/tests/e2e/KNOWN_ISSUES.md @@ -0,0 +1,209 @@ +# E2E 测试已知问题与修复指南 + +> 最后更新: 2026-03-17 +> 测试通过率: 88% (65/74) + +## 当前状态 + +### 测试结果摘要 +- **总测试**: 74 +- **通过**: 65 +- **失败**: 9 + +### 快速运行测试命令 +```bash +cd g:/ZClaw_openfang/desktop + +# 运行全部测试 +pnpm exec playwright test --config=tests/e2e/playwright.config.ts --reporter=list + +# 仅运行 app-verification (全部通过) +pnpm exec playwright test --config=tests/e2e/playwright.config.ts tests/e2e/specs/app-verification.spec.ts --reporter=list + +# 仅运行 functional-scenarios +pnpm exec playwright test --config=tests/e2e/playwright.config.ts tests/e2e/specs/functional-scenarios.spec.ts --reporter=list +``` + +--- + +## 问题 1: 聊天输入禁用问题 + +### 现象 +测试在尝试填写聊天输入框时失败,因为 Agent 正在回复中 (`isStreaming=true`),导致输入框被禁用。 + +### 错误信息 +``` +locator resolved to