import type { TaskContext, DomainFocusChangeSource } from "../../types/index.js"; import type { DomainName } from "../types.js"; import { type SignatureProvider } from "../signature_provider.js"; interface CreateTaskOptions { systemContext?: "greenfield" | "brownfield"; domainFocus?: DomainName; scope: TaskContext["scope"]; } export declare class TaskContextManager { private readonly stateDir; private readonly pointerPath; private readonly tasksDir; private readonly projectRoot; private readonly provider; private readonly taskLockContext; constructor(stateDir: string, provider?: SignatureProvider); getStateDir(): string; withTaskLock(taskId: string, operation: () => Promise): Promise; /** 构建新 task 记录(mkdir + 上限检查 + 敏感词扫描 + 生成 taskId + PII 脱敏),不含指针 IO。create 与 createIfNoActive 共用。 */ private prepareTaskRecord; create(intent: string, options: CreateTaskOptions): Promise; /** 原子"无活跃任务才创建":在 current-task.lock 内 check-then-act,治并发 start TOCTOU(R5)。 * 锁外 getCurrentTask 只作快速短路;本方法锁内权威判定——并发下两 start 只一个 created,另一个 rejected,无孤儿 active task。 * create 语义不变(不检查 active),供直接创建/测试用。 */ createIfNoActive(intent: string, options: CreateTaskOptions): Promise<{ status: "created"; task: TaskContext; } | { status: "rejected"; activeTask: TaskContext; }>; /** 锁内读取当前活跃任务(读指针 + load;不持/不清指针——清理由非锁路径 getCurrentTask/clearCurrentPointerIfMatches 负责,锁内清会嵌套 current-task.lock 死锁)。无活跃返 null。 */ private readActiveTaskUnderLock; load(taskId: string): Promise; updateStatus(taskId: string, status: TaskContext["status"]): Promise; /** 推进/回退 domain_focus 的统一受控入口(advance 逐域推进 + upgrade_apply 切回退点都经此)。 * source 审计来源,写入 last_domain_focus_change 持久化到 task record,治 R4:domain_focus 变更可追溯、 * 两条写入链路统一入口(不再各自直接改 domain_focus 无记录)。active 校验不变(已关闭任务抛错)。 */ setDomainFocus(taskId: string, domain: DomainName, source: DomainFocusChangeSource): Promise; getCurrentTask(): Promise; /** 只读查看当前任务;供 doctor/status 使用,不修复或删除任何指针。 */ peekCurrentTask(): Promise; cancel(taskId: string): Promise; /** 密钥轮换恢复:显式信任存量记录内容,用当前密钥重签(用户确认契约,CLI resign-tasks --confirm 触发)。 * 场景:旧签名密钥丢失/被轮换后,验签 fail-closed 挡住全部存量任务(load 全拒)——记录本身合法但信任链断裂。 * 信任锚=用户显式确认(工具层 --confirm),非自动重签(否则验签防线可被静默绕过)。 * 边界:保留 parseTaskShape shape 校验(schema_version/必填字段/hmac 存在性),结构非法仍拒——重签不背书任意伪造文件; * 已验签通过的记录幂等跳过(resigned:false);不改内容字段与 updated_at(信任链操作非内容变更); * 审计 task_resign 事件(谁在何时重签了什么)。 */ resignTask(taskId: string): Promise<{ task_id: string; resigned: boolean; }>; listRecent(limit?: number): Promise>; private taskFilePath; private saveUnlocked; private writeCurrentPointer; private clearCurrentPointerIfMatches; } export {};