dialog-status-check

Dialog Status Check

Плановий новий ендпоінт. Виконується коли оператор відкриває діалог в Electron-клієнті — щоб зрозуміти що з даних для цього (RU, TU) пари вже є у векторній базі, а що треба дотягнути.

Що повертає

Очікувано — JSON виду:

{
  "ruId": "...",
  "tuId": "...",
  "dialogKey": "<sha256...>",
  "lastNoteAt": "2026-05-19T08:00:00Z",      // або null
  "lastMessageAt": "2026-05-19T14:23:00Z",   // або null
  "profileUpdatedAt": "2026-05-15T10:00:00Z",// або null
  "photoUpdatedAt": "2026-05-15T10:00:00Z",  // або null
  "counts": { "notes": 124, "messages": 80, "profile": 1, "photo": 1 }
}

null означає що для цього джерела в БД нічого немає → треба буде запросити з upstream при наступному /generate.

Кроки

  1. Operator відкриває діалог в Electron. UI шле POST /stack-ai/tips/<TBD>/status з { ruId, tuId }. TODO: визначити фінальний шлях URL
  2. Сервіс будує dialogKey = sha256('dialog:<ruId>:<tuId>').
  3. Один запит до Supabase — GROUP BY source з MAX(updated_at) і COUNT(*):
    SELECT source, MAX(updated_at) AS last_at, COUNT(*) AS cnt
    FROM client_memory_chunks
    WHERE dialog_key = $1
    GROUP BY source;
  4. Сервіс мапить рядки у поля відповіді: notelastNoteAt, conversationlastMessageAt, profileprofileUpdatedAt, photophotoUpdatedAt (TODO: photo як source ще не визначено в [[services/ai/../entities/memory-chunk]]).
  5. Повертає JSON клієнту.

Нюанси

  • dialog_key стабільний, тому не залежить від favoriteId чи інших змінних.
  • Якщо діалог ще ніколи не інжестився — усі поля null, counts 0. UI має це показати як “немає даних, треба згенерувати з нуля”.
  • Запит швидкий (один індексований SELECT) — підходить для опен-діалогу onClick.
  • TODO: визначити який source описує "photo" — поки в коді profile chunks його не виділяють окремо.

Зв’язки

  • Запит дані з supabase (таблиця memory-chunk).
  • Виклик результату використовує generation-pipeline для рішення що дотягувати.
  • Має бути доданий як новий ендпоінт у tips-memory-controller (або в окремий controller — TODO: вирішити).

TODO

  • Підтвердити фінальну форму payload з боку Electron.
  • Визначити окремий source photo чи це під profile.
  • Винести SQL/Supabase запит у memory-service як новий метод getDialogStatus().