export type TaskComplexity = "simple" | "standard" | "complex"; export type TaskStatus = "pending" | "running" | "done" | "failed" | "skipped"; export type TaskKind = "answer" | "shell" | "filesystem" | "network-discovery" | "dns" | "whois" | "web-enum" | "pentest-recon" | "package" | "other"; export interface PlanStep { id: string; title: string; kind: TaskKind; status: TaskStatus; successCriteria?: string | undefined; required?: boolean | undefined; notes?: string | undefined; toolHint?: string | undefined; } export interface TaskPlan { id: string; goal: string; complexity: TaskComplexity; steps: PlanStep[]; currentStepId?: string | undefined; createdAt: string; updatedAt: string; } export declare function createPlanStep(title: string, kind: TaskKind, extra?: Partial>): PlanStep; export declare function createTaskPlan(goal: string, complexity: TaskComplexity, steps: PlanStep[]): TaskPlan; export declare function markStepRunning(plan: TaskPlan, stepId: string): void; export declare function markStepDone(plan: TaskPlan, stepId: string, note?: string | undefined): void; export declare function markStepFailed(plan: TaskPlan, stepId: string, note?: string | undefined): void; export declare function nextPendingStep(plan: TaskPlan): PlanStep | undefined; export declare function isPlanTerminal(plan: TaskPlan): boolean; export declare function isPlanSuccessful(plan: TaskPlan): boolean; /** @deprecated Use isPlanTerminal or isPlanSuccessful explicitly. */ export declare function isPlanComplete(plan: TaskPlan): boolean; /** * Compact plan summary for LLM context injection. Keeps token count low. */ export declare function formatPlanForPrompt(plan: TaskPlan): string; /** * Terminal-formatted plan for user display. Uses Unicode box-drawing. */ export declare function formatPlanForDisplay(plan: TaskPlan): string; /** Versioned dependency/resource metadata. Fields are optional for legacy persisted plans. */ export interface VersionedPlanStep extends PlanStep { dependencies?: string[] | undefined; resourceLocks?: string[] | undefined; supersededBy?: string | undefined; parentTaskId?: string | undefined; jobId?: string | undefined; processId?: number | undefined; responderOwned?: boolean | undefined; } export interface VersionedTaskPlan extends Omit { schemaVersion: 2; version: number; steps: VersionedPlanStep[]; } interface VersionedPlanOperation { /** The plan version read by the caller. Stale operations are rejected. */ expectedVersion: number; } export type PlanOperation = VersionedPlanOperation & ({ type: "addTask"; step: VersionedPlanStep; index?: number; } | { type: "editTask"; stepId: string; changes: Partial>; } | { type: "removeTask"; stepId: string; } | { type: "moveTask"; stepId: string; index: number; } | { type: "supersedeTask"; stepId: string; replacement: VersionedPlanStep; } | { type: "splitTask"; stepId: string; steps: VersionedPlanStep[]; } | { type: "mergeTasks"; stepIds: string[]; step: VersionedPlanStep; } | { type: "setDependencies"; stepId: string; dependencies: string[]; }); export declare function deserializeTaskPlan(value: unknown): VersionedTaskPlan; export declare function validatePlanDag(plan: Pick): { ok: true; } | { ok: false; reason: string; }; export declare function assertValidPlanDag(plan: Pick): void; export declare function readyPlanSteps(plan: Pick): VersionedPlanStep[]; export declare function applyPlanOperation(plan: VersionedTaskPlan, operation: PlanOperation): VersionedTaskPlan; export {};