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:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user