f8a40da56c
- 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>
52 lines
2.7 KiB
JavaScript
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: 'новое' });
|
|
});
|
|
});
|