import type { GpuDevice, JobRpcResult } from "@aicommander/protocol"; import { type JobScopeLauncher } from "./job-scope.js"; import { resolveJobsRoot } from "./job-store.js"; import { JobError } from "./job-types.js"; import type { JobCancelRequest, JobListRequest, JobLogsRequest, JobStartRequest, JobStatusRequest } from "./job-types.js"; export { buildJobScript, buildWindowsJobCommandScript, JOB_COMMAND_ENV, JOB_CWD_ENV, JOB_EXIT_PATH_ENV, JOB_LOG_PATH_ENV, WINDOWS_JOB_WRAPPER, } from "./job-scripts.js"; export { JobError, resolveJobsRoot }; export type { JobCancelRequest, JobListRequest, JobLogsRequest, JobStartRequest, JobStatusRequest, }; /** * Coordinates job lifecycle. Disk is authoritative; memory only guards active * start/retirement windows and avoids repeated work on settled records. */ export declare class JobManager { readonly jobsRoot: string; private lastPruneAt; /** Terminal observations used only to avoid repeat work, never to answer status. */ private readonly settledJobs; /** Failed starts whose spawned process is still being stopped. */ private readonly retiringJobs; /** GPU reservations retained while a late-started cancelled process dies. */ private readonly cardsHeldByDyingProcess; /** Interruptible record-to-process windows; readers must not settle them. */ private readonly startingJobs; /** In-memory companion to the durable cancelRequestedAt marker. */ private readonly cancelledJobs; /** Signal evidence consumed by the exit classification callback. */ private readonly signalledJobs; private knownGpus; private readonly store; private readonly scopeLauncher; constructor(opts?: { jobsRoot?: string; configDir?: string; scopeLauncher?: () => JobScopeLauncher | null; }); setKnownGpus(gpus: readonly GpuDevice[] | undefined): void; recover(): void; private pruneExpired; private maybePrune; start(req: JobStartRequest): Promise; private abandonStart; private abandonStartAsync; private retireStartedProcess; private holdCardUntilExit; private countRunningJobs; list(req: JobListRequest): JobRpcResult; status(req: JobStatusRequest): JobRpcResult; logs(req: JobLogsRequest): JobRpcResult; cancel(req: JobCancelRequest): JobRpcResult; private handleChildExit; private signalJob; private refresh; private settleFromExitMarker; private classifyVanishedJob; private cancelWasRequested; private estimateVanishedEndedAt; private settle; private markSettled; private discardRetired; private checkLogCap; private acquireGpuLock; private releaseGpuLock; private reapGpuLocks; private gpuHolderState; private loadForRequest; private removeJobDir; private removeJobDirAsync; private forgetJob; private pruneUnreadable; } export declare function getJobManager(configDir?: string): JobManager; export declare function resetJobManagerForTests(): void;