[dashboard][C] Демо-консоль: веб-чат пациента, «следующий день», прокрутка сценария, сплит-экран #17

Closed
opened 2026-10-03 14:38:56 +03:00 by Eleboba · 0 comments
Owner

Описание

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 зелёный.
  • Проверено вживую на API #12 (sqlite): подключение → «Начать» → проигрывание дней, ошибка шага ставит проигрывание на паузу.

Заметки/решения

  • Время в сценарии: дата дня N = дата последнего проигранного дня M + (N − M); если ничего не проигрывали или дата уже позади (ручной «Следующий день») — ближайшее HH:MM. Часы только вперёд: прошедшее время пропускается с ⚠️.
  • press ищет кнопку в последних 10 ответах, от новых к старым; точное совпадение подписи важнее подстроки; до 3 повторов с ожиданием outbox.
  • expect_color — мягкая проверка (✅/⚠️), демо не останавливает. Любая ошибка шага → пауза с «Повторить шаг» / «Пропустить шаг» / «Продолжить вручную»; прерванный прогон тоже можно продолжить.
  • Дополнительное действие сценария {"start": "<код>"} (необязательное) — отправляет type=start.
  • Ограничение: при iframe веб-приложения пациента кнопка сценария в сплит-экране шлёт события через API и забирает outbox сама — приложение пациента увидит их, только если перечитывает историю.
  • dashboard/app.py и dashboard/api_client.py не трогал (зона #16).
## Описание 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` зелёный. - Проверено вживую на API #12 (sqlite): подключение → «Начать» → проигрывание дней, ошибка шага ставит проигрывание на паузу. **Заметки/решения** - Время в сценарии: дата дня N = дата последнего проигранного дня M + (N − M); если ничего не проигрывали или дата уже позади (ручной «Следующий день») — ближайшее HH:MM. Часы только вперёд: прошедшее время пропускается с ⚠️. - `press` ищет кнопку в последних 10 ответах, от новых к старым; точное совпадение подписи важнее подстроки; до 3 повторов с ожиданием outbox. - `expect_color` — мягкая проверка (✅/⚠️), демо не останавливает. Любая ошибка шага → пауза с «Повторить шаг» / «Пропустить шаг» / «Продолжить вручную»; прерванный прогон тоже можно продолжить. - Дополнительное действие сценария `{"start": "<код>"}` (необязательное) — отправляет `type=start`. - Ограничение: при iframe веб-приложения пациента кнопка сценария в сплит-экране шлёт события через API и забирает outbox сама — приложение пациента увидит их, только если перечитывает историю. - `dashboard/app.py` и `dashboard/api_client.py` не трогал (зона #16).
Eleboba added this to the Этап 1 · Ветераны СВО milestone 2026-10-03 14:38:56 +03:00
Eleboba added the size/1P0featuredashboard labels 2026-10-03 14:38:56 +03:00
Eleboba changed title from [dashboard] Демо-консоль: веб-чат пациента, «следующий день», проигрывание сценария to [dashboard][C] Демо-консоль: веб-чат пациента, «следующий день», прокрутка сценария, сплит-экран 2026-10-03 15:16:41 +03:00
Eleboba added the lane/Cstage/veterans labels 2026-10-03 15:16:42 +03:00
Eleboba self-assigned this 2026-10-04 12:23:07 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: MedITron/PTSRaiAgent#17