evOo-local/packages/adapters/src/takeover-resume.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

76 lines
2.5 KiB
TypeScript

export type TakeoverResumeCheckpoint = "takeover" | "takeover-skipped";
export const TAKEOVER_RESUME_CHECKPOINTS: readonly TakeoverResumeCheckpoint[] = [
"takeover",
"takeover-skipped",
];
/** Shown when desktop tools are gated because the user still holds the screen. */
export const DESKTOP_HELD_FOR_TAKEOVER_MESSAGE =
"The user has the screen. File and shell tools still work.";
export function takeoverCheckpointOf(
checkpoint: string | null | undefined,
): TakeoverResumeCheckpoint | null {
return checkpoint === "takeover" || checkpoint === "takeover-skipped" ? checkpoint : null;
}
export function takeoverResumeFromRelease(reason: unknown): {
checkpoint: TakeoverResumeCheckpoint;
promptNote: string;
} {
if (reason === "skipped" || reason === "expired") {
return {
checkpoint: "takeover-skipped",
promptNote:
"The user skipped the login. Continue without treating the login as complete. Do not request takeover again unless you still cannot proceed.",
};
}
return {
checkpoint: "takeover",
promptNote:
"The user finished the login. Continue from where you left off. Do not request takeover again.",
};
}
export type TakeoverContinuePlan = {
resumeCheckpoint: TakeoverResumeCheckpoint | null;
heldForTakeover: boolean;
resumeHeldLease: boolean;
takeoverResume: ReturnType<typeof takeoverResumeFromRelease> | null;
};
export function takeoverContinuePlan(run: {
status: string;
checkpoint: string | null;
}): TakeoverContinuePlan {
const resumeCheckpoint = takeoverCheckpointOf(run.checkpoint);
const heldForTakeover = run.status === "waiting_takeover" && !resumeCheckpoint;
return {
resumeCheckpoint,
heldForTakeover,
resumeHeldLease: heldForTakeover || Boolean(resumeCheckpoint),
takeoverResume: resumeCheckpoint
? takeoverResumeFromRelease(resumeCheckpoint === "takeover-skipped" ? "skipped" : "done")
: null,
};
}
/** Observed status and checkpoint so a concurrent release cannot be claimed away. */
export function continueRunClaimFence(run: { status: string; checkpoint: string | null }) {
return {
status: run.status,
checkpoint: run.checkpoint,
};
}
/** If release stamped a checkpoint while this continue was held, rebuild the plan from it. */
export function refreshTakeoverContinuePlan(
plan: TakeoverContinuePlan,
current: { status: string; checkpoint: string | null },
): TakeoverContinuePlan {
if (!plan.heldForTakeover) return plan;
if (!takeoverCheckpointOf(current.checkpoint)) return plan;
return takeoverContinuePlan(current);
}