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 (
+
+ );
+}
+
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