refactor(startup): simplify stack to Tauri-managed OpenFang + optional ChromeDriver

- Remove OpenFang CLI dependency from startup scripts
- OpenFang now bundled with Tauri and managed via gateway_start/gateway_status commands
- Add bootstrap screen in App.tsx to auto-start local gateway before UI loads
- Update Makefile: replace start-no-gateway with start-desktop-only
- Fix gateway config endpoints: use /api/config instead of /api/config/quick
- Add Playwright dependencies for future E2E testing
This commit is contained in:
iven
2026-03-17 14:08:03 +08:00
parent 6c6d21400c
commit 74dbf42644
81 changed files with 5729 additions and 128 deletions

View File

@@ -1086,7 +1086,28 @@ export class GatewayClient {
}
async getQuickConfig(): Promise<any> {
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<string, any>): Promise<any> {
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<any> {
return this.restGet('/api/skills');