Files
brain/tools/secretary-slim.mjs
T

23 lines
1.6 KiB
JavaScript

// tools/secretary-slim.mjs
// Live-only проекция протокола для подачи в LLM: мёртвые ветки/кандидаты («надгробия»)
// в неё не попадают совсем. Чистая, не мутирует вход. Полный протокол (источник истины)
// и архив строятся отдельно — здесь только то, что видит агент.
// Терминальные статусы ветки = мертва, в подачу не идёт (кандидат: закрыт/отпал/мутировал/повышен).
const DEAD_BRANCH = new Set(['закрыт', 'отпал', 'мутировал']);
/** Ветка жива, если статус не терминальный (нет статуса/«открыт» — живые). */
export function isLiveBranch(h) { return !DEAD_BRANCH.has(String((h && h.status) || '')); }
/** Кандидат жив, если без статуса или «жив» (то же, что фильтрует candidatesForPrompt). */
export function isLiveCandidate(c) { const s = String((c && c.status) || ''); return s === '' || s === 'жив'; }
/** Копия протокола только из живого. Вход не мутируется. null/не-объект — как есть. */
export function slimProtocol(proto) {
if (!proto || typeof proto !== 'object') return proto;
return {
...proto,
hidden: (proto.hidden || []).filter(isLiveBranch),
candidates: (proto.candidates || []).filter(isLiveCandidate),
};
}