Files
2026-07-13 13:20:22 +08:00

171 lines
4.5 KiB
TypeScript

/**
* @license
* Copyright 2025 AionUi (aionui.com)
* SPDX-License-Identifier: Apache-2.0
*/
import { describe, expect, it } from 'vitest';
import { resolveGuidAssistantDefaults } from '@/renderer/pages/guid/utils/assistantDefaults';
import type { AssistantDetail } from '@/common/types/agent/assistantTypes';
const buildDetail = (
overrides: Partial<AssistantDetail['defaults']> = {},
preferences?: Partial<AssistantDetail['preferences']>
): AssistantDetail =>
({
id: 'assistant-1',
source: 'user',
profile: {
name: 'Writer',
name_i18n: {},
description: 'desc',
description_i18n: {},
avatar: '🤖',
},
state: {
enabled: true,
sort_order: 1,
},
engine: {
agent_backend: 'aionrs',
},
rules: {
content: '',
storage_mode: 'user_file',
},
prompts: {
recommended: [],
recommended_i18n: {},
},
defaults: {
model: { mode: 'auto' },
permission: { mode: 'auto' },
thought_level: { mode: 'auto' },
skills: { mode: 'fixed', value: [] },
mcps: { mode: 'auto', value: [] },
...overrides,
},
capabilities: {
default_skill_ids: [],
custom_skill_names: [],
default_disabled_builtin_skill_ids: [],
},
preferences: {
last_model_id: undefined,
last_permission_value: undefined,
last_thought_level_value: undefined,
last_skill_ids: [],
last_disabled_builtin_skill_ids: [],
last_mcp_ids: [],
...preferences,
},
}) satisfies AssistantDetail;
describe('resolveGuidAssistantDefaults', () => {
it('returns fixed defaults directly', () => {
const resolved = resolveGuidAssistantDefaults(
buildDetail({
model: { mode: 'fixed', value: 'gemini-2.5-pro' },
permission: { mode: 'fixed', value: 'yolo' },
thought_level: { mode: 'fixed', value: 'medium' },
mcps: { mode: 'fixed', value: ['mcp-a', 'mcp-b'] },
})
);
expect(resolved).toEqual({
modelId: 'gemini-2.5-pro',
permissionMode: 'yolo',
thoughtLevel: 'medium',
skillIds: [],
disabledBuiltinSkillIds: [],
mcpIds: ['mcp-a', 'mcp-b'],
});
});
it('falls back to remembered values for auto defaults', () => {
const resolved = resolveGuidAssistantDefaults(
buildDetail(
{
model: { mode: 'auto' },
permission: { mode: 'auto' },
skills: { mode: 'auto', value: [] },
mcps: { mode: 'auto', value: [] },
},
{
last_model_id: 'claude-sonnet-4',
last_permission_value: 'plan',
last_thought_level_value: 'high',
last_skill_ids: ['skill-a'],
last_disabled_builtin_skill_ids: ['skill-b'],
last_mcp_ids: ['mcp-1'],
}
)
);
expect(resolved).toEqual({
modelId: 'claude-sonnet-4',
permissionMode: 'plan',
thoughtLevel: 'high',
skillIds: ['skill-a'],
disabledBuiltinSkillIds: ['skill-b'],
mcpIds: ['mcp-1'],
});
});
it('uses fixed generated assistant skill defaults instead of remembered disabled builtins', () => {
const detail = {
...buildDetail(
{
skills: { mode: 'fixed', value: [] },
},
{
last_skill_ids: ['custom-skill'],
last_disabled_builtin_skill_ids: ['todo-tracker'],
}
),
source: 'generated',
} satisfies AssistantDetail;
const resolved = resolveGuidAssistantDefaults(detail);
expect(resolved).toEqual({
modelId: undefined,
permissionMode: undefined,
thoughtLevel: undefined,
skillIds: [],
disabledBuiltinSkillIds: [],
mcpIds: [],
});
});
it('returns empty values when auto defaults have no remembered values yet', () => {
const resolved = resolveGuidAssistantDefaults(buildDetail());
expect(resolved).toEqual({
modelId: undefined,
permissionMode: undefined,
thoughtLevel: undefined,
skillIds: [],
disabledBuiltinSkillIds: [],
mcpIds: [],
});
});
it('returns fixed skill defaults from assistant detail instead of list payload fields', () => {
const resolved = resolveGuidAssistantDefaults(
buildDetail({
skills: { mode: 'fixed', value: ['skill-fixed'] },
})
);
expect(resolved).toEqual({
modelId: undefined,
permissionMode: undefined,
thoughtLevel: undefined,
skillIds: ['skill-fixed'],
disabledBuiltinSkillIds: [],
mcpIds: [],
});
});
});