101c08d447
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
28 lines
1.4 KiB
JavaScript
28 lines
1.4 KiB
JavaScript
// Чистые утилиты для тонких переходников секретаря.
|
|
|
|
/** Проверка пригодности файла-хода перед записью ссылок: UTF-8, без BOM, непусто. */
|
|
export function verifyEncoding(content) {
|
|
if (typeof content !== 'string' || content.length === 0) return { ok: false, reason: 'empty' };
|
|
if (content.charCodeAt(0) === 0xFEFF) return { ok: false, reason: 'BOM' };
|
|
return { ok: true, reason: 'utf8' };
|
|
}
|
|
|
|
/** Провенанс-метка из номеров ходов: [7,12] → "[→7, →12]". */
|
|
export function buildStepLinks(turns) {
|
|
const arr = Array.isArray(turns) ? turns.filter((t) => t != null) : [];
|
|
if (!arr.length) return '';
|
|
return `[${arr.map((t) => `→${t}`).join(', ')}]`;
|
|
}
|
|
|
|
/** Период нарезки из состояния флажка и текущего хода. */
|
|
export function computePeriod(flagState = {}, currentTurn = 0) {
|
|
const from = Number.isInteger(flagState.startedAtTurn) ? flagState.startedAtTurn : 0;
|
|
return { from, to: currentTurn };
|
|
}
|
|
|
|
/** Оглавление дел как подсказка для старта сессии. */
|
|
export function renderIndexContext(indexMd) {
|
|
const body = typeof indexMd === 'string' && indexMd.trim() ? indexMd.trim() : '(дел пока нет)';
|
|
return `Открытые дела (протоколы секретаря):\n${body}`;
|
|
}
|