UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

101 lines (100 loc) 3.14 kB
/** * ConversationStore — 对话持久化 + 上下文窗口管理 * * 设计: * - 每个对话一个 JSONL 文件: .autosnippet/conversations/{id}.jsonl * - 索引文件: .autosnippet/conversations/index.json * - 按 category 隔离: 'user'(Dashboard) / 'system'(SignalCollector) * - Token 预算: 超限时自动生成摘要压缩旧轮次 * - 静默降级: 持久化失败不影响核心功能 * * Token 计算策略: * 采用字符数近似估算 (1 token ≈ 3.5 字符中文 / ≈ 4 字符英文) * 简单高效,无需额外依赖 * * 文件结构: * .autosnippet/conversations/ * index.json — 对话元数据索引 * {id}.jsonl — 每行一条消息 {role, content, ts} */ /** 单条对话消息 */ interface ConversationMessage { role: string; content: string; } /** AI Provider 最小接口(用于 summarize) */ interface AiProvider { chat(prompt: string, opts?: { temperature?: number; maxTokens?: number; }): Promise<string>; } export declare class ConversationStore { #private; /** @param projectRoot 用户项目根目录 */ constructor(projectRoot: string); /** * 创建新对话 * @param opts.category 对话类别 * @param [opts.title] 对话标题 * @returns conversationId */ create({ category, title }?: { category?: string | undefined; title?: string | undefined; }): `${string}-${string}-${string}-${string}-${string}`; /** * 追加消息到对话 * @param message */ append(conversationId: string, message: ConversationMessage): void; /** * 加载对话历史(带 token 预算控制) * * 如果历史超出 tokenBudget: * - 保留开头的摘要(如有) * - 截断中间的旧消息 * - 保留最新的消息 * * @param [opts.tokenBudget] token 预算 * @returns []} */ load(conversationId: string, { tokenBudget }?: { tokenBudget?: number | undefined; }): ConversationMessage[]; /** * 对话列表 * @param [opts.category] 按类别过滤 */ list({ category, limit }?: { category?: 'user' | 'system' | 'lark'; limit?: number; }): any; /** 删除对话 */ delete(conversationId: string): void; /** * 为对话生成压缩摘要(需要 AI) * 将旧消息替换为一条 system 摘要消息 * * @param opts.aiProvider AI Provider 实例 * @returns 是否成功压缩 */ summarize(conversationId: string, { aiProvider }: { aiProvider: AiProvider; }): Promise<boolean>; /** * 清理过期对话 * @param [opts.maxAgeDays=30] 超过此天数的对话将被删除 * @param [opts.category] 只清理特定类别 * @returns } */ cleanup({ maxAgeDays, category, }?: { maxAgeDays?: number; category?: 'user' | 'system' | 'lark'; }): { deleted: number; }; /** 估算 token 数 — 委托给共享 token-utils(CJK 感知) */ estimateTokens(text: string): number; } export default ConversationStore;