Skip to content

feat(ui): add Compact button to session detail page#1117

Open
nguyennguyenit wants to merge 1 commit intomainfrom
feat/ui-session-compact-button
Open

feat(ui): add Compact button to session detail page#1117
nguyennguyenit wants to merge 1 commit intomainfrom
feat/ui-session-compact-button

Conversation

@nguyennguyenit
Copy link
Copy Markdown
Contributor

Summary

Expose backend method sessions.compact (Issue 958) trong web UI session detail page. User trước đây chỉ có Đặt lại (wipe cả messages + summary) và Xóa (xóa hẳn session). Thiếu cách giảm token usage mà vẫn giữ context.

Compact = truncate messages về N tin gần nhất (default 4), giữ summary nguyên vẹn → agent vẫn nhớ context qua summary, mở lại budget cho prompt+output.

Use case thực tế

Session group chat dài (ví dụ 188 messages, 7 lần auto-compact, vẫn đẩy mỗi turn lên ~199k/200k tokens do tool results bloat history) → Compact giảm history về 4 messages cuối, agent đọc summary để tiếp tục task.

What changed

File Δ What
ui/web/src/api/protocol.ts +1 SESSIONS_COMPACT constant
ui/web/src/pages/sessions/hooks/use-sessions.ts +16 compactSession(key, keepLast?) callback, exports
ui/web/src/pages/sessions/session-detail-page.tsx +27 Optional onCompact prop, button + confirm dialog
ui/web/src/pages/sessions/sessions-page.tsx +2 Wire compactSessiononCompact
ui/web/src/i18n/locales/{en,vi,zh}/sessions.json +18 i18n keys (compact, compactTitle, compactDescription, confirmCompact, toast.compacted, toast.compactFailed)

UI: nút "Compact" (Shrink icon, variant=outline) nằm giữa "Reset" và "Delete". Confirm dialog giải thích rõ khác biệt vs Reset.

Backend

Không đổi. Dùng method có sẵn internal/gateway/methods/sessions.go:242 (handleCompact):

  • Params: { key: string, keepLast?: number } (default 4)
  • Returns: { ok, original, kept }
  • Auth + tenant check đã có.

Test plan

  • TypeScript check clean (chỉ còn pre-existing prismjs errors trên main, không liên quan)
  • JSON syntax valid (en/vi/zh sessions.json)
  • Match existing pattern của resetSession cho consistency
  • Manual: render UI, bấm Compact → confirm dialog → submit → toast success → preview reload

i18n preview

Lang compact confirmCompact
EN Compact Compact
VI Nén Nén
ZH 压缩 压缩

Notes

  • Pre-existing build error trên main (prismjs missing trong script-editor.tsx) không liên quan, không block PR này.
  • Nếu prop onCompact không truyền (backward compat), button + dialog ẩn hoàn toàn.

Backend method sessions.compact (Issue 958) was not exposed in the web
UI. Users only had Reset (wipes both messages and summary) and Delete.
Compact truncates messages to last N (default 4) while preserving the
summary, letting agents keep context after recovering from full-context
situations.

Adds:
- SESSIONS_COMPACT method constant.
- compactSession callback in useSessions hook.
- "Compact" button between Reset and Delete in session detail header,
  with confirm dialog explaining the difference vs Reset.
- i18n keys for en/vi/zh: detail.compact, detail.compactTitle,
  detail.compactDescription, detail.confirmCompact, toast.compacted,
  toast.compactFailed.

Backend unchanged.
@clark-cant
Copy link
Copy Markdown

🔍 Code Review — feat(ui): add Compact button to session detail page

🎯 Tổng quan

Expose sessions.compact backend method trong UI — thêm nút "Compact" giữa "Reset" và "Delete" trong session detail. Compact = truncate messages về last N (default 4), giữ summary nguyên vẹn → agent vẫn nhớ context.

Scope: 7 files, +57/-3, 1 commit


🤖 CI Status + Merge Conflicts

CI:All checks passed — go: pass (7m16s), web: pass (55s)
Merge conflicts: ✅ No conflicts (MERGEABLE, mergeStateStatus: CLEAN)


✅ Điểm Tốt

  1. Use case thực tế rõ ràng. Session group chat dài → 188 messages → 199k/200k tokens → Compact giảm về 4 messages, giữ summary. Problem-solution fit tốt.

  2. Backend unchanged. Chỉ expose method có sẵn (handleCompact at internal/gateway/methods/sessions.go:242). Không risk về backend.

  3. Match existing pattern. compactSession callback trong useSessions hook mirror resetSession pattern — consistency tốt.

  4. Confirm dialog giải thích rõ. compactDescription: "Truncate message history to the last 4 messages while keeping the summary. Unlike Reset, the summary is preserved." — user hiểu khác biệt vs Reset.

  5. i18n đầy đủ. en/vi/zh parity, 6 keys mới mỗi locale.

  6. Backward compatible. onCompact optional prop — nếu không truyền, button ẩn hoàn toàn.

  7. Preview reload sau compact. Reload preview để reflect truncated history — good UX.


🟢 LOW

  1. keepLast default hardcoded 4 ở backend. UI không expose option để user chọn số messages giữ lại. Acceptable cho v1, nhưng nice-to-have nếu sau này có slider/input.

  2. Pre-existing build error noted. prismjs missing trên main — không liên quan PR này, nhưng nên fix để CI clean.


📊 Summary

Severity Count Issues
🔴 CRITICAL 0
🟡 MEDIUM 0
🟢 LOW 2 keepLast default hardcoded, pre-existing build error

💡 Recommendation

🟢 APPROVED

Clean UI feature, đúng pattern, i18n đầy đủ, backend unchanged. Small scope, clear value for operators managing long sessions.

Ready to merge! 🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants