§01
Обзор
- Что это: небольшая ops-утилита для выборочного QA звонков колл-центра на Asterisk. Название
tg_invoice_listenerвводит в заблуждение (вероятно, наследиеbun initили переименования) — по коду это «сэмплер записей звонков для QA → Telegram». - Тип / статус / роль: cli / ops-скрипт · prototype · solo (1 коммит от пользователя).
- Период активности: 2026-04-18 (один день, 1 коммит).
§02
Стек
- Bun + TypeScript, БЕЗ внешних зависимостей — только встроенные средства Bun:
Bun.$(shell),Bun.file,Bun.env, нативныеfetch/FormData. Системныйsshpassдля SSH/SCP по паролю. - Источник данных: Asterisk CDR (
asteriskcdrdbMySQL), файлы записей в/var/spool/asterisk/monitor/YYYY/MM/DD/. - Доставка: Telegram Bot API (
sendAudio, multipart FormData). - Конфигурация через env (SSH host/user/password, TG token/chat, параметры окна выборки и сэмпла).
§03
Что реализовано
- Один коммит (2026-04-18): полностью рабочий скрипт
index.ts(176 строк). - Логика:
fetchCandidates()(SQL по CDR: ANSWERED, billsec ≥ порога, запись присутствует,GROUP BY recordingfile,ORDER BY RAND() LIMIT),pickCount()(случайные 10–15), скачивание по SCP во временную папку,sendAudio()с форматированной подписью, очистка tmp вfinally, exit code по результату.
§04
Технические челленджи
Подтверждено по index.ts:
- Автоматизация SSH/SCP по паролю (
sshpass -e+ строгие опции-o: проверка host-key отключена, только парольная аутентификация, таймаут): доступ к удалённому PBX без ключей. → практичная ops-интеграция. - Случайная выборка для QA (
ORDER BY RAND()+pickCount10–15): репрезентативный сэмпл записей вместо всех подряд. → продуманный подход к QA. - Zero-dependency на встроенных средствах Bun (
Bun.$,Bun.file, нативные fetch/FormData): без зависимостей node_modules, весь I/O через рантайм Bun. → современный, лёгкий стиль. - Аккуратная работа с ресурсами и ошибками: временная папка с PID+timestamp, гарантированная очистка в
finally, try/catch на каждый файл, осмысленный exit code (fail, если ничего не отправлено). → надёжность для запусков по cron. - `requireEnv` с явной ошибкой при отсутствии переменной. → fail-fast конфигурация.
§05
AI-разработка
- Найдено сессий: 0. В репозитории есть
.claude/(с гайдом по Bun в CLAUDE.md) и.cursor/— AI-тулинг использовался, но транскриптов Claude Code нет. - Что делалось с AI: вероятно, сгенерировано/доработано в Cursor/Claude (CLAUDE.md — стандартный гайд по Bun).
- Паттерны AI-воркфлоу: данных минимум.
§06
Достижения и метрики
- Рабочая ops-утилита: Asterisk CDR → SCP → Telegram, ~176 строк, без зависимостей.
- Настраиваемая выборка, безопасная очистка, готовность к cron.