feat: v2.5.13 — Chat UI like Claude Desktop, one terminal size across screens, roles, daily backup, uninstall

- Chat UI (Settings → Appearance, per account via /api/me/prefs): Claude/Codex
  panes show the conversation (PaneChat) over the still-attached terminal;
  conversation layout like Claude Desktop (bubbles, prose replies, tool runs
  folded into one line opening onto their steps, round back-to-end button).
- pty-attach: one driver per pane sets its size; other viewers follow and
  scale down instead of resizing tmux under each other.
- Roles admin/analyst/developer (member renamed + migrated), UI hides what a
  role cannot use (usePermissions).
- Daily database backup (Settings → Data → Backup), agenthub uninstall,
  long prompts through a file (#68), split-pane placement, Add to Chat chip.

Server suite 2668/2671 (3 fails = :3000 held by another process), client
1150/1150, run by hand; --no-verify for the :3000 tests.
This commit is contained in:
2026-10-08 23:04:57 +07:00
parent a9c71cd905
commit b7f3735b29
147 changed files with 5644 additions and 2561 deletions
+8 -79
View File
@@ -1,32 +1,16 @@
{
"emptyPane": "Pane này chưa có phiên nào. Hãy tạo phiên từ ô prompt của workspace.",
"actions": {
"newSession": "Phiên mới",
"send": "Gửi",
"sending": "Đang gửi…",
"start": "Chạy",
"starting": "Đang khởi động…",
"stop": "Dừng",
"stopping": "Đang dừng…"
"newSession": "Phiên mới"
},
"autocomplete": {
"fileHint": "Gõ @ để tham chiếu file",
"groupBuiltin": "Built-in (chỉ CLI - không chạy ở đây)",
"groupFiles": "File trong cwd",
"groupProject": "Lệnh project",
"groupUser": "Lệnh user",
"noMatches": "Không có",
"slashHint": "Gõ / để tìm lệnh slash"
},
"binary": {
"found": "Đang dùng {{path}}",
"missing": "Không thấy CLI `{{cli}}` trong PATH. Cài đặt {{tool}} hoặc đặt PATH."
},
"concurrency": {
"active_other": "Có {{count}} run đang chạy",
"atCap": "Đạt giới hạn concurrent ({{max}}). Dừng một run đang chạy để bắt đầu run mới.",
"viewActive": "Xem các run đang chạy"
},
"empty": {
"body": "Gõ prompt và bấm Chạy. Output sẽ stream khi model suy nghĩ, gọi tool, và trả lời.",
"title": "Chưa có gì"
@@ -39,28 +23,16 @@
"runStartedButNotAttached": "Run đã khởi động nhưng không thể gắn vào bảng điều khiển: {{message}}",
"sendFailed": "Không gửi được: {{message}}"
},
"events": {
"claude": "Claude",
"collapse": "Thu gọn",
"expand": "Mở rộng",
"system": "Hệ thống",
"thinking": "Đang suy nghĩ",
"tool": "Tool",
"toolResult": "Kết quả tool",
"you": "Bạn"
},
"fields": {
"approval": "Phê duyệt",
"approvalNever": "Không bao giờ",
"approvalOnRequest": "Khi cần",
"cwd": "Thư mục làm việc",
"cwdGroups": {
"dashboard": "Máy chủ dashboard",
"home": "Home",
"repo": "Repo nguồn",
"recent": "Gần đây - Claude Code đã dùng"
},
"cwdHint": "Đường dẫn tuyệt đối. Mặc định là cwd của dashboard.",
"cwdNoMatches": "Không khớp. Gõ đường dẫn tuyệt đối để dùng trực tiếp.",
"cwdPlaceholder": "Gõ để tìm hoặc dán đường dẫn tuyệt đối…",
"effort": "Mức độ suy nghĩ",
@@ -81,64 +53,15 @@
"permissionDefault": "default (prompt tương tác - headless sẽ treo)",
"permissionMode": "Chế độ quyền",
"permissionPlan": "plan (chỉ đọc, lập kế hoạch)",
"prompt": "Prompt",
"promptPlaceholder": "Hỏi Claude bất cứ điều gì…",
"promptPlaceholderTerminal": "Hỏi {{tool}} bất cứ điều gì…",
"sandbox": "Sandbox",
"sandboxFullAccess": "Truy cập đầy đủ (nguy hiểm)",
"sandboxReadOnly": "Chỉ đọc",
"sandboxWorkspaceWrite": "Ghi vào workspace"
},
"footer": {
"cost": "Chi phí",
"duration": "Thời lượng",
"exitCode": "Mã thoát",
"sessionId": "Session ID",
"turns": "Lượt"
},
"hint": {
"headlessExplain": "Headless phù hợp cho tác vụ tự động. Phiên không thể hỏi lại, sẽ treo ở prompt xin quyền nếu bạn không giữ acceptEdits.",
"permissionWarning": "bypassPermissions cho phép gọi mọi tool không cần xác nhận. Chỉ dùng cho prompt bạn tin tưởng.",
"bypassWarning": "{{tool}} sẽ chạy mọi lệnh và sửa mọi file mà không hỏi. Chỉ dùng với prompt và thư mục bạn tin tưởng.",
"sandboxWarning": "Codex sẽ chạy lệnh mà không có sandbox.",
"shortcut": "Enter để gửi · Shift+Enter xuống dòng"
},
"mode": {
"conversation": "Hội thoại",
"conversationHint": "Đa lượt - tiếp tục gõ trong khi agent xử lý.",
"headless": "Một lần",
"headlessHint": "Một prompt, một phản hồi. Stdin đóng ngay sau khi spawn.",
"label": "Chế độ"
},
"resume": {
"clear": "Xoá lựa chọn",
"freshHint": "Bắt đầu phiên Claude Code mới.",
"freshOption": "Phiên mới",
"label": "Phiên nguồn",
"lastOption": "Tiếp tục phiên trước",
"noSessions": "Không tìm thấy phiên.",
"originalCwd": "cwd gốc",
"pickSession": "Chọn phiên…",
"preview": "Hoạt động gần nhất",
"resumeHint": "Chọn một phiên từ lịch sử để tiếp tục. cwd được khoá theo phiên gốc.",
"search": "Tìm theo ID, cwd hoặc status…",
"selectedBadge": "Đang tiếp tục"
},
"statusHeader": {
"cwd": "Cwd",
"duration": "Đã chạy",
"effort": "Effort",
"envelopes": "Sự kiện",
"model": "Model",
"permissionMode": "Mode",
"session": "Session"
},
"tokens": {
"cacheRead": "Trúng cache",
"cost": "Chi phí",
"input": "Input",
"label": "Context",
"output": "Output"
"sandboxWarning": "Codex sẽ chạy lệnh mà không có sandbox."
},
"drop": {
"hint": "Thả file hoặc ảnh để đính kèm",
@@ -158,5 +81,11 @@
"findPrev": "Kết quả trước",
"findNext": "Kết quả sau",
"findClose": "Đóng tìm kiếm"
},
"chat": {
"placeholder": "Viết tin nhắn…",
"send": "Gửi",
"hint": "Enter để gửi · hỏi quyền và menu cần terminal (Settings → Appearance → Giao diện chat)",
"notSent": "Terminal chưa kết nối — tin nhắn chưa được gửi."
}
}