export type JobStatus = "starting" | "running" | "exited" | "failed" | "stopping" | "killed" | "lost"; export type JobTerminalStatus = Exclude; export interface JobArtifactReceipt { path: string; chunks: string[]; bytes: number; droppedBytes: number; redacted: boolean; sha256: string; } export type JobMonitorMetadata = Record; export interface JobLinkMetadata { taskId?: string | undefined; parentTaskId?: string | undefined; delegationId?: string | undefined; wakeOnCompletion?: boolean | undefined; monitor?: JobMonitorMetadata | undefined; responderLeaseId?: string | undefined; responder?: boolean | undefined; } export type JobKind = "durable" | "ephemeral"; export interface BackgroundJob extends JobLinkMetadata { id: string; command: string; commandDisplay: string; cwd: string; pid?: number | undefined; processGroupId?: number | undefined; processIdentity?: string | undefined; status: JobStatus; startedAt: string; heartbeatAt?: string | undefined; endedAt?: string | undefined; exitCode?: number | undefined; signal?: string | undefined; artifactPath: string; stdoutArtifact: string; stderrArtifact: string; artifacts: { stdout: JobArtifactReceipt; stderr: JobArtifactReceipt; }; redactionProfile: string; ownerSessionId: string; kind?: JobKind | undefined; name?: string | undefined; authorization?: { target: string; expiresAt?: string | undefined; } | undefined; timeoutAt?: string | undefined; } export interface SupersededResultRevision { resultRevision: number; resultHash: string; status: JobTerminalStatus; endedAt: string; exitCode?: number | undefined; signal?: string | undefined; deliveredAt?: string | undefined; readAt?: string | undefined; analyzedAt?: string | undefined; acknowledgedAt?: string | undefined; settledAt?: string | undefined; } export interface ResponderNotification { id: string; ownerSessionId: string; jobId: string; taskId?: string | undefined; parentTaskId?: string | undefined; status: JobTerminalStatus; createdAt: string; startedAt: string; endedAt: string; exitCode?: number | undefined; signal?: string | undefined; stdoutArtifact: JobArtifactReceipt; stderrArtifact: JobArtifactReceipt; commandDisplay: string; wakeOnCompletion: boolean; responder: boolean; monitor?: JobMonitorMetadata | undefined; responderLeaseId?: string | undefined; deliveryStartedAt?: string | undefined; deliveredAt?: string | undefined; readAt?: string | undefined; analyzedAt?: string | undefined; acknowledgedAt?: string | undefined; discardedAt?: string | undefined; discardReason?: "session-cancelled" | undefined; resultRevision?: number | undefined; resultHash?: string | undefined; supersededRevisions?: readonly SupersededResultRevision[] | undefined; archivedAt?: string | undefined; settledAt?: string | undefined; } export type JobManagerChange = { type: "job"; jobId: string; } | { type: "notification"; jobId: string; notificationId: string; }; export type JobManagerListener = (change: JobManagerChange) => void; interface PersistedRegistryV1 { schemaVersion: 1; jobs: BackgroundJob[]; } export interface PersistedRegistryV2 { schemaVersion: 2; jobs: BackgroundJob[]; notifications: ResponderNotification[]; settlements?: PendingSettlement[]; consumedResults?: ConsumedResponderResult[]; } export interface ConsumedResponderResult { jobId: string; resultHash: string; resultRevision: number; acknowledgedAt: string; } export interface PendingSettlement { jobId: string; resultRevision: number; attempts: number; firstAttemptAt: string; lastAttemptAt: string; lastReason: string; deadLetteredAt?: string | undefined; } export type PersistedRegistry = PersistedRegistryV1 | PersistedRegistryV2; export interface BackgroundSpawnSpec { command: string; argv: string[]; stdinText?: string | undefined; display?: string | undefined; } export interface StartJobOptions extends JobLinkMetadata { cwd?: string | undefined; name?: string | undefined; ownerSessionId?: string | undefined; profile?: string | undefined; estimatedSeconds?: number | undefined; timeoutMs?: number | undefined; authorization?: { target: string; expiresAt?: string | undefined; } | undefined; } export {};