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:
2025-12-10 22:55:37 +08:00
parent bc1ece3dad
commit 1e0ecc2de7
13 changed files with 862 additions and 4 deletions
+43 -1
View File
@@ -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();
}
}
/**