// services/voiceDiag/checks/mppDeskPhoneRelay.js // // Summarises MPP desk-phone relay probe results for /voicediag. import { collectIssues } from '../../renderers/mppPhoneFormatters.js'; import { isLineRegistered } from '../../renderers/mppPhoneFormatters.js'; export const MPP_DESK_PHONE_RELAY_STANDARDS = Object.freeze({ registered: true, noIssues: true, }); export const mppDeskPhoneRelayCheck = { id: 'mppDeskPhoneRelay', label: 'MPP Desk Phone (relay)', requires: ['phoneStatus'], scope: null, standards: MPP_DESK_PHONE_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 `/phonediag` when relay is available.', details: null, remediation: null, }; } const results = ctx.mppRelayResults; if (!Array.isArray(results)) { return { status: 'skipped', message: 'MPP relay probe was not run (no desk phones discovered on 10.x).', details: null, remediation: null, }; } if (results.length === 0) { return { status: 'skipped', message: 'No MPP desk phones discovered on 10.x for relay probe.', details: null, remediation: null, }; } const phones = []; let errorCount = 0; for (const r of results) { const label = r.phone?.name || r.phone?.product || r.phone?.mac || '?'; const ip = r.phone?.ip || '?'; if (!r.ok) { errorCount += 1; phones.push({ label, ip, ok: false, error: r.error?.message || 'probe failed', }); continue; } const parsed = r.mpp?.parsed || r.parsed || {}; const line1 = parsed.lines?.find((l) => l.index === 1) || parsed.lines?.[0]; const issues = collectIssues(r.mpp || {}, parsed); const registered = line1 ? isLineRegistered(line1) : null; if (!registered || issues.length > 0) errorCount += 1; phones.push({ label, ip, ok: true, registered: line1?.registrationState || null, issues, }); } const summary = `${results.length} MPP phone(s) probed via relay. ` + `${errorCount === 0 ? 'All registered with no issues.' : `${errorCount} phone(s) need attention.`}`; const details = { phones, probed: results.length, attentionCount: errorCount }; if (errorCount > 0) { return { status: 'error', message: summary + ' Run `/phonediag` for full section layout.', details, remediation: null, }; } return { status: 'ok', message: summary, details, remediation: null, }; }, };