280 lines
8.1 KiB
Markdown
280 lines
8.1 KiB
Markdown
# IC Coder 插件 - 会话历史管理功能实现文档
|
||
|
||
## 概述
|
||
|
||
本次更新为 IC Coder 插件添加了完整的会话历史管理功能,实现了基于任务(Task)的对话历史持久化存储,采用 LangChain4j 兼容的消息格式。
|
||
|
||
## 核心功能
|
||
|
||
### 1. 会话历史管理系统
|
||
|
||
#### 存储架构
|
||
- **存储位置**: `~/.iccoder/projects/{项目路径编码}/{taskId}/`
|
||
- **项目路径编码规则**:
|
||
- 移除冒号 `:`
|
||
- 将斜杠 `/` 和反斜杠 `\` 替换为 `--`
|
||
- 示例: `C:\Users\admin\Documents\Project` → `C--Users-admin-Documents-Project`
|
||
|
||
#### 文件结构
|
||
每个任务目录包含三个文件:
|
||
```
|
||
~/.iccoder/projects/{编码后的项目路径}/{taskId}/
|
||
├── meta.json # 任务元数据
|
||
├── conversation.json # 对话历史
|
||
└── conversation_meta.jsonl # 对话轮次元数据(JSONL格式)
|
||
```
|
||
|
||
### 2. 新增类型定义 (`src/types/chatHistory.ts`)
|
||
|
||
#### 消息类型
|
||
- **MessageType 枚举**: `SYSTEM`, `USER`, `AI`, `TOOL_EXECUTION_RESULT`
|
||
- **消息接口**:
|
||
- `SystemMessage`: 系统消息
|
||
- `UserMessage`: 用户消息(支持多内容块)
|
||
- `AiMessage`: AI 回复(支持工具调用和思考过程)
|
||
- `ToolExecutionResultMessage`: 工具执行结果
|
||
|
||
#### 元数据结构
|
||
- **TaskMeta**: 任务元数据
|
||
- 任务 ID、名称、项目路径
|
||
- 创建/更新时间
|
||
- Token 使用统计
|
||
|
||
- **ConversationMeta**: 对话轮次元数据
|
||
- 轮次 ID、时间戳
|
||
- Token 使用量
|
||
- 模型信息、响应耗时
|
||
|
||
### 3. ChatHistoryManager 单例类 (`src/utils/chatHistoryManager.ts`)
|
||
|
||
#### 核心方法
|
||
|
||
**任务管理**:
|
||
- `createTask(projectPath, taskName)`: 创建新任务
|
||
- `switchTask(projectPath, taskId)`: 切换到指定任务
|
||
- `listProjectTasks(projectPath)`: 列出项目所有任务
|
||
- `getCurrentTaskSession()`: 获取当前任务完整会话
|
||
|
||
**消息记录**:
|
||
- `addUserMessage(text)`: 添加用户消息
|
||
- `addAiMessage(text, toolRequests?)`: 添加 AI 消息
|
||
- `addSystemMessage(text)`: 添加系统消息
|
||
- `recordTurnMeta(turnId, usage, model, duration)`: 记录对话轮次元数据
|
||
|
||
**自动化功能**:
|
||
- 自动创建存储目录
|
||
- 首次使用时自动创建默认任务
|
||
- 自动更新任务时间戳和 Token 统计
|
||
|
||
### 4. 集成到消息处理流程 (`src/utils/messageHandler.ts`)
|
||
|
||
#### 修改点
|
||
- 在 `handleUserMessage()` 中自动记录用户消息
|
||
- 在所有 AI 回复点自动记录 AI 消息
|
||
- 支持文件操作、VCD 生成等场景的历史记录
|
||
|
||
#### 记录场景
|
||
- 普通对话消息
|
||
- 文件操作(创建、删除、读取、更新、重命名、替换)
|
||
- VCD 文件生成流程
|
||
- 错误消息
|
||
|
||
### 5. 插件初始化 (`src/extension.ts`)
|
||
|
||
- 导入 `ChatHistoryManager`
|
||
- 插件激活时自动初始化历史管理器
|
||
- 为后续命令实现预留接口(已在 `package.json` 中定义)
|
||
|
||
## 预留命令(待实现)
|
||
|
||
在 `package.json` 中已定义以下命令,但在 `extension.ts` 中暂时注释:
|
||
- `ic-coder.viewHistory`: 查看会话历史
|
||
- `ic-coder.newSession`: 新建会话
|
||
- `ic-coder.exportSession`: 导出当前会话
|
||
- `ic-coder.deleteSession`: 删除会话
|
||
- `ic-coder.clearHistory`: 清空会话历史
|
||
- `ic-coder.searchSession`: 搜索会话
|
||
|
||
## 技术特点
|
||
|
||
1. **单例模式**: 确保全局唯一的历史管理器实例
|
||
2. **自动初始化**: 首次使用时自动创建必要的目录和文件
|
||
3. **LangChain4j 兼容**: 消息格式与 LangChain4j 保持一致
|
||
4. **跨平台支持**: 使用 VSCode API 处理文件系统,支持 Windows/Linux/macOS
|
||
5. **错误处理**: 完善的异常捕获和错误提示
|
||
6. **增量更新**: 使用 JSONL 格式追加对话元数据,避免重写整个文件
|
||
|
||
## 使用示例
|
||
|
||
```typescript
|
||
// 获取历史管理器实例
|
||
const historyManager = ChatHistoryManager.getInstance();
|
||
|
||
// 创建新任务
|
||
await historyManager.createTask('/path/to/project', '实现计数器模块');
|
||
|
||
// 记录对话
|
||
await historyManager.addUserMessage('帮我创建一个计数器');
|
||
await historyManager.addAiMessage('好的,我来帮你创建计数器模块...');
|
||
|
||
// 记录轮次元数据
|
||
await historyManager.recordTurnMeta(1, {
|
||
inputTokens: 100,
|
||
outputTokens: 200,
|
||
totalTokens: 300
|
||
}, 'gpt-4', 2.5);
|
||
|
||
// 获取当前会话
|
||
const session = await historyManager.getCurrentTaskSession();
|
||
```
|
||
|
||
## 数据格式示例
|
||
|
||
### meta.json
|
||
```json
|
||
{
|
||
"taskId": "task_20231215_abc123",
|
||
"taskName": "实现计数器模块",
|
||
"projectPath": "D:\\ICCoderPlugin\\ic-coder",
|
||
"createdAt": "2023-12-15T10:30:00.000Z",
|
||
"updatedAt": "2023-12-15T11:45:00.000Z",
|
||
"stats": {
|
||
"credits": 0,
|
||
"totalTokens": 5000,
|
||
"inputTokens": 2000,
|
||
"outputTokens": 3000
|
||
}
|
||
}
|
||
```
|
||
|
||
### conversation.json
|
||
```json
|
||
[
|
||
{
|
||
"type": "USER",
|
||
"contents": [
|
||
{
|
||
"type": "TEXT",
|
||
"text": "帮我创建一个计数器"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "AI",
|
||
"text": "好的,我来帮你创建计数器模块..."
|
||
}
|
||
]
|
||
```
|
||
|
||
### conversation_meta.jsonl
|
||
```jsonl
|
||
{"turnId":1,"timestamp":"2023-12-15T10:30:00.000Z","usage":{"inputTokens":100,"outputTokens":200,"totalTokens":300},"model":"gpt-4","duration":2.5}
|
||
{"turnId":2,"timestamp":"2023-12-15T10:32:00.000Z","usage":{"inputTokens":150,"outputTokens":250,"totalTokens":400},"model":"gpt-4","duration":3.2}
|
||
```
|
||
|
||
## 文件修改清单
|
||
|
||
### 新增文件
|
||
1. `src/types/chatHistory.ts` - 类型定义文件
|
||
2. `src/utils/chatHistoryManager.ts` - 会话历史管理器
|
||
|
||
### 修改文件
|
||
1. `src/extension.ts` - 导入 ChatHistoryManager
|
||
2. `src/utils/messageHandler.ts` - 集成历史记录功能
|
||
3. `package.json` - 定义会话管理相关命令
|
||
|
||
## 关键代码位置
|
||
|
||
### 用户消息记录
|
||
- 文件: `src/utils/messageHandler.ts:29-30`
|
||
- 代码: `await historyManager.addUserMessage(text);`
|
||
|
||
### AI 消息记录
|
||
- 文件: `src/utils/messageHandler.ts:54`
|
||
- 代码: `await historyManager.addAiMessage(reply);`
|
||
|
||
### 文件操作历史记录
|
||
- 文件: `src/utils/messageHandler.ts:194, 207, 217, 227, 243, 263`
|
||
- 各种文件操作后都会记录 AI 消息
|
||
|
||
### 任务自动创建
|
||
- 文件: `src/utils/chatHistoryManager.ts:269-279`
|
||
- 方法: `ensureCurrentTask()`
|
||
|
||
## 后续开发建议
|
||
|
||
1. **实现预留的会话管理命令**
|
||
- 查看历史:展示任务列表和对话内容
|
||
- 新建会话:创建新任务并切换
|
||
- 导出会话:支持 Markdown、JSON 等格式
|
||
- 删除会话:删除指定任务目录
|
||
- 清空历史:清空所有会话数据
|
||
- 搜索会话:按关键词搜索对话内容
|
||
|
||
2. **增强功能**
|
||
- 添加会话统计和可视化面板
|
||
- 支持多任务并行管理
|
||
- 实现会话备份和恢复功能
|
||
- 添加会话标签和分类
|
||
- 支持会话合并和拆分
|
||
|
||
3. **性能优化**
|
||
- 实现会话数据的懒加载
|
||
- 添加缓存机制减少文件读写
|
||
- 优化大型会话的加载速度
|
||
|
||
4. **用户体验**
|
||
- 添加会话切换的快捷键
|
||
- 在状态栏显示当前任务信息
|
||
- 提供会话导入功能
|
||
- 支持会话模板
|
||
|
||
## 测试建议
|
||
|
||
1. **单元测试**
|
||
- 测试项目路径编码/解码
|
||
- 测试任务创建和切换
|
||
- 测试消息添加和读取
|
||
- 测试元数据更新
|
||
|
||
2. **集成测试**
|
||
- 测试完整的对话流程
|
||
- 测试文件操作的历史记录
|
||
- 测试跨会话切换
|
||
- 测试异常情况处理
|
||
|
||
3. **性能测试**
|
||
- 测试大量消息的读写性能
|
||
- 测试多任务并发访问
|
||
- 测试长时间运行的稳定性
|
||
|
||
## 注意事项
|
||
|
||
1. **数据安全**
|
||
- 会话数据存储在用户主目录,确保权限正确
|
||
- 敏感信息不应记录到历史中
|
||
- 定期清理过期会话数据
|
||
|
||
2. **兼容性**
|
||
- 确保跨平台路径处理正确
|
||
- 注意文件编码问题(统一使用 UTF-8)
|
||
- 保持与 LangChain4j 格式的兼容性
|
||
|
||
3. **错误处理**
|
||
- 文件系统操作都应有异常捕获
|
||
- 提供友好的错误提示
|
||
- 记录详细的错误日志
|
||
|
||
## 版本信息
|
||
|
||
- **功能版本**: v1.0.0
|
||
- **实现日期**: 2025-12-15
|
||
- **兼容版本**: VSCode ^1.107.0
|
||
- **依赖**: 无额外依赖,仅使用 VSCode API
|
||
|
||
## 参考资料
|
||
|
||
- [LangChain4j 消息格式](https://docs.langchain4j.dev/)
|
||
- [VSCode 文件系统 API](https://code.visualstudio.com/api/references/vscode-api#FileSystem)
|
||
- [JSONL 格式规范](http://jsonlines.org/)
|