feat(system): retention cleanup jobs, storage panel API and health storage level (CACHE-2)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-09-29 17:16:50 +08:00
1 parent d13c18b4b1
commit 05b163ce32
9 files changed
+1254 -9

No files matched your search

+9 -1
View File
@@ -28,6 +28,8 @@ export interface HealthDeps {
checkRoot?: typeof checkRoot;
/** 单个路径 IO 检查超时(ms),缺省 3000 */
ioTimeoutMs?: number;
/** 存储段(CACHE-2);不给时该段为 unknown */
storage?: () => Promise<{ level: HealthLevel; alerts: string[] }>;
}
const LEVEL_ORDER: HealthLevel[] = ["ok", "warn", "critical"];
@@ -384,7 +386,7 @@ export async function loadSchedules(db: Kysely<DB>, now: Date): Promise<SystemHe
export async function buildHealth(d: HealthDeps): Promise<SystemHealth> {
const now = d.now?.() ?? new Date();
const [{ processes, retiredProcesses }, db, paths, engine, schedules] = await Promise.all([
const [{ processes, retiredProcesses }, db, paths, engine, schedules, storage] = await Promise.all([
loadProcesses(d.db, now).catch(() => ({
processes: [] as SystemProcess[],
retiredProcesses: [] as SystemProcess[],
@@ -408,6 +410,10 @@ export async function buildHealth(d: HealthDeps): Promise<SystemHealth> {
failing: [],
failedRuns24h: 0,
})),
(d.storage?.() ?? Promise.resolve({ level: "unknown" as HealthLevel, alerts: [] })).catch(() => ({
level: "unknown" as HealthLevel,
alerts: [] as string[],
})),
]);
// SSE:存活的 api/all 进程上报的连接数合计;本进程若还没写过心跳,用实时值
const selfCounted = processes.some((p) => !p.stale && p.instanceId === d.self.instanceId && p.sseConnections != null);
@@ -423,6 +429,7 @@ export async function buildHealth(d: HealthDeps): Promise<SystemHealth> {
mountLevel,
engine.level,
schedules.level,
storage.level,
]),
checkedAt: now.toISOString(),
api: {
@@ -439,6 +446,7 @@ export async function buildHealth(d: HealthDeps): Promise<SystemHealth> {
mounts: paths.mounts,
engine,
schedules,
storage,
};
}