1. W1.1 — чат как главная, кнопка «Стоп» и кооперативная отмена стрима

— smeta_user_frontend: ChatWorkspaceView/ChatView — главная теперь чат, AppTopbar/useNav (логотип → home), кнопка ⏹ Стоп через AbortController, контекст-панель

— smeta-user-backend: ChatController + AgentClient — проброс отмены стрима к агенту (надёжная остановка через прокси, IOException-цепочка)

— Частичный ответ остаётся как «⏹ остановлено», не считается ошибкой

2. W1.2 — выбор модели ИИ пользователем + админская витрина моделей

— smeta-user-backend: preferred_model + settings/models endpoint

— smeta_user_frontend: селектор модели ИИ в шапке чата

— smeta_admin_backend: AdminModelsUsageController — GET/PUT /api/admin/models (model_id в теле PUT — обход Spring-фильтра кодированных слэшей для deepseek), прокси к agent под X-Service-Token

— smeta_admin_frontend: ModelsView — таблица 12 моделей, чекбоксы доступности польз./эксперт, радио дефолта на роль, тумблер enabled, per-field PUT

3. W1.3 — сводный расход агента в админке, биллинг убран у юзера

— smeta_admin_backend: GET /api/admin/usage/summary?from&to&user_id&model

— smeta_admin_frontend: AgentExpensesView — период + фильтры model/user_id, сводка (всего/вызовы/токены) + таблица по моделям с сортировкой по стоимости; роуты и пункты сайдбара «Модели ИИ»/«Расходы»; agentUsageSummaryApi

— smeta_user_frontend: QuotaBadge и quota-blocker сняты, /me/usage не дёргается — всё бесплатно

— Verified: каталог 12 моделей, PUT слэш-id персистится, usage $176/952 записи

4. W2.1/W2.2 — срезы сметы и браузер ФСНБ с деплинками чата

— smeta-user-backend: срезы сметы «на работы» и «на материалы» (v2.5.0)

— smeta_user_frontend: вкладки срезов + браузер ФСНБ + деплинки чата (v2.5.0)

5. W2.3 — просмотр чатов пользователей в админке

— smeta_admin_backend: AdminChatsController — GET /api/admin/chats?user_id&from&to&q (список сессий), GET /api/admin/chats/{sessionId} (полный тред role/content/tool_calls/usage/ts); читает chat_session/chat_message напрямую из fsnbdb, без прокси к user-backend; admin JWT, read-only

— Фиксы: восстановление контекста чата из tool_calls, owner-фильтр при восстановлении (v2.3.58/v2.3.60)

— smeta_admin_frontend: UserChatsView + пометка «~ из диалога» для восстановленного контекста (v2.3.74/v2.3.75)

— Verified: 7 сессий, 80/80 сообщений с текстом, 39 с tool_calls, 40 с usage

6. Корневой фикс prQnt — «всего» вместо домножения на объём работы

— smeta-user-backend: SmetaService.calcFotRabota — prQnt → vol=1 (ресурс/ЗТ/ВМ/PERCENT_OF); SmetaTotalService SQL — CASE WHEN pr_qnt в EM+MAT, ЗТ-koef, ВМ-подзапросе; VmResursResponse.prQnt + проставление в CatalogService.lookupVmResursy

— smeta_user_frontend: RazdelGrid — qtyTotal()/itogoTek() для prQnt-строк не домножают на объём; D4-UI — строки prQnt[] под работой ВОР (оранжевый бейдж «П проект»), нумерация после расценок и материалов, removePrqnt

— Регрессия исключена: e2e scenario_02 1 277 771,72 ₽ копейка-в-копейку, ввод 20→15.54 (=20×0.777)

— D1 — неучтённый ресурс нумеруется внутри раздела (renumberSmetaInternal сразу в addNeuchtennyy)

7. Chat-analytics — covered_by-эпизоды и тип подбора (расценка/материал)

— smeta_admin_backend: AdminChatAnalyticsController.episodes форвардит kind (rascenka|material) на agent

— smeta_admin_frontend: ChatAnalyticsView — фильтр и колонка «Тип подбора», блок by_kind в сводке, тег типа в карточке, кандидаты через codeOf(); covered_by-исход в фильтре/метке/сводке, колонка «Выбор» ↗ covered_by_code, карточка «Учтено в составе расценки X»

— Также: covered_by-эпизоды — название из covered_reason при пустом vor_text (v2.3.76)

8. Корневой фикс — привязка сессии к создаваемым сущностям

— smeta-user-backend: v2.5.2 — chat session → созданные сущности (объекты/ВОР/сметы) подхватывают session id

Сводная статистика по коду:

Проект | Добавлено строк | Удалено строк | Коммитов

smeta_admin_backend | 287 | 55 | 5

smeta_admin_frontend | 511 | 16 | 6

smeta-user-backend | 474 | 34 | 6

smeta_user_frontend | 923 | 73 | 6

Итого | 2195 | 178 | 23

Оценка трудозатрат:

Задача | ~Часы

W1.1 чат-главная, «Стоп» и отмена стрима | 6

W1.2 селектор моделей у юзера + админ-витрина | 5

W1.3 сводный расход агента + снятие биллинга | 4

W2.1/W2.2 срезы сметы и браузер ФСНБ с деплинками | 6

W2.3 просмотр чатов юзеров в админке (бэк+фронт+фиксы) | 5

Корневой фикс prQnt = «всего» (бэк+фронт+D1+D4-UI) | 5

Chat-analytics covered_by + тип подбора | 3

Фикс привязки сессии к сущностям (v2.5.2) | 1.5

Итого | ~35.5 час