Refactor clawx (#344)

Co-authored-by: ashione <skyzlxuan@gmail.com>
This commit is contained in:
paisley
2026-03-09 13:10:42 +08:00
committed by GitHub
Unverified
parent 3d804a9f5e
commit 2c5c82bb74
75 changed files with 7640 additions and 3106 deletions

View File

@@ -72,13 +72,12 @@ describe('provider metadata', () => {
);
});
it('only exposes OpenRouter and SiliconFlow model overrides in developer mode', () => {
it('exposes OpenRouter model overrides by default and keeps SiliconFlow developer-only', () => {
const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter');
const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow');
expect(openrouter).toMatchObject({
showModelId: true,
showModelIdInDevModeOnly: true,
defaultModelId: 'anthropic/claude-opus-4.6',
});
expect(siliconflow).toMatchObject({
@@ -87,23 +86,24 @@ describe('provider metadata', () => {
defaultModelId: 'deepseek-ai/DeepSeek-V3',
});
expect(shouldShowProviderModelId(openrouter, false)).toBe(false);
expect(shouldShowProviderModelId(openrouter, false)).toBe(true);
expect(shouldShowProviderModelId(siliconflow, false)).toBe(false);
expect(shouldShowProviderModelId(openrouter, true)).toBe(true);
expect(shouldShowProviderModelId(siliconflow, true)).toBe(true);
});
it('only saves OpenRouter and SiliconFlow model overrides in developer mode', () => {
it('saves OpenRouter model overrides by default and keeps SiliconFlow developer-only', () => {
const openrouter = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'openrouter');
const siliconflow = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'siliconflow');
const ark = PROVIDER_TYPE_INFO.find((provider) => provider.id === 'ark');
expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', false)).toBeUndefined();
expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', false)).toBe('openai/gpt-5');
expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', false)).toBeUndefined();
expect(resolveProviderModelForSave(openrouter, 'openai/gpt-5', true)).toBe('openai/gpt-5');
expect(resolveProviderModelForSave(siliconflow, 'Qwen/Qwen3-Coder-480B-A35B-Instruct', true)).toBe('Qwen/Qwen3-Coder-480B-A35B-Instruct');
expect(resolveProviderModelForSave(openrouter, ' ', false)).toBe('anthropic/claude-opus-4.6');
expect(resolveProviderModelForSave(openrouter, ' ', true)).toBe('anthropic/claude-opus-4.6');
expect(resolveProviderModelForSave(siliconflow, ' ', true)).toBe('deepseek-ai/DeepSeek-V3');
expect(resolveProviderModelForSave(ark, ' ep-custom-model ', false)).toBe('ep-custom-model');

View File

@@ -1,7 +1,7 @@
/**
* Zustand Stores Tests
*/
import { describe, it, expect, beforeEach } from 'vitest';
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { useSettingsStore } from '@/stores/settings';
import { useGatewayStore } from '@/stores/gateway';
@@ -72,4 +72,14 @@ describe('Gateway Store', () => {
expect(state.status.state).toBe('running');
expect(state.status.pid).toBe(12345);
});
it('should proxy gateway rpc through ipc', async () => {
const invoke = vi.mocked(window.electron.ipcRenderer.invoke);
invoke.mockResolvedValueOnce({ success: true, result: { ok: true } });
const result = await useGatewayStore.getState().rpc<{ ok: boolean }>('chat.history', { limit: 10 }, 5000);
expect(result.ok).toBe(true);
expect(invoke).toHaveBeenCalledWith('gateway:rpc', 'chat.history', { limit: 10 }, 5000);
});
});