feat: 添加会话持久化和 Todo 工具
会话持久化: - 新增 SessionManager 和 SessionStorage,支持会话自动保存和恢复 - 会话数据存储在 ~/.local/share/ai-assist/,遵循 XDG 规范 - 支持对话历史、已发现工具、待办事项的持久化 - 启动时自动恢复同一工作目录的上次会话 - 支持会话归档和历史会话管理 Todo 工具: - 新增 todoread 工具:读取当前会话的待办事项列表 - 新增 todowrite 工具:创建和更新待办事项 - 支持 pending/in_progress/completed 三种状态 - 待办事项随会话自动持久化 其他改进: - ToolResult 类型新增可选的 metadata 字段 - Agent 支持会话管理器集成 - clearHistory 改为异步方法
This commit is contained in:
+43
-1
@@ -11,6 +11,7 @@ import {
|
||||
import type { Tool, ToolResult, Message, AgentConfig, ProviderType } from '../types/index.js';
|
||||
import { buildZodSchema } from '../types/index.js';
|
||||
import { ToolRegistry } from '../tools/registry.js';
|
||||
import { SessionManager } from '../session/index.js';
|
||||
|
||||
// Provider 工厂函数类型
|
||||
type ProviderFactory = (apiKey: string) => (model: string) => LanguageModel;
|
||||
@@ -41,6 +42,9 @@ export class Agent {
|
||||
// 兼容旧模式:直接注册的工具
|
||||
private legacyTools: Map<string, Tool> = new Map();
|
||||
|
||||
// 会话管理器(可选)
|
||||
private sessionManager: SessionManager | null = null;
|
||||
|
||||
constructor(config: AgentConfig) {
|
||||
this.config = config;
|
||||
|
||||
@@ -58,6 +62,26 @@ export class Agent {
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置会话管理器(启用会话持久化)
|
||||
*/
|
||||
setSessionManager(manager: SessionManager): void {
|
||||
this.sessionManager = manager;
|
||||
// 从会话恢复状态
|
||||
const session = manager.getSession();
|
||||
if (session) {
|
||||
this.conversationHistory = [...session.messages];
|
||||
this.discoveredTools = new Set(session.discoveredTools);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取会话管理器
|
||||
*/
|
||||
getSessionManager(): SessionManager | null {
|
||||
return this.sessionManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册单个工具(兼容旧代码)
|
||||
*/
|
||||
@@ -206,15 +230,33 @@ export class Agent {
|
||||
content: fullResponse,
|
||||
});
|
||||
|
||||
// 持久化会话
|
||||
await this.persistSession();
|
||||
|
||||
return fullResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* 持久化当前会话状态
|
||||
*/
|
||||
private async persistSession(): Promise<void> {
|
||||
if (!this.sessionManager) return;
|
||||
|
||||
await this.sessionManager.setMessages(this.conversationHistory);
|
||||
await this.sessionManager.setDiscoveredTools([...this.discoveredTools]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空对话历史和发现的工具
|
||||
*/
|
||||
clearHistory(): void {
|
||||
async clearHistory(): Promise<void> {
|
||||
this.conversationHistory = [];
|
||||
this.discoveredTools.clear();
|
||||
|
||||
// 如果有会话管理器,创建新会话
|
||||
if (this.sessionManager) {
|
||||
await this.sessionManager.newSession();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user