refactor(skills): add skill-adapter and refactor SkillMarket

- Add skill-adapter.ts to bridge configStore and UI skill formats
- Refactor SkillMarket to use new skill-adapter instead of skill-discovery
- Add health check state to connectionStore
- Update multiple components with improved typing
- Clean up test artifacts and add new test results
- Update README and add skill-market-mvp plan

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-21 00:28:03 +08:00
parent 54ccc0a7b0
commit 48a430fc97
50 changed files with 1523 additions and 360 deletions

View File

@@ -1,61 +1,68 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
const useGatewayStoreMock = vi.fn();
const useChatStoreMock = vi.fn();
const getStoredGatewayTokenMock = vi.fn(() => 'stored-token');
const setStoredGatewayTokenMock = vi.fn();
const mockConnectionState = { value: 'connected' as const };
const mockQuickConfig = {
value: {
gatewayUrl: 'ws://127.0.0.1:50051',
gatewayToken: '',
theme: 'light' as const,
autoStart: false,
showToolCalls: false,
},
};
vi.mock('../../desktop/src/store/gatewayStore', () => ({
useGatewayStore: () => useGatewayStoreMock(),
const connectMock = vi.fn(async () => {});
const disconnectMock = vi.fn();
const saveQuickConfigMock = vi.fn(async () => {});
// Mock connectionStore with selector pattern
vi.mock('../../desktop/src/store/connectionStore', () => ({
useConnectionStore: vi.fn((selector) => {
const state = {
connectionState: mockConnectionState.value,
connect: connectMock,
disconnect: disconnectMock,
};
return selector ? selector(state) : state;
}),
}));
// Mock configStore with selector pattern
vi.mock('../../desktop/src/store/configStore', () => ({
useConfigStore: vi.fn((selector) => {
const state = {
quickConfig: mockQuickConfig.value,
saveQuickConfig: saveQuickConfigMock,
};
return selector ? selector(state) : state;
}),
}));
// Mock chatStore with selector pattern
vi.mock('../../desktop/src/store/chatStore', () => ({
useChatStore: () => useChatStoreMock(),
useChatStore: vi.fn((selector) => {
const state = {
currentModel: 'glm-5',
};
return selector ? selector(state) : state;
}),
}));
vi.mock('../../desktop/src/lib/gateway-client', () => ({
getStoredGatewayToken: () => getStoredGatewayTokenMock(),
setStoredGatewayToken: (token: string) => setStoredGatewayTokenMock(token),
getStoredGatewayToken: () => 'stored-token',
setStoredGatewayToken: vi.fn(),
}));
describe('General settings gateway connection', () => {
let connectMock: ReturnType<typeof vi.fn>;
let disconnectMock: ReturnType<typeof vi.fn>;
let saveQuickConfigMock: ReturnType<typeof vi.fn>;
beforeEach(() => {
vi.clearAllMocks();
connectMock = vi.fn(async () => {});
disconnectMock = vi.fn();
saveQuickConfigMock = vi.fn(async () => {});
useGatewayStoreMock.mockReturnValue({
connectionState: 'connected',
gatewayVersion: '2026.3.11',
error: null,
quickConfig: {
gatewayUrl: 'ws://127.0.0.1:50051',
gatewayToken: '',
theme: 'light',
autoStart: false,
showToolCalls: false,
},
connect: connectMock,
disconnect: disconnectMock,
saveQuickConfig: saveQuickConfigMock,
});
useChatStoreMock.mockReturnValue({
currentModel: 'glm-5',
});
mockConnectionState.value = 'connected';
});
it('renders gateway connection settings and displays connection status', async () => {
const reactModule = 'react';
const reactDomClientModule = 'react-dom/client';
const [{ act, createElement }, { createRoot }, { General }] = await Promise.all([
import(reactModule),
import(reactDomClientModule),
import('react'),
import('react-dom/client'),
import('../../desktop/src/components/Settings/General'),
]);
@@ -73,7 +80,6 @@ describe('General settings gateway connection', () => {
expect(container.textContent).toContain('Gateway 连接');
expect(container.textContent).toContain('已连接');
expect(container.textContent).toContain('ws://127.0.0.1:50051');
expect(container.textContent).toContain('2026.3.11');
expect(container.textContent).toContain('glm-5');
expect(container.textContent).toContain('断开连接');
@@ -90,21 +96,7 @@ describe('General settings gateway connection', () => {
});
it('displays disconnected state when not connected', async () => {
useGatewayStoreMock.mockReturnValue({
connectionState: 'disconnected',
gatewayVersion: null,
error: null,
quickConfig: {
gatewayUrl: 'ws://127.0.0.1:50051',
gatewayToken: '',
theme: 'light',
autoStart: false,
showToolCalls: false,
},
connect: connectMock,
disconnect: disconnectMock,
saveQuickConfig: saveQuickConfigMock,
});
mockConnectionState.value = 'disconnected';
const [{ act, createElement }, { createRoot }, { General }] = await Promise.all([
import('react'),