/** * Io Controller — 核心基础层模块。 * * 职责边界: * - 负责:WorkspaceIntegrityResult 等 核心基础层职责 * - 不负责:不属于本模块的职责由对应模块承担 * * 被谁调用:引擎各子模块、管线层 * 调用谁:promises、node:path、node:crypto、logger、helpers * * 数据流:底层能力请求 → 处理 → 返回结果 * 持久化:读写本地文件(详见代码内路径) */ /** * 极化工作区锁 — 防止人类在 AI 长耗时推演期间手动修改代码导致静默覆盖。 * * 中间件在可能覆盖用户工作区的工具执行前自动调用 ioController.verify()。 * * 机制: * 1. 长耗时任务开始时生成 .soloforge.lock,记录 Git 工作树 Hash + 文件修改时间 * 2. 任务完成准备写入前,校验当前 Git 工作树 Hash 和文件 mtime * 3. 若检测到外部变更 → 抛出 DirtyWorkspaceError,中断覆盖,要求 Diff 合并 * * 锁文件格式 (JSON): * { * "task_id": "task-xxx", * "acquired_at": "ISO timestamp", * "git_tree_hash": "sha256 of git diff HEAD output", * "file_snapshots": { "path": { "mtime_ms": 123, "size": 456, "hash": "sha256" } } * } */ /** 文件快照 */ interface FileSnapshot { mtime_ms: number; size: number; hash: string; } /** 校验结果 */ export interface WorkspaceIntegrityResult { /** 是否一致(无外部变更) */ clean: boolean; /** 被外部修改的文件列表 */ dirty_files: string[]; /** Git 工作树是否变化 */ git_changed: boolean; /** 诊断消息 */ message: string; } /** * 工作区脏数据异常 — 检测到外部修改时抛出。 * 调用方必须捕获此异常并启动 Diff 合并流程。 */ export declare class DirtyWorkspaceError extends Error { /** 被修改的文件列表 */ readonly dirtyFiles: string[]; /** 锁文件中的原始快照 */ readonly originalSnapshots: Record; /** 任务 ID */ readonly taskId: string; constructor(dirtyFiles: string[], snapshots: Record, taskId: string); } export declare class IOController { private projectPath; private lockPath; constructor(projectPath: string); /** * 获取工作区锁。 * 扫描目标文件并生成快照,写入锁文件。 * @param taskId - 任务 ID * @param targetFiles - 目标文件列表(将要修改的文件) * @param reason - 加锁原因 */ acquire(taskId: string, targetFiles: string[], reason: string): Promise; /** * 校验工作区完整性 — 写入前必须调用。 * @returns 校验结果 * @throws DirtyWorkspaceError 当检测到外部修改时 */ verify(): Promise; /** * 写入前强制校验 — 不通过则抛出 DirtyWorkspaceError。 * @throws DirtyWorkspaceError */ assertClean(): Promise; /** * 释放工作区锁 — 任务完成或取消后调用。 */ release(): Promise; /** * 检查工作区是否被锁定。 */ isLocked(): Promise<{ locked: boolean; task_id?: string; reason?: string; expired?: boolean; }>; private readLock; private snapshotFiles; private computeGitTreeHash; } export {};