refactor(core): 拆分大型单体文件为模块化子组件

将三个超过 700 行的大型文件重构为模块化架构:

Agent (1033 → ~400 行):
- agent-tool-executor: 工具获取、过滤和执行
- agent-message-handler: 消息构建、流式处理
- agent-mode-manager: 模式切换和权限检查
- agent-vision-handler: 视觉处理委托

CheckpointManager (1015 → ~620 行):
- checkpoint-store: 检查点 CRUD 操作
- checkpoint-rollback: 回滚和撤销操作
- checkpoint-session: 会话跟踪
- checkpoint-events: 事件发射系统

SessionManager (768 → 356 行):
- message-converter: Part ↔ ModelMessage 转换
- session-store: 会话 CRUD 操作
- project-manager: 项目管理
- session-auto-save: 自动保存功能

重构原则: 单一职责、编排器模式、向后兼容 API
This commit is contained in:
2025-12-16 22:07:13 +08:00
parent e53035ffc0
commit 66ad1a1ec9
17 changed files with 3154 additions and 1959 deletions
@@ -0,0 +1,86 @@
/**
* 项目管理器
* 负责项目的创建和管理
*/
import * as storage from './storage/index.js';
import { getProjectId, isGitRepository } from './project.js';
/**
* 项目元数据
*/
export interface ProjectMetadata {
id: string;
workdir: string;
createdAt: string;
isGitRepo: boolean;
}
/**
* 项目管理器
*/
export class ProjectManager {
private currentProject: ProjectMetadata | null = null;
/**
* 获取当前项目
*/
getProject(): ProjectMetadata | null {
return this.currentProject;
}
/**
* 设置当前项目
*/
setProject(project: ProjectMetadata | null): void {
this.currentProject = project;
}
/**
* 获取或创建项目
*/
async getOrCreate(workdir: string): Promise<ProjectMetadata> {
const projectId = await getProjectId(workdir);
try {
const existing = await storage.read<ProjectMetadata>(['project', projectId]);
this.currentProject = existing;
return existing;
} catch (e) {
if (e instanceof storage.StorageNotFoundError) {
const isGitRepo = await isGitRepository(workdir);
const project: ProjectMetadata = {
id: projectId,
workdir,
createdAt: new Date().toISOString(),
isGitRepo,
};
await storage.write(['project', projectId], project);
this.currentProject = project;
return project;
}
throw e;
}
}
/**
* 切换项目
*/
async switchProject(workdir: string): Promise<ProjectMetadata> {
return this.getOrCreate(workdir);
}
/**
* 检查项目是否初始化
*/
isInitialized(): boolean {
return this.currentProject !== null;
}
/**
* 获取项目 ID
*/
getProjectId(): string | null {
return this.currentProject?.id ?? null;
}
}