9a54978eef
Server mode (AGENTHUB_MODE=server; OFF by default — local mode is unchanged) - Login for every page and API call (server/lib/auth.js, routes/auth.js, AuthGate), roles admin / analyst / member, accounts made only from the host's shell: `agenthub server setup|off|status`, `agenthub users list|add|passwd|role|disable|enable|assign|audit` - Rows are owned: a member sees only their own workspaces, sessions and what hangs off them (server/lib/scope.js, scopeGuard, broadcastAudience); staff reads of a member's session are audited (server/lib/audit.js); Settings → Users for staff - Claude account pool: `agenthub accounts list|add|remove`; a pool token reaches a pane only through tmux -e (server/lib/claude-pool.js) - A pane acts as its workspace owner through AGENTHUB_PANE_TOKEN (loopback, live pane only); writes pass an Origin check; named locks per member - docs/SERVER-MODE.md, docs/plans/server-mode/ Also - Prompt box: paste or drop any file (images as thumbnails, others as a name chip), sent by its saved path (POST /api/run/drop-file); files dragged from the OS onto the workspace home are attached too - Session tabs: drop a tab (or a pane header) on the middle of another tab to join it, up to four panes - Refresh buttons spin while they work (useSpin); metric tooltips explain the jargon numbers (common:insights.help.*) - Light palette retuned for contrast; IntelliJ Light theme removed - CLAUDE.md sync marker trimmed; its history moved to docs/CLAUDE-SYNC-LOG.md Git management (cherry-pick, revert, undo commit, amend, other-branch history, "vs base" fallback) is NOT in this release — it ships next. Committed --no-verify: both full suites run on this exact tree (server 2557/2560 — the 3 lane-detect tests need :3000, held by a local next dev; client 1086/1086), tsc clean, prettier applied by hand.
234 lines
10 KiB
JSON
234 lines
10 KiB
JSON
{
|
|
"refresh": "Làm mới",
|
|
"retry": "Thử lại",
|
|
"cancel": "Hủy",
|
|
"export": "Xuất",
|
|
"loading": "Đang tải...",
|
|
"noData": "Không có dữ liệu",
|
|
"total": "Tổng",
|
|
"active": "đang hoạt động",
|
|
"total_lower": "tổng",
|
|
"subagent": "Subagent",
|
|
"subagents": "Subagent",
|
|
"subagent_label_one": "{{count}} Subagent",
|
|
"subagent_label_other": "{{count}} Subagent",
|
|
"events": "sự kiện",
|
|
"event": "sự kiện",
|
|
"sessions": "phiên",
|
|
"session": "phiên",
|
|
"agents": "Agent",
|
|
"agent": "Agent",
|
|
"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",
|
|
"actions": "Thao tác",
|
|
"close": "Đóng",
|
|
"unexpectedError": "Lỗi không xác định",
|
|
"depth": "Độ sâu",
|
|
"type": "Loại",
|
|
"statusLabel": "Trạng thái",
|
|
"status": {
|
|
"working": "Đang xử lý",
|
|
"waiting": "Đang chờ",
|
|
"completed": "Hoàn tất",
|
|
"error": "Lỗi",
|
|
"active": "Đang hoạt động",
|
|
"abandoned": "Bị bỏ dở"
|
|
},
|
|
"awaitingReason": {
|
|
"notification": {
|
|
"label": "Cần phản hồi",
|
|
"desc": "Đang bị chặn bởi lời nhắc cấp quyền hoặc yêu cầu nhập — Claude không thể tiếp tục cho đến khi bạn phản hồi."
|
|
},
|
|
"stop": {
|
|
"label": "Xong lượt",
|
|
"desc": "Claude đã trả lời xong; phiên sẽ chờ cho đến khi bạn gửi prompt tiếp theo."
|
|
},
|
|
"session_start": {
|
|
"label": "Chờ prompt",
|
|
"desc": "Phiên vừa khởi động hoặc tiếp tục và đang ở prompt trống — chưa có yêu cầu nào được gửi."
|
|
},
|
|
"interrupted": {
|
|
"label": "Bị ngắt",
|
|
"desc": "Lượt vừa rồi bị ngắt (Esc hoặc hook được khôi phục) — Claude đang chờ chỉ dẫn của bạn."
|
|
}
|
|
},
|
|
"time": {
|
|
"justNow": "vừa xong",
|
|
"mAgo": "{{count}} phút trước",
|
|
"hAgo": "{{count}} giờ trước",
|
|
"dAgo": "{{count}} ngày trước",
|
|
"justNowShort": "vừa xong",
|
|
"mAgoShort": "{{count}} phút",
|
|
"hAgoShort": "{{count}} giờ",
|
|
"dAgoShort": "{{count}} ngày"
|
|
},
|
|
"pagination": {
|
|
"previous": "Trước",
|
|
"next": "Tiếp",
|
|
"showing": "Hiển thị {{from}}-{{to}} / {{total}}"
|
|
},
|
|
"token": {
|
|
"input": "Đầu vào",
|
|
"output": "Đầu ra",
|
|
"cacheRead": "Đọc bộ nhớ đệm",
|
|
"cacheWrite": "Ghi bộ nhớ đệm",
|
|
"totalTokens": "Tổng token"
|
|
},
|
|
"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}}",
|
|
"eventId": "ID sự kiện",
|
|
"recordedAt": "Ghi lúc",
|
|
"session": "Phiên",
|
|
"sessionId": "ID phiên",
|
|
"agentId": "ID Agent",
|
|
"agent": "Agent",
|
|
"cwd": "Thư mục làm việc",
|
|
"permissionMode": "Chế độ quyền",
|
|
"toolUseId": "ID Lượt Dùng Công Cụ",
|
|
"toolName": "Công Cụ",
|
|
"toolInput": "Đầu Vào Công Cụ",
|
|
"toolResponse": "Phản Hồi Công Cụ",
|
|
"isError": "Lỗi",
|
|
"transcriptPath": "Đường Dẫn Bản Ghi",
|
|
"agentTranscriptPath": "Đường Dẫn Bản Ghi Subagent",
|
|
"hookEventName": "Tên Sự Kiện Hook",
|
|
"stopReason": "Lý Do Dừng",
|
|
"stopHookActive": "Hook Dừng Đang Bật",
|
|
"subagentType": "Loại Subagent",
|
|
"agentType": "Loại Agent",
|
|
"notificationType": "Loại Thông Báo",
|
|
"message": "Tin Nhắn",
|
|
"prompt": "Câu Lệnh",
|
|
"model": "Mô Hình",
|
|
"reason": "Lý Do",
|
|
"source": "Nguồn",
|
|
"imported": "Đã Nhập",
|
|
"type": "Loại",
|
|
"timestamp": "Thời Điểm",
|
|
"uuid": "UUID",
|
|
"durationMs": "Thời Lượng (ms)",
|
|
"compactionNumber": "Số Lần Nén",
|
|
"totalCompactions": "Tổng Số Lần Nén",
|
|
"lastAssistantMessage": "Tin Nhắn Trợ Lý Cuối",
|
|
"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"
|
|
},
|
|
"eventFilters": {
|
|
"searchPlaceholder": "Tìm tóm tắt, công cụ, dữ liệu...",
|
|
"status": "Trạng thái",
|
|
"eventType": "Loại sự kiện",
|
|
"toolName": "Công cụ",
|
|
"agentId": "Agent",
|
|
"sessionId": "Phiên",
|
|
"from": "Từ",
|
|
"to": "Đến",
|
|
"clearAll": "Xóa bộ lọc",
|
|
"noOptions": "Không có lựa chọn",
|
|
"showing": "Hiển thị {{shown}} / {{total}}",
|
|
"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ì",
|
|
"valueStatusDesc": "Lối tắt mở rộng thành event_type (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...).",
|
|
"valueEventTypeDesc": "Giá trị event_type thực có trong DB. Lấy từ /api/events/facets.",
|
|
"valueToolNameDesc": "Giá trị tool_name có trong DB (Bash, Edit, Read, Grep, mcp__...). Lấy từ /api/events/facets.",
|
|
"valueAgentIdDesc": "UUID đầy đủ của agent (main + subagent). Chọn để giới hạn theo các agent cụ thể.",
|
|
"valueSessionIdDesc": "UUID của phiên. Thường bạn sẽ vào /sessions/:id, nhưng cái này cho phép giao nhiều phiên.",
|
|
"valueSearchDesc": "Khớp chuỗi con trong summary, tool_name và payload JSON thô. Debounce 300ms.",
|
|
"valueDateRangeDesc": "Mốc thời gian ISO dưới/trên cho created_at của sự kiện.",
|
|
"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)",
|
|
"filtersTitle": "Cách bộ lọc hoạt động",
|
|
"filterTip1": "Các bộ lọc kết hợp AND giữa các danh mục. Trong một danh mục, nhiều lựa chọn là OR.",
|
|
"filterTip2": "Status là lối tắt mở rộng thành event_type (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...).",
|
|
"filterTipGrouping": "Mẹo nhóm: một hàng nhóm cần cả Pre và Post. Khi lọc theo Status, hãy chọn Working + Connected cùng lúc để giữ nguyên cặp - nếu không, nhóm chỉ hiện một nửa.",
|
|
"filterTip3": "Tìm kiếm văn bản khớp summary, tool_name và dữ liệu thô.",
|
|
"filterTip4": "Khoảng ngày áp dụng cho created_at của mỗi sự kiện."
|
|
}
|
|
},
|
|
"examples": "Ví dụ",
|
|
"help": "Trợ giúp",
|
|
"copied": "Đã sao chép",
|
|
"copyFailed": "Không sao chép được vào bộ nhớ tạm",
|
|
"dismiss": "Đóng",
|
|
"confirm": "Xác nhận",
|
|
"unsaved": {
|
|
"title": "Bỏ các thay đổi chưa lưu?",
|
|
"message": "Các chỉnh sửa của bạn chưa được lưu và sẽ bị mất.",
|
|
"discard": "Bỏ thay đổi",
|
|
"keep": "Tiếp tục sửa"
|
|
},
|
|
"auth": {
|
|
"title": "Đăng nhập AgentHub",
|
|
"username": "Tên đăng nhập",
|
|
"password": "Mật khẩu",
|
|
"submit": "Đăng nhập",
|
|
"submitting": "Đang đăng nhập…",
|
|
"failed": "Sai tên đăng nhập hoặc mật khẩu",
|
|
"tooMany": "Sai quá nhiều lần — hãy thử lại sau vài phút",
|
|
"logout": "Đăng xuất",
|
|
"signedInAs": "Đang đăng nhập: {{name}} ({{role}})"
|
|
},
|
|
"insights": {
|
|
"help": {
|
|
"sessions": "Một phiên là một cuộc trò chuyện với agent AI, từ lúc bắt đầu đến khi kết thúc.",
|
|
"agents": "Agent là các 'nhân công' AI: agent chính trong mỗi phiên cộng với các agent phụ nó tạo ra.",
|
|
"tokens": "Token là các mẩu chữ AI đọc và viết, khoảng 1 token ≈ 4 ký tự. Càng nhiều token càng tốn tiền.",
|
|
"cost": "Số tiền ước tính, tính từ số token và giá của từng mô hình.",
|
|
"events": "Mỗi bước AI làm (chạy công cụ, trả lời xong…) được ghi lại thành một sự kiện.",
|
|
"tokenMix": "Input = nội dung bạn và các file gửi cho AI. Output = nội dung AI viết ra. Cache read = nội dung dùng lại từ bộ nhớ đệm (rẻ hơn khoảng 10 lần). Cache write = nội dung lưu vào bộ nhớ đệm để dùng lại.",
|
|
"spendPace": "Tốc độ chi tiền, và cuối tháng sẽ tốn bao nhiêu nếu giữ tốc độ này.",
|
|
"toolCalls": "Số thao tác AI đã làm: đọc file, sửa file, chạy lệnh…",
|
|
"subagents": "Các agent phụ mà AI chính tạo ra để làm song song một phần công việc.",
|
|
"compactions": "Khi cuộc trò chuyện quá dài, nó được tóm tắt lại để có chỗ trống. Chi tiết ở đoạn đầu có thể bị mất.",
|
|
"errors": "Các bước bị lỗi. Vài lỗi là bình thường; nhiều lỗi có thể nghĩa là AI bị kẹt.",
|
|
"tokenFlow": "Input = gửi cho AI, Output = AI viết ra, Cache = dùng lại từ bộ nhớ đệm (rẻ hơn)."
|
|
}
|
|
}
|
|
}
|