[dashboard][C] Демо-консоль: веб-чат пациента, «следующий день», прокрутка сценария, сплит-экран #17
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#17
Reference in New Issue
Block a user
Описание
ADR-004/005: демо не зависит от Telegram и реального времени. Через API диалога и демо-часов.
Желаемый результат
Веб-чат (сообщения, кнопки, пуши из outbox), панель демо (виртуальный день, «следующий день», «прокрутить до дня N» по
data/synthetic/andrey.jsonl, «сброс»), страница «Сплит-экран»: слева чат Андрея, справа дашборд врача.Зона и владение файлами
Lane C (дашборд) — владеет:
dashboard/**,tests/test_dashboard*.py.Замороженные контракты (менять только отдельным мелким PR с пингом всех):
app/core/types.py,app/dialog/contracts.py,app/api/schemas.py,app/integrations/base.py,app/services/contracts.py,app/main.py,app/config.py,config/modules.yaml,config/rules.yaml,config/scales/*,pyproject.toml/uv.lock,docker-compose.yml,Makefile.Лог выполнения
2026-10-04
2026-10-04
Что сделано
dashboard/pages/2_Демо-консоль.py: выбор персоны (/demo/personas→ пациенты врача → токен изDEMO_PERSONA_TOKEN), панель часов (дата/время, день терапии, «+1 час», «К 08:00 (приём)», «К 20:00 (чек-ин)», «Следующий день», «Сброс демо» с подтверждением), веб-чат пациента (кнопки изReply.buttons→type=button, текст →type=text, «Начать» с кодом подключения →type=start; стили поkind: crisis — красный блок, safety_plan — карточка, info — серый), outbox забирается после каждого действия и опросом раз в 2 с (st.fragment).data/synthetic/<персона>.jsonl(путь из персоны, по имени «Андрей С.» →andrey.jsonl, свой путь или загрузка файла), список дней с подсказками, «▶ Проиграть день N» (с паузой между шагами и живым журналом), «⏭ Прокрутить до дня N» (все непроигранные дни без пауз), «▶ Следующий день сценария».dashboard/pages/3_Сплит-экран.py: сверху часы и «Следующий день» + «▶ Сценарий: день N»; слева чат пациента или iframe веб-приложения пациента (PATIENT_WEB_URL); справа компактная панель врача (пациенты с цветами, лента алертов, опрос 2 с, большой красный баннер на новый острый алерт с кнопкой ack).dashboard/console/:api.py(свой HTTP-клиент, все ошибки →ApiError),scenario.py(парсер/валидатор),playback.py(раннер),chatlog.py,widgets.py,playback_ui.py./patients/connect), код подставляется в «Начать»;?code=из ссылки подключения тоже подставляется.Результат
tests/test_dashboard_console.py(27: парсер, поиск кнопки по подписи, расчёт сдвига часов, раннер на фейковом API, HTTP-клиент) иtests/test_dashboard_console_pages.py(3: страницы черезAppTestпри выключенном API не падают).make lint testзелёный.Заметки/решения
pressищет кнопку в последних 10 ответах, от новых к старым; точное совпадение подписи важнее подстроки; до 3 повторов с ожиданием outbox.expect_color— мягкая проверка (✅/⚠️), демо не останавливает. Любая ошибка шага → пауза с «Повторить шаг» / «Пропустить шаг» / «Продолжить вручную»; прерванный прогон тоже можно продолжить.{"start": "<код>"}(необязательное) — отправляетtype=start.dashboard/app.pyиdashboard/api_client.pyне трогал (зона #16).[dashboard] Демо-консоль: веб-чат пациента, «следующий день», проигрывание сценарияto [dashboard][C] Демо-консоль: веб-чат пациента, «следующий день», прокрутка сценария, сплит-экран