import { accountDb } from "../scoped-db"; import { CAPS } from "../limits"; import { busyRunnerCounts, deleteRunnerRow, summarizeRunner } from "./runner-registration"; import type { RunnerRow, RunnerSummary } from "./runner-registration"; import { ownerRepoIds } from "./scope"; /** Owner-wide runners of an account (they serve every repository it owns). */ export async function listOwnerRunners(ownerId: string): Promise { const rows = await accountDb(ownerId).all( "SELECT * FROM runners WHERE owner_id = ? ORDER BY name LIMIT ?", ownerId, CAPS.runnersPerScope, ); const counts = await busyRunnerCounts( rows.length > 0 ? await ownerRepoIds(ownerId) : [], rows.map((row) => row.id), ); return rows.map((row) => summarizeRunner(row, counts.get(row.id) ?? 0)); } /** Callers must have checked owner admin. */ export async function removeOwnerRunner(ownerId: string, runnerId: string): Promise { const row = await accountDb(ownerId).first<{ id: string }>( "SELECT id FROM runners WHERE id = ? AND owner_id = ?", runnerId, ownerId, ); if (!row) return false; await deleteRunnerRow(runnerId); return true; }