66ad1a1ec9
将三个超过 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
87 lines
1.8 KiB
TypeScript
87 lines
1.8 KiB
TypeScript
/**
|
|
* 项目管理器
|
|
* 负责项目的创建和管理
|
|
*/
|
|
|
|
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;
|
|
}
|
|
}
|