Skip to main content
Glama

AI Conversation Logger

by fablefang
schemas.ts5.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);

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fablefang/ai-conversation-logger-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server