import type { OpenClawConfig } from "../config/types.openclaw.js";
import type { TaskDeliveryState, TaskDeliveryStatus, TaskNotifyPolicy, TaskRecord, TaskRuntime, TaskScopeKind, TaskStatus, TaskTerminalOutcome } from "./task-registry.types.js";
export type DetachedTaskCreateParams = {
    runtime: TaskRuntime;
    taskKind?: string;
    sourceId?: string;
    requesterSessionKey?: string;
    ownerKey?: string;
    scopeKind?: TaskScopeKind;
    requesterOrigin?: TaskDeliveryState["requesterOrigin"];
    parentFlowId?: string;
    childSessionKey?: string;
    parentTaskId?: string;
    agentId?: string;
    runId?: string;
    label?: string;
    task: string;
    preferMetadata?: boolean;
    notifyPolicy?: TaskNotifyPolicy;
    deliveryStatus?: TaskDeliveryStatus;
};
export type DetachedRunningTaskCreateParams = DetachedTaskCreateParams & {
    startedAt?: number;
    lastEventAt?: number;
    progressSummary?: string | null;
};
export type DetachedTaskStartParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    startedAt?: number;
    lastEventAt?: number;
    progressSummary?: string | null;
    eventSummary?: string | null;
};
export type DetachedTaskProgressParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    lastEventAt?: number;
    progressSummary?: string | null;
    eventSummary?: string | null;
};
export type DetachedTaskCompleteParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    endedAt: number;
    lastEventAt?: number;
    progressSummary?: string | null;
    terminalSummary?: string | null;
    terminalOutcome?: TaskTerminalOutcome | null;
};
export type DetachedTaskFailParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    status?: Extract<TaskStatus, "failed" | "timed_out" | "cancelled">;
    endedAt: number;
    lastEventAt?: number;
    error?: string;
    progressSummary?: string | null;
    terminalSummary?: string | null;
};
export type DetachedTaskFinalizeParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    status: Extract<TaskStatus, "succeeded" | "failed" | "timed_out" | "cancelled">;
    endedAt: number;
    lastEventAt?: number;
    error?: string;
    progressSummary?: string | null;
    terminalSummary?: string | null;
    terminalOutcome?: TaskTerminalOutcome | null;
};
export type DetachedTaskDeliveryStatusParams = {
    runId: string;
    runtime?: TaskRuntime;
    sessionKey?: string;
    deliveryStatus: TaskDeliveryStatus;
    error?: string;
};
export type DetachedTaskCancelParams = {
    cfg: OpenClawConfig;
    taskId: string;
};
export type DetachedTaskCancelResult = {
    found: boolean;
    cancelled: boolean;
    reason?: string;
    task?: TaskRecord;
};
export type DetachedTaskRecoveryAttemptParams = {
    taskId: string;
    runtime: TaskRuntime;
    task: TaskRecord;
    now: number;
};
export type DetachedTaskRecoveryAttemptResult = {
    recovered: boolean;
};
export type DetachedTaskLifecycleRuntime = {
    createQueuedTaskRun: (params: DetachedTaskCreateParams) => TaskRecord;
    createRunningTaskRun: (params: DetachedRunningTaskCreateParams) => TaskRecord;
    startTaskRunByRunId: (params: DetachedTaskStartParams) => TaskRecord[];
    recordTaskRunProgressByRunId: (params: DetachedTaskProgressParams) => TaskRecord[];
    finalizeTaskRunByRunId?: (params: DetachedTaskFinalizeParams) => TaskRecord[];
    completeTaskRunByRunId: (params: DetachedTaskCompleteParams) => TaskRecord[];
    failTaskRunByRunId: (params: DetachedTaskFailParams) => TaskRecord[];
    setDetachedTaskDeliveryStatusByRunId: (params: DetachedTaskDeliveryStatusParams) => TaskRecord[];
    /**
     * Return `found: false` when this runtime does not own the task so core can
     * fall back to the legacy detached-task cancel path.
     */
    cancelDetachedTaskRunById: (params: DetachedTaskCancelParams) => Promise<DetachedTaskCancelResult>;
    /**
     * Give a registered detached runtime one last chance to recover a stale task
     * before core marks it lost during maintenance.
     */
    tryRecoverTaskBeforeMarkLost?: (params: DetachedTaskRecoveryAttemptParams) => DetachedTaskRecoveryAttemptResult | Promise<DetachedTaskRecoveryAttemptResult>;
};
export type DetachedTaskLifecycleRuntimeRegistration = {
    pluginId: string;
    runtime: DetachedTaskLifecycleRuntime;
};
