schemas.ts•5.51 kB
import { z } from 'zod';
import { CONSTANTS } from '../constants/index.js';
// 平台枚举验证
const PlatformSchema = z.enum([
CONSTANTS.PLATFORMS.CLAUDE_CODE,
CONSTANTS.PLATFORMS.CURSOR,
CONSTANTS.PLATFORMS.VSCODE,
CONSTANTS.PLATFORMS.IDEA
] as const).optional();
// 时间范围验证
const TimeRangeSchema = z.object({
start: z.string().datetime().optional(),
end: z.string().datetime().optional()
}).optional();
// 记录对话的参数验证 - 新规范
export const LogConversationSchema = z.object({
project: z.string().optional(), // 项目名称(可选,自动检测)
userRequest: z.string().min(1, '用户需求不能为空'),
aiTodoList: z.array(z.string()).min(1, 'AI执行计划不能为空'),
aiSummary: z.string().min(1, 'AI总结不能为空'),
fileOperations: z.array(z.string()).optional(),
title: z.string().optional(),
tags: z.array(z.string()).optional(),
platform: z.string().default(CONSTANTS.PLATFORMS.CLAUDE_CODE)
}).transform((data) => ({
...data,
tags: data.tags || [],
fileOperations: data.fileOperations || [],
platform: data.platform || CONSTANTS.PLATFORMS.CLAUDE_CODE
}));
// 搜索对话的参数验证 - 新规范
export const SearchConversationsSchema = z.object({
project: z.string().optional(),
keywords: z.array(z.string()).optional(),
filePattern: z.string().optional(), // 文件名模式搜索
days: z.number().int().positive().optional(),
platform: PlatformSchema,
tags: z.array(z.string()).optional(),
limit: z.number().int().positive().max(100).optional()
}).transform((data) => ({
...data,
keywords: data.keywords || [],
tags: data.tags || [],
limit: data.limit || CONSTANTS.DEFAULT_SEARCH_LIMIT
}));
// 获取上下文建议的参数验证 - 新规范
export const GetContextSuggestionsSchema = z.object({
currentInput: z.string().min(1, '当前输入不能为空'),
currentFiles: z.array(z.string()).optional(), // 当前涉及的文件
project: z.string().optional()
}).transform((data) => ({
...data,
currentFiles: data.currentFiles || []
}));
// 项目列表的参数验证
export const ListProjectsSchema = z.object({
includeStats: z.boolean().optional().default(false)
});
// 导出对话的参数验证
export const ExportConversationsSchema = z.object({
project: z.string().optional(),
format: z.enum(['markdown', 'json']).optional().default('markdown'),
timeRange: TimeRangeSchema
});
// 参数验证类型推断 - 新规范
export type LogConversationParams = {
project?: string; // 项目名称(可选,自动检测)
userRequest: string; // 用户原始需求 + 上传文件说明
aiTodoList: string[]; // AI的执行计划清单
aiSummary: string; // AI的操作总结(3-5句话)
fileOperations: string[]; // 文件操作总结
title?: string; // 对话标题(可选)
tags: string[]; // 标签数组
platform: string; // 平台标识
};
export type SearchConversationsParams = {
project?: string;
keywords: string[];
filePattern?: string; // 文件名模式搜索
tags: string[];
limit: number;
timeRange?: { start?: string; end?: string };
days?: number;
platform?: 'claude-code' | 'cursor' | 'vscode' | 'idea';
};
export type GetContextSuggestionsParams = {
currentInput: string; // 当前用户输入
currentFiles: string[]; // 当前涉及的文件
project?: string; // 项目过滤
};
export type ListProjectsParams = z.infer<typeof ListProjectsSchema>;
export type ExportConversationsParams = z.infer<typeof ExportConversationsSchema>;
// 验证函数工厂
export function createValidator<T>(schema: z.ZodSchema<T>) {
return (data: unknown): T => {
const result = schema.safeParse(data);
if (!result.success) {
const errorMessages = result.error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');
throw new Error(`${CONSTANTS.ERROR_MESSAGES.INVALID_PARAMETERS}: ${errorMessages}`);
}
return result.data;
};
}
// 导出验证器
export const validateLogConversation = (data: unknown): LogConversationParams => {
const result = LogConversationSchema.safeParse(data);
if (!result.success) {
const errorMessages = result.error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');
throw new Error(`${CONSTANTS.ERROR_MESSAGES.INVALID_PARAMETERS}: ${errorMessages}`);
}
return result.data as LogConversationParams;
};
export const validateSearchConversations = (data: unknown): SearchConversationsParams => {
const result = SearchConversationsSchema.safeParse(data);
if (!result.success) {
const errorMessages = result.error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');
throw new Error(`${CONSTANTS.ERROR_MESSAGES.INVALID_PARAMETERS}: ${errorMessages}`);
}
return result.data as SearchConversationsParams;
};
export const validateGetContextSuggestions = (data: unknown): GetContextSuggestionsParams => {
const result = GetContextSuggestionsSchema.safeParse(data);
if (!result.success) {
const errorMessages = result.error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join('; ');
throw new Error(`${CONSTANTS.ERROR_MESSAGES.INVALID_PARAMETERS}: ${errorMessages}`);
}
return result.data as GetContextSuggestionsParams;
};
export const validateListProjects = createValidator(ListProjectsSchema);
export const validateExportConversations = createValidator(ExportConversationsSchema);