import { BaseCommand } from '@adonisjs/core/ace' import { CommandOptions } from '@adonisjs/core/types/ace' import SeedOrchestrator from '#services/SeedOrchestrator' /** Seeding progress per range status and per node (CONCEPT.md D38). */ export default class SeedStatus extends BaseCommand { public static commandName = 'seed:status' public static description = 'Shows seeding progress per range status and per node.' public static options: CommandOptions = { startApp: true, } public async run() { const status = await SeedOrchestrator.status() const n = (x: unknown) => Number(x ?? 0).toLocaleString('en') for (const r of status.ranges) { this.logger.info(`${r.status}: ${n(r.ranges)} ranges, ${n(r.reached)} of ${n(r.articles)} articles reached, ${n(r.headers)} headers, ${n(r.files)} files`) } for (const node of status.nodes) { this.logger.info(`node ${node.name}${node.disabled ? ' (disabled)' : ''}: ${node.leases} leases, ${n(node.headers)} headers, last seen ${node.last_seen_at ?? 'never'}`) } this.logger.info(`Headers in ranges finished in the last hour: ${n(status.headersDoneLastHour)}`) if (status.paused) this.logger.warning(`No new leases: ${status.paused} (BACKFILL_MAX_NVME_GB / BACKFILL_MAX_HDD_GB).`) } }