feat: account management overhaul + 7 issue resolutions (#147)
- Add smart JSON export/import with schema validation and deduplication - Add per-account proxy configurations (Issue #79) - Add advanced account sorting engine (Issues #126 & #99) - Add compact horizontal layout, AI credits, inline model visibility (Issues #145 & #134) - Add desktop push notifications for low quota (Issue #53) - Fix Arch Linux AUR process detection bug (Issue #117) - Default theme set to Dark Mode (it's better) - UI Polishing: Improved sort dropdown and symmetrical dialog layouts - Dev Mode: Resolved port conflicts and single-instance locks - Updated README and README.zh-CN with new features
This commit is contained in:
37 files changed
+1989
-455
No files matched your search
@@ -72,9 +72,11 @@ describe('Parity rollout guard replay', () => {
|
||||
preferred_account_id: 'acc-2',
|
||||
}),
|
||||
);
|
||||
(service as any).currentIndex = 0;
|
||||
service.resetSelectionState();
|
||||
const rollbackSelected = await service.getNextToken({ model: 'gemini-2.5-flash' });
|
||||
expect(rollbackSelected?.id).toBe('acc-1');
|
||||
// Verify that shadow comparison was bypassed due to kill-switch
|
||||
expect((service as any).shadowComparisonCount).toBe(0);
|
||||
});
|
||||
|
||||
it('enforces no-go threshold after shadow mismatch and blocks parity enablement', async () => {
|
||||
@@ -98,9 +100,9 @@ describe('Parity rollout guard replay', () => {
|
||||
preferred_account_id: 'acc-2',
|
||||
}),
|
||||
);
|
||||
(service as any).currentIndex = 0;
|
||||
service.resetSelectionState();
|
||||
const blockedSelection = await service.getNextToken({ model: 'gemini-2.5-flash' });
|
||||
expect(blockedSelection?.id).toBe('acc-1');
|
||||
expect((service as any).noGoBlocked).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -260,8 +260,12 @@ describe('ProxyController Integration', () => {
|
||||
);
|
||||
|
||||
const callArg = proxyService.handleChatCompletions.mock.calls[0][0];
|
||||
const assistantMessage = callArg.messages.find((message: { role: string }) => message.role === 'assistant');
|
||||
const toolMessage = callArg.messages.find((message: { role: string }) => message.role === 'tool');
|
||||
const assistantMessage = callArg.messages.find(
|
||||
(message: { role: string }) => message.role === 'assistant',
|
||||
);
|
||||
const toolMessage = callArg.messages.find(
|
||||
(message: { role: string }) => message.role === 'tool',
|
||||
);
|
||||
|
||||
expect(assistantMessage?.tool_calls?.[0]?.function?.name).toBe('builtin_web_search');
|
||||
expect(toolMessage?.name).toBe('builtin_web_search');
|
||||
|
||||
Reference in new issue
Block a user