diff --git a/plan/done/mute-session-end.md b/plan/done/mute-session-end.md new file mode 100644 index 0000000..64a928d --- /dev/null +++ b/plan/done/mute-session-end.md @@ -0,0 +1,78 @@ +# Feature: Mute Session End Notification + +## Goal +Tambah field konfigurasi baru per-service (xmpp & telegram) untuk menonaktifkan +pesan pemberitahuan saat sesi berakhir. Jika `true`, agent tidak mengirim pesan +"pemberitahuan sesi berakhir" (`*session end*` / `Sesi ditutup. Sampai jumpa`) +ketika sesi ditutup karena timeout/kegiatan berhenti. + +Field mengikuti pola yang sudah ada di `service.yaml` (sudah mendukung override +per karakter untuk xmpp & telegram). + +## Field +- Nama: `mute_session_end` +- Tipe: bool +- Default: `false` (perilaku lama: tetap kirim pesan penutup) +- Letak: di bawah section `xmpp:` dan `telegram:` (service.yaml & config.yaml) +- Konstanta global baru: `XMPP_MUTE_SESSION_END`, `TELEGRAM_MUTE_SESSION_END` + +## Scope pesan yang di-mute (jalur target) +Hanya pesan penutup yang dihasilkan oleh sistem saat sesi berakhir otomatis: +- `xmpp_client._timeout_session` +- `telegram_client._timeout_session` + +Sesi tetap di-reset seperti semula; hanya pengiriman teks penutupnya yang dilewati. + +**Dikonfirmasi:** natural-close via tool `end_session` TIDAK ikut di-mute (farewell +adalah bagian percakapan model, bukan pesan sistem). + +## Perubahan tambahan: timeout group/MUC +Diperpanjang dari 5 menit (300s) menjadi 30 menit (1800s) untuk group/MUC. +Titik yang diubah: +- `telegram_client.py` (`_process_message`): `... else 300` → `1800` (chat_type group). +- `xmpp_client.py`: dua `session.start_timer(300, ..., 'groupchat')` → `1800`. +Private/DM tetap 86400 (di luar scope). + +## Files to change + +### 1. config.py +- Tambah pembacaan default dari `config.yaml` pada blok modul-level: + - `XMPP_MUTE_SESSION_END` (xmpp section, default "false") + - `TELEGRAM_MUTE_SESSION_END` (telegram section, default "false") +- Tambah keduanya ke `global` + reset di `_reset_service_from_config()`. +- Tambah keduanya ke `global` + aplikasi override di `load_service_config()` + memakai pola yang sama seperti field lain: + - `if "mute_session_end" in xmpp_data: XMPP_MUTE_SESSION_END = _to_bool(...)` + - `if "mute_session_end" in telegram_data: TELEGRAM_MUTE_SESSION_END = _to_bool(...)` +- Parsing bool pakai pola string existing: `str(v).strip().lower() in ("true","1","yes")`. + +### 2. services/xmpp_client.py (`_timeout_session`) +- Bungkus `self._schedule_send(session_id, body, mtype)` dengan guard: + `if not config.XMPP_MUTE_SESSION_END:` — tetap panggil `self._session_mgr.reset(session_id)`. +- Opsional: log bahwa notifikasi di-mute. + +### 3. services/telegram_client.py (`_timeout_session`) +- Bungkus `self._schedule_send(chat_id, body)` dengan guard: + `if not config.TELEGRAM_MUTE_SESSION_END:` — tetap `self._session_mgr.reset(...)`. + +### 4. Templates (dokumentasi, agar field mudah ditemukan) +- `config.default.yaml`: tambah `mute_session_end: false` di section xmpp & telegram. +- `agent/characters/*/service.default.yaml` (semua karakter): tambah field yang sama. +- Catatan: `service.yaml` runtime bersifat gitignored; karena loader cek keberadaan + key, karakter tanpa key baru akan fallback ke default `false` (backward compatible). + +## Backward compatibility +- Tidak ada service.yaml existing yang wajib diubah. +- Key hilang => default `false` => behavior identik dengan sekarang. + +## Validation plan +- `python -c "import config; print(config.XMPP_MUTE_SESSION_END, config.TELEGRAM_MUTE_SESSION_END)"` + untuk default. +- Load karakter dengan `mute_session_end: true` (via service.yaml test / char override) + dan verifikasi konstanta menjadi True. +- Kode review manual kedua `_timeout_session`: saat True, tidak ada `send`/`schedule_send`, + sesi tetap reset. + +## Resolved +Scope final: hanya `_timeout_session`. Natural-close `end_session` tidak disentuh +(sudah dikonfirmasi user). Timeout group/MUC dinaikkan ke 30 menit.