Files
brain/tools/secretary-flag.test.mjs
T
Дмитрий f8a40da56c feat(secretary): захват выдачи инструмента (N3) + сверка имени дела при включении (N2)
- parseLastExchange привязывает результат инструмента к действию по tool_use_id,
  склеивает text-блоки, усекает до 1200 симв.; [ВЫДАЧА] в Слое 1 теперь наполняется
- resolveCaseActivation: похожее имя дела (опечатка/подстрока) -> переспросить,
  не заводя дело-двойник; хук secretary-prompt-hook выводит подсказку с кандидатами
- TDD: тесты secretary-transcript/flag/prompt-hook; полный свод зелёный

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 17:21:06 +03:00

52 lines
2.7 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { detectSecretaryCommand, secretaryModeFileName, resolveCaseActivation } from './secretary-flag.mjs';
describe('detectSecretaryCommand', () => {
it('распознаёт включение', () => {
expect(detectSecretaryCommand('включи секретаря пожалуйста')).toBe('on');
});
it('распознаёт выключение', () => {
expect(detectSecretaryCommand('всё, выключи секретаря')).toBe('off');
});
it('нет команды — null', () => {
expect(detectSecretaryCommand('давай продолжим работу')).toBeNull();
});
it('цитата в кавычках не срабатывает', () => {
expect(detectSecretaryCommand('фраза «включи секретаря» это команда')).toBeNull();
});
});
describe('secretaryModeFileName — флажок по сессии', () => {
it('имя файла флажка содержит id сессии', () => {
expect(secretaryModeFileName('abc-123')).toBe('secretary-mode-abc-123.json');
});
it('без сессии — unknown', () => {
expect(secretaryModeFileName()).toBe('secretary-mode-unknown.json');
});
});
describe('resolveCaseActivation — сверка имени дела со списком существующих', () => {
const existing = ['general', 'создание-секретаря', 'строительство-секретаря'];
it('точное совпадение — активировать существующее', () => {
expect(resolveCaseActivation('создание-секретаря', existing))
.toEqual({ action: 'activate', work: 'создание-секретаря' });
});
it('нет похожих — активировать как новое (имя как ввёл)', () => {
expect(resolveCaseActivation('биллинг', existing))
.toEqual({ action: 'activate', work: 'биллинг' });
});
it('опечатка (правка ≤2) — переспросить с кандидатом', () => {
const r = resolveCaseActivation('создание-секретар', existing);
expect(r.action).toBe('confirm');
expect(r.candidates).toContain('создание-секретаря');
});
it('сокращение (подстрока) — переспросить', () => {
const r = resolveCaseActivation('создание', existing);
expect(r.action).toBe('confirm');
expect(r.candidates).toContain('создание-секретаря');
});
it('пустой список дел — активировать как новое', () => {
expect(resolveCaseActivation('новое', [])).toEqual({ action: 'activate', work: 'новое' });
});
});