项目文件夹

文件
2026-07-13 12:22:50 +08:00

172 行
5.6 KiB
TypeScript

import {sessionFixtures} from '../../jest/fixtures/chatSessions';
import type {
BannerVariant,
CompletionResultSnapshot,
} from '../../src/utils/completionTypes';
// Mock defaultCompletionSettings to avoid circular imports
// This should match the actual defaultCompletionSettings from ChatSessionStore
export const mockDefaultCompletionSettings = {
version: 3,
include_thinking_in_context: true,
n_predict: 1024,
temperature: 0.7,
top_k: 40,
top_p: 0.95,
min_p: 0.05,
xtc_threshold: 0.1,
xtc_probability: 0.0,
typical_p: 1.0,
penalty_last_n: 64,
penalty_repeat: 1.0,
penalty_freq: 0.0,
penalty_present: 0.0,
mirostat: 0,
mirostat_tau: 5,
mirostat_eta: 0.1,
seed: -1,
n_probs: 0,
jinja: true,
enable_thinking: true,
};
export const mockChatSessionStore = {
sessions: sessionFixtures,
//currentSessionMessages: [],
activeSessionId: 'session-1',
newChatCompletionSettings: mockDefaultCompletionSettings,
newChatThinkingOverride: undefined as boolean | undefined,
newChatReasoningEffort: undefined as string | undefined,
isMigrating: false,
migrationComplete: true,
// Draft autosave
sessionDrafts: new Map<string, string>(),
saveDraft: jest.fn(),
getDraft: jest.fn().mockReturnValue(''),
clearDraft: jest.fn(),
// Selection mode state
isSelectionMode: false,
selectedSessionIds: new Set<string>(),
loadSessionList: jest.fn().mockResolvedValue(undefined),
loadGlobalSettings: jest.fn().mockResolvedValue(undefined),
deleteSession: jest.fn().mockResolvedValue(undefined),
setActiveSession: jest.fn().mockResolvedValue(undefined),
addMessageToCurrentSession: jest.fn().mockResolvedValue(undefined),
resetActiveSession: jest.fn(),
updateSessionTitle: jest.fn().mockResolvedValue(undefined),
updateSessionTitleBySessionId: jest.fn().mockResolvedValue(undefined),
groupedSessions: {
Today: [sessionFixtures[0]],
Yesterday: [sessionFixtures[1]],
},
createNewSession: jest.fn().mockResolvedValue(undefined),
updateMessage: jest.fn().mockResolvedValue(undefined),
updateMessageStreaming: jest.fn().mockResolvedValue(undefined),
updateSessionCompletionSettings: jest.fn().mockResolvedValue(undefined),
applySessionSettingsToGlobal: jest.fn().mockResolvedValue(undefined),
resetSessionSettingsToGlobal: jest.fn().mockResolvedValue(undefined),
exitEditMode: jest.fn(),
enterEditMode: jest.fn(),
removeMessagesFromId: jest.fn(),
setIsGenerating: jest.fn(),
setIsStopping: jest.fn(),
isStopping: false,
duplicateSession: jest.fn().mockResolvedValue(undefined),
setNewChatCompletionSettings: jest.fn().mockResolvedValue(undefined),
resetNewChatCompletionSettings: jest.fn().mockResolvedValue(undefined),
setActivePal: jest.fn().mockResolvedValue(undefined),
resolveCompletionSettings: jest
.fn()
.mockResolvedValue(mockDefaultCompletionSettings),
getCurrentCompletionSettings: jest
.fn()
.mockResolvedValue(mockDefaultCompletionSettings),
// Selection mode methods
enterSelectionMode: jest.fn(),
exitSelectionMode: jest.fn(),
toggleSessionSelection: jest.fn(),
selectAllSessions: jest.fn(),
deselectAllSessions: jest.fn(),
bulkDeleteSessions: jest.fn().mockResolvedValue(undefined),
bulkExportSessions: jest.fn().mockResolvedValue(undefined),
dateGroupNames: {
today: 'Today',
yesterday: 'Yesterday',
thisWeek: 'This week',
lastWeek: 'Last week',
twoWeeksAgo: '2 weeks ago',
threeWeeksAgo: '3 weeks ago',
fourWeeksAgo: '4 weeks ago',
lastMonth: 'Last month',
older: 'Older',
},
setDateGroupNames: jest.fn(),
initialize: jest.fn().mockResolvedValue(undefined),
// Agent UI state and per-step actions (added with AssistantTurn refactor)
agentUiState: {
status: 'idle' as
| 'idle'
| 'prefill'
| 'streaming_text'
| 'generating_tool_call'
| 'executing_tool'
| 'done'
| 'failed',
pendingTalentNames: [] as string[],
hitMaxTurns: false,
},
setAgentUiState: jest.fn(),
toolCallTokenCount: 0,
setToolCallTokenCount: jest.fn(),
pushAgentStep: jest.fn().mockResolvedValue(undefined),
updateActiveStepStreaming: jest.fn(),
appendToolCall: jest.fn().mockResolvedValue(undefined),
appendToolOutcome: jest.fn().mockResolvedValue(undefined),
finalizeActiveStep: jest.fn().mockResolvedValue(undefined),
// Context-limit banner state
lastCompletionResult: undefined as CompletionResultSnapshot | undefined,
dismissedBannerVariants: new Set<BannerVariant>(),
consecutiveFullFailures: 0,
palLoadHintSeen: new Set<string>(),
recordCompletionSnapshot: jest.fn(),
setBannerDismissed: jest.fn(),
markPalLoadHintSeen: jest.fn(),
};
Object.defineProperty(mockChatSessionStore, 'isGeneratingToolCall', {
get: jest.fn(
() => mockChatSessionStore.agentUiState.status === 'generating_tool_call',
),
configurable: true,
});
Object.defineProperty(mockChatSessionStore, 'currentSessionMessages', {
get: jest.fn(() => []),
configurable: true,
});
Object.defineProperty(mockChatSessionStore, 'activePalId', {
get: jest.fn(() => null),
configurable: true,
});
Object.defineProperty(mockChatSessionStore, 'shouldShowHeaderDivider', {
get: jest.fn(() => true),
configurable: true,
});
Object.defineProperty(mockChatSessionStore, 'selectedCount', {
get: jest.fn(() => mockChatSessionStore.selectedSessionIds.size),
configurable: true,
});
Object.defineProperty(mockChatSessionStore, 'allSelected', {
get: jest.fn(
() =>
mockChatSessionStore.sessions.length > 0 &&
mockChatSessionStore.selectedSessionIds.size ===
mockChatSessionStore.sessions.length,
),
configurable: true,
});