autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
101 lines (100 loc) • 3.14 kB
TypeScript
/**
* 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;