#!/usr/bin/env node /** * judge-key-config — резолв HMAC-ключа СУДЬИ (отдельный домен от расписок R-31). * Пакет 4.1 (Δ4): ТОЛЬКО keychain (service router-mentor-judge). env-fallback УБРАН — * ROUTER_MENTOR_JUDGE_KEY больше не читается (анти-казуальная утечка через env/логи; шов под HSM). * Ключ провижинит владелец. Без ключа — null → подпись под-прогонов невозможна * → дисциплина #1 fail-closed (вердикт без валидного под-прогона не принимается). */ import { readKeychainSync } from './keychain-read.mjs'; const KEY_ENV = 'ROUTER_MENTOR_JUDGE_KEY'; const KEYCHAIN_SERVICE = 'router-mentor-judge'; const KEYCHAIN_ACCOUNT = 'default'; /** * Резолв ключа судьи: ТОЛЬКО keychain (env-fallback убран, Пакет 4.1 Δ4). `env` в args * больше не используется (extra-проп молча игнорируется); KEY_ENV сохранён в _internals * как имя теперь-игнорируемой переменной (domain-тест R-31 на него опирается). * @param {object} [args] * @param {Function} [args.keychainGet] - () => string|null (инъекция для тестов) * @returns {string|null} */ export function resolveJudgeKey({ keychainGet = defaultKeychainGet } = {}) { try { const v = keychainGet(); return v ? String(v) : null; } catch { return null; } } /** keytar async-only (синхронного чтения нет) → читаем обёрткой readKeychainSync через subprocess. */ export function defaultKeychainGet() { return readKeychainSync(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT); } export const _internals = { KEY_ENV, KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT };