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": "Export",
"totalSessions": "Total Sessions",
"totalAgents": "Total Agents",
"totalTokens": "Total Tokens",
"totalCost": "Total Cost",
"totalEvents": "Total Events",
"cacheHitRate": "% cache hit rate",
"perSession": " per session",
"noDataCost": "No data",
"eventCountLabel_one": "{{count}} event",
"eventCountLabel_other": "{{count}} events",
"tabs": {
+5 -36
View File
@@ -30,14 +30,12 @@
},
"overview": {
"rootsTitle": "Roots",
"claudeHome": "Claude home",
"projectClaudeDir": "Project .claude",
"projectRoot": "Project root",
"claudeJson": "claude.json",
"summary": "Quick summary",
"user": "user",
"project": "project",
"items": "items"
"project": "project"
},
"common": {
"search": "Search by name…",
@@ -47,32 +45,19 @@
"close": "Close",
"copyPath": "Copy path",
"copyName": "Copy name",
"copied": "Copied",
"truncated": "(truncated for preview)",
"size": "Size",
"modified": "Modified",
"scopeLabel": "Scope",
"noFrontmatter": "No frontmatter",
"redactedNotice": "Values matching /token|secret|password|key|auth/i are redacted server-side.",
"preview": "Preview",
"raw": "Raw"
},
"skills": {
"name": "Name",
"description": "Description"
},
"agents": {
"name": "Name",
"model": "Model",
"tools": "Tools"
},
"plugins": {
"manifest": "Manifest",
"marketplace": "Marketplace",
"version": "Version",
"installedAt": "Installed",
"lastUpdated": "Updated",
"installPath": "Install path",
"missing": "Install path missing",
"manifestMissing": "No installed_plugins.json found at {{path}}",
"enabled": "Enabled",
@@ -90,8 +75,7 @@
"hooks_other": "{{count}} hook scripts",
"author": "Author",
"homepage": "Homepage",
"license": "License",
"description": "Description"
"license": "License"
},
"marketplaces": {
"manifest": "Known marketplaces manifest",
@@ -100,11 +84,9 @@
"lastUpdated": "Last synced",
"pluginCount": "Plugins",
"owner": "Owner",
"installLocation": "Install path",
"addCmd": "claude plugin marketplace add <repo>"
},
"keybindings": {
"file": "Source file",
"missing": "No keybindings.json found at {{path}}",
"context": "Context",
"key": "Key",
@@ -128,8 +110,7 @@
},
"hookScripts": {
"title": "~/.claude/hooks/ scripts",
"subtitle": "Helper scripts referenced by your hook commands. These run when settings.json `hooks.<event>.hooks[].command` invokes them.",
"empty": "No scripts in ~/.claude/hooks/."
"subtitle": "Helper scripts referenced by your hook commands. These run when settings.json `hooks.<event>.hooks[].command` invokes them."
},
"mcp": {
"userScope": "User-scoped servers",
@@ -143,8 +124,6 @@
"env": "Env names",
"url": "URL",
"headers": "Header names",
"kind": "Kind",
"source": "Source",
"noServers": "No MCP servers found.",
"notRemovable": "Configured in settings.json — remove it there; no CLI scope addresses this entry."
},
@@ -162,8 +141,6 @@
"rawJson": "Raw JSON"
},
"memory": {
"userScope": "User memory",
"projectScope": "Project memory",
"missing": "No CLAUDE.md found.",
"autoTitle": "Project memory store",
"autoSubtitle": "Per-project file-based memory under ~/.claude/projects/<project>/memory/ — a MEMORY.md index plus one file per remembered fact. Read-only here.",
@@ -241,15 +218,9 @@
"backups": {
"title": "Backups",
"empty": "No backups yet - every edit or delete creates a timestamped backup that lands here.",
"viewLink": "Show backup history",
"openButton": "Backups",
"subtitle": "Every save / delete in the editor writes a copy here first. Backup folders live outside the directories Claude Code scans, so they don't reappear as ghosts in your CLI.",
"restoreHint": "Restore by copying the backup back into place (the backup is kept):",
"size": "Size",
"created": "Created",
"type": "Type",
"scopeLabel": "Scope",
"filterAll": "All types"
"restoreHint": "Restore by copying the backup back into place (the backup is kept):"
},
"profiles": {
"usageCheck": "Check quota",
@@ -314,9 +285,7 @@
"title": "Plugins run through the `claude` CLI",
"body": "Plugins are bundles with their own registry — `installed_plugins.json` plus install paths under `plugins/cache/`. The buttons here run the matching `claude plugin …` command on this machine, so the registry stays consistent. Installing a plugin means running third-party code: only add marketplaces you trust.",
"install": "Install a plugin:",
"installCmd": "claude plugin install <marketplace>/<plugin>",
"uninstall": "Uninstall this plugin:",
"uninstallButton": "Copy uninstall command"
"installCmd": "claude plugin install <marketplace>/<plugin>"
},
"mcp": {
"title": "MCP servers are managed by the CLI",
@@ -22,7 +22,6 @@
},
"overview": {
"rootsTitle": "Roots",
"codexHome": "Codex home",
"projectCodexDir": "Project .codex",
"projectRoot": "Project root",
"summary": "Quick summary",
@@ -72,9 +71,6 @@
"saving": "Creating…",
"close": "Close"
},
"config": {
"missing": "No config.toml found."
},
"mcp": {
"addTitle": "Add an MCP server",
"nameLabel": "Name",
-18
View File
@@ -21,14 +21,11 @@
"live": "Live",
"offline": "Offline",
"running": "running",
"dashboardRun": "Run",
"days": "days",
"hours": "hours",
"updated": "Updated ",
"lastUpdated": "Last updated: ",
"showMore": "Show more ({{count}} remaining)",
"plusMore": "+{{count}} more",
"ofSessions": "% of sessions",
"save": "Save",
"edit": "Edit",
"delete": "Delete",
@@ -89,14 +86,8 @@
"cost": {
"model": "Model",
"cost": "Cost",
"totalCost": "Total Cost",
"totalEstimatedCost": "Total Estimated Cost"
},
"duration": {
"h_m": "{{h}}h {{m}}m",
"m_s": "{{m}}m {{s}}s",
"s": "{{s}}s"
},
"eventDetail": {
"summary": "Summary",
"seeDetailsBelow": "Check below for full details in {{fields}}",
@@ -137,8 +128,6 @@
"rawPayload": "Raw Payload",
"copy": "Copy",
"copied": "Copied",
"noPayload": "No payload captured for this event.",
"viewDetails": "View details",
"expand": "Expand event",
"collapse": "Collapse event"
},
@@ -157,12 +146,7 @@
"loadMore": "Load more",
"loading": "Loading...",
"noResults": "No events match the current filters",
"grouped": "Group by tool call",
"flat": "Flat list",
"groupEventCount_one": "{{count}} event",
"groupEventCount_other": "{{count}} events",
"help": {
"toggle": "Help",
"title": "About events, filters, and grouping",
"subtitle": "Unlock deeper insights: badges, lifecycles, and filter mechanics explained.",
"valuesTitle": "What each filter accepts",
@@ -176,10 +160,8 @@
"statusesTitle": "Status badges",
"statusesIntro": "Status is derived from event_type. It's what you see on each row.",
"statusWorkingDesc": "Agent started a tool call (PreToolUse). The tool is about to run.",
"statusConnectedDesc": "Tool call completed and returned a result (PostToolUse).",
"statusCompletedDesc": "Turn or lifecycle boundary (Stop, SubagentStop, Compaction).",
"statusErrorDesc": "An error was recorded (error, APIError).",
"statusIdleDesc": "Lifecycle or metadata (Notification, TurnDuration, SessionStart, SessionEnd).",
"lifecycleTitle": "Event lifecycle",
"lifecycleDesc": "A typical tool call emits two events sharing the same tool_use_id:",
"lifecycleFlow": "PreToolUse (Working) → PostToolUse (Connected) → ... → Stop (Completed)",
@@ -7,7 +7,6 @@
"eventsToday": "Events Today",
"totalEvents": "Total Events",
"totalCost": "Total Cost",
"viewBoard": "View Board",
"viewAll": "View All",
"activeAgentsSection": "Active Agents",
"recentActivity": "Recent Activity",
@@ -15,7 +14,6 @@
"noAgentsDesc": "Agents will appear here when a Claude Code session is running.",
"noActivity": "No activity yet",
"noActivityDesc": "Events from Claude Code sessions will stream here in real-time.",
"failedConnect": "Failed to connect to server",
"failedLoad": "Failed to load data",
"activeTrend": " active",
"totalTrend": " in active sessions",
+2 -11
View File
@@ -19,15 +19,6 @@
"sessionError": "Session Error",
"subagentSpawned": "Subagent Spawned"
},
"toolLegend": {
"read": "Read",
"write": "Write",
"edit": "Edit",
"bash": "Bash",
"grep": "Grep",
"glob": "Glob",
"agent": "Agent",
"other": "Other"
},
"badResponse": "The server sent an unexpected response instead of data. The dashboard may be restarting, or a proxy is answering in its place — reload in a moment."
"badResponse": "The server sent an unexpected response instead of data. The dashboard may be restarting, or a proxy is answering in its place — reload in a moment.",
"adminOnly": "Only an admin can do this. Ask an admin of this AgentHub if you need it."
}
-27
View File
@@ -1,45 +1,18 @@
{
"title": "Kanban Board",
"subtitle": "Kanban view of all agents by status",
"subtitleSessions": "Kanban view of all sessions by status",
"viewToggle": {
"agents": "Agents",
"sessions": "Sessions"
},
"noAgents": "No agents tracked yet",
"noAgentsDesc": "Start a Claude Code session with hooks installed to see agents appear here.",
"agentCount": "{{count}} agent tracked",
"agentCount_plural": "{{count}} agents tracked",
"noAgentsInColumn": "No agents",
"noSessions": "No sessions tracked yet",
"noSessionsDesc": "Start a Claude Code session with hooks installed to see sessions appear here.",
"sessionCount": "{{count}} session tracked",
"sessionCount_plural": "{{count}} sessions tracked",
"noSessionsInColumn": "No sessions",
"ran": "ran ",
"running": "running ",
"session": {
"anonymous": "Untitled session",
"agentSummary_one": "{{count}} agent",
"agentSummary_other": "{{count}} agents",
"subagentSummary_one": "{{count}} subagent",
"subagentSummary_other": "{{count}} subagents",
"turnSummary_one": "{{count}} turn",
"turnSummary_other": "{{count}} turns"
},
"tooltip": {
"agent": {
"working": "Agent is actively running a tool call right now.\n\nEntered on PreToolUse or UserPromptSubmit, exits on Stop (turn finished).",
"waiting": "Agent finished its turn and is blocked on the human - either Claude is waiting for the next user message or has prompted for permission to use a tool.\n\nCleared on the next PreToolUse / PostToolUse, or when the session ends.",
"completed": "Agent has fully ended for this session - typically because SessionEnd fired or, for subagents, SubagentStop was processed.\n\nNo further activity will be recorded against this agent.",
"error": "Agent recorded an error and will not continue. For main agents this comes from a Stop with stop_reason=error; for subagents, from a failed run."
},
"session": {
"active": "Session is mid-turn - Claude is currently running and the user isn't blocking anything. Brief by nature: a session moves through Active during tool calls and back to Waiting at end of turn.",
"waiting": "Session is sitting on the user. Either Claude finished its turn (most common) or it has surfaced a permission prompt and is blocked until the human responds.\n\nLook here for sessions you owe a reply to.",
"completed": "Session has fully closed - SessionEnd fired (CLI exited cleanly) or the user explicitly closed it.\n\nAll agents on this session are also completed.",
"error": "Session ended with an error - Claude returned stop_reason=error, an unrecoverable failure occurred, or an upstream API error terminated the run.",
"abandoned": "Session went stale without a clean SessionEnd. Marked abandoned after 5+ minutes of no activity (orphaned by /resume, network drop, or the CLI being killed). Distinct from Completed: we never saw a real exit signal."
}
}
}
+2 -24
View File
@@ -1,10 +1,5 @@
{
"action.clear": "clear state",
"action.forget": "Delete workspace",
"action.purge": "delete history",
"action.reset": "reset worktree",
"action.start": "start",
"action.stop": "stop",
"actionError": "Workspace action failed: {{message}}",
"actionErrorUnknown": "Unknown error",
"add": "Add workspace",
@@ -110,14 +105,6 @@
"changes.unstage": "Unstage this file",
"changes.changesView": "Changes",
"changes.wholeFile": "Whole file",
"confirmRemoveCancel": "Cancel",
"confirmRemoveConfirm": "Remove",
"confirmRemoveMessage": "This action cannot be undone.",
"confirmRemoveTitle": "Remove workspace?",
"countDead": "dead",
"countNeedsYou": "need you",
"countRunning": "running",
"countTotal": "workspaces",
"destructive.blocked.adopted": "This is an adopted directory and cannot be changed by a worktree action.",
"destructive.blocked.missing": "The workspace directory is missing, so this action cannot continue.",
"destructive.blocked.unreadable": "The workspace directory cannot be read as a Git worktree, so this action cannot continue.",
@@ -189,10 +176,6 @@
"gitBar.switchHint": "Switch this worktree to another local branch",
"gitBar.switchLabel": "Switch branch…",
"gitBar.unbornHint": "Commit first, then publish this repo to a remote.",
"kind.adopted": "adopted",
"kind.managed": "managed",
"laneDetail.hide": "Hide details",
"laneDetail.show": "Workspace details",
"locks.held_one": "{{count}} lock held",
"locks.held_other": "{{count}} locks held",
"mode.repo": "Repo",
@@ -206,25 +189,18 @@
"preflightErrorWithMessage": "Could not load the current workspace facts: {{message}}",
"proof.ticketReport": "Task report",
"renameLabel": "Rename this workspace",
"reorderHint": "Drag to reorder · Alt+←/→",
"proxy.native": "Native ({{tool}})",
"proxy.label": "AI Proxy",
"runtime.boot": "▶ up",
"runtime.busy.down": "stopping…",
"runtime.busy.up": "booting…",
"runtime.down": "down",
"runtime.healthy": "healthy",
"runtime.partial": "partial",
"runtime.slot": "slot {{slot}}",
"runtime.steppedAsideTitle": "Stepped aside from {{expected}}, which was already in use",
"runtime.stop": "■ down",
"runtime.toggleTitle": "Boot or stop this workspace's own application stack (separate from its Claude run)",
"status.failed": "failed",
"status.idle": "idle",
"status.provisioning": "provisioning",
"status.running": "running",
"title": "Workspaces",
"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.undoHunk": "Undo this hunk",
@@ -386,6 +362,7 @@
"home.memoryEmpty": "Memory shows here once the folder has a CLAUDE.md or AGENTS.md, or Claude saves memory for it.",
"home.context": "Context",
"home.contextEmpty": "Add PDFs, documents, or other text to reference in this workspace.",
"home.contextSnapshot": "Each file is copied when you add it — later edits to the original are not seen. Remove and add it again, or add its folder under Folder to always read the latest.",
"home.addFile": "Add files",
"home.folder": "Folder",
"home.ownFolder": "Workspace folder",
@@ -452,6 +429,7 @@
"tree.showMore_one": "Show {{count}} more",
"tree.showMore_other": "Show {{count}} more",
"tree.seeAll": "See all ({{count}} more)",
"tree.showLess": "Show less",
"home.contextPanel": "Workspace context",
"row.state.needsYou": "needs you",
"row.state.error": "error",
-11
View File
@@ -1,6 +1,5 @@
{
"activityFeed": "Activity Feed",
"agentBoard": "Kanban Board",
"agents": "Agents",
"analytics": "Analytics",
"avg": "avg",
@@ -19,20 +18,11 @@
"daysAgo": "{{count}}d ago",
"disconnected": "Disconnected",
"eventsLastMin": "Last 60s",
"eventsReceived": "Events received",
"eventsTotal": "Total",
"expand": "Expand sidebar",
"hoursAgo": "{{count}}h ago",
"justNow": "just now",
"language": "Language",
"languageNames": {
"en": "English",
"vi": "Vietnamese"
},
"languageShort": {
"en": "EN",
"vi": "VI"
},
"lastEvent": "Last event",
"live": "Live",
"minutesAgo": "{{count}}m ago",
@@ -55,7 +45,6 @@
"unitPerSec": "events/s",
"upToDate": "Up to date",
"updateAvailable": "Update available",
"website": "Website",
"workspace": "Workspace",
"wsEndpoint": "WebSocket",
"releaseAvailable": "{{version}} available",
+8 -80
View File
@@ -1,33 +1,16 @@
{
"emptyPane": "No session in this pane. Start one from the workspace's prompt box.",
"actions": {
"newSession": "New session",
"send": "Send",
"sending": "Sending…",
"start": "Run",
"starting": "Starting…",
"stop": "Stop",
"stopping": "Stopping…"
"newSession": "New session"
},
"autocomplete": {
"fileHint": "Type @ to reference a file",
"groupBuiltin": "Built-in (CLI only - won't run from here)",
"groupFiles": "Files in cwd",
"groupProject": "Project commands",
"groupUser": "User commands",
"noMatches": "No matches",
"slashHint": "Type / for slash commands"
},
"binary": {
"found": "Using {{path}}",
"missing": "The `{{cli}}` CLI isn't on your PATH. Install {{tool}} or set PATH so the dashboard can spawn it."
},
"concurrency": {
"active_one": "{{count}} run already in flight",
"active_other": "{{count}} runs already in flight",
"atCap": "Concurrency cap reached ({{max}}). Stop one of the running runs to start a new one.",
"viewActive": "View active runs"
},
"empty": {
"body": "Type a prompt and click Run. Output streams here as the model thinks, calls tools, and answers.",
"title": "Nothing yet"
@@ -40,28 +23,16 @@
"runStartedButNotAttached": "Run is live but couldn't attach to console: {{message}}",
"sendFailed": "Couldn't send: {{message}}"
},
"events": {
"claude": "Claude",
"collapse": "Collapse",
"expand": "Expand",
"system": "System",
"thinking": "Thinking",
"tool": "Tool",
"toolResult": "Tool result",
"you": "You"
},
"fields": {
"approval": "Approval",
"approvalNever": "Never",
"approvalOnRequest": "On request",
"cwd": "Working directory",
"cwdGroups": {
"dashboard": "Dashboard server",
"home": "Home",
"repo": "Source repos",
"recent": "Recent - used by Claude Code"
},
"cwdHint": "Absolute path. Defaults to the dashboard's own cwd.",
"cwdNoMatches": "No matches. Type an absolute path to use it directly.",
"cwdPlaceholder": "Type to search or paste an absolute path…",
"effort": "Thinking effort",
@@ -82,64 +53,15 @@
"permissionDefault": "default (interactive prompts - sessions may hang headlessly)",
"permissionMode": "Permission mode",
"permissionPlan": "plan (read-only planning)",
"prompt": "Prompt",
"promptPlaceholder": "Ask Claude anything…",
"promptPlaceholderTerminal": "Ask {{tool}} anything…",
"sandbox": "Sandbox",
"sandboxFullAccess": "Full access (dangerous)",
"sandboxReadOnly": "Read only",
"sandboxWorkspaceWrite": "Workspace write"
},
"footer": {
"cost": "Cost",
"duration": "Duration",
"exitCode": "Exit code",
"sessionId": "Session ID",
"turns": "Turns"
},
"hint": {
"headlessExplain": "Headless mode is best for scripted tasks where you know exactly what you want. The session can't ask follow-up questions and will hang on permission prompts unless you stay in acceptEdits.",
"permissionWarning": "bypassPermissions allows ALL tool invocations without confirming. Only use for trusted prompts.",
"bypassWarning": "{{tool}} will run every command and edit every file without asking. Only for a prompt and a folder you trust.",
"sandboxWarning": "Codex will run commands with no sandbox.",
"shortcut": "Enter to send · Shift+Enter for newline"
},
"mode": {
"conversation": "Conversation",
"conversationHint": "Multi-turn - keep typing follow-ups while the agent works.",
"headless": "One-shot",
"headlessHint": "Single prompt, single response. Stdin closes after spawn.",
"label": "Mode"
},
"resume": {
"clear": "Clear selection",
"freshHint": "Start a fresh Claude Code session.",
"freshOption": "New session",
"label": "Source session",
"lastOption": "Resume last session",
"noSessions": "No sessions found.",
"originalCwd": "Original cwd",
"pickSession": "Pick a session…",
"preview": "Last activity",
"resumeHint": "Pick a session from your history and continue the conversation. Cwd is locked to the original.",
"search": "Search by ID, cwd, or status…",
"selectedBadge": "Resuming"
},
"statusHeader": {
"cwd": "Cwd",
"duration": "Elapsed",
"effort": "Effort",
"envelopes": "Events",
"model": "Model",
"permissionMode": "Mode",
"session": "Session"
},
"tokens": {
"cacheRead": "Cache hit",
"cost": "Cost",
"input": "Input",
"label": "Context",
"output": "Output"
"sandboxWarning": "Codex will run commands with no sandbox."
},
"drop": {
"hint": "Drop files or images to attach",
@@ -159,5 +81,11 @@
"findPrev": "Previous match",
"findNext": "Next match",
"findClose": "Close find"
},
"chat": {
"placeholder": "Write a message…",
"send": "Send",
"hint": "Enter sends · permission prompts and menus need the terminal (Settings → Appearance → Chat UI)",
"notSent": "The terminal is not connected — the message was not sent."
}
}
+18 -3
View File
@@ -8,7 +8,6 @@
"filterError": "Error",
"filterAbandoned": "Abandoned",
"sessionCount": "{{count}} session recorded",
"sessionCount_plural": "{{count}} sessions recorded",
"noSessions": "No sessions found",
"noSessionsDesc": "Try adjusting your search or filters.",
"noSessionsHint": "Start a Claude Code session with hooks installed to begin tracking.",
@@ -26,14 +25,12 @@
"generic": "Claude Code is paused in this session until you respond in the terminal."
},
"failedLoad": "Failed to load session",
"loading": "Loading session...",
"notFound": "Session not found",
"backToSessions": "Back to Sessions",
"agents": "Agents",
"noAgents": "No agents recorded.",
"unparented": "Unparented Subagents",
"costBreakdown": "Cost Breakdown",
"eventTimeline": "Event Timeline",
"noEvents": "No events recorded.",
"conversation": "Conversation",
"timeline": "Timeline ({{shown}}/{{total}})",
@@ -151,6 +148,8 @@
"persistedOutput": "Persisted output",
"taskNotification": "Task notification",
"thinking": "Thinking",
"showMore": "Show more",
"showLess": "Show less",
"chars_one": "{{formatted}} char",
"chars_other": "{{formatted}} chars",
"sender": {
@@ -181,6 +180,22 @@
"statusError": "error",
"statusOk": "ok",
"statusPending": "pending"
},
"work": {
"commands_one": "ran {{count}} command",
"commands_other": "ran {{count}} commands",
"edits_one": "edited a file",
"edits_other": "made {{count}} edits",
"reads_one": "read a file",
"reads_other": "read {{count}} files",
"searches_one": "searched the code",
"searches_other": "ran {{count}} searches",
"web_one": "looked up the web",
"web_other": "made {{count}} web lookups",
"agents_one": "ran an agent",
"agents_other": "ran {{count}} agents",
"tools_one": "used a tool",
"tools_other": "used {{count}} tools"
}
},
"overview": {
+35
View File
@@ -326,6 +326,14 @@
"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."
},
"uninstall": {
"label": "Uninstall AgentHub",
"desc": "Remove AgentHub from this computer: the dashboard, its database and settings, its hooks in Claude Code, Codex and Antigravity, and the plugin. Your conversations, workspace folders and repositories are kept.",
"button": "Uninstall",
"confirmTitle": "Uninstall AgentHub?",
"confirmMessage": "Every workspace terminal is closed and AgentHub is removed for good, its database (history, workspaces, settings, saved logins) included — this cannot be undone. Conversations of Claude Code, Codex and the other AI tools, workspace worktrees and your repositories are kept.",
"done": "AgentHub is being uninstalled; this page stops answering in a moment. Log: {{log}}"
},
"about": {
"title": "System",
"release": "Release",
@@ -670,6 +678,7 @@
"enabledOf": "{{tool}} enabled",
"homepage": "Homepage",
"homepageOf": "{{tool}} homepage",
"openSettings": "Open {{tool}} settings",
"install": "Install",
"update": "Update",
"updateAll": "Update all ({{count}})",
@@ -796,6 +805,8 @@
},
"settingsNav": {
"label": "Settings sections",
"toolsTab": "All tools",
"toolTabs": "AI tool settings",
"back": "Back to Workspace",
"group": {
"general": "General",
@@ -936,6 +947,23 @@
"ignoreHint": "One absolute path per line. Hooks from these folders, and anything under them, are dropped whole; history import and the Codex reader skip their sessions. AGENTHUB_IGNORE_CWD sets the same list.",
"envOwned": "A value here is set by the environment the dashboard started in, and cannot be changed from this page."
},
"backup": {
"title": "Daily backup",
"description": "A full copy of the database once a day, into a folder you choose — best on another disk, so a failed drive does not take the backups with it.",
"folder": "Backup folder",
"folderHint": "An absolute path to an existing folder the server can write to. Leave it empty to turn backups off. AgentHub only ever deletes its own agenthub-YYYYMMDD-HHMMSS.db files here, oldest first beyond the number kept.",
"hour": "Time (server)",
"keep": "Backups kept",
"runNow": "Back up now",
"running": "Backing up…",
"done": "Backup written: {{file}}",
"failed": "Backup failed: {{error}}",
"newest": "Newest: {{time}}, {{size}} · {{n}} kept, {{total}} in all",
"none": "No backup in this folder yet.",
"off": "Backups are off.",
"lastFailed": "The last run ({{time}}) failed: {{error}}",
"restoreHint": "To restore: agenthub stop, delete dashboard.db-wal and dashboard.db-shm, copy a backup over dashboard.db (its path is on the System page), then agenthub start."
},
"reports": {
"title": "Scheduled reports",
"description": "A summary of the last days — sessions, events, tokens, cost by model and by AI tool, top tools, budgets — written as HTML or JSON on a schedule. Reports and their history survive Clear Data.",
@@ -985,5 +1013,12 @@
"title": "Model pricing",
"description": "Prices for every vendor's models live on one page.",
"open": "Open Pricing"
},
"chatUi": {
"title": "Chat UI",
"description": "How a Claude or Codex session opens in its workspace. Saved for your account only.",
"label": "Open sessions as a chat",
"labelDesc": "Show every Claude or Codex session's conversation like Claude Desktop, with a message box, instead of its terminal. Permission prompts and menus still need the terminal: turn this off to answer them.",
"saveFailed": "Could not save: {{message}}"
}
}
+5 -5
View File
@@ -14,12 +14,12 @@
"roles": {
"admin": "Admin",
"analyst": "Analyst",
"member": "Member"
"developer": "Developer"
},
"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"
"analyst": "Sees every user's data; works only in their own workspaces, changes no settings",
"developer": "Only their own workspaces; changes no settings"
},
"add": "Add user",
"username": "Username",
@@ -48,7 +48,7 @@
"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."
"workspaceBody": "The workspace's sessions and costs move to {{name}}. A developer sees only their own workspaces."
},
"done": {
"created": "{{name}} added",
@@ -68,6 +68,6 @@
},
"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.",
"auditDescription": "Account changes made here, and each time an admin or analyst opened a session a developer owns.",
"auditEmpty": "Nothing recorded yet."
}
@@ -2,8 +2,6 @@
"title": "Workflows",
"subtitle": "Agent orchestration intelligence",
"failedLoad": "Failed to load workflow data",
"filteredBy": "Filtered by:",
"clearFilter": "Clear filter",
"refreshData": "Refresh data",
"exportJson": "Export as JSON",
"allSessions": "All Sessions",
@@ -238,8 +236,6 @@
"noToolEvents": "No tool events recorded.",
"noEvents": "No events recorded for this session.",
"showingOf": "Showing 100 of {{total}} events",
"sessionInfo": " session(s) - active {{from}}%-{{to}}% of session",
"sortedByCompaction": " session(s) (sorted by compaction count)",
"openSession": "Open session",
"openInWorkspace": "Open in workspace"
},
@@ -266,7 +262,6 @@
"subtitle": "Where errors cluster in agent hierarchy depth",
"noErrors": "No errors recorded",
"allSuccess": "All sessions completed successfully",
"sessionsHadErrors": " sessions had errors",
"sessionsErrorSummary": "{{errorSessions}} of {{totalSessions}} sessions had errors",
"agentErrors": " agent-level error(s) across hierarchy",
"sessionErrorsOnly": "Session-level errors only",
@@ -306,7 +301,6 @@
"ofTotal": "of {{total}}",
"avgPerSession": "Avg / affected session",
"peakSession": "Most in one session",
"tokensRecovered": "Tokens Recovered",
"distribution": "Sessions by compaction count",
"xAxis": "Compactions per session",
"yAxis": "Sessions",