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
@@ -4,12 +4,9 @@
"export": "Xuất",
"totalSessions": "Tổng số phiên",
"totalAgents": "Tổng số Agent",
"totalTokens": "Tổng token",
"totalCost": "Tổng chi phí",
"totalEvents": "Tổng sự kiện",
"cacheHitRate": "% tỷ lệ trúng bộ nhớ đệm",
"perSession": " mỗi phiên",
"noDataCost": "Không có dữ liệu",
"eventCountLabel_one": "{{count}} sự kiện",
"eventCountLabel_other": "{{count}} sự kiện",
"tabs": {
+5 -36
View File
@@ -30,14 +30,12 @@
},
"overview": {
"rootsTitle": "Thư mục gốc",
"claudeHome": "Claude home",
"projectClaudeDir": "Dự án .claude",
"projectRoot": "Thư mục dự án",
"claudeJson": "claude.json",
"summary": "Tóm tắt nhanh",
"user": "người dùng",
"project": "dự án",
"items": "mục"
"project": "dự án"
},
"common": {
"search": "Tìm theo tên…",
@@ -47,32 +45,19 @@
"close": "Đóng",
"copyPath": "Sao chép đường dẫn",
"copyName": "Sao chép tên",
"copied": "Đã sao chép",
"truncated": "(đã cắt bớt để xem trước)",
"size": "Kích thước",
"modified": "Đã sửa",
"scopeLabel": "Phạm vi",
"noFrontmatter": "Không có frontmatter",
"redactedNotice": "Các giá trị khớp /token|secret|password|key|auth/i đã được ẩn ở phía máy chủ.",
"preview": "Xem trước",
"raw": "Mã nguồn"
},
"skills": {
"name": "Tên",
"description": "Mô tả"
},
"agents": {
"name": "Tên",
"model": "Model",
"tools": "Công cụ"
},
"plugins": {
"manifest": "Manifest",
"marketplace": "Marketplace",
"version": "Phiên bản",
"installedAt": "Cài đặt lúc",
"lastUpdated": "Cập nhật",
"installPath": "Đường dẫn cài đặt",
"missing": "Thiếu đường dẫn cài đặt",
"manifestMissing": "Không tìm thấy installed_plugins.json tại {{path}}",
"enabled": "Đang bật",
@@ -85,8 +70,7 @@
"hooks_other": "{{count}} hook script",
"author": "Tác giả",
"homepage": "Trang chủ",
"license": "Giấy phép",
"description": "Mô tả"
"license": "Giấy phép"
},
"marketplaces": {
"manifest": "Manifest marketplace đã biết",
@@ -95,11 +79,9 @@
"lastUpdated": "Đồng bộ lần cuối",
"pluginCount": "Plugin",
"owner": "Chủ sở hữu",
"installLocation": "Đường dẫn cài",
"addCmd": "claude plugin marketplace add <repo>"
},
"keybindings": {
"file": "Tệp nguồn",
"missing": "Không tìm thấy keybindings.json tại {{path}}",
"context": "Ngữ cảnh",
"key": "Phím",
@@ -123,8 +105,7 @@
},
"hookScripts": {
"title": "Script ~/.claude/hooks/",
"subtitle": "Các script hỗ trợ được tham chiếu bởi lệnh hook của bạn. Chạy khi `hooks.<event>.hooks[].command` trong settings.json gọi đến.",
"empty": "Không có script trong ~/.claude/hooks/."
"subtitle": "Các script hỗ trợ được tham chiếu bởi lệnh hook của bạn. Chạy khi `hooks.<event>.hooks[].command` trong settings.json gọi đến."
},
"mcp": {
"userScope": "Máy chủ phạm vi người dùng",
@@ -138,8 +119,6 @@
"env": "Tên env",
"url": "URL",
"headers": "Tên Header",
"kind": "Loại",
"source": "Nguồn",
"noServers": "Không tìm thấy máy chủ MCP.",
"notRemovable": "Được cấu hình trong settings.json — hãy xóa ở đó; không có phạm vi CLI nào áp dụng cho mục này."
},
@@ -157,8 +136,6 @@
"rawJson": "JSON thô"
},
"memory": {
"userScope": "Bộ nhớ người dùng",
"projectScope": "Bộ nhớ dự án",
"missing": "Không tìm thấy CLAUDE.md.",
"autoTitle": "Kho bộ nhớ dự án",
"autoSubtitle": "Bộ nhớ theo tệp cho từng dự án trong ~/.claude/projects/<dự-án>/memory/ — một chỉ mục MEMORY.md cùng một tệp cho mỗi sự kiện được ghi nhớ. Chỉ đọc tại đây.",
@@ -236,15 +213,9 @@
"backups": {
"title": "Bản sao lưu",
"empty": "Chưa có bản sao lưu - mỗi lần sửa hoặc xoá sẽ tạo bản sao có dấu thời gian.",
"viewLink": "Xem lịch sử sao lưu",
"openButton": "Bản sao lưu",
"subtitle": "Mỗi thao tác lưu / xoá đều ghi bản sao tới đây trước. Thư mục sao lưu nằm ngoài các vị trí Claude Code quét, nên không xuất hiện như mục thừa trong CLI.",
"restoreHint": "Khôi phục bằng cách sao chép bản sao lưu về chỗ cũ (bản sao lưu vẫn được giữ):",
"size": "Kích thước",
"created": "Tạo lúc",
"type": "Loại",
"scopeLabel": "Phạm vi",
"filterAll": "Tất cả loại"
"restoreHint": "Khôi phục bằng cách sao chép bản sao lưu về chỗ cũ (bản sao lưu vẫn được giữ):"
},
"profiles": {
"usageCheck": "Kiểm tra quota",
@@ -309,9 +280,7 @@
"title": "Plugin chạy qua CLI `claude`",
"body": "Plugin là các gói có registry riêng — `installed_plugins.json` cùng đường dẫn cài trong `plugins/cache/`. Các nút ở đây chạy đúng lệnh `claude plugin …` trên máy này nên registry luôn nhất quán. Cài plugin nghĩa là chạy mã của bên thứ ba: chỉ thêm marketplace mà bạn tin tưởng.",
"install": "Cài plugin:",
"installCmd": "claude plugin install <marketplace>/<plugin>",
"uninstall": "Gỡ plugin này:",
"uninstallButton": "Sao chép lệnh gỡ"
"installCmd": "claude plugin install <marketplace>/<plugin>"
},
"mcp": {
"title": "MCP server được CLI quản lý",
@@ -22,7 +22,6 @@
},
"overview": {
"rootsTitle": "Thư mục gốc",
"codexHome": "Thư mục Codex",
"projectCodexDir": "Thư mục .codex của dự án",
"projectRoot": "Thư mục gốc dự án",
"summary": "Tóm tắt nhanh",
@@ -72,9 +71,6 @@
"saving": "Đang tạo…",
"close": "Đóng"
},
"config": {
"missing": "Không tìm thấy config.toml."
},
"mcp": {
"addTitle": "Thêm máy chủ MCP",
"nameLabel": "Tên",
-18
View File
@@ -21,14 +21,11 @@
"live": "Trực tiếp",
"offline": "Ngoại tuyến",
"running": "đang chạy",
"dashboardRun": "Chạy",
"days": "ngày",
"hours": "giờ",
"updated": "Đã cập nhật ",
"lastUpdated": "Cập nhật lần cuối: ",
"showMore": "Hiển thị thêm (còn {{count}})",
"plusMore": "+{{count}} nữa",
"ofSessions": "% số phiên",
"save": "Lưu",
"edit": "Sửa",
"delete": "Xóa",
@@ -89,14 +86,8 @@
"cost": {
"model": "Mô hình",
"cost": "Chi phí",
"totalCost": "Tổng chi phí",
"totalEstimatedCost": "Tổng chi phí ước tính"
},
"duration": {
"h_m": "{{h}}h {{m}}m",
"m_s": "{{m}}m {{s}}s",
"s": "{{s}}s"
},
"eventDetail": {
"summary": "Tóm tắt",
"seeDetailsBelow": "Xem chi tiết đầy đủ bên dưới trong {{fields}}",
@@ -137,8 +128,6 @@
"rawPayload": "Dữ Liệu Thô",
"copy": "Sao chép",
"copied": "Đã sao chép",
"noPayload": "Không có dữ liệu cho sự kiện này.",
"viewDetails": "Xem chi tiết",
"expand": "Mở rộng sự kiện",
"collapse": "Thu gọn sự kiện"
},
@@ -157,12 +146,7 @@
"loadMore": "Tải thêm",
"loading": "Đang tải...",
"noResults": "Không có sự kiện nào khớp với bộ lọc",
"grouped": "Nhóm theo lần gọi công cụ",
"flat": "Danh sách phẳng",
"groupEventCount_one": "{{count}} sự kiện",
"groupEventCount_other": "{{count}} sự kiện",
"help": {
"toggle": "Trợ giúp",
"title": "Về sự kiện, bộ lọc và nhóm",
"subtitle": "Nhấn để mở - trạng thái, vòng đời, ngữ nghĩa bộ lọc, giá trị bộ lọc",
"valuesTitle": "Mỗi bộ lọc chấp nhận gì",
@@ -176,10 +160,8 @@
"statusesTitle": "Trạng thái",
"statusesIntro": "Trạng thái được suy ra từ event_type.",
"statusWorkingDesc": "Agent bắt đầu gọi công cụ (PreToolUse).",
"statusConnectedDesc": "Công cụ hoàn tất và trả kết quả (PostToolUse).",
"statusCompletedDesc": "Mốc vòng đời (Stop, SubagentStop, Compaction).",
"statusErrorDesc": "Sự kiện lỗi (error, APIError).",
"statusIdleDesc": "Sự kiện vòng đời / siêu dữ liệu (Notification, TurnDuration, SessionStart, SessionEnd).",
"lifecycleTitle": "Vòng đời sự kiện",
"lifecycleDesc": "Một lần gọi công cụ thường phát ra hai sự kiện chia sẻ tool_use_id:",
"lifecycleFlow": "PreToolUse (Working) → PostToolUse (Connected) → ... → Stop (Completed)",
@@ -7,7 +7,6 @@
"eventsToday": "Sự kiện hôm nay",
"totalEvents": "Tổng sự kiện",
"totalCost": "Tổng chi phí",
"viewBoard": "Xem bảng",
"viewAll": "Xem tất cả",
"activeAgentsSection": "Agent đang hoạt động",
"recentActivity": "Hoạt động gần đây",
@@ -15,7 +14,6 @@
"noAgentsDesc": "Agent sẽ xuất hiện ở đây khi phiên Claude Code đang chạy.",
"noActivity": "Chưa có hoạt động",
"noActivityDesc": "Sự kiện từ các phiên Claude Code sẽ được phát trực tiếp tại đây.",
"failedConnect": "Không thể kết nối máy chủ",
"failedLoad": "Không thể tải dữ liệu",
"activeTrend": " đang hoạt động",
"totalTrend": " trong phiên hoạt động",
+2 -11
View File
@@ -19,15 +19,6 @@
"sessionError": "Lỗi phiên",
"subagentSpawned": "Đã tạo Subagent"
},
"toolLegend": {
"read": "Đọc",
"write": "Ghi",
"edit": "Sửa",
"bash": "Bash",
"grep": "Grep",
"glob": "Glob",
"agent": "Agent",
"other": "Khác"
},
"badResponse": "Máy chủ trả về phản hồi không mong đợi thay vì dữ liệu. Dashboard có thể đang khởi động lại, hoặc một proxy đang trả lời thay nó — hãy tải lại sau giây lát."
"badResponse": "Máy chủ trả về phản hồi không mong đợi thay vì dữ liệu. Dashboard có thể đang khởi động lại, hoặc một proxy đang trả lời thay nó — hãy tải lại sau giây lát.",
"adminOnly": "Chỉ admin mới làm được thao tác này. Hãy nhờ admin của AgentHub nếu bạn cần."
}
-27
View File
@@ -1,45 +1,18 @@
{
"title": "Bảng Kanban",
"subtitle": "Góc nhìn kanban của mọi Agent theo trạng thái",
"subtitleSessions": "Góc nhìn kanban của mọi phiên theo trạng thái",
"viewToggle": {
"agents": "Agent",
"sessions": "Phiên"
},
"noAgents": "Chưa có Agent được theo dõi",
"noAgentsDesc": "Bắt đầu một phiên Claude Code với hooks đã cài để thấy Agent xuất hiện tại đây.",
"agentCount": "Đã theo dõi {{count}} Agent",
"agentCount_plural": "Đã theo dõi {{count}} Agent",
"noAgentsInColumn": "Không có Agent",
"noSessions": "Chưa có phiên được theo dõi",
"noSessionsDesc": "Bắt đầu một phiên Claude Code với hooks đã cài để thấy phiên xuất hiện tại đây.",
"sessionCount": "Đã theo dõi {{count}} phiên",
"sessionCount_plural": "Đã theo dõi {{count}} phiên",
"noSessionsInColumn": "Không có phiên",
"ran": "đã chạy ",
"running": "đang chạy ",
"session": {
"anonymous": "Phiên chưa đặt tên",
"agentSummary_one": "{{count}} Agent",
"agentSummary_other": "{{count}} Agent",
"subagentSummary_one": "{{count}} Agent con",
"subagentSummary_other": "{{count}} Agent con",
"turnSummary_one": "{{count}} lượt",
"turnSummary_other": "{{count}} lượt"
},
"tooltip": {
"agent": {
"working": "Agent đang chạy một tool call ngay lúc này.\n\nVào trạng thái khi PreToolUse hoặc UserPromptSubmit, thoát khi Stop (hết lượt).",
"waiting": "Agent đã kết thúc lượt và đang chờ người dùng - Claude chờ tin nhắn tiếp theo hoặc đã hỏi xin quyền sử dụng tool.\n\nXóa khi PreToolUse / PostToolUse tiếp theo, hoặc khi phiên kết thúc.",
"completed": "Agent đã kết thúc hoàn toàn cho phiên này - thường do SessionEnd kích hoạt, hoặc với subagent là do SubagentStop.\n\nKhông còn hoạt động nào được ghi nhận cho Agent này.",
"error": "Agent gặp lỗi và sẽ không tiếp tục. Với main agent là từ Stop với stop_reason=error; với subagent là do chạy thất bại."
},
"session": {
"active": "Phiên đang giữa lượt - Claude đang chạy và người dùng không bị chặn. Trạng thái này thoáng qua: phiên đi qua Active trong các tool call rồi quay lại Waiting khi hết lượt.",
"waiting": "Phiên đang chờ người dùng. Có thể Claude đã hết lượt (phổ biến nhất) hoặc đang hỏi quyền và bị chặn cho tới khi người dùng phản hồi.\n\nXem cột này để biết phiên nào bạn cần trả lời.",
"completed": "Phiên đã đóng hoàn toàn - SessionEnd đã kích hoạt (CLI thoát sạch) hoặc người dùng đã đóng thủ công.\n\nMọi Agent của phiên cũng đã hoàn tất.",
"error": "Phiên kết thúc với lỗi - Claude trả về stop_reason=error, có lỗi không thể khôi phục, hoặc lỗi API thượng nguồn đã chấm dứt lần chạy.",
"abandoned": "Phiên đã chết mà không có SessionEnd sạch. Bị đánh dấu bỏ dở sau 5+ phút không hoạt động (mồ côi vì /resume, mất mạng, hoặc CLI bị tắt). Khác với Completed: ta không thấy tín hiệu thoát thật sự."
}
}
}
+2 -24
View File
@@ -1,10 +1,5 @@
{
"action.clear": "Dọn trạng thái",
"action.forget": "Xóa workspace",
"action.purge": "Xóa lịch sử",
"action.reset": "Đặt lại worktree",
"action.start": "Bắt đầu",
"action.stop": "Dừng",
"actionError": "Thao tác workspace thất bại: {{message}}",
"actionErrorUnknown": "Lỗi không xác định",
"add": "Thêm workspace",
@@ -110,14 +105,6 @@
"changes.unstage": "Bỏ file này khỏi index",
"changes.changesView": "Thay đổi",
"changes.wholeFile": "Toàn bộ file",
"confirmRemoveCancel": "Hủy",
"confirmRemoveConfirm": "Xóa",
"confirmRemoveMessage": "Hành động này không thể hoàn tác.",
"confirmRemoveTitle": "Xóa workspace?",
"countDead": "đã chết",
"countNeedsYou": "cần bạn",
"countRunning": "đang chạy",
"countTotal": "workspace",
"destructive.blocked.adopted": "Đây là thư mục đã nhận và không thể thay đổi bằng thao tác worktree.",
"destructive.blocked.missing": "Thư mục workspace không còn, nên không thể tiếp tục thao tác này.",
"destructive.blocked.unreadable": "Không thể đọc thư mục workspace như một Git worktree, nên không thể tiếp tục thao tác này.",
@@ -189,10 +176,6 @@
"gitBar.switchHint": "Đổi worktree này sang nhánh local khác",
"gitBar.switchLabel": "Đổi nhánh…",
"gitBar.unbornHint": "Hãy commit trước, rồi publish repo này lên remote.",
"kind.adopted": "đã nhận",
"kind.managed": "được quản lý",
"laneDetail.hide": "Ẩn chi tiết",
"laneDetail.show": "Chi tiết workspace",
"locks.held_one": "Đang giữ {{count}} khóa",
"locks.held_other": "Đang giữ {{count}} khóa",
"mode.repo": "Repo",
@@ -206,25 +189,18 @@
"preflightErrorWithMessage": "Không thể tải trạng thái workspace hiện tại: {{message}}",
"proof.ticketReport": "Báo cáo nhiệm vụ",
"renameLabel": "Đổi tên workspace này",
"reorderHint": "Kéo để sắp xếp · Alt+←/→",
"proxy.native": "Native ({{tool}})",
"proxy.label": "AI Proxy",
"runtime.boot": "▶ chạy",
"runtime.busy.down": "đang dừng…",
"runtime.busy.up": "đang khởi động…",
"runtime.down": "tắt",
"runtime.healthy": "khoẻ",
"runtime.partial": "một phần",
"runtime.slot": "slot {{slot}}",
"runtime.steppedAsideTitle": "Đã lùi khỏi {{expected}} vì cổng đó đang bận",
"runtime.stop": "■ dừng",
"runtime.toggleTitle": "Chạy hoặc dừng stack ứng dụng của workspace này (khác với phiên Claude của nó)",
"status.failed": "thất bại",
"status.idle": "rảnh",
"status.provisioning": "đang khởi tạo",
"status.running": "đang chạy",
"title": "Workspace",
"tooltipStart": "Tạo một lần chạy ở chế độ hội thoại mà không có lời nhắc ban đầu; được điều khiển từ CLI hoặc qua tin nhắn",
"worktrees.heading_one": "{{count}} worktree",
"worktrees.heading_other": "{{count}} worktree",
"changes.undoHunk": "Hoàn tác đoạn này",
@@ -386,6 +362,7 @@
"home.memoryEmpty": "Bộ nhớ hiện ở đây khi thư mục có CLAUDE.md hoặc AGENTS.md, hoặc Claude lưu bộ nhớ cho nó.",
"home.context": "Ngữ cảnh",
"home.contextEmpty": "Thêm PDF, tài liệu hoặc văn bản để tham chiếu trong workspace này.",
"home.contextSnapshot": "Mỗi file được sao chép lúc thêm — sửa file gốc sau đó sẽ không cập nhật theo. Hãy xóa rồi thêm lại, hoặc thêm thư mục chứa nó ở mục Thư mục để luôn đọc bản mới nhất.",
"home.addFile": "Thêm file",
"home.folder": "Thư mục",
"home.ownFolder": "Thư mục của workspace",
@@ -452,6 +429,7 @@
"tree.showMore_one": "Hiện thêm {{count}}",
"tree.showMore_other": "Hiện thêm {{count}}",
"tree.seeAll": "Xem tất cả (thêm {{count}})",
"tree.showLess": "Thu gọn",
"home.contextPanel": "Ngữ cảnh workspace",
"row.state.needsYou": "cần bạn",
"row.state.error": "lỗi",
-11
View File
@@ -1,6 +1,5 @@
{
"activityFeed": "Luồng hoạt động",
"agentBoard": "Bảng Kanban",
"agents": "Agent",
"analytics": "Phân tích",
"avg": "TB",
@@ -19,20 +18,11 @@
"daysAgo": "{{count}} ngày trước",
"disconnected": "Mất kết nối",
"eventsLastMin": "60s qua",
"eventsReceived": "Sự kiện đã nhận",
"eventsTotal": "Tổng",
"expand": "Mở rộng thanh bên",
"hoursAgo": "{{count}} giờ trước",
"justNow": "vừa xong",
"language": "Ngôn ngữ",
"languageNames": {
"en": "English",
"vi": "Tiếng Việt"
},
"languageShort": {
"en": "EN",
"vi": "VI"
},
"lastEvent": "Sự kiện gần nhất",
"live": "Trực tiếp",
"minutesAgo": "{{count}} phút trước",
@@ -55,7 +45,6 @@
"unitPerSec": "sự kiện/s",
"upToDate": "Đã là mới nhất",
"updateAvailable": "Có bản cập nhật",
"website": "Website",
"workspace": "Không gian làm việc",
"wsEndpoint": "WebSocket",
"releaseAvailable": "Có {{version}}",
+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."
}
}
+18 -3
View File
@@ -8,7 +8,6 @@
"filterError": "Lỗi",
"filterAbandoned": "Bị bỏ dở",
"sessionCount": "Đã ghi nhận {{count}} phiên",
"sessionCount_plural": "Đã ghi nhận {{count}} phiên",
"noSessions": "Không tìm thấy phiên",
"noSessionsDesc": "Hãy thử điều chỉnh tìm kiếm hoặc bộ lọc.",
"noSessionsHint": "Bắt đầu một phiên Claude Code với hooks đã cài để theo dõi.",
@@ -26,14 +25,12 @@
"generic": "Claude Code đang tạm dừng trong phiên này cho đến khi bạn phản hồi trong terminal."
},
"failedLoad": "Không thể tải phiên",
"loading": "Đang tải phiên...",
"notFound": "Không tìm thấy phiên",
"backToSessions": "Quay lại danh sách phiên",
"agents": "Agent",
"noAgents": "Chưa có Agent được ghi nhận.",
"unparented": "Subagent không có cha",
"costBreakdown": "Phân rã chi phí",
"eventTimeline": "Dòng thời gian sự kiện",
"noEvents": "Chưa có sự kiện được ghi nhận.",
"conversation": "Hội thoại",
"timeline": "Dòng thời gian ({{shown}}/{{total}})",
@@ -151,6 +148,8 @@
"persistedOutput": "Đầu ra đã lưu",
"taskNotification": "Thông báo tác vụ",
"thinking": "Suy nghĩ",
"showMore": "Xem thêm",
"showLess": "Thu gọn",
"chars_one": "{{formatted}} ký tự",
"chars_other": "{{formatted}} ký tự",
"sender": {
@@ -181,6 +180,22 @@
"statusError": "lỗi",
"statusOk": "ok",
"statusPending": "đang chờ"
},
"work": {
"commands_one": "đã chạy {{count}} lệnh",
"commands_other": "đã chạy {{count}} lệnh",
"edits_one": "sửa 1 file",
"edits_other": "sửa {{count}} lần",
"reads_one": "đọc 1 file",
"reads_other": "đọc {{count}} file",
"searches_one": "tìm trong code",
"searches_other": "tìm {{count}} lần",
"web_one": "tra cứu web",
"web_other": "tra cứu web {{count}} lần",
"agents_one": "chạy 1 agent",
"agents_other": "chạy {{count}} agent",
"tools_one": "dùng 1 công cụ",
"tools_other": "dùng {{count}} công cụ"
}
},
"overview": {
+35
View File
@@ -326,6 +326,14 @@
"confirmMessageAutostart": "Mọi terminal của các workspace sẽ bị đóng — agent đang chạy sẽ dừng — và dashboard tắt. Nó giữ tắt cho tới khi bạn chạy `agenthub start`, hoặc tới lần khởi động/đăng nhập máy kế tiếp (đang bật tự khởi động).",
"done": "AgentHub đang tắt. Chạy `agenthub start` để bật lại."
},
"uninstall": {
"label": "Gỡ cài đặt AgentHub",
"desc": "Gỡ AgentHub khỏi máy: dashboard, database và cài đặt của nó, các hook trong Claude Code, Codex và Antigravity, và plugin. Các cuộc trò chuyện, thư mục workspace và repository của bạn được giữ lại.",
"button": "Gỡ cài đặt",
"confirmTitle": "Gỡ cài đặt AgentHub?",
"confirmMessage": "Mọi terminal của các workspace sẽ bị đóng và AgentHub bị gỡ hẳn, kể cả database (lịch sử, workspace, cài đặt, đăng nhập đã lưu) — không thể hoàn tác. Các cuộc trò chuyện của Claude Code, Codex và các công cụ AI khác, worktree của workspace và repository của bạn được giữ lại.",
"done": "AgentHub đang được gỡ; trang này sẽ ngừng phản hồi trong giây lát. Log: {{log}}"
},
"about": {
"title": "Hệ thống",
"release": "Phiên bản",
@@ -670,6 +678,7 @@
"enabledOf": "Bật {{tool}}",
"homepage": "Trang chủ",
"homepageOf": "Trang chủ {{tool}}",
"openSettings": "Mở cài đặt {{tool}}",
"install": "Cài đặt",
"update": "Cập nhật",
"updateAll": "Cập nhật tất cả ({{count}})",
@@ -796,6 +805,8 @@
},
"settingsNav": {
"label": "Các mục cài đặt",
"toolsTab": "Tất cả",
"toolTabs": "Cài đặt AI tool",
"back": "Quay lại Không gian làm việc",
"group": {
"general": "Chung",
@@ -936,6 +947,23 @@
"ignoreHint": "Mỗi dòng một đường dẫn tuyệt đối. Hook từ các thư mục này, và mọi thứ bên trong, bị bỏ hoàn toàn; việc nhập lịch sử và bộ đọc Codex cũng bỏ qua phiên của chúng. AGENTHUB_IGNORE_CWD đặt cùng danh sách này.",
"envOwned": "Một giá trị ở đây do môi trường khởi động dashboard đặt, và không thể đổi từ trang này."
},
"backup": {
"title": "Backup hằng ngày",
"description": "Mỗi ngày một bản sao đầy đủ của cơ sở dữ liệu vào thư mục bạn chọn — tốt nhất là trên một ổ đĩa khác, để hỏng một ổ không mất luôn bản backup.",
"folder": "Thư mục backup",
"folderHint": "Đường dẫn tuyệt đối tới một thư mục có sẵn mà server ghi được. Để trống để tắt backup. AgentHub chỉ xóa đúng các tệp agenthub-YYYYMMDD-HHMMSS.db của chính nó ở đây, bản cũ nhất trước khi vượt số bản giữ lại.",
"hour": "Giờ chạy (giờ server)",
"keep": "Số bản giữ lại",
"runNow": "Backup ngay",
"running": "Đang backup…",
"done": "Đã ghi bản backup: {{file}}",
"failed": "Backup thất bại: {{error}}",
"newest": "Mới nhất: {{time}}, {{size}} · đang giữ {{n}} bản, tổng {{total}}",
"none": "Thư mục này chưa có bản backup nào.",
"off": "Backup đang tắt.",
"lastFailed": "Lần chạy gần nhất ({{time}}) thất bại: {{error}}",
"restoreHint": "Khôi phục: agenthub stop, xóa dashboard.db-wal và dashboard.db-shm, chép bản backup đè lên dashboard.db (đường dẫn ở trang Hệ thống), rồi agenthub start."
},
"reports": {
"title": "Báo cáo định kỳ",
"description": "Bản tóm tắt những ngày gần nhất — phiên, sự kiện, token, chi phí theo model và theo công cụ AI, công cụ dùng nhiều nhất, ngân sách — ghi ra HTML hoặc JSON theo lịch. Báo cáo và lịch sử chạy được giữ lại khi Xóa dữ liệu.",
@@ -985,5 +1013,12 @@
"title": "Giá model",
"description": "Giá model của mọi nhà cung cấp nằm chung một trang.",
"open": "Mở trang Giá"
},
"chatUi": {
"title": "Giao diện chat",
"description": "Cách một session Claude hoặc Codex mở trong workspace. Chỉ lưu cho tài khoản của bạn.",
"label": "Mở session dạng chat",
"labelDesc": "Hiện hội thoại của mọi session Claude hoặc Codex như Claude Desktop, kèm ô nhập tin, thay cho terminal. Hỏi quyền và menu vẫn cần terminal: tắt mục này để trả lời chúng.",
"saveFailed": "Không lưu được: {{message}}"
}
}
+5 -5
View File
@@ -14,12 +14,12 @@
"roles": {
"admin": "Admin",
"analyst": "Analyst",
"member": "Thành viên"
"developer": "Developer"
},
"roleHint": {
"admin": "Toàn quyền, kể cả cấu hình của server và dữ liệu của mọi người",
"analyst": "Xem được mọi thứ; không có terminal, không thay đổi gì",
"member": "Chỉ workspace của chính mình"
"analyst": "Xem được dữ liệu của mọi người; chỉ làm việc trong workspace của mình, không đổi cài đặt",
"developer": "Chỉ workspace của chính mình; không đổi cài đặt"
},
"add": "Thêm người dùng",
"username": "Tên đăng nhập",
@@ -48,7 +48,7 @@
"password": "Đặt lại mật khẩu cho {{name}}",
"passwordBody": "{{name}} bị đăng xuất khỏi mọi nơi và đăng nhập lại bằng mật khẩu mới.",
"workspace": "Giao workspace cho {{name}}",
"workspaceBody": "Các phiên và chi phí của workspace chuyển sang {{name}}. Thành viên chỉ thấy workspace của chính mình."
"workspaceBody": "Các phiên và chi phí của workspace chuyển sang {{name}}. Developer chỉ thấy workspace của chính mình."
},
"done": {
"created": "Đã thêm {{name}}",
@@ -68,6 +68,6 @@
},
"readOnly": "Analyst chỉ xem được tài khoản, không thay đổi được.",
"auditTitle": "Nhật ký audit",
"auditDescription": "Các thay đổi tài khoản thực hiện ở đây, và mỗi lần admin hoặc analyst mở phiên của một thành viên.",
"auditDescription": "Các thay đổi tài khoản thực hiện ở đây, và mỗi lần admin hoặc analyst mở phiên của một developer.",
"auditEmpty": "Chưa ghi nhận gì."
}
@@ -2,8 +2,6 @@
"title": "Quy trình",
"subtitle": "Phân tích điều phối Agent",
"failedLoad": "Không thể tải dữ liệu quy trình",
"filteredBy": "Đang lọc theo:",
"clearFilter": "Xóa bộ lọc",
"refreshData": "Làm mới dữ liệu",
"exportJson": "Xuất JSON",
"allSessions": "Tất cả phiên",
@@ -238,8 +236,6 @@
"noToolEvents": "Không có sự kiện công cụ.",
"noEvents": "Không có sự kiện cho phiên này.",
"showingOf": "Đang hiển thị 100 / {{total}} sự kiện",
"sessionInfo": " phiên - hoạt động {{from}}%-{{to}} thời lượng phiên",
"sortedByCompaction": " phiên (sắp theo số lần nén ngữ cảnh)",
"openSession": "Mở phiên",
"openInWorkspace": "Mở trong workspace"
},
@@ -266,7 +262,6 @@
"subtitle": "Điểm tập trung lỗi theo độ sâu phân cấp Agent",
"noErrors": "Không ghi nhận lỗi",
"allSuccess": "Tất cả phiên đã hoàn tất thành công",
"sessionsHadErrors": " phiên gặp lỗi",
"sessionsErrorSummary": "{{errorSessions}} trên {{totalSessions}} phiên gặp lỗi",
"agentErrors": " lỗi cấp Agent trong toàn bộ phân cấp",
"sessionErrorsOnly": "Chỉ có lỗi ở cấp phiên",
@@ -306,7 +301,6 @@
"ofTotal": "trên {{total}}",
"avgPerSession": "TB / phiên bị ảnh hưởng",
"peakSession": "Nhiều nhất trong một phiên",
"tokensRecovered": "Token thu hồi",
"distribution": "Số phiên theo số lần nén",
"xAxis": "Số lần nén mỗi phiên",
"yAxis": "Số phiên",