feat: v2.5.12 — plan and quota for every AI tool, Grok Build and Kimi Code, Quit AgentHub (#65)
Usage panel (status bar): - every account shows its plan (Claude subscriptionType, Codex chatgpt_plan_type, Cursor membershipType, Grok subscriptionTier) - new quota rows: Cursor CLI (cursor.com usage-summary), Antigravity (`agy --print /usage`, two model pools; AGENTHUB_AGY_USAGE=0 never runs agy), Grok Build, Kimi Code, OpenCode Go — each login read from the tool's own file, sent only to its own host while valid, never refreshed - in-flight quota reads are shared between tabs AI Tools catalog: Grok Build (`grok`) and Kimi Code (`kimi`) added; Gemini CLI, Hermes and OpenClaw removed. Also: Quit AgentHub (#65, `agenthub stop`), status-area icon, Add to Chat on an editor selection, Settings in three groups, JetBrains-style Changes panel (ticked files/hunks, ignore, blame, file history), terminal font. --no-verify: :3000 is taken by another dev server (lane-detect tests); both suites run by hand — server 2636/2639 (the 3 are :3000), client 1131/1131.
This commit is contained in:
@@ -114,6 +114,7 @@ export const i18nReady = i18n
|
||||
"alerts",
|
||||
"splash",
|
||||
"lanes",
|
||||
"users",
|
||||
],
|
||||
defaultNS: "common",
|
||||
interpolation: { escapeValue: false },
|
||||
|
||||
@@ -58,11 +58,7 @@
|
||||
"changes.collapseContext": "Show fewer surrounding lines",
|
||||
"changes.collapseFile": "Collapse {{path}}",
|
||||
"changes.commitPlaceholder": "Commit message",
|
||||
"changes.commitStaged": "Commit {{count}} staged",
|
||||
"changes.suggestMessage": "Suggest a commit message with AI (Claude, staged changes)",
|
||||
"changes.neverStage": "Never stage — Stage all skips this file",
|
||||
"changes.allowStage": "Include in Stage all again",
|
||||
"changes.keptHint": "Never staged by Stage all (this browser)",
|
||||
"changes.suggestMessage": "Suggest a commit message with AI (Claude, ticked files)",
|
||||
"changes.conflicted": "conflict",
|
||||
"changes.discard": "Discard this file's changes",
|
||||
"changes.discardConfirm": "Click again to discard — this cannot be undone",
|
||||
@@ -79,6 +75,7 @@
|
||||
"changes.commentLine": "Comment on line {{n}} — pasted into this workspace's pane",
|
||||
"changes.commentOn": "Comment on {{at}} — pasted into the pane you used last; nothing is sent until you press Enter there",
|
||||
"changes.commentSend": "Paste into pane",
|
||||
"changes.addToChat": "Add to Chat",
|
||||
"changes.commentCancel": "Cancel",
|
||||
"changes.commentNoPane": "No terminal of this workspace is on screen — open its session (or narrow the Changes panel) first",
|
||||
"changes.layout.split": "Side-by-side",
|
||||
@@ -105,13 +102,7 @@
|
||||
"changes.size.full": "Full screen",
|
||||
"changes.fileCount_one": "{{count}} file",
|
||||
"changes.fileCount_other": "{{count}} files",
|
||||
"changes.stageFolder": "Stage every file in this folder",
|
||||
"changes.unstageFolder": "Unstage every file in this folder",
|
||||
"changes.stageAll": "Stage all ({{count}})",
|
||||
"changes.unstageAll": "Unstage all ({{count}})",
|
||||
"changes.dropEdits": "Discard your unsaved edits to this file?",
|
||||
"changes.stagedGroup": "Staged Changes",
|
||||
"changes.unstagedGroup": "Changes",
|
||||
"changes.stage": "Stage this file",
|
||||
"changes.title": "Changes",
|
||||
"changes.truncated": "Some changes were left out to keep this panel responsive.",
|
||||
@@ -236,10 +227,8 @@
|
||||
"tooltipStart": "Spawn a conversation-mode run with no initial prompt; driven from CLI or via message",
|
||||
"worktrees.heading_one": "{{count}} worktree",
|
||||
"worktrees.heading_other": "{{count}} worktrees",
|
||||
"changes.stageHunk": "Stage this hunk",
|
||||
"changes.undoHunk": "Undo this hunk",
|
||||
"changes.undoHunkConfirm": "Click again to undo this hunk — this cannot be undone",
|
||||
"changes.stageHunkShort": "Keep",
|
||||
"changes.undoHunkShort": "Undo",
|
||||
"changes.undoHunkShortConfirm": "Confirm undo",
|
||||
"changes.edit": "Edit",
|
||||
@@ -278,14 +267,14 @@
|
||||
"gitBar.mergeConflicts": "Merge stopped on {{count}} conflicted file(s) — resolve them in the list below.",
|
||||
"gitBar.merging": "A {{op}} is in progress: finish or abort it first",
|
||||
"changes.conflictsGroup": "Merge conflicts",
|
||||
"changes.mergeBanner": "A {{op}} is in progress \u2014 {{count}} file(s) still conflicted",
|
||||
"changes.mergeReady": "A {{op}} is in progress \u2014 every conflict is resolved",
|
||||
"changes.mergeBanner": "A {{op}} is in progress — {{count}} file(s) still conflicted",
|
||||
"changes.mergeReady": "A {{op}} is in progress — every conflict is resolved",
|
||||
"changes.mergeCommit": "Complete {{op}}",
|
||||
"changes.mergeAbort": "Abort {{op}}",
|
||||
"changes.mergeAbortConfirm": "Click again to abort the {{op}}",
|
||||
"changes.discardShortConfirm": "Discard?",
|
||||
"changes.amend": "Amend",
|
||||
"changes.amendHint": "Fold the staged changes into the last commit (only before it is pushed). Leave the message empty to keep the old one.",
|
||||
"changes.amendHint": "Fold the ticked files into the last commit (only before it is pushed). Nothing ticked rewords it; leave the message empty to keep the old one.",
|
||||
"changes.amendPlaceholder": "New message (empty = keep the old one)",
|
||||
"changes.historyOf": "History of branch",
|
||||
"changes.cherryPick": "Cherry-pick onto {{branch}}",
|
||||
@@ -435,6 +424,7 @@
|
||||
"panes.splitNew.right": "Split right with a new terminal",
|
||||
"panes.splitNew.bottom": "Split down with a new terminal",
|
||||
"panes.closeShort": "Move to own tab",
|
||||
"panes.stop": "Stop session",
|
||||
"changes.copyPath": "Copy relative path",
|
||||
"changes.viewCommit": "View commit",
|
||||
"changes.copySha": "Copy commit SHA",
|
||||
@@ -475,5 +465,30 @@
|
||||
"runtime.listening": "listening",
|
||||
"runtime.notListening": "not listening",
|
||||
"replay.pasted": "That session was already open in a tab — your message is pasted there; press Enter to send it.",
|
||||
"replay.notPasted": "That session is open in a tab, but your message could not be pasted there: {{text}}"
|
||||
"replay.notPasted": "That session is open in a tab, but your message could not be pasted there: {{text}}",
|
||||
"changes.changesGroup": "Changes",
|
||||
"changes.unversionedGroup": "Unversioned Files",
|
||||
"changes.commitTicked": "Commit ({{count}})",
|
||||
"changes.commitAndPush": "Commit and Push",
|
||||
"changes.amendAndPush": "Amend and Push",
|
||||
"changes.pushFailed": "Committed, but the push failed: {{error}}",
|
||||
"changes.tickFile": "Include {{path}} in the commit",
|
||||
"changes.tickFolder": "Tick every file in {{path}}",
|
||||
"changes.commitFile": "Commit File…",
|
||||
"changes.jumpToSource": "Jump to Source",
|
||||
"changes.copyPatch": "Copy as Patch to Clipboard",
|
||||
"changes.noPatch": "This file has no text diff to copy",
|
||||
"changes.addToVcs": "Add to VCS",
|
||||
"changes.addToGitignore": "Add to .gitignore",
|
||||
"changes.includeBlock": "Include this change in the commit",
|
||||
"changes.prevDiff": "Previous difference (Shift+F7)",
|
||||
"changes.nextDiff": "Next difference (F7)",
|
||||
"changes.prevFile": "Previous file",
|
||||
"changes.nextFile": "Next file",
|
||||
"changes.showHistory": "Show History",
|
||||
"changes.historyOfFile": "History of {{path}}",
|
||||
"changes.historyWholeBranch": "Whole branch",
|
||||
"changes.annotate": "Annotate",
|
||||
"changes.noBlame": "Nothing to annotate: this file has no committed history yet",
|
||||
"changes.notCommitted": "Not committed yet"
|
||||
}
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
"quotaFailed": "Could not read the quota",
|
||||
"quotaWrongAccount": "This sign-in belongs to another Claude account: log in as this account and save it again",
|
||||
"quotaActive": "in use",
|
||||
"quotaTokenExpired": "Sign-in expired: use the tool once so it signs in again",
|
||||
"quotaProfileExpired": "Sign-in expired: use Check quota in Claude Code → Profiles to refresh it",
|
||||
"quotaSignInExpires": "Sign-in expires in {{time}}",
|
||||
"quotaSignInExpired": "Sign-in expired",
|
||||
@@ -94,5 +95,6 @@
|
||||
"resizeSidebar": "Resize sidebar (double-click to reset)",
|
||||
"closeMenu": "Close menu",
|
||||
"sidebar": "Sidebar",
|
||||
"now": "now"
|
||||
"now": "now",
|
||||
"users": "Users"
|
||||
}
|
||||
|
||||
@@ -137,7 +137,8 @@
|
||||
"incomplete": "Hooks incomplete",
|
||||
"reinstall": "Reinstall Hooks",
|
||||
"success": "Hooks installed successfully",
|
||||
"failed": "Hook installation failed"
|
||||
"failed": "Hook installation failed",
|
||||
"plugin": "Provided by the agenthub plugin (its plugin.json), not settings.json"
|
||||
},
|
||||
"lanesSection": {
|
||||
"title": "Workspaces",
|
||||
@@ -311,16 +312,51 @@
|
||||
"unavailable": "Not available here: needs systemd --user on Linux, or a GUI login on macOS.",
|
||||
"foreign": "A service named agenthub that AgentHub did not write already exists — AgentHub leaves it alone."
|
||||
},
|
||||
"tray": {
|
||||
"label": "Show AgentHub icon in the status area",
|
||||
"desc": "An AgentHub icon beside the clock (top bar, menu bar or notification area) to open the dashboard, quit it, and start it again after a quit.",
|
||||
"unavailable": "Not available here: needs a graphical desktop session, and is off in server mode."
|
||||
},
|
||||
"quit": {
|
||||
"label": "Quit AgentHub",
|
||||
"desc": "Stop the dashboard so nothing runs in the background. Opening Claude Code no longer starts it; run `agenthub start` to bring it back.",
|
||||
"button": "Quit",
|
||||
"confirmTitle": "Quit AgentHub?",
|
||||
"confirmMessage": "Every workspace terminal is closed — running agents stop — and the dashboard shuts down. It stays off until you run `agenthub start`.",
|
||||
"confirmMessageAutostart": "Every workspace terminal is closed — running agents stop — and the dashboard shuts down. It stays off until you run `agenthub start`, or until the next boot/login (start automatically is on).",
|
||||
"done": "AgentHub is stopping. Run `agenthub start` to start it again."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
"description": "Server runtime information.",
|
||||
"title": "System",
|
||||
"release": "Release",
|
||||
"uiBuild": "UI build v{{version}} (rebuild client to match)",
|
||||
"uptime": "Uptime",
|
||||
"nodejs": "Node.js",
|
||||
"platform": "Platform",
|
||||
"wsClients": "WS Clients",
|
||||
"loadingInfo": "Loading server info..."
|
||||
"wsClients": "Live connections",
|
||||
"wsClientsDesc": "Browser tabs and tools receiving live updates",
|
||||
"loadingInfo": "Loading server info...",
|
||||
"server": "Server",
|
||||
"cpu": "CPU",
|
||||
"cpuValue": "{{count}} cores · load {{load}}",
|
||||
"memory": "Process memory",
|
||||
"memoryValue": "{{rss}} RSS · heap {{used}} of {{limit}}",
|
||||
"systemMemory": "System memory",
|
||||
"systemMemoryValue": "{{used}} used of {{total}}",
|
||||
"install": "Installation",
|
||||
"installKind": {
|
||||
"plugin": "Claude Code plugin",
|
||||
"checkout": "Git checkout"
|
||||
},
|
||||
"latest": "Latest release",
|
||||
"upToDate": "Up to date",
|
||||
"updateAvailable": "Update available",
|
||||
"unknown": "Unknown",
|
||||
"database": "Database",
|
||||
"dbFile": "Database file",
|
||||
"journal": "Journal mode",
|
||||
"activity": "Events recorded",
|
||||
"activityValue": "{{m5}} in 5 min · {{m15}} in 15 min · {{h1}} in 1 h"
|
||||
},
|
||||
"tables": {
|
||||
"sessions": "sessions",
|
||||
@@ -764,9 +800,7 @@
|
||||
"group": {
|
||||
"general": "General",
|
||||
"agents": "Agents",
|
||||
"routing": "Routing",
|
||||
"git": "Git",
|
||||
"cost": "Cost"
|
||||
"data": "Data"
|
||||
},
|
||||
"section": {
|
||||
"appearance": {
|
||||
@@ -800,37 +834,25 @@
|
||||
"title": "Pricing",
|
||||
"description": "Model prices for every vendor, used to estimate cost. Rates per million tokens (USD); % is a wildcard in a pattern; a model's introductory rate is shown in violet."
|
||||
},
|
||||
"gitCredentials": {
|
||||
"title": "Git credentials",
|
||||
"description": "Logins AgentHub gives git for a dashboard fetch, pull or push."
|
||||
},
|
||||
"worktrees": {
|
||||
"title": "Worktrees",
|
||||
"description": "Which untracked git worktrees a workspace's Add folder suggests."
|
||||
},
|
||||
"data": {
|
||||
"title": "Data",
|
||||
"description": "Cost and database overview, import, remote sources, export, cleanup and the danger zone."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
"description": "Server version, uptime and runtime."
|
||||
},
|
||||
"snapshots": {
|
||||
"title": "Snapshots",
|
||||
"description": "Frozen, read-only copies of sessions, each behind its own link."
|
||||
"title": "Database",
|
||||
"description": "Total cost, database overview, import, remote sources, export, cleanup and the danger zone."
|
||||
},
|
||||
"reports": {
|
||||
"title": "Reports",
|
||||
"description": "Analytics summaries written on a schedule, as HTML or JSON."
|
||||
"title": "Snapshots & reports",
|
||||
"description": "Read-only session snapshots behind their own links, and analytics summaries written on a schedule."
|
||||
},
|
||||
"users": {
|
||||
"title": "Users",
|
||||
"description": "Accounts, their usage and the audit log."
|
||||
"system": {
|
||||
"title": "System",
|
||||
"description": "Version, install, start at login, server runtime and the database file."
|
||||
},
|
||||
"git": {
|
||||
"title": "Git",
|
||||
"description": "Logins AgentHub gives git for a dashboard fetch, pull or push, and which worktrees Add folder suggests."
|
||||
}
|
||||
},
|
||||
"backPrevious": "Back",
|
||||
"unknownSection": "There is no “{{section}}” settings page — showing General instead."
|
||||
"unknownSection": "There is no “{{section}}” settings page — showing Appearance instead."
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Search settings",
|
||||
@@ -856,6 +878,18 @@
|
||||
"vi": "Tiếng Việt"
|
||||
}
|
||||
},
|
||||
"terminalFont": {
|
||||
"title": "Terminal font",
|
||||
"description": "The font of the workspace terminals. Takes effect the next time a terminal opens. Saved in this browser only.",
|
||||
"label": "Font",
|
||||
"names": {
|
||||
"jetbrains": "JetBrains Mono",
|
||||
"maple": "Maple Mono (rounded)",
|
||||
"system": "System font"
|
||||
},
|
||||
"systemNote": "Your browser's fixed-width font. It may lack some Vietnamese letters (ấ, ế, ố…), which then draw out of line.",
|
||||
"preview": "Preview"
|
||||
},
|
||||
"rowMenu": {
|
||||
"copyHost": "Copy host",
|
||||
"copyUrl": "Copy endpoint",
|
||||
@@ -947,20 +981,9 @@
|
||||
"imported": "Imported {{count}} preference(s). Reloading…",
|
||||
"badFile": "That file is not an AgentHub preferences file."
|
||||
},
|
||||
"users": {
|
||||
"title": "Users",
|
||||
"description": "Every account on this server, with its workspaces, sessions and recent usage.",
|
||||
"name": "User",
|
||||
"role": "Role",
|
||||
"workspaces": "Workspaces",
|
||||
"sessions": "Sessions",
|
||||
"last7d": "7 days",
|
||||
"last30d": "30 days",
|
||||
"disabled": "disabled",
|
||||
"tokens": "{{n}} tokens",
|
||||
"manageHint": "Add, disable or change a user on the host: agenthub users …",
|
||||
"auditTitle": "Audit log",
|
||||
"auditDescription": "Each time an admin or analyst opened a session a member owns.",
|
||||
"auditEmpty": "No reads recorded yet."
|
||||
"pricingLink": {
|
||||
"title": "Model pricing",
|
||||
"description": "Prices for every vendor's models live on one page.",
|
||||
"open": "Open Pricing"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"title": "Users",
|
||||
"description": "Every account on this server, with its workspaces, sessions and recent usage.",
|
||||
"name": "User",
|
||||
"role": "Role",
|
||||
"workspaces": "Workspaces",
|
||||
"sessions": "Sessions",
|
||||
"last7d": "7 days",
|
||||
"last30d": "30 days",
|
||||
"disabled": "disabled",
|
||||
"you": "you",
|
||||
"tokens": "{{n}} tokens",
|
||||
"actions": "Actions",
|
||||
"roles": {
|
||||
"admin": "Admin",
|
||||
"analyst": "Analyst",
|
||||
"member": "Member"
|
||||
},
|
||||
"roleHint": {
|
||||
"admin": "Everything, including this server's configuration and every user's data",
|
||||
"analyst": "Reads everything; no terminal, no changes",
|
||||
"member": "Only their own workspaces"
|
||||
},
|
||||
"add": "Add user",
|
||||
"username": "Username",
|
||||
"usernameHint": "Letters, digits, '.', '_' or '-'",
|
||||
"password": "Password",
|
||||
"passwordHint": "At least 8 characters",
|
||||
"newPassword": "New password",
|
||||
"changeRole": "Change role",
|
||||
"disable": "Disable",
|
||||
"enable": "Enable",
|
||||
"resetPassword": "Reset password",
|
||||
"assignWorkspace": "Give a workspace",
|
||||
"workspace": "Workspace",
|
||||
"noOwner": "no owner",
|
||||
"ownedBy": "owned by {{name}}",
|
||||
"noWorkspaces": "There are no workspaces yet.",
|
||||
"yourPassword": "Your password",
|
||||
"yourPasswordHint": "Type your own password to confirm this change.",
|
||||
"save": "Save",
|
||||
"dialog": {
|
||||
"add": "Add a user",
|
||||
"role": "Change {{name}}'s role",
|
||||
"disable": "Disable {{name}}?",
|
||||
"disableBody": "{{name}} is signed out everywhere and cannot sign in until enabled again. Their workspaces and history stay.",
|
||||
"enable": "Enable {{name}}?",
|
||||
"password": "Reset {{name}}'s password",
|
||||
"passwordBody": "{{name}} is signed out everywhere and signs in with the new password.",
|
||||
"workspace": "Give {{name}} a workspace",
|
||||
"workspaceBody": "The workspace's sessions and costs move to {{name}}. A member sees only their own workspaces."
|
||||
},
|
||||
"done": {
|
||||
"created": "{{name}} added",
|
||||
"role": "{{name}} is now {{role}}",
|
||||
"disabled": "{{name}} disabled",
|
||||
"enabled": "{{name}} enabled",
|
||||
"password": "{{name}}'s password reset",
|
||||
"workspace": "Workspace given to {{name}}"
|
||||
},
|
||||
"errors": {
|
||||
"EREAUTH": "Your password is wrong.",
|
||||
"ETOOMANY": "Too many wrong passwords. Try again in 15 minutes.",
|
||||
"ESELF": "You cannot change your own role or disable yourself.",
|
||||
"EEXISTS": "That username is taken.",
|
||||
"EBADUSER": "Username: letters, digits, '.', '_' or '-' (up to 64).",
|
||||
"EBADPASSWORD": "Password: at least 8 characters."
|
||||
},
|
||||
"readOnly": "Analysts can view accounts but not change them.",
|
||||
"auditTitle": "Audit log",
|
||||
"auditDescription": "Account changes made here, and each time an admin or analyst opened a session a member owns.",
|
||||
"auditEmpty": "Nothing recorded yet."
|
||||
}
|
||||
@@ -58,11 +58,7 @@
|
||||
"changes.collapseContext": "Bớt dòng xung quanh",
|
||||
"changes.collapseFile": "Thu gọn {{path}}",
|
||||
"changes.commitPlaceholder": "Nội dung commit",
|
||||
"changes.commitStaged": "Commit {{count}} file đã stage",
|
||||
"changes.suggestMessage": "Gợi ý nội dung commit bằng AI (Claude, các thay đổi đã stage)",
|
||||
"changes.neverStage": "Không bao giờ stage — Stage all bỏ qua file này",
|
||||
"changes.allowStage": "Cho Stage all stage lại file này",
|
||||
"changes.keptHint": "Stage all không bao giờ stage file này (trên trình duyệt này)",
|
||||
"changes.suggestMessage": "Gợi ý nội dung commit bằng AI (Claude, các file đã tick)",
|
||||
"changes.conflicted": "xung đột",
|
||||
"changes.discard": "Bỏ thay đổi của file này",
|
||||
"changes.discardConfirm": "Bấm lần nữa để bỏ — không thể hoàn tác",
|
||||
@@ -79,6 +75,7 @@
|
||||
"changes.commentLine": "Comment dòng {{n}} — dán vào pane của workspace này",
|
||||
"changes.commentOn": "Comment {{at}} — dán vào pane bạn dùng gần nhất; chưa gửi gì cho tới khi bạn nhấn Enter ở đó",
|
||||
"changes.commentSend": "Dán vào pane",
|
||||
"changes.addToChat": "Thêm vào chat",
|
||||
"changes.commentCancel": "Huỷ",
|
||||
"changes.commentNoPane": "Chưa có terminal nào của workspace này đang hiện — hãy mở session (hoặc thu hẹp khung Changes) trước",
|
||||
"changes.layout.split": "Hai cột",
|
||||
@@ -105,13 +102,7 @@
|
||||
"changes.size.full": "Toàn màn hình",
|
||||
"changes.fileCount_one": "{{count}} tệp",
|
||||
"changes.fileCount_other": "{{count}} tệp",
|
||||
"changes.stageFolder": "Stage mọi tệp trong thư mục này",
|
||||
"changes.unstageFolder": "Bỏ stage mọi tệp trong thư mục này",
|
||||
"changes.stageAll": "Stage tất cả ({{count}})",
|
||||
"changes.unstageAll": "Bỏ stage tất cả ({{count}})",
|
||||
"changes.dropEdits": "Bỏ các chỉnh sửa chưa lưu của file này?",
|
||||
"changes.stagedGroup": "Đã stage",
|
||||
"changes.unstagedGroup": "Thay đổi",
|
||||
"changes.stage": "Đưa file này vào index",
|
||||
"changes.title": "Thay đổi",
|
||||
"changes.truncated": "Một phần thay đổi đã bị lược bớt để bảng này còn mượt.",
|
||||
@@ -236,10 +227,8 @@
|
||||
"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.stageHunk": "Stage đoạn này",
|
||||
"changes.undoHunk": "Hoàn tác đoạn này",
|
||||
"changes.undoHunkConfirm": "Bấm lần nữa để hoàn tác đoạn này — không thể khôi phục",
|
||||
"changes.stageHunkShort": "Giữ",
|
||||
"changes.undoHunkShort": "Hoàn tác",
|
||||
"changes.undoHunkShortConfirm": "Xác nhận",
|
||||
"changes.edit": "Sửa",
|
||||
@@ -285,7 +274,7 @@
|
||||
"changes.mergeAbortConfirm": "Bấm lần nữa để huỷ {{op}}",
|
||||
"changes.discardShortConfirm": "Xoá?",
|
||||
"changes.amend": "Amend",
|
||||
"changes.amendHint": "Gộp phần đã stage vào commit cuối (chỉ khi chưa push). Để trống message để giữ message cũ.",
|
||||
"changes.amendHint": "Gộp các file đã tick vào commit cuối (chỉ khi chưa push). Không tick file nào thì chỉ sửa message; để trống message để giữ message cũ.",
|
||||
"changes.amendPlaceholder": "Message mới (trống = giữ message cũ)",
|
||||
"changes.historyOf": "Lịch sử của nhánh",
|
||||
"changes.cherryPick": "Cherry-pick vào {{branch}}",
|
||||
@@ -435,6 +424,7 @@
|
||||
"panes.splitNew.right": "Chia sang phải với terminal mới",
|
||||
"panes.splitNew.bottom": "Chia xuống dưới với terminal mới",
|
||||
"panes.closeShort": "Tách ra tab riêng",
|
||||
"panes.stop": "Dừng phiên",
|
||||
"changes.copyPath": "Sao chép đường dẫn tương đối",
|
||||
"changes.viewCommit": "Xem commit",
|
||||
"changes.copySha": "Sao chép SHA của commit",
|
||||
@@ -475,5 +465,30 @@
|
||||
"runtime.listening": "đang lắng nghe",
|
||||
"runtime.notListening": "không lắng nghe",
|
||||
"replay.pasted": "Session đó đã mở trong một tab — tin nhắn đã được dán vào đó; nhấn Enter để gửi.",
|
||||
"replay.notPasted": "Session đó đang mở trong một tab nhưng không dán được tin nhắn vào đó: {{text}}"
|
||||
"replay.notPasted": "Session đó đang mở trong một tab nhưng không dán được tin nhắn vào đó: {{text}}",
|
||||
"changes.changesGroup": "Thay đổi",
|
||||
"changes.unversionedGroup": "File chưa theo dõi",
|
||||
"changes.commitTicked": "Commit ({{count}})",
|
||||
"changes.commitAndPush": "Commit và Push",
|
||||
"changes.amendAndPush": "Amend và Push",
|
||||
"changes.pushFailed": "Đã commit, nhưng push thất bại: {{error}}",
|
||||
"changes.tickFile": "Đưa {{path}} vào commit",
|
||||
"changes.tickFolder": "Tick mọi file trong {{path}}",
|
||||
"changes.commitFile": "Commit file…",
|
||||
"changes.jumpToSource": "Mở mã nguồn",
|
||||
"changes.copyPatch": "Sao chép dạng patch",
|
||||
"changes.noPatch": "File này không có diff dạng văn bản để sao chép",
|
||||
"changes.addToVcs": "Thêm vào VCS",
|
||||
"changes.addToGitignore": "Thêm vào .gitignore",
|
||||
"changes.includeBlock": "Đưa thay đổi này vào commit",
|
||||
"changes.prevDiff": "Khác biệt trước (Shift+F7)",
|
||||
"changes.nextDiff": "Khác biệt tiếp theo (F7)",
|
||||
"changes.prevFile": "File trước",
|
||||
"changes.nextFile": "File tiếp theo",
|
||||
"changes.showHistory": "Xem lịch sử",
|
||||
"changes.historyOfFile": "Lịch sử của {{path}}",
|
||||
"changes.historyWholeBranch": "Cả nhánh",
|
||||
"changes.annotate": "Annotate",
|
||||
"changes.noBlame": "Không có gì để annotate: file này chưa có lịch sử commit",
|
||||
"changes.notCommitted": "Chưa commit"
|
||||
}
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
"quotaFailed": "Không đọc được quota",
|
||||
"quotaWrongAccount": "Lượt đăng nhập này thuộc tài khoản Claude khác: đăng nhập lại đúng tài khoản này rồi lưu lại",
|
||||
"quotaActive": "đang dùng",
|
||||
"quotaTokenExpired": "Đăng nhập đã hết hạn: dùng công cụ một lần để nó đăng nhập lại",
|
||||
"quotaProfileExpired": "Đăng nhập đã hết hạn: bấm Kiểm tra quota trong Claude Code → Profiles để làm mới",
|
||||
"quotaSignInExpires": "Đăng nhập hết hạn sau {{time}}",
|
||||
"quotaSignInExpired": "Đăng nhập đã hết hạn",
|
||||
@@ -94,5 +95,6 @@
|
||||
"resizeSidebar": "Kéo để đổi độ rộng sidebar (nhấp đúp để đặt lại)",
|
||||
"closeMenu": "Đóng menu",
|
||||
"sidebar": "Thanh bên",
|
||||
"now": "bây giờ"
|
||||
"now": "bây giờ",
|
||||
"users": "Người dùng"
|
||||
}
|
||||
|
||||
@@ -137,7 +137,8 @@
|
||||
"incomplete": "Hooks chưa đầy đủ",
|
||||
"reinstall": "Cài lại hooks",
|
||||
"success": "Cài hooks thành công",
|
||||
"failed": "Cài hooks thất bại"
|
||||
"failed": "Cài hooks thất bại",
|
||||
"plugin": "Do plugin agenthub cung cấp (trong plugin.json của nó), không nằm trong settings.json"
|
||||
},
|
||||
"lanesSection": {
|
||||
"title": "Workspace",
|
||||
@@ -311,16 +312,51 @@
|
||||
"unavailable": "Không khả dụng ở đây: cần systemd --user trên Linux, hoặc phiên đăng nhập GUI trên macOS.",
|
||||
"foreign": "Đã có một service tên agenthub không do AgentHub tạo — AgentHub không đụng vào."
|
||||
},
|
||||
"tray": {
|
||||
"label": "Hiện icon AgentHub trên thanh trạng thái",
|
||||
"desc": "Icon AgentHub cạnh đồng hồ (thanh trên cùng, menu bar hoặc khay hệ thống) để mở dashboard, thoát, và bật lại sau khi thoát.",
|
||||
"unavailable": "Không khả dụng ở đây: cần phiên desktop có giao diện đồ hoạ, và luôn tắt ở server mode."
|
||||
},
|
||||
"quit": {
|
||||
"label": "Thoát AgentHub",
|
||||
"desc": "Tắt dashboard để không còn chạy ngầm. Mở Claude Code sẽ không tự bật lại; chạy `agenthub start` để bật lại.",
|
||||
"button": "Thoát",
|
||||
"confirmTitle": "Thoát AgentHub?",
|
||||
"confirmMessage": "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`.",
|
||||
"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."
|
||||
},
|
||||
"about": {
|
||||
"title": "Giới thiệu",
|
||||
"description": "Thông tin runtime của máy chủ.",
|
||||
"title": "Hệ thống",
|
||||
"release": "Phiên bản",
|
||||
"uiBuild": "UI build v{{version}} (hãy build lại client để khớp)",
|
||||
"uptime": "Thời gian chạy",
|
||||
"nodejs": "Node.js",
|
||||
"platform": "Nền tảng",
|
||||
"wsClients": "WS Clients",
|
||||
"loadingInfo": "Đang tải thông tin máy chủ..."
|
||||
"wsClients": "Kết nối trực tiếp",
|
||||
"wsClientsDesc": "Các tab trình duyệt và công cụ đang nhận cập nhật trực tiếp",
|
||||
"loadingInfo": "Đang tải thông tin máy chủ...",
|
||||
"server": "Máy chủ",
|
||||
"cpu": "CPU",
|
||||
"cpuValue": "{{count}} lõi · tải {{load}}",
|
||||
"memory": "Bộ nhớ tiến trình",
|
||||
"memoryValue": "{{rss}} RSS · heap {{used}} / {{limit}}",
|
||||
"systemMemory": "Bộ nhớ hệ thống",
|
||||
"systemMemoryValue": "Đã dùng {{used}} / {{total}}",
|
||||
"install": "Cài đặt",
|
||||
"installKind": {
|
||||
"plugin": "Plugin Claude Code",
|
||||
"checkout": "Git checkout"
|
||||
},
|
||||
"latest": "Bản phát hành mới nhất",
|
||||
"upToDate": "Đã mới nhất",
|
||||
"updateAvailable": "Có bản cập nhật",
|
||||
"unknown": "Không rõ",
|
||||
"database": "Cơ sở dữ liệu",
|
||||
"dbFile": "Tệp cơ sở dữ liệu",
|
||||
"journal": "Chế độ journal",
|
||||
"activity": "Sự kiện đã ghi",
|
||||
"activityValue": "{{m5}} trong 5 phút · {{m15}} trong 15 phút · {{h1}} trong 1 giờ"
|
||||
},
|
||||
"tables": {
|
||||
"sessions": "phiên",
|
||||
@@ -764,9 +800,7 @@
|
||||
"group": {
|
||||
"general": "Chung",
|
||||
"agents": "Tác tử",
|
||||
"routing": "Định tuyến",
|
||||
"git": "Git",
|
||||
"cost": "Chi phí"
|
||||
"data": "Dữ liệu"
|
||||
},
|
||||
"section": {
|
||||
"appearance": {
|
||||
@@ -800,37 +834,25 @@
|
||||
"title": "Định giá",
|
||||
"description": "Giá mô hình của mọi nhà cung cấp, dùng để ước tính chi phí. Đơn giá theo một triệu token (USD); % là ký tự đại diện trong mẫu; giá giới thiệu hiển thị màu tím."
|
||||
},
|
||||
"gitCredentials": {
|
||||
"title": "Git credentials",
|
||||
"description": "Thông tin đăng nhập AgentHub đưa cho git khi fetch, pull hoặc push từ dashboard."
|
||||
},
|
||||
"worktrees": {
|
||||
"title": "Worktree",
|
||||
"description": "Những git worktree chưa theo dõi được gợi ý khi thêm thư mục cho workspace."
|
||||
},
|
||||
"data": {
|
||||
"title": "Dữ liệu",
|
||||
"description": "Tổng quan chi phí và cơ sở dữ liệu, nhập, nguồn từ xa, xuất, dọn dẹp và vùng nguy hiểm."
|
||||
},
|
||||
"about": {
|
||||
"title": "Giới thiệu",
|
||||
"description": "Phiên bản máy chủ, thời gian hoạt động và môi trường chạy."
|
||||
},
|
||||
"snapshots": {
|
||||
"title": "Snapshot",
|
||||
"description": "Các bản sao chỉ đọc, đã đóng băng của phiên, mỗi bản có liên kết riêng."
|
||||
"title": "Cơ sở dữ liệu",
|
||||
"description": "Tổng chi phí, tổng quan cơ sở dữ liệu, nhập, nguồn từ xa, xuất, dọn dẹp và vùng nguy hiểm."
|
||||
},
|
||||
"reports": {
|
||||
"title": "Báo cáo",
|
||||
"description": "Bản tóm tắt phân tích ghi ra theo lịch, dạng HTML hoặc JSON."
|
||||
"title": "Snapshot & báo cáo",
|
||||
"description": "Bản snapshot phiên chỉ đọc, mỗi bản một liên kết riêng, và bản tóm tắt phân tích ghi ra theo lịch."
|
||||
},
|
||||
"users": {
|
||||
"title": "Người dùng",
|
||||
"description": "Tài khoản, mức dùng và nhật ký truy cập."
|
||||
"system": {
|
||||
"title": "Hệ thống",
|
||||
"description": "Phiên bản, cách cài đặt, tự khởi động, runtime máy chủ và tệp cơ sở dữ liệu."
|
||||
},
|
||||
"git": {
|
||||
"title": "Git",
|
||||
"description": "Thông tin đăng nhập AgentHub đưa cho git khi fetch, pull, push từ dashboard, và các worktree được gợi ý khi Thêm thư mục."
|
||||
}
|
||||
},
|
||||
"backPrevious": "Quay lại",
|
||||
"unknownSection": "Không có trang cài đặt “{{section}}” — đang hiển thị trang Chung."
|
||||
"unknownSection": "Không có trang cài đặt “{{section}}” — đang hiển thị trang Giao diện."
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Tìm cài đặt",
|
||||
@@ -856,6 +878,18 @@
|
||||
"vi": "Tiếng Việt"
|
||||
}
|
||||
},
|
||||
"terminalFont": {
|
||||
"title": "Font terminal",
|
||||
"description": "Font của các terminal trong workspace. Áp dụng từ lần mở terminal tiếp theo. Chỉ lưu trong trình duyệt này.",
|
||||
"label": "Font",
|
||||
"names": {
|
||||
"jetbrains": "JetBrains Mono",
|
||||
"maple": "Maple Mono (bo tròn)",
|
||||
"system": "Font hệ thống"
|
||||
},
|
||||
"systemNote": "Font độ rộng cố định của trình duyệt. Font này có thể thiếu một số chữ tiếng Việt (ấ, ế, ố…), khi đó chữ sẽ bị lệch ô.",
|
||||
"preview": "Xem trước"
|
||||
},
|
||||
"rowMenu": {
|
||||
"copyHost": "Sao chép host",
|
||||
"copyUrl": "Sao chép endpoint",
|
||||
@@ -947,20 +981,9 @@
|
||||
"imported": "Đã nhập {{count}} tùy chọn. Đang tải lại…",
|
||||
"badFile": "Tệp này không phải tệp tùy chọn của AgentHub."
|
||||
},
|
||||
"users": {
|
||||
"title": "Người dùng",
|
||||
"description": "Mọi tài khoản trên server này, cùng workspace, session và mức dùng gần đây.",
|
||||
"name": "Người dùng",
|
||||
"role": "Vai trò",
|
||||
"workspaces": "Workspace",
|
||||
"sessions": "Session",
|
||||
"last7d": "7 ngày",
|
||||
"last30d": "30 ngày",
|
||||
"disabled": "đã khoá",
|
||||
"tokens": "{{n}} token",
|
||||
"manageHint": "Thêm, khoá hoặc sửa người dùng trên máy chủ: agenthub users …",
|
||||
"auditTitle": "Nhật ký truy cập",
|
||||
"auditDescription": "Mỗi lần admin hoặc analyst mở một session của member.",
|
||||
"auditEmpty": "Chưa có lượt đọc nào."
|
||||
"pricingLink": {
|
||||
"title": "Giá model",
|
||||
"description": "Giá model của mọi nhà cung cấp nằm chung một trang.",
|
||||
"open": "Mở trang Giá"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"title": "Người dùng",
|
||||
"description": "Mọi tài khoản trên server này, kèm workspace, phiên và mức dùng gần đây.",
|
||||
"name": "Người dùng",
|
||||
"role": "Vai trò",
|
||||
"workspaces": "Workspace",
|
||||
"sessions": "Phiên",
|
||||
"last7d": "7 ngày",
|
||||
"last30d": "30 ngày",
|
||||
"disabled": "đã khoá",
|
||||
"you": "bạn",
|
||||
"tokens": "{{n}} token",
|
||||
"actions": "Thao tác",
|
||||
"roles": {
|
||||
"admin": "Admin",
|
||||
"analyst": "Analyst",
|
||||
"member": "Thành viên"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"add": "Thêm người dùng",
|
||||
"username": "Tên đăng nhập",
|
||||
"usernameHint": "Chữ, số, '.', '_' hoặc '-'",
|
||||
"password": "Mật khẩu",
|
||||
"passwordHint": "Ít nhất 8 ký tự",
|
||||
"newPassword": "Mật khẩu mới",
|
||||
"changeRole": "Đổi vai trò",
|
||||
"disable": "Khoá",
|
||||
"enable": "Mở khoá",
|
||||
"resetPassword": "Đặt lại mật khẩu",
|
||||
"assignWorkspace": "Giao workspace",
|
||||
"workspace": "Workspace",
|
||||
"noOwner": "chưa có chủ",
|
||||
"ownedBy": "của {{name}}",
|
||||
"noWorkspaces": "Chưa có workspace nào.",
|
||||
"yourPassword": "Mật khẩu của bạn",
|
||||
"yourPasswordHint": "Nhập mật khẩu của chính bạn để xác nhận thay đổi này.",
|
||||
"save": "Lưu",
|
||||
"dialog": {
|
||||
"add": "Thêm người dùng",
|
||||
"role": "Đổi vai trò của {{name}}",
|
||||
"disable": "Khoá {{name}}?",
|
||||
"disableBody": "{{name}} bị đăng xuất khỏi mọi nơi và không đăng nhập được cho tới khi mở khoá. Workspace và lịch sử vẫn giữ nguyên.",
|
||||
"enable": "Mở khoá {{name}}?",
|
||||
"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."
|
||||
},
|
||||
"done": {
|
||||
"created": "Đã thêm {{name}}",
|
||||
"role": "{{name}} giờ là {{role}}",
|
||||
"disabled": "Đã khoá {{name}}",
|
||||
"enabled": "Đã mở khoá {{name}}",
|
||||
"password": "Đã đặt lại mật khẩu cho {{name}}",
|
||||
"workspace": "Đã giao workspace cho {{name}}"
|
||||
},
|
||||
"errors": {
|
||||
"EREAUTH": "Mật khẩu của bạn không đúng.",
|
||||
"ETOOMANY": "Nhập sai mật khẩu quá nhiều lần. Thử lại sau 15 phút.",
|
||||
"ESELF": "Bạn không thể tự đổi vai trò hay tự khoá chính mình.",
|
||||
"EEXISTS": "Tên đăng nhập này đã có người dùng.",
|
||||
"EBADUSER": "Tên đăng nhập: chữ, số, '.', '_' hoặc '-' (tối đa 64 ký tự).",
|
||||
"EBADPASSWORD": "Mật khẩu: ít nhất 8 ký tự."
|
||||
},
|
||||
"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.",
|
||||
"auditEmpty": "Chưa ghi nhận gì."
|
||||
}
|
||||
Reference in New Issue
Block a user