()
| 7 | const ONE_HOUR = 60 * 60 * 1000; |
| 8 | |
| 9 | async function cleanExpiredAgentJobKeys() { |
| 10 | try { |
| 11 | const db = getDb(); |
| 12 | const rows = db |
| 13 | .select({ id: settings.id, key: settings.key, lastUsedAt: settings.lastUsedAt, createdAt: settings.createdAt }) |
| 14 | .from(settings) |
| 15 | .where(eq(settings.type, 'agent_job_api_key')) |
| 16 | .all(); |
| 17 | |
| 18 | // Split into SDK keys (no container) vs container-backed keys |
| 19 | const sdkRows = rows.filter(r => r.key.includes('sdk')); |
| 20 | const containerRows = rows.filter(r => !r.key.includes('sdk')); |
| 21 | |
| 22 | let deleted = 0; |
| 23 | |
| 24 | // SDK keys: delete any older than 1 hour (no container to inspect) |
| 25 | const sdkCutoff = Date.now() - ONE_HOUR; |
| 26 | for (const r of sdkRows) { |
| 27 | const age = r.lastUsedAt !== null ? r.lastUsedAt : r.createdAt; |
| 28 | if (age < sdkCutoff) { |
| 29 | db.delete(settings).where(eq(settings.id, r.id)).run(); |
| 30 | deleted++; |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | // Container-backed keys: existing logic — 24h expiry + container inspect |
| 35 | const containerCutoff = Date.now() - TWENTY_FOUR_HOURS; |
| 36 | const candidates = containerRows.filter(r => |
| 37 | (r.lastUsedAt !== null ? r.lastUsedAt : r.createdAt) < containerCutoff |
| 38 | ); |
| 39 | |
| 40 | if (candidates.length > 0) { |
| 41 | const { inspectContainer } = await import('./tools/docker.js'); |
| 42 | for (const r of candidates) { |
| 43 | const info = await inspectContainer(r.key); |
| 44 | if (!info) { |
| 45 | db.delete(settings).where(eq(settings.id, r.id)).run(); |
| 46 | deleted++; |
| 47 | } |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | if (deleted > 0) { |
| 52 | console.log(`[maintenance] Deleted ${deleted} expired agent job key(s)`); |
| 53 | } else { |
| 54 | console.log(`[maintenance] No expired agent job keys (${rows.length} active)`); |
| 55 | } |
| 56 | } catch (err) { |
| 57 | console.error('[maintenance] cleanExpiredAgentJobKeys failed:', err); |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | async function runMaintenance() { |
| 62 | console.log('[maintenance] Running maintenance...'); |
no test coverage detected