// services/voiceDiag/checks/dectBaseRelay.js // // Summarises DECT base relay collect results for /voicediag. export const DECT_BASE_RELAY_STANDARDS = Object.freeze({ healthy: true, }); export const dectBaseRelayCheck = { id: 'dectBaseRelay', label: 'DECT Base (relay)', requires: ['phoneStatus'], scope: null, standards: DECT_BASE_RELAY_STANDARDS, async run(ctx) { if (!process.env.DECT_RELAY_AGENT_TOKEN) { return { status: 'skipped', message: 'Relay not configured (`DECT_RELAY_AGENT_TOKEN` unset) — run `/dectdiag` when relay is available.', details: null, remediation: null, }; } const results = ctx.dectRelayResults; if (!Array.isArray(results)) { return { status: 'skipped', message: 'DECT relay collect was not run (no bases discovered on 10.x).', details: null, remediation: null, }; } if (results.length === 0) { return { status: 'skipped', message: 'No DECT bases discovered on 10.x for relay collect.', details: null, remediation: null, }; } const bases = []; let errorCount = 0; for (const r of results) { const label = r.base?.name || r.base?.mac || '?'; const ip = r.base?.ip || '?'; if (!r.ok) { errorCount += 1; bases.push({ label, ip, ok: false, error: r.error?.message || 'collect failed', }); continue; } const verdict = r.verdict || {}; const data = r.data || {}; const warnings = Array.isArray(verdict.warnings) ? verdict.warnings : []; const powerLoss = (data.rebootLog || []).find((entry) => entry.reasonCode === 80); const unhealthy = !verdict.healthy; if (unhealthy) errorCount += 1; bases.push({ label, ip, ok: true, healthy: verdict.healthy !== false, uptime: data.time?.operatingTime || null, warnings, powerLoss: powerLoss ? { at: powerLoss.at, sequence: powerLoss.sequence } : null, activeRtp: data.rtp?.current || 0, }); } const summary = `${results.length} DECT base(s) collected via relay. ` + `${errorCount === 0 ? 'All bases healthy.' : `${errorCount} base(s) need attention.`}`; const details = { bases, collected: results.length, attentionCount: errorCount }; if (errorCount > 0) { return { status: 'error', message: summary + ' Run `/dectdiag` for full dump and reboot controls.', details, remediation: null, }; } return { status: 'ok', message: summary, details, remediation: null, }; }, };