/** * Lost-task detection. * * For every task currently in `running` or `queued`, check whether its recorded * pid is still alive via `process.kill(pid, 0)`. If the pid is gone, the * runner crashed or was killed externally; flip status to `lost` so observers * (CLI list, agent prompt) stop misreporting it as in-flight. * * EPERM means the pid exists but we don't have permission to signal it — * treat that as alive. ESRCH (or anything else) means dead. * * Pid-less queued tasks: runner.ts writes its own pid on entry, so a task * with status=queued and no pid means the runner subprocess crashed during * module import (cliPath wrong, syntax error in dist) before it could record * itself. We reap these once they're older than QUEUED_NO_PID_TIMEOUT_MS so * `franklin task list` doesn't show them as eternally pending. * * Best-effort: PID reuse can lie. v3.10's contract is "lazy reconciliation * on `task list`"; v3.11 may add a pidStartTime cross-check. */ export declare function reconcileLostTasks(now?: number): number;