feat: Claude Code Monitor — lanes, pipelines and a merged workspace
Internal SmartGift build of a Claude Code monitoring dashboard. Lanes: a durable unit of parallel agent work, one per working directory, tracked across session restarts. Managed lanes are git worktrees the dashboard provisions and can reset or remove behind a three-check destroy guard and a counted preflight; adopted lanes are directories you already own and are never destroyable. Pipelines: a lane moves through pipeline stages. A stage the agent declares with evidence renders green; a stage inferred from the tool-event stream renders dashed amber and never counts as done. Detection is forward-only within a 30-minute window, and never writes the declared stage. Workspace: one page at /run with a lane grid, the selected lane's pipeline, and a full Claude console behind a disclosure.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"title": "Activity Feed",
|
||||
"subtitle": "Real-time stream of all agent events",
|
||||
"paused": "(paused - {{count}} buffered)",
|
||||
"resume": "Resume",
|
||||
"pause": "Pause",
|
||||
"noActivity": "No activity yet",
|
||||
"noActivityDesc": "Events will stream here in real-time as Claude Code agents work.",
|
||||
"viewSession": "Session"
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"title": "Alerts",
|
||||
"subtitle": "Rules-based alerting for sessions, agents, events, and token usage",
|
||||
"refresh": "Refresh",
|
||||
"ackAll": "Acknowledge all ({{count}})",
|
||||
"ruleTypes": {
|
||||
"event_pattern": "Event pattern",
|
||||
"inactivity": "Inactivity",
|
||||
"status_duration": "Stuck agent",
|
||||
"token_threshold": "Token threshold"
|
||||
},
|
||||
"ruleTypeHints": {
|
||||
"event_pattern": "Fires when an ingested event matches the pattern. Set a count above 1 to require N matching events within a time window (e.g. more than 5 errors in 2 minutes).",
|
||||
"inactivity": "Fires when an active session has received no events for the configured number of minutes.",
|
||||
"status_duration": "Fires when an agent has remained in the selected status with no activity for the configured number of minutes.",
|
||||
"token_threshold": "Fires when a session's total token usage (input + output + cache) exceeds the threshold."
|
||||
},
|
||||
"ruleDesc": {
|
||||
"eventPattern": "Matches {{pattern}}",
|
||||
"eventPatternCount": "≥{{count}} × {{pattern}} within {{window}} min",
|
||||
"inactivity": "No session activity for {{minutes}} min",
|
||||
"statusDuration": "Agent stuck in {{status}} for {{minutes}} min",
|
||||
"tokenThreshold": "Session tokens exceed {{tokens}}"
|
||||
},
|
||||
"rules": {
|
||||
"title": "Alert rules",
|
||||
"add": "Add rule",
|
||||
"cancel": "Cancel",
|
||||
"create": "Create rule",
|
||||
"saving": "Saving…",
|
||||
"empty": "No alert rules yet. Add one to start monitoring for stuck agents, error bursts, idle sessions, or token spikes.",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled",
|
||||
"enable": "Enable rule",
|
||||
"disable": "Disable rule",
|
||||
"delete": "Delete rule",
|
||||
"confirmDelete": "Delete rule \"{{name}}\" and its alert history?",
|
||||
"cooldown": "{{seconds}}s cooldown",
|
||||
"form": {
|
||||
"name": "Rule name",
|
||||
"namePlaceholder": "e.g. Error burst",
|
||||
"type": "Rule type",
|
||||
"eventType": "Event type (exact)",
|
||||
"toolName": "Tool name (exact)",
|
||||
"summaryContains": "Summary contains",
|
||||
"count": "Trigger count",
|
||||
"windowMinutes": "Window (minutes)",
|
||||
"agentStatus": "Agent status",
|
||||
"minutes": "Minutes",
|
||||
"totalTokens": "Total tokens",
|
||||
"cooldown": "Cooldown (seconds)"
|
||||
},
|
||||
"deleteTitle": "Delete alert rule?",
|
||||
"help": {
|
||||
"name": "A label for this rule. Shows in the alert feed and is included in webhook payloads (rule_name). e.g. 'Repeated Bash errors'.",
|
||||
"type": "What this rule watches. event_pattern matches the live event stream; inactivity = an active session goes quiet; status_duration = an agent is stuck in a state; token_threshold = a session's token usage crosses a limit.",
|
||||
"eventType": "The Claude Code hook event to match. Leave blank to match any event type. Matched exactly (case-sensitive).",
|
||||
"toolName": "The tool the agent invoked (on PreToolUse / PostToolUse events). Leave blank to match any tool. Matched exactly.",
|
||||
"summaryContains": "Case-insensitive substring match against the event's summary text. Useful for catching errors or specific phrases. Leave blank to skip.",
|
||||
"count": "How many matching events must occur before the alert fires. 1 = fire on the first match. Set above 1 to detect bursts (e.g. repeated errors).",
|
||||
"window": "The rolling look-back window for the count. e.g. count 5 + window 2 means '5 matching events within any 2-minute span'.",
|
||||
"status": "Which agent state to watch. 'working' catches agents stuck mid-task; 'waiting' catches agents blocked on input/permission.",
|
||||
"minutesInactivity": "Fire when an active session has had no events for this many minutes (a stalled or forgotten session).",
|
||||
"minutesStatus": "Fire when an agent stays in the selected status with no activity for this many minutes (a stuck agent).",
|
||||
"totalTokens": "Fire when a session's cumulative tokens (input + output + cache read + cache write) cross this number. e.g. 1000000 = 1M tokens.",
|
||||
"cooldown": "Minimum seconds between repeat alerts for the same rule + session + agent. Prevents noisy duplicates. Default 300 (5 min); 0 = no cooldown."
|
||||
}
|
||||
},
|
||||
"feed": {
|
||||
"title": "Alert feed",
|
||||
"unackedCount": "{{count}} unacknowledged",
|
||||
"unackedOnly": "Unacknowledged only",
|
||||
"ack": "Acknowledge",
|
||||
"viewSession": "View session",
|
||||
"loadMore": "Load more ({{shown}} of {{total}})",
|
||||
"emptyTitle": "No alerts",
|
||||
"emptyDescription": "Alerts fired by your rules will appear here in real time.",
|
||||
"emptyUnacked": "Everything is acknowledged. New alerts will appear here as they fire."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"title": "Analytics",
|
||||
"subtitle": "Real-time monitoring and analytics for Claude Code sessions",
|
||||
"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": {
|
||||
"tokenAnalytics": "Token Analytics",
|
||||
"costAnalytics": "Cost Analytics",
|
||||
"workflowIntelligence": "Workflow Intelligence",
|
||||
"productivityAnalytics": "Productivity Analytics"
|
||||
},
|
||||
"eventActivity": "Event Activity - Last 52 Weeks",
|
||||
"last30Days": "Last 30 Days",
|
||||
"dailyEventCount": "Daily event count",
|
||||
"peakDay": "Peak day",
|
||||
"total30d": "Total (30d)",
|
||||
"tokenDistribution": "Token Distribution",
|
||||
"tokenMix": "Token Mix",
|
||||
"cacheEfficiency": "Cache efficiency",
|
||||
"tokenBreakdown": "Token Breakdown",
|
||||
"tokenInfo": "Token data captured from Claude Code Stop events.",
|
||||
"costByModel": "Cost by Model",
|
||||
"dailyCostTrends": "Daily Cost Trends",
|
||||
"costByWeekday": "Cost by Weekday",
|
||||
"costPerDay": "Cost per day",
|
||||
"peakCostDay": "Peak cost day",
|
||||
"totalCost30d": "Total cost (30d)",
|
||||
"noDailyCostData": "No daily cost data yet.",
|
||||
"noCostData": "No cost data yet.",
|
||||
"subagentTypes": "Subagent Types",
|
||||
"noSubagentData": "No subagent data yet.",
|
||||
"agentStatus": "Agent Status",
|
||||
"totalAgentsLabel": "Total agents",
|
||||
"eventTypes": "Event Types",
|
||||
"noEventData": "No event data yet.",
|
||||
"toolUsage": "Tool Usage",
|
||||
"noToolData": "No tool usage data yet.",
|
||||
"sessionOutcomes": "Session Outcomes",
|
||||
"totalSessionsLabel": "Total sessions",
|
||||
"dailySessionTrends": "Daily Session Trends",
|
||||
"noSessionTrendData": "No session trend data yet.",
|
||||
"last7Days": "Last 7 days",
|
||||
"less": "Less",
|
||||
"more": "More"
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"title": "Claude Config Explorer",
|
||||
"subtitle": "Your Claude Code setup at a glance - plugins, skills, subagents, MCP servers, hooks, and settings.",
|
||||
"refresh": "Refresh",
|
||||
"refreshing": "Refreshing…",
|
||||
"lastUpdated": "Last updated {{time}}",
|
||||
"loadError": "Failed to load: {{message}}",
|
||||
"scope": {
|
||||
"all": "All scopes",
|
||||
"user": "User",
|
||||
"project": "Project",
|
||||
"projectLocal": "Project (local)",
|
||||
"home": "Home"
|
||||
},
|
||||
"tabs": {
|
||||
"overview": "Overview",
|
||||
"skills": "Skills",
|
||||
"agents": "Subagents",
|
||||
"commands": "Slash commands",
|
||||
"outputStyles": "Output styles",
|
||||
"plugins": "Plugins",
|
||||
"marketplaces": "Marketplaces",
|
||||
"mcp": "MCP servers",
|
||||
"hooks": "Hooks",
|
||||
"keybindings": "Keybindings",
|
||||
"settings": "Settings",
|
||||
"memory": "Memory"
|
||||
},
|
||||
"overview": {
|
||||
"rootsTitle": "Roots",
|
||||
"claudeHome": "Claude home",
|
||||
"projectClaudeDir": "Project .claude",
|
||||
"projectRoot": "Project root",
|
||||
"claudeJson": "claude.json",
|
||||
"summary": "Quick summary",
|
||||
"user": "user",
|
||||
"project": "project",
|
||||
"items": "items"
|
||||
},
|
||||
"common": {
|
||||
"search": "Search by name…",
|
||||
"clearSearch": "Clear search",
|
||||
"empty": "Nothing here yet.",
|
||||
"viewSource": "View source",
|
||||
"close": "Close",
|
||||
"copyPath": "Copy path",
|
||||
"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."
|
||||
},
|
||||
"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",
|
||||
"disabled": "Disabled",
|
||||
"contributes": "Contributes",
|
||||
"skills_one": "{{count}} skill",
|
||||
"skills_other": "{{count}} skills",
|
||||
"agents_one": "{{count}} agent",
|
||||
"agents_other": "{{count}} agents",
|
||||
"commands_one": "{{count}} command",
|
||||
"commands_other": "{{count}} commands",
|
||||
"outputStyles_one": "{{count}} output style",
|
||||
"outputStyles_other": "{{count}} output styles",
|
||||
"hooks_one": "{{count}} hook script",
|
||||
"hooks_other": "{{count}} hook scripts",
|
||||
"author": "Author",
|
||||
"homepage": "Homepage",
|
||||
"license": "License",
|
||||
"description": "Description"
|
||||
},
|
||||
"marketplaces": {
|
||||
"manifest": "Known marketplaces manifest",
|
||||
"noMarketplaces": "No marketplaces registered.",
|
||||
"source": "Source",
|
||||
"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",
|
||||
"action": "Action",
|
||||
"docsLink": "View keybindings docs",
|
||||
"contextPlaceholder": "Context (e.g. Global, Chat)",
|
||||
"addContext": "Add context",
|
||||
"removeContext": "Remove context",
|
||||
"addBinding": "Add binding",
|
||||
"removeBinding": "Remove binding",
|
||||
"errContext": "Every context needs a name.",
|
||||
"errDupContext": "Duplicate context: {{context}}",
|
||||
"errEmpty": "Every binding in \"{{context}}\" needs both a key and an action.",
|
||||
"errDupKey": "Duplicate key \"{{key}}\" in context \"{{context}}\"."
|
||||
},
|
||||
"statusline": {
|
||||
"title": "Statusline",
|
||||
"configured": "Configured statusline command",
|
||||
"scripts": "Statusline scripts found in CLAUDE_HOME",
|
||||
"noStatusline": "No statusline configured."
|
||||
},
|
||||
"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/."
|
||||
},
|
||||
"mcp": {
|
||||
"userScope": "User-scoped servers",
|
||||
"projectScope": "Project-scoped servers",
|
||||
"command": "Command",
|
||||
"args": "Args",
|
||||
"env": "Env names",
|
||||
"url": "URL",
|
||||
"headers": "Header names",
|
||||
"kind": "Kind",
|
||||
"source": "Source",
|
||||
"noServers": "No MCP servers found."
|
||||
},
|
||||
"hooks": {
|
||||
"noHooks": "No hooks configured.",
|
||||
"matcher": "Matcher",
|
||||
"command": "Command",
|
||||
"type": "Type",
|
||||
"timeout": "Timeout",
|
||||
"fileMissing": "(no settings file at this scope)"
|
||||
},
|
||||
"settings": {
|
||||
"fileMissing": "(no settings file at this scope)"
|
||||
},
|
||||
"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.",
|
||||
"noMatches": "No memory files match your search.",
|
||||
"indexFiles": "Index",
|
||||
"jumpTo": "Jump to file",
|
||||
"fileCount_one": "{{count}} file",
|
||||
"fileCount_other": "{{count}} files",
|
||||
"factFiles_one": "{{count}} fact",
|
||||
"factFiles_other": "{{count}} facts",
|
||||
"newFile": "New file",
|
||||
"newFileTitle": "New memory file in {{project}}",
|
||||
"namePlaceholder": "e.g. my_fact.md",
|
||||
"nameHelp": "Filename ending in .md (.md is added if you omit it).",
|
||||
"projectLabel": "Project",
|
||||
"projectHelp": "Created in this project's memory dir."
|
||||
},
|
||||
"edit": {
|
||||
"newButton": "New",
|
||||
"editButton": "Edit",
|
||||
"deleteButton": "Delete",
|
||||
"save": "Save",
|
||||
"cancel": "Cancel",
|
||||
"saving": "Saving…",
|
||||
"deleting": "Deleting…",
|
||||
"newTitle": "Create new {{type}}",
|
||||
"editTitle": "Edit {{name}}",
|
||||
"namePlaceholder": "name (kebab-case, no spaces)",
|
||||
"nameLabel": "Name",
|
||||
"nameHelp": "Letters, digits, dot, dash, underscore. Max 64 chars.",
|
||||
"contentLabel": "Content",
|
||||
"scopePicker": "Scope",
|
||||
"writeError": "Save failed: {{message}}",
|
||||
"deleteError": "Delete failed: {{message}}",
|
||||
"saveSuccess": "Saved · backup at {{path}}",
|
||||
"saveSuccessNew": "Created.",
|
||||
"deleteSuccess": "Deleted · backup at {{path}}",
|
||||
"confirmDelete": "Delete this item?",
|
||||
"confirmDeleteBody": "This will move the file (or skill folder, including bundled assets) to a timestamped backup before removing it. The backup lives outside the directories Claude Code scans, so the entry will disappear from your CLI.",
|
||||
"confirmDeletePath": "Path: {{path}}",
|
||||
"confirmDeleteAction": "Yes, back up and delete",
|
||||
"templates": {
|
||||
"skills": "---\nname: my-skill\ndescription: One-line description (shown when Claude picks the skill)\n---\n\nBody - what the skill does, when to use it, examples.\n",
|
||||
"agents": "---\nname: my-agent\ndescription: When to invoke this subagent\ntools: Read, Grep\nmodel: sonnet\n---\n\nSystem prompt for the subagent.\n",
|
||||
"commands": "---\ndescription: One-line description shown in the slash menu\n---\n\nWhat /my-command does.\n",
|
||||
"output-styles": "---\nname: my-style\ndescription: Output style description\n---\n\nStyle instructions.\n",
|
||||
"memory": "# Project memory\n\nClaude reads this on session start.\n",
|
||||
"auto-memory": "---\nname: my-fact\ndescription: One-line summary of the remembered fact\nmetadata:\n type: feedback\n---\n\nThe fact to remember.\n"
|
||||
}
|
||||
},
|
||||
"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 renaming the backup back into place:",
|
||||
"size": "Size",
|
||||
"created": "Created",
|
||||
"type": "Type",
|
||||
"scopeLabel": "Scope",
|
||||
"filterAll": "All types"
|
||||
},
|
||||
"explain": {
|
||||
"hooks": {
|
||||
"title": "Hooks are read-only here on purpose",
|
||||
"body": "Hooks live in the `hooks` block of `settings.json` files that Claude Code writes to constantly. Editing them from the dashboard would race with the live CLI and could silently break the dashboard's own ingestion (the `hook-handler.js` entry below).",
|
||||
"howTo": "Edit them yourself with one of:",
|
||||
"cmd1": "claude config /hooks",
|
||||
"cmd1Note": "Interactive hook editor inside Claude Code",
|
||||
"cmd2": "$EDITOR ~/.claude/settings.json",
|
||||
"cmd2Note": "Hand-edit the user-level hooks block",
|
||||
"cmd3": "$EDITOR .claude/settings.json",
|
||||
"cmd3Note": "Hand-edit the project-level hooks block"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings are read-only here on purpose",
|
||||
"body": "These JSON files are rewritten by the live `claude` CLI on every model change, theme toggle, plugin enable, etc. A dashboard write would race with the CLI and lose state.",
|
||||
"howTo": "Edit settings via Claude Code itself:",
|
||||
"cmd1": "claude config set <key> <value>",
|
||||
"cmd1Note": "Set an individual key safely",
|
||||
"cmd2": "/config",
|
||||
"cmd2Note": "Open the interactive config UI inside the CLI",
|
||||
"cmd3": "$EDITOR ~/.claude/settings.json",
|
||||
"cmd3Note": "Hand-edit (only when no `claude` process is running)"
|
||||
},
|
||||
"plugins": {
|
||||
"title": "Plugins are managed by the CLI",
|
||||
"body": "Plugins are bundles with their own registry - `installed_plugins.json` plus install paths under `plugins/cache/`. The dashboard reads them but defers install/uninstall to `claude plugin …` so the registry stays consistent.",
|
||||
"install": "Install a plugin:",
|
||||
"installCmd": "claude plugin install <marketplace>/<plugin>",
|
||||
"uninstall": "Uninstall this plugin:",
|
||||
"uninstallButton": "Copy uninstall command"
|
||||
},
|
||||
"mcp": {
|
||||
"title": "MCP servers are managed by the CLI",
|
||||
"body": "MCP server config lives inside `~/.claude.json`, the same file the live CLI writes to constantly. Concurrent writes from the dashboard would corrupt project state, so add/remove flow goes through Claude Code itself.",
|
||||
"list": "List configured servers:",
|
||||
"listCmd": "claude mcp list",
|
||||
"add": "Add a server:",
|
||||
"addCmd": "claude mcp add <name> <command> [args…]",
|
||||
"remove": "Remove this server:",
|
||||
"removeButton": "Copy remove command"
|
||||
}
|
||||
},
|
||||
"snippet": {
|
||||
"copy": "Copy",
|
||||
"copied": "Copied"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"refresh": "Refresh",
|
||||
"retry": "Retry",
|
||||
"cancel": "Cancel",
|
||||
"export": "Export",
|
||||
"loading": "Loading...",
|
||||
"noData": "No data",
|
||||
"total": "Total",
|
||||
"active": "active",
|
||||
"total_lower": "total",
|
||||
"subagent": "subagent",
|
||||
"subagents": "subagents",
|
||||
"subagent_label_one": "{{count}} subagent",
|
||||
"subagent_label_other": "{{count}} subagents",
|
||||
"events": "events",
|
||||
"event": "event",
|
||||
"sessions": "sessions",
|
||||
"session": "session",
|
||||
"agents": "agents",
|
||||
"agent": "agent",
|
||||
"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",
|
||||
"actions": "Actions",
|
||||
"close": "Close",
|
||||
"unexpectedError": "Unexpected error",
|
||||
"depth": "Depth",
|
||||
"type": "Type",
|
||||
"statusLabel": "Status",
|
||||
"status": {
|
||||
"working": "Working",
|
||||
"waiting": "Waiting",
|
||||
"completed": "Completed",
|
||||
"error": "Error",
|
||||
"active": "Active",
|
||||
"abandoned": "Abandoned"
|
||||
},
|
||||
"awaitingReason": {
|
||||
"notification": {
|
||||
"label": "Needs input",
|
||||
"desc": "Blocked on a permission prompt or an input request — Claude can't continue until you respond."
|
||||
},
|
||||
"stop": {
|
||||
"label": "Turn done",
|
||||
"desc": "Claude finished its reply; the session is idle until you send the next prompt."
|
||||
},
|
||||
"session_start": {
|
||||
"label": "At prompt",
|
||||
"desc": "The session just started or resumed and is sitting at an empty prompt — nothing has been asked yet."
|
||||
},
|
||||
"interrupted": {
|
||||
"label": "Interrupted",
|
||||
"desc": "The last turn was interrupted (Esc or a recovered hook) — Claude is waiting for direction."
|
||||
}
|
||||
},
|
||||
"time": {
|
||||
"justNow": "just now",
|
||||
"mAgo": "{{count}}m ago",
|
||||
"hAgo": "{{count}}h ago",
|
||||
"dAgo": "{{count}}d ago"
|
||||
},
|
||||
"pagination": {
|
||||
"previous": "Previous",
|
||||
"next": "Next",
|
||||
"showing": "Showing {{from}}-{{to}} of {{total}}"
|
||||
},
|
||||
"token": {
|
||||
"input": "Input",
|
||||
"output": "Output",
|
||||
"cacheRead": "Cache Read",
|
||||
"cacheWrite": "Cache Write",
|
||||
"totalTokens": "Total tokens"
|
||||
},
|
||||
"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}}",
|
||||
"eventId": "Event ID",
|
||||
"recordedAt": "Recorded at",
|
||||
"session": "Session",
|
||||
"sessionId": "Session ID",
|
||||
"agentId": "Agent ID",
|
||||
"agent": "Agent",
|
||||
"cwd": "Working directory",
|
||||
"permissionMode": "Permission mode",
|
||||
"toolUseId": "Tool Use ID",
|
||||
"toolName": "Tool",
|
||||
"toolInput": "Tool Input",
|
||||
"toolResponse": "Tool Response",
|
||||
"isError": "Error",
|
||||
"transcriptPath": "Transcript Path",
|
||||
"agentTranscriptPath": "Subagent Transcript Path",
|
||||
"hookEventName": "Hook Event Name",
|
||||
"stopReason": "Stop Reason",
|
||||
"stopHookActive": "Stop Hook Active",
|
||||
"subagentType": "Subagent Type",
|
||||
"agentType": "Agent Type",
|
||||
"notificationType": "Notification Type",
|
||||
"message": "Message",
|
||||
"prompt": "Prompt",
|
||||
"model": "Model",
|
||||
"reason": "Reason",
|
||||
"source": "Source",
|
||||
"imported": "Imported",
|
||||
"type": "Type",
|
||||
"timestamp": "Timestamp",
|
||||
"uuid": "UUID",
|
||||
"durationMs": "Duration (ms)",
|
||||
"compactionNumber": "Compaction Number",
|
||||
"totalCompactions": "Total Compactions",
|
||||
"lastAssistantMessage": "Last Assistant Message",
|
||||
"rawPayload": "Raw Payload",
|
||||
"copy": "Copy",
|
||||
"copied": "Copied",
|
||||
"noPayload": "No payload captured for this event.",
|
||||
"viewDetails": "View details",
|
||||
"expand": "Expand event",
|
||||
"collapse": "Collapse event"
|
||||
},
|
||||
"eventFilters": {
|
||||
"searchPlaceholder": "Search summary, tool, payload...",
|
||||
"status": "Status",
|
||||
"eventType": "Event type",
|
||||
"toolName": "Tool",
|
||||
"agentId": "Agent",
|
||||
"sessionId": "Session",
|
||||
"from": "From",
|
||||
"to": "To",
|
||||
"clearAll": "Clear filters",
|
||||
"noOptions": "No options",
|
||||
"showing": "Showing {{shown}} of {{total}}",
|
||||
"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",
|
||||
"valueStatusDesc": "Preset shortcut that expands to event_type values (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...).",
|
||||
"valueEventTypeDesc": "Raw event_type strings from the DB. Pulled from /api/events/facets.",
|
||||
"valueToolNameDesc": "tool_name values currently in the DB (Bash, Edit, Read, Grep, mcp__... tools). Pulled from /api/events/facets.",
|
||||
"valueAgentIdDesc": "Full agent UUIDs (main + subagents). Select one or more to scope to specific agents.",
|
||||
"valueSessionIdDesc": "Session UUIDs. Typically you'd navigate to /sessions/:id instead, but this lets you intersect multiple sessions.",
|
||||
"valueSearchDesc": "Substring match on summary, tool_name, and the raw JSON payload. Debounced 300ms.",
|
||||
"valueDateRangeDesc": "ISO datetime lower/upper bounds on the event's created_at.",
|
||||
"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)",
|
||||
"filtersTitle": "How filters work",
|
||||
"filterTip1": "Filters compose with AND across categories. Within one category, multi-select is OR.",
|
||||
"filterTip2": "Status is a shortcut that expands to event_type values (Working → PreToolUse, Completed → Stop/SubagentStop/Compaction, ...). Status + Event type compose as OR on event_type.",
|
||||
"filterTipGrouping": "Grouping tip: a grouped row needs both Pre and Post events. If you filter by Status, pick Working + Connected together to keep pairs intact - otherwise a group will only show half of the call.",
|
||||
"filterTip3": "Text search matches summary, tool_name, and the raw payload (data column).",
|
||||
"filterTip4": "Date range applies to each event's created_at."
|
||||
}
|
||||
},
|
||||
"examples": "Examples",
|
||||
"help": "Help"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"title": "Dashboard",
|
||||
"subtitle": "Real-time overview of Claude Code agent activity",
|
||||
"totalSessions": "Total Sessions",
|
||||
"activeAgents": "Active Agents",
|
||||
"activeSubagents": "Active Subagents",
|
||||
"eventsToday": "Events Today",
|
||||
"totalEvents": "Total Events",
|
||||
"totalCost": "Total Cost",
|
||||
"viewBoard": "View Board",
|
||||
"viewAll": "View All",
|
||||
"activeAgentsSection": "Active Agents",
|
||||
"recentActivity": "Recent Activity",
|
||||
"noAgents": "No active agents",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"notFound": {
|
||||
"code": "404",
|
||||
"title": "Page not found",
|
||||
"description": "The route you requested does not exist. Use navigation to return to a valid page.",
|
||||
"goDashboard": "Go to Dashboard",
|
||||
"goBack": "Go Back"
|
||||
},
|
||||
"notifications": {
|
||||
"newSession": "New Session",
|
||||
"sessionDefault": "Session ",
|
||||
"sessionError": "Session Error",
|
||||
"subagentSpawned": "Subagent Spawned",
|
||||
"finishedResponding": "Claude Finished Responding",
|
||||
"readyForInput": "Ready for input",
|
||||
"sessionCompleted": "Session Completed",
|
||||
"sessionClosed": "Session closed",
|
||||
"defaultTitle": "Claude Code",
|
||||
"defaultBody": "Notification"
|
||||
},
|
||||
"toolLegend": {
|
||||
"read": "Read",
|
||||
"write": "Write",
|
||||
"edit": "Edit",
|
||||
"bash": "Bash",
|
||||
"grep": "Grep",
|
||||
"glob": "Glob",
|
||||
"agent": "Agent",
|
||||
"other": "Other"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"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."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"action.clear": "clear",
|
||||
"action.forget": "forget lane",
|
||||
"action.purge": "purge history",
|
||||
"action.remove": "remove",
|
||||
"action.reset": "reset worktree",
|
||||
"action.start": "start",
|
||||
"action.stop": "stop",
|
||||
"actionError": "Lane action failed: {{message}}",
|
||||
"actionErrorUnknown": "Unknown error",
|
||||
"add": "Add lane",
|
||||
"addLane": "Create a lane from a working directory",
|
||||
"addLaneBaseLabel": "Branch to fork from",
|
||||
"addLaneNoBranches": "This repo has no commits yet — the worktree will start empty.",
|
||||
"addLaneNotARepo": "Not a git repository (or no read access) yet.",
|
||||
"addLaneRepoHint": "An existing git repo. The dashboard creates a new worktree for the lane, not a folder you pick.",
|
||||
"addLaneRepoLabel": "Source repository",
|
||||
"addLaneTitleLabel": "Title",
|
||||
"addLaneTitlePlaceholder": "Optional",
|
||||
"autoStage": "auto: {{stage}}",
|
||||
"cardId": "Lane {{id}}",
|
||||
"confirmRemoveCancel": "Cancel",
|
||||
"confirmRemoveConfirm": "Remove",
|
||||
"confirmRemoveMessage": "This action cannot be undone.",
|
||||
"confirmRemoveTitle": "Remove lane?",
|
||||
"countDead": "dead",
|
||||
"countNeedsYou": "need you",
|
||||
"countRunning": "running",
|
||||
"countTotal": "lanes",
|
||||
"destructive.blocked.adopted": "This is an adopted directory and cannot be changed by a worktree action.",
|
||||
"destructive.blocked.missing": "The lane directory is missing, so this action cannot continue.",
|
||||
"destructive.blocked.unreadable": "The lane directory cannot be read as a Git worktree, so this action cannot continue.",
|
||||
"destructive.cancel": "Cancel",
|
||||
"destructive.count.bytesEstimate": "Estimated space freed",
|
||||
"destructive.count.dirty": "Modified files",
|
||||
"destructive.count.events": "Events",
|
||||
"destructive.count.head": "HEAD",
|
||||
"destructive.count.sessions": "Sessions",
|
||||
"destructive.count.tokenRows": "Token rows",
|
||||
"destructive.count.unpushed": "Unpushed commits",
|
||||
"destructive.count.untracked": "Untracked files",
|
||||
"destructive.force": "I understand these unpushed commits will be discarded.",
|
||||
"destructive.loading": "Loading current facts…",
|
||||
"destructive.notice.activeSessionSkipped": "One or more sessions in this lane are still active and will be kept, not purged.",
|
||||
"destructive.notice.adopted": "This lane points at a directory you own. Only the dashboard's record of it is dropped — the directory and its files are left untouched.",
|
||||
"destructive.notice.missing": "The lane directory is already gone. Removing it drops the dashboard's record and clears Git's stale worktree entry; nothing is deleted from disk.",
|
||||
"destructive.notice.unreadable": "The lane directory cannot be read as a Git worktree. Removal is attempted; if Git itself refuses, its worktree record is cleared directly instead. Either way, the directory itself is never touched.",
|
||||
"destructive.purge.confirm": "Purge history",
|
||||
"destructive.purge.message": "Approve the current counts before deleting stored session history.",
|
||||
"destructive.purge.title": "Purge lane history?",
|
||||
"destructive.remove.confirm": "Remove lane",
|
||||
"destructive.remove.message": "Approve the current counts before this action.",
|
||||
"destructive.remove.title": "Remove lane?",
|
||||
"destructive.reset.confirm": "Reset worktree",
|
||||
"destructive.reset.message": "Approve the current counts before resetting this worktree.",
|
||||
"destructive.reset.survives": "Gitignored files such as node_modules and .env are kept; untracked files are deleted.",
|
||||
"destructive.reset.title": "Reset managed worktree?",
|
||||
"destructive.warning.no-remote": "No Git remote is configured, so nothing here is backed up remotely. You can still proceed.",
|
||||
"emptyState": "No lanes yet. Create one from a working directory:",
|
||||
"git.uncommitted": "{{dirty}} modified · {{untracked}} untracked",
|
||||
"kind.adopted": "adopted",
|
||||
"kind.managed": "managed",
|
||||
"laneHeader": "Lane {{id}} · {{title}} · {{pipeline}}",
|
||||
"moreActions": "More actions",
|
||||
"preflightError": "Could not load the current lane facts.",
|
||||
"preflightErrorWithMessage": "Could not load the current lane facts: {{message}}",
|
||||
"status.failed": "failed",
|
||||
"status.idle": "idle",
|
||||
"status.provisioning": "provisioning",
|
||||
"status.running": "running",
|
||||
"statusDead": "DEAD",
|
||||
"title": "Lanes",
|
||||
"tooltipStart": "Spawn a conversation-mode run with no initial prompt; driven from CLI or via message"
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"activityFeed": "Activity Feed",
|
||||
"agentBoard": "Kanban Board",
|
||||
"analytics": "Analytics",
|
||||
"avg": "avg",
|
||||
"brand": "Agent Dashboard",
|
||||
"brandSub": "Claude Code Monitor",
|
||||
"ccConfig": "Claude Config",
|
||||
"checkFailed": "Update check failed",
|
||||
"checkForUpdates": "Check for updates",
|
||||
"checkingForUpdates": "Checking for updates...",
|
||||
"close": "Close",
|
||||
"collapse": "Collapse sidebar",
|
||||
"collapseShort": "Collapse",
|
||||
"connection": "Connection",
|
||||
"connectionDetails": "Connection details",
|
||||
"connectionUptime": "Connected",
|
||||
"dashboard": "Dashboard",
|
||||
"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",
|
||||
"noEventsYet": "No events yet",
|
||||
"notConnected": "Not connected",
|
||||
"notFound": "Not found",
|
||||
"peakRate": "Peak",
|
||||
"recentActivity": "Recent activity",
|
||||
"resetStats": "Reset",
|
||||
"scrollDown": "Scroll navigation down",
|
||||
"scrollUp": "Scroll navigation up",
|
||||
"secondsAgo": "{{count}}s ago",
|
||||
"sessions": "Sessions",
|
||||
"settings": "Settings",
|
||||
"skipToContent": "Skip to content",
|
||||
"statsPersisted": "Stats persist across reloads",
|
||||
"switchLanguage": "Switch to {{language}}",
|
||||
"throughput60s": "Throughput · last 60s",
|
||||
"topEventTypes": "Top event types",
|
||||
"unitEvents": "events",
|
||||
"unitPerSec": "events/s",
|
||||
"upToDate": "Up to date",
|
||||
"updateAvailable": "Update available",
|
||||
"website": "Website",
|
||||
"workflows": "Workflows",
|
||||
"workspace": "Workspace",
|
||||
"wsEndpoint": "WebSocket"
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"actions": {
|
||||
"newRun": "New run",
|
||||
"send": "Send",
|
||||
"sending": "Sending…",
|
||||
"start": "Run",
|
||||
"starting": "Starting…",
|
||||
"stop": "Stop",
|
||||
"stopping": "Stopping…",
|
||||
"viewSession": "View 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 `claude` CLI isn't on your PATH. Install Claude Code 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"
|
||||
},
|
||||
"errors": {
|
||||
"attachFailed": "Couldn't attach to run: {{message}}",
|
||||
"cwdRequired": "Working directory required to start a run",
|
||||
"killFailed": "Couldn't stop: {{message}}",
|
||||
"laneCreateFailed": "Failed to create lane: {{message}}",
|
||||
"noLaneSelected": "No lane selected or could not create one",
|
||||
"noRunIdReturned": "No run_id returned from lane start",
|
||||
"runStartedButNotAttached": "Run is live but couldn't attach to console: {{message}}",
|
||||
"sendFailed": "Couldn't send: {{message}}",
|
||||
"startFailed": "Couldn't start run: {{message}}"
|
||||
},
|
||||
"events": {
|
||||
"claude": "Claude",
|
||||
"collapse": "Collapse",
|
||||
"expand": "Expand",
|
||||
"system": "System",
|
||||
"thinking": "Thinking",
|
||||
"tool": "Tool",
|
||||
"toolResult": "Tool result",
|
||||
"you": "You"
|
||||
},
|
||||
"fields": {
|
||||
"cwd": "Working directory",
|
||||
"cwdGroups": {
|
||||
"dashboard": "Dashboard server",
|
||||
"home": "Home",
|
||||
"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",
|
||||
"model": "Model",
|
||||
"modelCustom": "Custom…",
|
||||
"modelCustomPlaceholder": "model id (e.g. claude-opus-4-7-20260101)",
|
||||
"modelInheritLabel": "Inherit from settings",
|
||||
"permissionAcceptEdits": "acceptEdits (recommended)",
|
||||
"permissionBypass": "bypassPermissions (DANGER - allows everything without asking)",
|
||||
"permissionDefault": "default (interactive prompts - sessions may hang headlessly)",
|
||||
"permissionMode": "Permission mode",
|
||||
"permissionPlan": "plan (read-only planning)",
|
||||
"prompt": "Prompt",
|
||||
"promptPlaceholder": "Ask Claude anything…"
|
||||
},
|
||||
"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.",
|
||||
"shortcut": "Cmd+Enter / Ctrl+Enter to send"
|
||||
},
|
||||
"limitations": {
|
||||
"dismiss": "Got it"
|
||||
},
|
||||
"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",
|
||||
"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.",
|
||||
"resumeOption": "Resume existing session",
|
||||
"search": "Search by ID, cwd, or status…",
|
||||
"selectedBadge": "Resuming"
|
||||
},
|
||||
"runs": {
|
||||
"allSessionsLink": "See all Claude Code sessions →",
|
||||
"attached": "Attached to existing run",
|
||||
"scopeNote": "Only shows runs you started from this dashboard.",
|
||||
"started": "Started {{when}}",
|
||||
"switcher": "Active runs",
|
||||
"switcherEmpty": "No active runs",
|
||||
"viewActive": "View active run",
|
||||
"viewActive_other": "{{count}} active runs",
|
||||
"viewLabel": "View"
|
||||
},
|
||||
"status": {
|
||||
"abandoned": "Abandoned",
|
||||
"completed": "Completed",
|
||||
"error": "Error",
|
||||
"idle": "Idle",
|
||||
"killed": "Killed",
|
||||
"running": "Running",
|
||||
"spawning": "Spawning…"
|
||||
},
|
||||
"statusHeader": {
|
||||
"cwd": "Cwd",
|
||||
"duration": "Elapsed",
|
||||
"effort": "Effort",
|
||||
"envelopes": "Events",
|
||||
"model": "Model",
|
||||
"permissionMode": "Mode",
|
||||
"session": "Session"
|
||||
},
|
||||
"subtitle": "Spin up a Claude Code session right inside the dashboard. Live streaming output, multi-turn conversation, and the same hooks-driven analytics as your terminal sessions.",
|
||||
"title": "Run Claude",
|
||||
"tokens": {
|
||||
"cacheRead": "Cache hit",
|
||||
"cost": "Cost",
|
||||
"input": "Input",
|
||||
"label": "Context",
|
||||
"output": "Output"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"title": "Sessions",
|
||||
"searchPlaceholder": "Search sessions...",
|
||||
"filterAll": "All",
|
||||
"filterActive": "Active",
|
||||
"filterWaiting": "Waiting",
|
||||
"filterCompleted": "Completed",
|
||||
"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.",
|
||||
"tableSession": "Session",
|
||||
"tableStatus": "Status",
|
||||
"tableLastActive": "Last Active",
|
||||
"tableDuration": "Duration",
|
||||
"tableAgents": "Agents",
|
||||
"tableCost": "Cost",
|
||||
"tableDirectory": "Directory",
|
||||
"defaultName": "Session ",
|
||||
"detail": {
|
||||
"waitingBanner": {
|
||||
"title": "Waiting for your input",
|
||||
"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}})",
|
||||
"transcriptNotFound": "Conversation transcript not found for this agent. The transcript file may be missing or not yet linked."
|
||||
},
|
||||
"remoteSourceBadgeTitle": "Collected from a remote machine"
|
||||
}
|
||||
@@ -0,0 +1,435 @@
|
||||
{
|
||||
"title": "Settings",
|
||||
"subtitle": "Manage pricing, notifications, data, and hooks",
|
||||
"exportData": "Export Data",
|
||||
"acrossSessions": "Across all tracked sessions",
|
||||
"basedOnUsage": "Based on per-model token usage",
|
||||
"tabby": {
|
||||
"title": "Tabby companion",
|
||||
"description": "A floating cat that reacts to your live sessions.",
|
||||
"enable": "Show Tabby",
|
||||
"enableDesc": "Display the corner companion across the dashboard (⌘B to open)"
|
||||
},
|
||||
"pricing": {
|
||||
"title": "Model Pricing",
|
||||
"description": "Rates per million tokens (USD). Use % as wildcard in patterns. Some models have a time-limited introductory rate (shown in violet); usage on or before its cutoff date is billed at that rate, and usage after it at the standard rate.",
|
||||
"introNote": "Intro ${{input}}/${{output}} through {{until}}",
|
||||
"introRatesTitle": "Introductory rates",
|
||||
"introRatesHint": "Leave the date empty for no promo",
|
||||
"introUntil": "Through (date)",
|
||||
"introUntilInvalid": "Introductory cutoff must be a YYYY-MM-DD date",
|
||||
"resetConfirm": "Confirm Reset",
|
||||
"resetDefaults": "Reset Defaults",
|
||||
"resetResult": "Reset to {{count}} default rules",
|
||||
"addModel": "Add Model",
|
||||
"pattern": "Pattern",
|
||||
"patternPlaceholder": "claude-opus-4%",
|
||||
"namePlaceholder": "Claude Opus 4",
|
||||
"validationRequired": "Pattern and display name are required",
|
||||
"lastUpdated": "Last updated: ",
|
||||
"tooltip": {
|
||||
"title": "How model pricing works",
|
||||
"howItWorks": "How it works",
|
||||
"howItWorksBody": "When a session reports usage, the dashboard finds the first pricing rule whose pattern matches the model id and multiplies (input tokens / 1M) and (output tokens / 1M) by the rates below to compute cost. Rules are evaluated top-to-bottom - the first match wins.",
|
||||
"patternsTitle": "Pattern syntax",
|
||||
"patternsBody": "Patterns are SQL-style globs. % is a wildcard that matches any characters. For example: claude-opus-4-7% matches every model id that starts with claude-opus-4-7 (e.g. claude-opus-4-7, claude-opus-4-7-20260101). claude-%-haiku matches any haiku variant. An exact id like claude-sonnet-4-6 only matches itself.",
|
||||
"manualUpdates": "You must update prices manually",
|
||||
"manualUpdatesBody": "Anthropic publishes pricing changes on their website - there is no live feed. When a new model launches or rates change, edit the matching rule (or add a new one above the catch-all) so newly recorded sessions are costed correctly. Already-stored sessions keep the price that was applied at ingest time.",
|
||||
"apiPricing": "Reference only - API rates",
|
||||
"apiPricingBody": "These are pay-as-you-go API rates. If you use Claude Code on a subscription plan (Pro, Max, Team, or Enterprise), your actual cost is a flat monthly fee, not per-token - so these figures will usually be higher than what you really pay. Treat the costs here as a usage estimate for reference, not a bill."
|
||||
},
|
||||
"cacheWrite5m": "Cache Write (5m)",
|
||||
"cacheWrite1h": "Cache Write (1h)",
|
||||
"fastInput": "Fast Input",
|
||||
"fastOutput": "Fast Output"
|
||||
},
|
||||
"claudeHome": {
|
||||
"title": "CLAUDE_HOME",
|
||||
"description": "Root directory for Claude Code session data. Changing this updates the scan path for transcripts and imports immediately.",
|
||||
"save": "Save",
|
||||
"saving": "Saving...",
|
||||
"current": "Current:",
|
||||
"placeholder": "/path/to/claude-home",
|
||||
"saveFailed": "Failed to update CLAUDE_HOME"
|
||||
},
|
||||
"hooks": {
|
||||
"title": "Hook Configuration",
|
||||
"description": "Claude Code hooks forward events to the dashboard in real time.",
|
||||
"allInstalled": "All hooks installed",
|
||||
"incomplete": "Hooks incomplete",
|
||||
"reinstall": "Reinstall Hooks",
|
||||
"success": "Hooks installed successfully",
|
||||
"failed": "Hook installation failed"
|
||||
},
|
||||
"notifications": {
|
||||
"title": "Notifications",
|
||||
"description": "Browser notifications for important events. Requires permission.",
|
||||
"enable": "Enable Browser Notifications",
|
||||
"granted": "Permission granted",
|
||||
"blocked": "Permission blocked",
|
||||
"required": "Permission required",
|
||||
"notifyWhen": "Notify me when...",
|
||||
"newSession": "New session starts",
|
||||
"sessionComplete": "Session completes",
|
||||
"sessionError": "Session errors",
|
||||
"subagentSpawned": "Subagent spawned",
|
||||
"testTitle": "Agent Monitor",
|
||||
"testBody": "Notifications are working!",
|
||||
"sendTest": "Send Test Notification",
|
||||
"disabledInfo": "Notifications are disabled - enable to get alerts for session events"
|
||||
},
|
||||
"import": {
|
||||
"title": "Import History",
|
||||
"description": "Bring existing Claude Code sessions into the dashboard. Token counts, per-model cost, compactions, subagents, tool uses, and turn durations are reconstructed from the original JSONL transcripts - identical to how live sessions are captured.",
|
||||
"accuracyNote": "Re-running is safe. Sessions are deduplicated by session ID, and compaction baselines ensure token totals never double-count.",
|
||||
"supportedFiles": "Supported inputs: .jsonl, .meta.json, .zip, .tar, .tar.gz, .tgz, .gz",
|
||||
"instructions": "How to gather your history",
|
||||
"stepLocate": "1. Locate your Claude Code history",
|
||||
"stepLocateBody": "Every Claude Code session is stored as a JSONL transcript under the projects folder. Each subfolder is named after the working directory where the session started (slashes replaced with dashes).",
|
||||
"stepArchive": "2. Bundle it for transfer (optional)",
|
||||
"stepArchiveBody": "To move history from another machine, archive the whole folder first, then copy it over (AirDrop, scp, USB, cloud storage):",
|
||||
"stepChoose": "3. Pick an import mode below",
|
||||
"stepChooseBody": "Rescan the default location, point at any folder you've extracted history into, or upload files/archives directly.",
|
||||
"stepVerify": "4. Verify tokens and cost",
|
||||
"stepVerifyBody": "After import, open Analytics → Cost to confirm the breakdown. Re-importing the same session is always safe.",
|
||||
"defaultLocation": "Default location on this machine",
|
||||
"locationFound": "Folder found",
|
||||
"locationMissing": "Folder not found",
|
||||
"projectsLabel": "projects",
|
||||
"jsonlLabel": "JSONL files",
|
||||
"modeRescan": "Rescan default folder",
|
||||
"modeRescanDesc": "Re-read ~/.claude/projects and import anything new.",
|
||||
"modeFolder": "Scan a folder",
|
||||
"modeFolderDesc": "Scan any directory on this machine for JSONL transcripts (walks subfolders).",
|
||||
"modeUpload": "Upload files",
|
||||
"modeUploadDesc": "Drop JSONL files or an archive (.zip / .tar.gz) directly into the browser.",
|
||||
"modeBackup": "Restore backup",
|
||||
"modeBackupDesc": "Import a dashboard export (.json) from Export data — merge another machine's history in.",
|
||||
"backupHint": "Drop an export .json here or click to select",
|
||||
"backupSub": "The file produced by the Export data button (top of Settings)",
|
||||
"runRestore": "Restore",
|
||||
"backupResult": {
|
||||
"title": "Restore complete",
|
||||
"sessionsImported": "Sessions added: {{count}}",
|
||||
"sessionsSkipped": "Already present: {{count}}",
|
||||
"events": "Events: {{count}}",
|
||||
"pricing": "Pricing rules: {{count}}",
|
||||
"detail": "{{agents}} agents · {{workflows}} workflows · {{runs}} runs · {{rules}} alert rules"
|
||||
},
|
||||
"folderPlaceholder": "/absolute/path/to/claude-history",
|
||||
"folderHelper": "Absolute path. Tilde (~) is expanded. Subfolders are scanned recursively.",
|
||||
"runRescan": "Rescan Now",
|
||||
"runScan": "Scan Folder",
|
||||
"runUpload": "Upload & Import",
|
||||
"dropzoneHint": "Drag files here or click to select",
|
||||
"dropzoneSub": "Accepts .jsonl, .meta.json, .zip, .tar, .tar.gz, .tgz, .gz",
|
||||
"filesSelected": "{{count}} file(s) selected",
|
||||
"clearSelection": "Clear",
|
||||
"copy": "Copy",
|
||||
"copied": "Copied",
|
||||
"progress": {
|
||||
"scan": "Scanning directory...",
|
||||
"extract": "Extracting archives ({{processed}}/{{total}})...",
|
||||
"parse": "Parsing transcripts ({{processed}}/{{total}})...",
|
||||
"complete": "Import complete",
|
||||
"error": "Import failed"
|
||||
},
|
||||
"result": {
|
||||
"imported": "Imported: {{count}}",
|
||||
"backfilled": "Enriched existing: {{count}}",
|
||||
"skipped": "Already up to date: {{count}}",
|
||||
"errors": "Errors: {{count}}",
|
||||
"filesScanned": "Files scanned: {{count}}",
|
||||
"title": "Last import result"
|
||||
},
|
||||
"errors": {
|
||||
"noFiles": "No files selected",
|
||||
"noJsonl": "No .jsonl files were found in the uploaded content",
|
||||
"pathRequired": "Path is required",
|
||||
"pathInvalid": "Path must be absolute",
|
||||
"pathNotFound": "Path does not exist",
|
||||
"pathNotDir": "Path is not a directory",
|
||||
"generic": "Import failed: {{message}}"
|
||||
}
|
||||
},
|
||||
"data": {
|
||||
"title": "Data Management",
|
||||
"description": "Database info, import/export, and cleanup.",
|
||||
"dbOverview": "Database Overview",
|
||||
"dbSize": "DB Size",
|
||||
"loadingDb": "Loading database info...",
|
||||
"sessionCleanup": "Session Cleanup",
|
||||
"cleanupDesc": "Abandon stale sessions and purge old data",
|
||||
"abandonAfter": "Abandon stale active sessions older than",
|
||||
"purgeAfter": "Purge completed/errored sessions older than",
|
||||
"confirmCleanup": "Confirm Cleanup",
|
||||
"runCleanup": "Run Cleanup",
|
||||
"nothingToClean": "Nothing to clean up",
|
||||
"abandonedResult": " sessions abandoned",
|
||||
"purgedResult": " sessions purged ({{events}} events, {{agents}} agents)"
|
||||
},
|
||||
"danger": {
|
||||
"title": "Danger Zone",
|
||||
"description": "Irreversible actions that delete data permanently",
|
||||
"warning": "This will delete all sessions, agents, events, and token data. Are you sure?",
|
||||
"yesClearAll": "Yes, Clear All",
|
||||
"clearAllData": "Clear All Data",
|
||||
"clearedResult": "Cleared {{count}} rows"
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
"description": "Server runtime information.",
|
||||
"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..."
|
||||
},
|
||||
"tables": {
|
||||
"sessions": "sessions",
|
||||
"agents": "agents",
|
||||
"events": "events",
|
||||
"sessionsWithCost": "sessions with cost",
|
||||
"pricingRules": "pricing rules"
|
||||
},
|
||||
"messages": {
|
||||
"failedLoad": "Failed to load",
|
||||
"failedSave": "Failed to save",
|
||||
"failedDelete": "Failed to delete",
|
||||
"unknownError": "Unknown",
|
||||
"actionFailed": "Error: {{message}}"
|
||||
},
|
||||
"webhooks": {
|
||||
"title": "Webhook Notifications",
|
||||
"description": "Forward fired alerts to Slack, Discord, Microsoft Teams, or any HTTP endpoint. Delivery is automatic, retried on failure, and never blocks monitoring.",
|
||||
"count_one": "{{count}} target",
|
||||
"count_other": "{{count}} targets",
|
||||
"add": "Add Webhook",
|
||||
"loading": "Loading webhooks…",
|
||||
"empty": "No webhooks configured. Add one to forward alerts to Slack, Discord, Teams, or a custom endpoint.",
|
||||
"scopedTo_one": "{{count}} rule",
|
||||
"scopedTo_other": "{{count}} rules",
|
||||
"enabled": "Enabled",
|
||||
"test": "Test",
|
||||
"edit": "Edit",
|
||||
"delete": "Delete",
|
||||
"confirmDelete": "Confirm",
|
||||
"testOk": "Delivered (HTTP {{status}})",
|
||||
"testFail": "Failed: {{error}}",
|
||||
"addTitle": "New Webhook",
|
||||
"editTitle": "Edit Webhook",
|
||||
"fieldName": "Name",
|
||||
"fieldNamePlaceholder": "e.g. Team Slack #alerts",
|
||||
"fieldType": "Type",
|
||||
"type": {
|
||||
"slack": "Slack",
|
||||
"discord": "Discord",
|
||||
"teams": "Microsoft Teams",
|
||||
"generic": "Generic (custom JSON)"
|
||||
},
|
||||
"fieldUrl": "Webhook URL",
|
||||
"urlKeepHint": "leave blank to keep current",
|
||||
"urlKeepPlaceholder": "•••••••• (unchanged)",
|
||||
"urlPlaceholder": {
|
||||
"slack": "https://hooks.slack.com/services/…",
|
||||
"discord": "https://discord.com/api/webhooks/…",
|
||||
"teams": "https://outlook.office.com/webhook/…",
|
||||
"generic": "https://example.com/webhook"
|
||||
},
|
||||
"fieldSecret": "Signing secret (optional)",
|
||||
"secretPlaceholder": "HMAC-SHA256 secret",
|
||||
"secretKeepPlaceholder": "•••••••• (leave blank to keep)",
|
||||
"secretHint": "When set, requests are signed with an X-Webhook-Signature header.",
|
||||
"fieldHeaders": "Custom headers (optional)",
|
||||
"replaceHeaders": "Replace headers",
|
||||
"headerKey": "Header",
|
||||
"headerValue": "Value",
|
||||
"addHeader": "Add header",
|
||||
"scopeAll": "Receive alerts from all rules",
|
||||
"enabledOnSave": "Enabled",
|
||||
"save": "Save",
|
||||
"create": "Create",
|
||||
"cancel": "Cancel",
|
||||
"urlOptional": "optional override",
|
||||
"urlAuto": "URL is set automatically from the credentials below.",
|
||||
"deleteTitle": "Delete webhook?",
|
||||
"deleteMessage": "Delete \"{{name}}\"? Fired alerts will stop being delivered to this target. This cannot be undone.",
|
||||
"guideToggle": "How to set up {{provider}}",
|
||||
"guideDocs": "Official {{provider}} docs",
|
||||
"guideStaleNote": "Provider setup screens change often, so these steps may be out of date - always confirm against the official docs."
|
||||
},
|
||||
"alertsHub": {
|
||||
"title": "Alerts",
|
||||
"description": "Define alert rules, route them to webhook channels, and review what has fired - all in one place.",
|
||||
"tabRules": "Rules",
|
||||
"tabChannels": "Channels",
|
||||
"tabActivity": "Activity",
|
||||
"rulesHint": "Conditions that trigger an alert. Evaluated server-side against the live event stream.",
|
||||
"rulesEmptyHint": "Add a rule to start alerting on errors, inactivity, stuck agents, or token thresholds."
|
||||
},
|
||||
"jumpTo": "Jump to",
|
||||
"webhookGuides": {
|
||||
"slack": {
|
||||
"steps": [
|
||||
"Create or open a Slack app at api.slack.com/apps.",
|
||||
"Turn on 'Incoming Webhooks', then click 'Add New Webhook to Workspace'.",
|
||||
"Choose the channel to post to and authorize.",
|
||||
"Copy the generated URL (https://hooks.slack.com/services/…) and paste it above."
|
||||
]
|
||||
},
|
||||
"discord": {
|
||||
"steps": [
|
||||
"Open your server → Server Settings → Integrations → Webhooks.",
|
||||
"Click 'New Webhook', pick a channel, optionally rename it.",
|
||||
"Click 'Copy Webhook URL' and paste it above."
|
||||
]
|
||||
},
|
||||
"teams": {
|
||||
"steps": [
|
||||
"In the target Teams channel, click ⋯ → 'Workflows'.",
|
||||
"Pick the template 'Post to a channel when a webhook request is received'.",
|
||||
"Finish the flow and copy the generated HTTP POST URL.",
|
||||
"Paste it above. (Classic Office 365 connectors were retired in 2025 - use Workflows.)"
|
||||
]
|
||||
},
|
||||
"google_chat": {
|
||||
"steps": [
|
||||
"Open the Google Chat space → space title → 'Apps & integrations'.",
|
||||
"Click 'Webhooks' → 'Add webhook' and give it a name.",
|
||||
"Copy the webhook URL and paste it above."
|
||||
]
|
||||
},
|
||||
"mattermost": {
|
||||
"steps": [
|
||||
"Main Menu → Integrations → Incoming Webhooks (an admin must enable webhooks first).",
|
||||
"Click 'Add Incoming Webhook' and choose a channel.",
|
||||
"Save, then copy the webhook URL and paste it above."
|
||||
]
|
||||
},
|
||||
"rocketchat": {
|
||||
"steps": [
|
||||
"Administration → Integrations → New → Incoming.",
|
||||
"Enable it, pick a channel, and save.",
|
||||
"Copy the 'Webhook URL' and paste it above."
|
||||
]
|
||||
},
|
||||
"telegram": {
|
||||
"steps": [
|
||||
"Message @BotFather, run /newbot, and copy the bot token.",
|
||||
"Add the bot to your group/channel (or just DM it).",
|
||||
"Find the chat ID: send a message, open https://api.telegram.org/bot<token>/getUpdates, read result[].message.chat.id.",
|
||||
"Enter the Bot token and Chat ID above - no URL needed."
|
||||
]
|
||||
},
|
||||
"pagerduty": {
|
||||
"steps": [
|
||||
"Open the target Service → Integrations → 'Add integration'.",
|
||||
"Choose 'Events API v2'.",
|
||||
"Copy the Integration Key (the routing key).",
|
||||
"Enter it as the Routing key above - the Events API URL is prefilled."
|
||||
]
|
||||
},
|
||||
"opsgenie": {
|
||||
"steps": [
|
||||
"Settings → Integrations → add an 'API' integration.",
|
||||
"Copy the generated API key.",
|
||||
"Note your account region (US or EU).",
|
||||
"Enter the API key and region above - the alerts URL is derived from the region."
|
||||
]
|
||||
},
|
||||
"splunk_oncall": {
|
||||
"steps": [
|
||||
"Integrations → REST Endpoint, and enable it.",
|
||||
"Copy the REST URL - it already contains your API key.",
|
||||
"Replace the trailing '$routing_key' with one of your routing keys.",
|
||||
"Paste the full URL above."
|
||||
]
|
||||
},
|
||||
"zapier": {
|
||||
"steps": [
|
||||
"Create a Zap with the trigger 'Webhooks by Zapier' → 'Catch Hook'.",
|
||||
"Copy the custom webhook URL it gives you.",
|
||||
"Paste it above. The alert arrives as JSON: { event, alert }."
|
||||
]
|
||||
},
|
||||
"make": {
|
||||
"steps": [
|
||||
"Add a 'Webhooks' → 'Custom webhook' module as the first step of a scenario.",
|
||||
"Click 'Add', create the hook, and copy its URL.",
|
||||
"Paste it above, then run once so Make learns the payload shape."
|
||||
]
|
||||
},
|
||||
"n8n": {
|
||||
"steps": [
|
||||
"Add a 'Webhook' node to your workflow; set the method to POST.",
|
||||
"Copy the Production URL.",
|
||||
"Activate the workflow and paste the URL above (http is allowed for self-hosted)."
|
||||
]
|
||||
},
|
||||
"pipedream": {
|
||||
"steps": [
|
||||
"Create a workflow with an 'HTTP / Webhook' trigger.",
|
||||
"Copy the unique endpoint URL.",
|
||||
"Paste it above; inspect deliveries in the Pipedream event inspector."
|
||||
]
|
||||
},
|
||||
"generic": {
|
||||
"steps": [
|
||||
"Point this at any endpoint that accepts a JSON POST (https, or http for local testing).",
|
||||
"Body shape: { event: 'alert.triggered', source, sent_at, alert: { … } }.",
|
||||
"Optional: set a signing secret (HMAC-SHA256 over the body → X-Webhook-Signature header) and custom headers.",
|
||||
"Tip: use a free inspector like webhook.site to see the exact payload."
|
||||
]
|
||||
}
|
||||
},
|
||||
"remoteSources": {
|
||||
"title": "Remote Data Sources",
|
||||
"description": "Collect Claude Code usage from other machines over SSH - e.g. a dev box or cloud VM you drive over SSH while running this dashboard locally. Authentication uses your own SSH setup (~/.ssh/config, keys, agent); no passwords are stored here.",
|
||||
"scopeTitle": "Data scope",
|
||||
"scopeDesc": "Choose which machines' data the whole dashboard shows. Changes apply immediately across every page — sessions, analytics, and cost.",
|
||||
"scopeAll": "All sources",
|
||||
"scopeAllDesc": "This machine plus every configured remote source, combined.",
|
||||
"scopeLocal": "This machine only",
|
||||
"scopeLocalDesc": "Only sessions collected locally — hides all remote-source data.",
|
||||
"scopeSelected": "Selected sources",
|
||||
"scopeSelectedDesc": "Pick exactly which machines to include, below.",
|
||||
"scopeSelectedCount": "{{n}} of {{total}} selected",
|
||||
"scopePickMachines": "Machines to include",
|
||||
"thisMachine": "This machine",
|
||||
"listTitle": "Configured sources",
|
||||
"add": "Add source",
|
||||
"addTitle": "Add a remote source",
|
||||
"editTitle": "Edit source",
|
||||
"fieldLabel": "Label",
|
||||
"fieldHost": "SSH host",
|
||||
"fieldPort": "Port (optional)",
|
||||
"fieldIdentity": "Identity file (optional)",
|
||||
"fieldRemoteHome": "Remote Claude home (optional)",
|
||||
"fieldRemoteHomeHint": "Linux/macOS: default ~/.claude (or an absolute path like /home/you/.claude). Windows SSH + Claude in WSL: leave blank (auto-detect) or use wsl:~/.claude. Native Windows: C:/Users/you/.claude.",
|
||||
"fieldEnabled": "Sync automatically in the background",
|
||||
"empty": "No remote sources yet.",
|
||||
"emptyHint": "Add a machine you reach over SSH to pull its Claude Code usage in.",
|
||||
"paused": "Auto-sync off",
|
||||
"sessionCount": "{{n}} sessions",
|
||||
"sessionCountLinked": "{{n}} linked",
|
||||
"sessionCountHint": "Sessions linked to this source (not every session visible when data scope is All)",
|
||||
"lastSync": "Last sync: {{when}}",
|
||||
"neverSynced": "Never synced",
|
||||
"imported": "{{n}} imported",
|
||||
"syncNew": "{{n}} new",
|
||||
"syncOnRemote": "{{n}} on remote",
|
||||
"test": "Test",
|
||||
"syncNow": "Sync",
|
||||
"syncAll": "Sync all",
|
||||
"enable": "Enable",
|
||||
"disable": "Disable",
|
||||
"confirmDelete": "Remove this source?",
|
||||
"purgeData": "Also delete the sessions imported from this source (cannot be undone)",
|
||||
"deleteAndPurge": "Remove + delete data",
|
||||
"removeKeep": "Remove (keep data)",
|
||||
"remoteSourceBadgeTitle": "Collected from a remote machine"
|
||||
},
|
||||
"cursorPathsNote": "Informational: Cursor sessions count here too — Cursor happens to use the same ~/.claude paths as Claude Code (locally and on synced remotes)."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"greeting": {
|
||||
"morning": "Good morning",
|
||||
"afternoon": "Good afternoon",
|
||||
"evening": "Good evening",
|
||||
"night": "Working late"
|
||||
},
|
||||
"tagline": "Nothing your agents do stays in the dark.",
|
||||
"sub1": "Real-time observability for every Claude Code session.",
|
||||
"sub2": "Tokens, tools, costs, and workflows, all live.",
|
||||
"brand": "Claude Code Monitor",
|
||||
"taglines": [
|
||||
"Nothing your agents do stays in the dark.",
|
||||
"See every move your agents make.",
|
||||
"Your agents, fully observable.",
|
||||
"Every token, tool, and turn — in plain sight.",
|
||||
"Watch your fleet think.",
|
||||
"Where Claude Code sessions come into focus.",
|
||||
"Real-time eyes on every agent.",
|
||||
"From prompt to result, all on the record.",
|
||||
"The control room for your AI agents.",
|
||||
"Every subagent accounted for.",
|
||||
"Know exactly what your agents cost.",
|
||||
"Your agentic workflows, made legible.",
|
||||
"Observe. Measure. Optimize.",
|
||||
"Mission control for Claude Code.",
|
||||
"Turn agent chaos into a clear picture.",
|
||||
"The receipts for every run."
|
||||
],
|
||||
"subs": [
|
||||
[
|
||||
"Real-time observability for every Claude Code session.",
|
||||
"Tokens, tools, costs, and workflows, all live."
|
||||
],
|
||||
[
|
||||
"Live sessions, agents, and events as they happen.",
|
||||
"Per-model token and cost breakdowns, no guesswork."
|
||||
],
|
||||
[
|
||||
"Trace every tool call across your agent tree.",
|
||||
"Spot the slow turn, the costly model, the silent failure."
|
||||
],
|
||||
["Hooks stream straight to a local dashboard.", "Your data never leaves your machine."],
|
||||
[
|
||||
"Watch orchestrators delegate to subagents.",
|
||||
"DAGs, concurrency, and error propagation, visualized."
|
||||
],
|
||||
[
|
||||
"Cost tracking down to the cache token.",
|
||||
"Per-model pricing with compaction-aware baselines."
|
||||
],
|
||||
[
|
||||
"Every session, agent, and event in one place.",
|
||||
"Search, replay, and inspect without leaving the room."
|
||||
],
|
||||
[
|
||||
"From SessionStart to SessionEnd, captured.",
|
||||
"Compactions, API errors, and turn durations included."
|
||||
],
|
||||
[
|
||||
"Know which model did what, and what it cost.",
|
||||
"Subagents priced at their own rate, not the orchestrator's."
|
||||
],
|
||||
["Workflow fleets and inner agents, surfaced.", "Even the runs that never fire a hook."],
|
||||
["A local-first window into your agents.", "No cloud, no account, no telemetry."],
|
||||
[
|
||||
"Measure productivity, not vibes.",
|
||||
"Velocity, cache efficiency, and tool effectiveness, scored."
|
||||
],
|
||||
[
|
||||
"Catch the anomaly before the invoice does.",
|
||||
"Cost outliers and token spikes, flagged early."
|
||||
],
|
||||
[
|
||||
"Your Claude Code config, fully mapped.",
|
||||
"Skills, agents, hooks, MCP, and memory at a glance."
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title": "Dashboard update available",
|
||||
"lead": "A new version of the dashboard is available. To update, run the following command in your terminal:",
|
||||
"commitsBehind": "{{count}} commit(s) behind {{ref}}",
|
||||
"copy": "Copy command",
|
||||
"commandLabel": "Terminal command to update the dashboard",
|
||||
"copied": "Copied",
|
||||
"dismiss": "Dismiss",
|
||||
"fetchError": "Could not reach git remote. Try again when you are online.",
|
||||
"notGit": "This install is not a git clone; use a manual upgrade path.",
|
||||
"restartNote": "After the command finishes, close and restart the dashboard the same way you started it: if you used npm start, run npm start again.",
|
||||
"checkNow": "Check now",
|
||||
"checking": "Checking...",
|
||||
"checkError": "Could not check for updates"
|
||||
}
|
||||
@@ -0,0 +1,468 @@
|
||||
{
|
||||
"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",
|
||||
"activeOnly": "Active Only",
|
||||
"completed": "Completed",
|
||||
"runs": {
|
||||
"title": "Dynamic Workflows",
|
||||
"subtitle": "Fleets spawned by the Workflow tool, reconstructed from on-disk run journals",
|
||||
"sessionTitle": "Dynamic Workflows",
|
||||
"loading": "Loading dynamic workflows…",
|
||||
"empty": "No dynamic workflows yet. Runs from the Workflow tool appear here once their journal is written (at completion).",
|
||||
"noAgents": "No inner agents recorded for this run.",
|
||||
"openSession": "Open parent session",
|
||||
"filterPhase": "Filter by phase",
|
||||
"clearFilter": "Clear",
|
||||
"resultsLabel": "Results",
|
||||
"promptLabel": "Prompt",
|
||||
"resultLabel": "Result",
|
||||
"loadingFull": "Loading full text…",
|
||||
"tokens": "tokens",
|
||||
"agents_one": "{{count}} agent",
|
||||
"agents_other": "{{count}} agents",
|
||||
"tools_one": "{{count}} tool call",
|
||||
"tools_other": "{{count}} tool calls",
|
||||
"status": {
|
||||
"running": "Running",
|
||||
"working": "Running",
|
||||
"queued": "Queued",
|
||||
"completed": "Completed",
|
||||
"done": "Done",
|
||||
"success": "Done",
|
||||
"error": "Error",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"col": {
|
||||
"agent": "Agent",
|
||||
"phase": "Phase",
|
||||
"state": "State",
|
||||
"tokens": "Tokens",
|
||||
"tools": "Tools",
|
||||
"duration": "Duration"
|
||||
}
|
||||
},
|
||||
"chartInfo": {
|
||||
"labels": {
|
||||
"what": "What this shows",
|
||||
"howToRead": "How to read it",
|
||||
"why": "Why it matters"
|
||||
},
|
||||
"orchestration": {
|
||||
"what": "A layered DAG of how Claude Code sessions fan out: from the originating sessions, into the main agent, into each subagent type, through any context compactions, and finally into terminal outcomes (completed / error / abandoned).",
|
||||
"howToRead": "Each column is one layer. Box width is constant; the small badge is the count. Edges flow left-to-right; thicker edges = more frequent transitions. Hover any node for stats; click to filter the rest of the page by it.",
|
||||
"why": "Use it to answer 'where does work go in my workflows?' - which subagent types dominate, where compaction kicks in, and which paths end in errors vs clean completions."
|
||||
},
|
||||
"toolFlow": {
|
||||
"what": "A Sankey-style chart of consecutive tool-call transitions across every session in scope. Each band is one (source → target) pair counted across all sessions.",
|
||||
"howToRead": "Tools appear as colored bars on the left and right. Bands connect them: thickness = number of times the source ran immediately before the target. Hover a band for share-of-source and share-of-target percentages; hover a node for its total usage and share of all tool calls.",
|
||||
"why": "Surfaces habitual tool chains (e.g. Read → Edit → Bash). Useful for spotting loops, wasted hops, and missing tool variety in agent behavior."
|
||||
},
|
||||
"pipeline": {
|
||||
"what": "A directed graph of agent-type co-occurrence: which agent types tend to run sequentially after which, and how often.",
|
||||
"howToRead": "Circles are agent types; size encodes total spawns. Arrows go A → B when B was observed running shortly after A in the same session, with the label = count. Hover an arrow for share of source/target; hover a circle for spawns, sessions, and success rate. Drag nodes to rearrange.",
|
||||
"why": "Surfaces real delegation pipelines you may not have intentionally designed - e.g. a code-review agent that nearly always follows a build agent - so you can codify or simplify them."
|
||||
},
|
||||
"effectiveness": {
|
||||
"what": "One card per subagent type with a success-rate ring, total sessions, average duration, and a 7-day activity sparkline.",
|
||||
"howToRead": "Ring fill is success rate; the percentage in the center is the same. The two boxes give counts and average wall-clock duration. The sparkline is sessions per day for the last week - hover a bar for the daily count.",
|
||||
"why": "Quick health check per agent: which agents are reliable, which are slow, and which are trending up or down in usage."
|
||||
},
|
||||
"patterns": {
|
||||
"what": "A ranked list of recurring agent-orchestration sequences detected from session traces, plus a callout for solo sessions that ran without subagents.",
|
||||
"howToRead": "Each row is a step sequence (main → sub → sub …). The right side shows how many sessions matched it and what percentage of all sessions that represents. Click a pattern to highlight it.",
|
||||
"why": "Reveals the standard 'shapes' of work in your project. Frequent patterns are good candidates to formalize as named workflows or skills."
|
||||
},
|
||||
"modelDelegation": {
|
||||
"what": "A two-column flow showing which main models delegate to which subagent models, plus per-node agent counts and total tokens.",
|
||||
"howToRead": "Left column = main models for sessions; right column = models used inside subagents. Lines indicate observed main → subagent pairings. Hover a node for share-of-all-agents, sessions, total tokens, and a description of the model family (Opus / Sonnet / Haiku).",
|
||||
"why": "Helps you confirm cost/latency tiering - e.g. main on Sonnet, subagents on Haiku - and catch unintended escalations to Opus."
|
||||
},
|
||||
"errorPropagation": {
|
||||
"what": "Where errors cluster across the agent hierarchy: by depth (session/main vs direct subagent vs nested), by agent type, and by API/session-level error category.",
|
||||
"howToRead": "The top banner gives the session-level error rate. The depth bars show how many errors occurred at each nesting level. The error-prone types list ranks subagent types by error count. The bottom block surfaces API/session error summaries.",
|
||||
"why": "Pinpoints whether failures live in the orchestration spine (main agent), in specific subagents, or in deep nested chains - guiding where to invest in retries, validation, or rewrites."
|
||||
},
|
||||
"concurrency": {
|
||||
"what": "Aggregate timing of when each agent type is active relative to the session timeline, plus how many sessions feature it.",
|
||||
"howToRead": "Each row is one agent type. Bar length is proportional to session count. The right-hand percentages show the average start and end position within a session (0% = session start, 100% = session end). Hover for a description of the timing pattern (front-loaded, mid-session, back-loaded, etc.).",
|
||||
"why": "Reveals the rhythm of your sessions - e.g. linting up front, code-review near the end - and surfaces agents that monopolize the entire session."
|
||||
},
|
||||
"complexity": {
|
||||
"what": "A scatter plot of every session: x = wall-clock duration, y = total agents involved, bubble size = total tokens, color = final status.",
|
||||
"howToRead": "Top-right bubbles are long, agent-heavy sessions. Big bubbles burned the most tokens. Reds/yellows = error/abandoned outcomes. Hover any bubble for full session stats; click to drill into it below.",
|
||||
"why": "Gives a single view of the cost/complexity distribution. Outliers are the sessions worth investigating for runaway behavior or cost spikes."
|
||||
},
|
||||
"compaction": {
|
||||
"what": "How often Claude triggered context compaction across sessions: total events, tokens recovered, and a per-session distribution.",
|
||||
"howToRead": "The two stat boxes show total compaction events and the cumulative tokens reclaimed. The bar chart lists sessions with at least one compaction, sorted descending by count.",
|
||||
"why": "Compactions indicate context pressure. A long tail of high-compaction sessions usually means workflows that should be split, summarized, or migrated to a longer-context model."
|
||||
},
|
||||
"drillIn": {
|
||||
"what": "Per-session detail view: full agent tree, tool-call timeline, and raw event sequence for whichever session you select.",
|
||||
"howToRead": "Pick a session from the dropdown above or click a bubble in the scatter plot. The tabs let you switch between hierarchical (Agent Tree), temporal (Tool Timeline), and chronological (Event Sequence) views of the same session.",
|
||||
"why": "When an aggregate chart flags a suspicious session, this is where you go to read exactly what happened, in order."
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"avgAgentDepth": "Avg Agent Depth",
|
||||
"avgSubagentsPerSession": "Avg Subagents / Session",
|
||||
"agentSuccessRate": "Agent Success Rate",
|
||||
"mostCommonFlow": "Most Common Flow",
|
||||
"avgCompactions": "Avg Compactions",
|
||||
"avgDuration": "Avg Duration",
|
||||
"tooltip": {
|
||||
"howCalc": "How it's calculated",
|
||||
"whatItMeans": "What this number means",
|
||||
"moreInfo": "Explain this metric",
|
||||
"valueMeansFmt": "{{value}} {{phrase}} means {{interpretation}}",
|
||||
"phrase": {
|
||||
"depth": "average agent depth",
|
||||
"subagents": "subagents per session",
|
||||
"success": "agent success rate",
|
||||
"topFlow": "most common flow",
|
||||
"compactions": "compactions per session",
|
||||
"duration": "average duration"
|
||||
},
|
||||
"calc": {
|
||||
"depth": "For each session we record the deepest agent nesting level (main = 0, direct subagent = 1, sub-subagent = 2, …) and average those maximums across all sessions in the current filter.",
|
||||
"subagents": "Total number of subagent invocations (every Task / SubagentStop pair) divided by the number of sessions in scope. Counts every subagent run, including parallel and re-spawned ones.",
|
||||
"success": "Across all main + subagent runs in scope: completed runs ÷ (completed + errored + abandoned) × 100. A run counts as completed when a Stop / SubagentStop is observed without an error event in between.",
|
||||
"topFlow": "Every consecutive pair of tool calls within a session is counted as one transition. The pair that appears most frequently across all sessions is shown here as 'source → target'.",
|
||||
"compactions": "Total number of context-compaction events recorded by the PreCompact / SessionStart(compact) hooks, divided by the number of sessions in scope.",
|
||||
"duration": "Mean wall-clock time from each session's first event (SessionStart) to its last event (Stop / SessionEnd / latest hook), averaged across all sessions in scope."
|
||||
},
|
||||
"depth": {
|
||||
"zero": "no nested agents have been observed. Every session ran with just the main agent - no subagent delegation occurred.",
|
||||
"rare": "nesting is rare. Most sessions stay at depth 0 (main agent only); only a small fraction reach into subagents.",
|
||||
"single": "sessions typically delegate to a single layer of subagents (main → subagent), without further nesting.",
|
||||
"multi": "multi-layer orchestration is common - subagents themselves frequently spawn further subagents (main → sub → sub).",
|
||||
"deep": "deep, recursive orchestration is the norm. Sessions consistently chain three or more agent layers."
|
||||
},
|
||||
"subagents": {
|
||||
"zero": "no subagents have fired. Sessions completed entirely on the main agent.",
|
||||
"lowFreq": "practically: roughly one subagent every ~{{count}} sessions. Most sessions don't spawn any subagent at all.",
|
||||
"moderate": "sessions typically delegate to 1–3 subagents - moderate use of specialized helpers.",
|
||||
"heavy": "heavy delegation - sessions routinely fan out to several subagents.",
|
||||
"veryHeavy": "very orchestration-heavy: sessions average 6+ subagent runs each."
|
||||
},
|
||||
"success": {
|
||||
"perfect": "near-perfect. Almost every agent run finishes with a clean Stop event - no errors or abandonment.",
|
||||
"healthy": "healthy. The vast majority of agent runs complete successfully; only sporadic failures.",
|
||||
"acceptable": "acceptable, but watch the error trend - roughly 1 in every 5–20 runs fails or is abandoned.",
|
||||
"concerning": "concerning - a meaningful share of agent runs are failing. Inspect the Errors page for top culprits.",
|
||||
"critical": "critical: most agent runs are failing or being abandoned. Check ErrorPropagation and recent deploys."
|
||||
},
|
||||
"topFlow": {
|
||||
"none": "not enough consecutive tool calls have been recorded yet to surface a dominant pair.",
|
||||
"selfLoop": "{{tool}} most often follows itself - typical for repeated reads/edits or chained shell commands.",
|
||||
"pair": "{{source}} most often runs immediately before {{target}}. Read it as a habit: agents tend to {{sourceLower}} and then {{targetLower}} as their next step."
|
||||
},
|
||||
"compactions": {
|
||||
"zero": "no context compaction has been observed. Sessions stayed comfortably within the model's context window.",
|
||||
"lowFreq": "practically: ~1 compaction every {{count}} sessions. Long-running sessions are the exception.",
|
||||
"moderate": "sessions typically hit compaction once or twice - context pressure exists but is manageable.",
|
||||
"high": "high compaction rate. Sessions routinely run long enough to require multiple context compressions; consider splitting work."
|
||||
},
|
||||
"duration": {
|
||||
"zero": "no completed sessions yet - duration is 0.",
|
||||
"veryShort": "very short sessions (under a minute) - likely quick tool calls or single-shot prompts.",
|
||||
"short": "short sessions, on the order of a few minutes. Typical for focused, single-feature work.",
|
||||
"medium": "medium-length sessions (5–30 min). Standard development cadence.",
|
||||
"long": "long sessions (30–60 min). Likely multi-step workflows or longer review cycles.",
|
||||
"veryLong": "very long sessions (1–3 hr). Watch for compaction and context pressure.",
|
||||
"marathon": "marathon sessions (3+ hours). Consider whether work could be split into multiple shorter sessions."
|
||||
}
|
||||
}
|
||||
},
|
||||
"orchestration": {
|
||||
"title": "Agent Orchestration Graph",
|
||||
"subtitle": "Aggregate spawning patterns across all sessions - Click a node to filter",
|
||||
"sessions": "Sessions",
|
||||
"mainAgent": "Main Agent",
|
||||
"compactions": "Compactions",
|
||||
"noData": "No orchestration data",
|
||||
"noDataDesc": "Agent spawning data will appear here once sessions with subagents have been recorded.",
|
||||
"legend": "Legend",
|
||||
"edgeWeight": "Edge weight = frequency",
|
||||
"count": "Count",
|
||||
"otherTypes": "{{count}} other types",
|
||||
"ariaLabel": "Agent orchestration directed acyclic graph",
|
||||
"layers": {
|
||||
"origin": "Origin",
|
||||
"mainAgent": "Main Agent",
|
||||
"subagentTypes": "Subagent Types",
|
||||
"compactions": "Compactions",
|
||||
"outcomes": "Outcomes"
|
||||
},
|
||||
"tooltip": {
|
||||
"tipClickToFilter": "Tip: click to filter the rest of the page by this node.",
|
||||
"layer": {
|
||||
"session": "Layer 0 - Origin",
|
||||
"main": "Layer 1 - Main agent",
|
||||
"subagent": "Layer 2 - Subagent type",
|
||||
"subagentOverflow": "Layer 2 - Subagent types",
|
||||
"nested": "Layer 3 - Compactions",
|
||||
"outcome": "Layer 4 - Outcome"
|
||||
},
|
||||
"desc": {
|
||||
"session": "Each unit here is a Claude Code session matching the current status filter. Outgoing edges fan out to the main agents these sessions launched.",
|
||||
"main": "The top-level Claude run for each session. Every session has exactly one main agent; from here the graph branches into the subagent types it delegated to.",
|
||||
"subagent": "A specialized subagent the main agent delegated to (e.g. via the Task tool).",
|
||||
"subagentClean": " Every run of this subagent has completed cleanly.",
|
||||
"subagentAllError": " Every run of this subagent has errored - investigate the agent definition.",
|
||||
"subagentSomeErrors": " {{count}} run(s) errored - see Error Propagation below for details.",
|
||||
"subagentOverflow": "All remaining subagent types collapsed into one node so the graph stays readable. Hover any other subagent node to see individual stats.",
|
||||
"nested": "Context-window compaction events. Claude triggers a compaction when the running context approaches the model's limit; the count reflects how often that happened across the sessions in scope.",
|
||||
"outcomeCompleted": "Sessions whose final hook was a clean Stop event. No error events were emitted before termination.",
|
||||
"outcomeError": "Sessions that emitted at least one error event (tool error, subagent error, or session error) before terminating.",
|
||||
"outcomeAbandoned": "Sessions that stopped without a clean Stop event and without explicit errors - usually closed mid-flight.",
|
||||
"outcomeFallback": "The terminal status of sessions in scope, computed from the last hook event observed for each session."
|
||||
}
|
||||
}
|
||||
},
|
||||
"toolFlow": {
|
||||
"title": "Tool Execution Flow",
|
||||
"subtitle": "How tools chain together - Sankey-style directed flow",
|
||||
"noData": "No tool flow data",
|
||||
"transitionCount_one": "{{count}} transition",
|
||||
"transitionCount_other": "{{count}} transitions",
|
||||
"tooltip": {
|
||||
"node": "Tool node",
|
||||
"link": "Tool transition",
|
||||
"totalCalls": "Total calls",
|
||||
"shareOfAll": "Share of all tool use",
|
||||
"transitionsObserved": "Transitions observed",
|
||||
"shareOfSourceFmt": "Share of {{source}} → next",
|
||||
"shareOfTargetFmt": "Share of prev → {{target}}",
|
||||
"nodeDescFmt": "Bar height shows how often {{name}} appears across all sessions in scope. Bands flowing in on the left show what ran before {{name}}; bands flowing out on the right show what ran after.",
|
||||
"linkDescFmt": "Across every session, this counts how often {{source}} ran immediately before {{target}}. Thicker bands = more common transitions; the percentages show how dominant this hop is among each tool's outgoing / incoming flow."
|
||||
}
|
||||
},
|
||||
"pipeline": {
|
||||
"title": "Agent Pipeline Graph",
|
||||
"subtitle": "Directed workflow - which agent types run after which, with frequency labels",
|
||||
"noData": "No pipeline data yet",
|
||||
"noDataDesc": "Directed workflow edges appear once agent types run sequentially across multiple sessions.",
|
||||
"legend": "Legend",
|
||||
"legendDesc": "A runs before B (labeled count)",
|
||||
"frequency": "Frequency",
|
||||
"meaning": "Meaning",
|
||||
"times": " times",
|
||||
"ranAfter": " ran after ",
|
||||
"spawns": " spawns",
|
||||
"spawned": "Spawned",
|
||||
"inSessions": "In sessions",
|
||||
"ariaLabel": "Agent pipeline graph",
|
||||
"tooltip": {
|
||||
"agentType": "Agent type",
|
||||
"edge": "Sequential edge",
|
||||
"shareOfAllSpawns": "Share of all spawns",
|
||||
"sequentialPairs": "Sequential pairs",
|
||||
"totalSpawnsFmt": "{{id}} total spawns",
|
||||
"shareOfSrcFmt": "Share of {{source}} → next",
|
||||
"shareOfTgtFmt": "Share of prev → {{target}}",
|
||||
"edgeDescFmt": "{{target}} ran immediately after {{source}} {{count}} time(s) across all sessions. The thicker the arrow, the more often this hand-off occurred. Use this to spot habitual delegation chains in your workflows.",
|
||||
"nodeDescFmt": "{{id}} ran {{total}} time(s) across {{sessions}} session(s); its success rate is {{rate}}% ({{health}}). Circle size encodes total spawns; arrows show which agent types tend to run before or after it.",
|
||||
"health": {
|
||||
"perfect": "near-perfect",
|
||||
"healthy": "healthy",
|
||||
"shaky": "shaky",
|
||||
"failing": "failing often"
|
||||
}
|
||||
}
|
||||
},
|
||||
"effectiveness": {
|
||||
"title": "Subagent Effectiveness",
|
||||
"subtitle": "Performance metrics per agent type",
|
||||
"success": "Success",
|
||||
"sessions": "Sessions",
|
||||
"avgDuration": "Avg Duration",
|
||||
"weeklyActivity": "Weekly activity",
|
||||
"noData": "No subagent data available",
|
||||
"successRateAria": "Success rate: {{rate}}%",
|
||||
"weeklyActivityAria": "Weekly activity sparkline",
|
||||
"sessionCount_one": "{{count}} session",
|
||||
"sessionCount_other": "{{count}} sessions"
|
||||
},
|
||||
"patterns": {
|
||||
"title": "Detected Workflow Patterns",
|
||||
"subtitle": "Common agent orchestration sequences",
|
||||
"noData": "No patterns detected yet",
|
||||
"noDataDesc": "Patterns appear once multiple sessions share the same agent sequence.",
|
||||
"solo": "solo (no subagents)",
|
||||
"label": "Workflow Patterns",
|
||||
"detail": {
|
||||
"clickHint": "Click for details",
|
||||
"stepsHeading": "Full step sequence",
|
||||
"statsHeading": "Stats",
|
||||
"stepsCount_one": "{{count}} step",
|
||||
"stepsCount_other": "{{count}} steps",
|
||||
"uniqueAgents": "Unique agent types",
|
||||
"occurrences": "Sessions matching this pattern",
|
||||
"shareOfSessions": "Share of all sessions",
|
||||
"narrativeHeading": "What this means",
|
||||
"suggestionHeading": "Suggestion",
|
||||
"narrative": {
|
||||
"soloFmt": "Sessions that ran with only {{first}} - no delegation to other agent types.",
|
||||
"twoStepFmt": "A two-step hand-off: {{first}} delegates straight to {{last}}, with no further branching.",
|
||||
"shortFmt": "A {{count}}-step chain that starts at {{first}} and ends at {{last}}.",
|
||||
"longFmt": "A long {{count}}-step chain - begins at {{first}}, threads through several agents, and lands at {{last}}.",
|
||||
"loopHintFmt": " {{agent}} appears more than once in this sequence - typical of a verification or revision loop.",
|
||||
"dominant": " This is the dominant workflow in your project - more than half of sessions follow it.",
|
||||
"common": " This is a common workflow, accounting for roughly a quarter of sessions.",
|
||||
"regular": " A recognised workflow, but not the majority pattern.",
|
||||
"niche": " A niche pattern that only surfaces occasionally."
|
||||
},
|
||||
"suggestion": {
|
||||
"solo": "Solo run - would a code-reviewer or test-runner subagent raise the quality of these sessions?",
|
||||
"shortChain": "Short chain. If it keeps recurring, name it as a slash command, skill, or named workflow so it's easy to reproduce.",
|
||||
"mediumChain": "Frequent enough to formalise. A named workflow or template would make this pattern reusable.",
|
||||
"longChain": "Long chain - review whether every hop is necessary, or whether some agents could be merged or skipped.",
|
||||
"loop": "Loop detected. Confirm the repeated step is intentional verification rather than a silent retry of a failing call."
|
||||
}
|
||||
}
|
||||
},
|
||||
"modelDelegation": {
|
||||
"title": "Model Delegation Flow",
|
||||
"subtitle": "How models route through agent hierarchies",
|
||||
"mainModels": "MAIN MODELS",
|
||||
"subagentModels": "SUBAGENT MODELS",
|
||||
"noData": "No model delegation data available",
|
||||
"agentsCount_one": "{{count}} agent",
|
||||
"agentsCount_other": "{{count}} agents",
|
||||
"tokensCount": "{{tokens}} tokens",
|
||||
"sessionsCount_one": "{{count}} session",
|
||||
"sessionsCount_other": "{{count}} sessions",
|
||||
"ariaLabel": "Model delegation flow diagram",
|
||||
"tooltip": {
|
||||
"mainModel": "Main model",
|
||||
"subagentModel": "Subagent model",
|
||||
"agentRuns": "Agent runs",
|
||||
"shareOfAll": "Share of all agents",
|
||||
"sessionsOnModel": "Sessions on this model",
|
||||
"totalTokens": "Total tokens",
|
||||
"family": {
|
||||
"opus": "Opus - highest-capability tier; best for complex reasoning, longest context, costliest per token.",
|
||||
"sonnet": "Sonnet - balanced tier; good default for most coding and tool-use workflows.",
|
||||
"haiku": "Haiku - fastest, cheapest tier; ideal for short, latency-sensitive subagents.",
|
||||
"other": "Non-Anthropic or unrecognized model - falls outside the standard Opus/Sonnet/Haiku families."
|
||||
},
|
||||
"lines": {
|
||||
"main": "Lines on the right show subagent models this main model delegated work to.",
|
||||
"sub": "Lines on the left show main models that delegated work to this subagent model."
|
||||
}
|
||||
}
|
||||
},
|
||||
"errorPropagation": {
|
||||
"title": "Error Propagation Map",
|
||||
"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",
|
||||
"errorsByDepth": "Errors by hierarchy depth",
|
||||
"errorProneTypes": "Error-prone agent types",
|
||||
"apiSessionErrors": "API & session errors",
|
||||
"depthLabels": {
|
||||
"sessionMain": "Session / Main",
|
||||
"directSubagent": "Direct Subagent",
|
||||
"nested": "Nested (depth 2)",
|
||||
"deep": "Deep (depth 3+)"
|
||||
}
|
||||
},
|
||||
"concurrency": {
|
||||
"title": "Agent Concurrency Timeline",
|
||||
"subtitle": "Parallel agent execution patterns - Shows how agents overlap in time",
|
||||
"noData": "No concurrency data",
|
||||
"noDataDesc": "Concurrency data appears once sessions with subagents have been recorded.",
|
||||
"sessions": "Sessions",
|
||||
"timing": "Timing",
|
||||
"max": " max",
|
||||
"sessionInfo_one": "{{count}} session - active {{from}}%-{{to}}% of session",
|
||||
"sessionInfo_other": "{{count}} sessions - active {{from}}%-{{to}}% of session",
|
||||
"tooltip": {
|
||||
"lane": "Concurrency lane",
|
||||
"sessionsWith": "Sessions with this agent",
|
||||
"avgStart": "Avg start in session",
|
||||
"avgEnd": "Avg end in session",
|
||||
"barHint": "Bar length is proportional to how many sessions feature this agent type. Timing percentages are averages across those sessions.",
|
||||
"timing": {
|
||||
"wholeSession": "Active across nearly the entire session - runs from the start through to the end.",
|
||||
"frontLoadedFmt": "Front-loaded: typically active from session start until ~{{end}}% of the way through.",
|
||||
"backLoadedFmt": "Back-loaded: typically kicks in around {{start}}% of the session and stays until the end.",
|
||||
"tightFmt": "Tightly scoped: runs in a narrow band between {{start}}% and {{end}}% of the session timeline.",
|
||||
"midSessionFmt": "Mid-session work: runs roughly from {{start}}% to {{end}}% of the session timeline."
|
||||
}
|
||||
}
|
||||
},
|
||||
"complexity": {
|
||||
"title": "Session Complexity Scatter",
|
||||
"subtitle": "Duration vs agent count vs tokens - Bubble size = token usage",
|
||||
"noData": "No session complexity data",
|
||||
"noDataDesc": "Sessions will appear here once they complete with agent activity.",
|
||||
"duration": "Duration",
|
||||
"agentCount": "Agent Count",
|
||||
"ariaLabel": "Session complexity scatter plot",
|
||||
"tooltip": {
|
||||
"duration": "Duration:",
|
||||
"agents": "Agents:",
|
||||
"subagents": "Subagents:",
|
||||
"tokens": "Tokens:",
|
||||
"model": "Model:"
|
||||
}
|
||||
},
|
||||
"compaction": {
|
||||
"title": "Compaction Impact Analysis",
|
||||
"subtitle": "How context compression is spread across your sessions",
|
||||
"help": "When a session's context window fills up, Claude Code compresses older history into a summary. Each compaction is one such event.",
|
||||
"noData": "No compactions recorded",
|
||||
"totalCompactions": "Total compactions",
|
||||
"sessionsAffected": "Sessions affected",
|
||||
"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",
|
||||
"summary": "{{affected}} of {{total}} sessions ({{pct}}%) used context compaction.",
|
||||
"tokensFreed": "Compaction freed ~{{tokens}} tokens of context.",
|
||||
"ariaLabel": "Number of sessions by compaction count",
|
||||
"tipTitle": "Compacted {{count}}x",
|
||||
"tipDetail": "{{sessions}} sessions · {{pct}}% of affected"
|
||||
},
|
||||
"drillIn": {
|
||||
"title": "Session Drill-In",
|
||||
"subtitle": "Select a session from the scatter plot or use the dropdown to explore",
|
||||
"searchPlaceholder": "Search sessions...",
|
||||
"noSessionSelected": "No session selected",
|
||||
"noSessionDesc": "Search and select a session above, or click a bubble in the scatter plot, to drill into its agent tree, tool timeline, and event sequence.",
|
||||
"failedLoad": "Failed to load session",
|
||||
"loading": "Loading...",
|
||||
"loadMore": "Load more",
|
||||
"noMatch": "No sessions match your search.",
|
||||
"notFound": "No sessions found.",
|
||||
"unknownModel": "unknown model",
|
||||
"closePanel": "Close drill-in panel",
|
||||
"close": "Close",
|
||||
"tabs": {
|
||||
"agentTree": "Agent Tree",
|
||||
"toolTimeline": "Tool Timeline",
|
||||
"eventSequence": "Event Sequence"
|
||||
},
|
||||
"noAgentTree": "No agent tree data available.",
|
||||
"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)"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"title": "Luồng hoạt động",
|
||||
"subtitle": "Luồng thời gian thực của mọi sự kiện Agent",
|
||||
"paused": "(đã tạm dừng - {{count}} mục đệm)",
|
||||
"resume": "Tiếp tục",
|
||||
"pause": "Tạm dừng",
|
||||
"noActivity": "Chưa có hoạt động",
|
||||
"noActivityDesc": "Sự kiện sẽ được phát trực tiếp tại đây khi các Agent Claude Code làm việc.",
|
||||
"viewSession": "Phiên"
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"title": "Cảnh báo",
|
||||
"subtitle": "Cảnh báo theo quy tắc cho phiên, agent, sự kiện và mức dùng token",
|
||||
"refresh": "Làm mới",
|
||||
"ackAll": "Xác nhận tất cả ({{count}})",
|
||||
"ruleTypes": {
|
||||
"event_pattern": "Mẫu sự kiện",
|
||||
"inactivity": "Không hoạt động",
|
||||
"status_duration": "Agent bị kẹt",
|
||||
"token_threshold": "Ngưỡng token"
|
||||
},
|
||||
"ruleTypeHints": {
|
||||
"event_pattern": "Kích hoạt khi một sự kiện khớp với mẫu. Đặt số lần lớn hơn 1 để yêu cầu N sự kiện khớp trong khung thời gian (ví dụ: hơn 5 lỗi trong 2 phút).",
|
||||
"inactivity": "Kích hoạt khi một phiên đang hoạt động không nhận được sự kiện nào trong số phút đã cấu hình.",
|
||||
"status_duration": "Kích hoạt khi một agent giữ nguyên trạng thái đã chọn mà không có hoạt động trong số phút đã cấu hình.",
|
||||
"token_threshold": "Kích hoạt khi tổng mức dùng token của phiên (đầu vào + đầu ra + bộ nhớ đệm) vượt ngưỡng."
|
||||
},
|
||||
"ruleDesc": {
|
||||
"eventPattern": "Khớp {{pattern}}",
|
||||
"eventPatternCount": "≥{{count}} × {{pattern}} trong {{window}} phút",
|
||||
"inactivity": "Phiên không hoạt động trong {{minutes}} phút",
|
||||
"statusDuration": "Agent kẹt ở trạng thái {{status}} trong {{minutes}} phút",
|
||||
"tokenThreshold": "Token của phiên vượt {{tokens}}"
|
||||
},
|
||||
"rules": {
|
||||
"title": "Quy tắc cảnh báo",
|
||||
"add": "Thêm quy tắc",
|
||||
"cancel": "Hủy",
|
||||
"create": "Tạo quy tắc",
|
||||
"saving": "Đang lưu…",
|
||||
"empty": "Chưa có quy tắc cảnh báo nào. Thêm một quy tắc để bắt đầu theo dõi agent bị kẹt, lỗi dồn dập, phiên nhàn rỗi hoặc token tăng vọt.",
|
||||
"enabled": "Đang bật",
|
||||
"disabled": "Đang tắt",
|
||||
"enable": "Bật quy tắc",
|
||||
"disable": "Tắt quy tắc",
|
||||
"delete": "Xóa quy tắc",
|
||||
"confirmDelete": "Xóa quy tắc \"{{name}}\" và lịch sử cảnh báo của nó?",
|
||||
"cooldown": "thời gian chờ {{seconds}}s",
|
||||
"form": {
|
||||
"name": "Tên quy tắc",
|
||||
"namePlaceholder": "ví dụ: Lỗi dồn dập",
|
||||
"type": "Loại quy tắc",
|
||||
"eventType": "Loại sự kiện (chính xác)",
|
||||
"toolName": "Tên công cụ (chính xác)",
|
||||
"summaryContains": "Tóm tắt chứa",
|
||||
"count": "Số lần kích hoạt",
|
||||
"windowMinutes": "Khung thời gian (phút)",
|
||||
"agentStatus": "Trạng thái agent",
|
||||
"minutes": "Phút",
|
||||
"totalTokens": "Tổng token",
|
||||
"cooldown": "Thời gian chờ (giây)"
|
||||
},
|
||||
"deleteTitle": "Xóa quy tắc cảnh báo?",
|
||||
"help": {
|
||||
"name": "Nhãn cho quy tắc này. Hiển thị trong danh sách cảnh báo và đính kèm trong payload webhook (rule_name). vd: 'Lỗi Bash lặp lại'.",
|
||||
"type": "Quy tắc theo dõi gì. event_pattern khớp luồng sự kiện trực tiếp; inactivity = phiên đang hoạt động im lặng; status_duration = agent kẹt ở một trạng thái; token_threshold = token của phiên vượt ngưỡng.",
|
||||
"eventType": "Sự kiện hook của Claude Code cần khớp. Để trống để khớp mọi loại. Khớp chính xác (phân biệt hoa thường).",
|
||||
"toolName": "Công cụ mà agent gọi (trong sự kiện PreToolUse / PostToolUse). Để trống để khớp mọi công cụ. Khớp chính xác.",
|
||||
"summaryContains": "Khớp chuỗi con (không phân biệt hoa thường) trong tóm tắt sự kiện. Hữu ích để bắt lỗi hoặc cụm từ cụ thể. Để trống để bỏ qua.",
|
||||
"count": "Cần bao nhiêu sự kiện khớp trước khi cảnh báo kích hoạt. 1 = kích hoạt ở lần khớp đầu. Đặt lớn hơn 1 để phát hiện bùng phát (vd lỗi lặp lại).",
|
||||
"window": "Cửa sổ nhìn lại cho bộ đếm. vd count 5 + window 2 nghĩa là '5 sự kiện khớp trong bất kỳ khoảng 2 phút nào'.",
|
||||
"status": "Trạng thái agent cần theo dõi. 'working' bắt agent kẹt giữa tác vụ; 'waiting' bắt agent chờ nhập liệu/quyền.",
|
||||
"minutesInactivity": "Kích hoạt khi một phiên đang hoạt động không có sự kiện nào trong bấy nhiêu phút (phiên bị treo hoặc bị quên).",
|
||||
"minutesStatus": "Kích hoạt khi agent ở trạng thái đã chọn mà không có hoạt động trong bấy nhiêu phút (agent bị kẹt).",
|
||||
"totalTokens": "Kích hoạt khi tổng token của phiên (input + output + cache read + cache write) vượt số này. vd 1000000 = 1 triệu token.",
|
||||
"cooldown": "Số giây tối thiểu giữa các cảnh báo lặp cho cùng quy tắc + phiên + agent. Tránh trùng lặp gây nhiễu. Mặc định 300 (5 phút); 0 = không có thời gian chờ."
|
||||
}
|
||||
},
|
||||
"feed": {
|
||||
"title": "Luồng cảnh báo",
|
||||
"unackedCount": "{{count}} chưa xác nhận",
|
||||
"unackedOnly": "Chỉ chưa xác nhận",
|
||||
"ack": "Xác nhận",
|
||||
"viewSession": "Xem phiên",
|
||||
"loadMore": "Tải thêm ({{shown}} / {{total}})",
|
||||
"emptyTitle": "Không có cảnh báo",
|
||||
"emptyDescription": "Cảnh báo do các quy tắc của bạn kích hoạt sẽ hiển thị tại đây theo thời gian thực.",
|
||||
"emptyUnacked": "Tất cả đã được xác nhận. Cảnh báo mới sẽ hiển thị tại đây khi được kích hoạt."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"title": "Phân tích",
|
||||
"subtitle": "Giám sát và phân tích thời gian thực cho các phiên Claude Code",
|
||||
"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": {
|
||||
"tokenAnalytics": "Phân tích token",
|
||||
"costAnalytics": "Phân tích chi phí",
|
||||
"workflowIntelligence": "Thông minh quy trình",
|
||||
"productivityAnalytics": "Phân tích năng suất"
|
||||
},
|
||||
"eventActivity": "Hoạt động sự kiện - 52 tuần gần nhất",
|
||||
"last30Days": "30 ngày gần nhất",
|
||||
"dailyEventCount": "Số sự kiện theo ngày",
|
||||
"peakDay": "Ngày cao điểm",
|
||||
"total30d": "Tổng (30 ngày)",
|
||||
"tokenDistribution": "Phân bố token",
|
||||
"tokenMix": "Tỷ trọng token",
|
||||
"cacheEfficiency": "Hiệu quả bộ nhớ đệm",
|
||||
"tokenBreakdown": "Chi tiết token",
|
||||
"tokenInfo": "Dữ liệu token được ghi nhận từ sự kiện Stop của Claude Code.",
|
||||
"costByModel": "Chi phí theo mô hình",
|
||||
"dailyCostTrends": "Xu hướng chi phí theo ngày",
|
||||
"costByWeekday": "Chi phí theo thứ",
|
||||
"costPerDay": "Chi phí mỗi ngày",
|
||||
"peakCostDay": "Ngày chi phí cao nhất",
|
||||
"totalCost30d": "Tổng chi phí (30 ngày)",
|
||||
"noDailyCostData": "Chưa có dữ liệu chi phí theo ngày.",
|
||||
"noCostData": "Chưa có dữ liệu chi phí.",
|
||||
"subagentTypes": "Loại Subagent",
|
||||
"noSubagentData": "Chưa có dữ liệu Subagent.",
|
||||
"agentStatus": "Trạng thái Agent",
|
||||
"totalAgentsLabel": "Tổng Agent",
|
||||
"eventTypes": "Loại sự kiện",
|
||||
"noEventData": "Chưa có dữ liệu sự kiện.",
|
||||
"toolUsage": "Mức dùng công cụ",
|
||||
"noToolData": "Chưa có dữ liệu dùng công cụ.",
|
||||
"sessionOutcomes": "Kết quả phiên",
|
||||
"totalSessionsLabel": "Tổng phiên",
|
||||
"dailySessionTrends": "Xu hướng phiên theo ngày",
|
||||
"noSessionTrendData": "Chưa có dữ liệu xu hướng phiên.",
|
||||
"last7Days": "7 ngày gần nhất",
|
||||
"less": "Ít",
|
||||
"more": "Nhiều"
|
||||
}
|
||||
@@ -0,0 +1,259 @@
|
||||
{
|
||||
"title": "Trình khám phá cấu hình Claude",
|
||||
"subtitle": "Toàn cảnh thiết lập Claude Code của bạn - plugin, skill, subagent, máy chủ MCP, hook và cài đặt.",
|
||||
"refresh": "Làm mới",
|
||||
"refreshing": "Đang làm mới…",
|
||||
"lastUpdated": "Cập nhật lần cuối {{time}}",
|
||||
"loadError": "Tải thất bại: {{message}}",
|
||||
"scope": {
|
||||
"all": "Tất cả phạm vi",
|
||||
"user": "Người dùng",
|
||||
"project": "Dự án",
|
||||
"projectLocal": "Dự án (cục bộ)",
|
||||
"home": "Home"
|
||||
},
|
||||
"tabs": {
|
||||
"overview": "Tổng quan",
|
||||
"skills": "Skills",
|
||||
"agents": "Subagent",
|
||||
"commands": "Lệnh slash",
|
||||
"outputStyles": "Kiểu xuất",
|
||||
"plugins": "Plugin",
|
||||
"marketplaces": "Marketplace",
|
||||
"mcp": "Máy chủ MCP",
|
||||
"hooks": "Hooks",
|
||||
"keybindings": "Phím tắt",
|
||||
"settings": "Cài đặt",
|
||||
"memory": "Bộ nhớ"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"common": {
|
||||
"search": "Tìm theo tên…",
|
||||
"clearSearch": "Xóa tìm kiếm",
|
||||
"empty": "Chưa có nội dung.",
|
||||
"viewSource": "Xem nguồn",
|
||||
"close": "Đóng",
|
||||
"copyPath": "Sao chép đường dẫ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ủ."
|
||||
},
|
||||
"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",
|
||||
"disabled": "Đã tắt",
|
||||
"contributes": "Cung cấp",
|
||||
"skills_other": "{{count}} skill",
|
||||
"agents_other": "{{count}} agent",
|
||||
"commands_other": "{{count}} lệnh",
|
||||
"outputStyles_other": "{{count}} output style",
|
||||
"hooks_other": "{{count}} hook script",
|
||||
"author": "Tác giả",
|
||||
"homepage": "Trang chủ",
|
||||
"license": "Giấy phép",
|
||||
"description": "Mô tả"
|
||||
},
|
||||
"marketplaces": {
|
||||
"manifest": "Manifest marketplace đã biết",
|
||||
"noMarketplaces": "Chưa đăng ký marketplace.",
|
||||
"source": "Nguồn",
|
||||
"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",
|
||||
"action": "Hành động",
|
||||
"docsLink": "Xem tài liệu phím tắt",
|
||||
"contextPlaceholder": "Ngữ cảnh (vd: Global, Chat)",
|
||||
"addContext": "Thêm ngữ cảnh",
|
||||
"removeContext": "Xoá ngữ cảnh",
|
||||
"addBinding": "Thêm phím tắt",
|
||||
"removeBinding": "Xoá phím tắt",
|
||||
"errContext": "Mỗi ngữ cảnh cần có tên.",
|
||||
"errDupContext": "Ngữ cảnh trùng lặp: {{context}}",
|
||||
"errEmpty": "Mỗi phím tắt trong \"{{context}}\" cần cả phím và hành động.",
|
||||
"errDupKey": "Phím trùng lặp \"{{key}}\" trong ngữ cảnh \"{{context}}\"."
|
||||
},
|
||||
"statusline": {
|
||||
"title": "Statusline",
|
||||
"configured": "Lệnh statusline đã cấu hình",
|
||||
"scripts": "Script statusline trong CLAUDE_HOME",
|
||||
"noStatusline": "Chưa cấu hình statusline."
|
||||
},
|
||||
"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/."
|
||||
},
|
||||
"mcp": {
|
||||
"userScope": "Máy chủ phạm vi người dùng",
|
||||
"projectScope": "Máy chủ phạm vi dự án",
|
||||
"command": "Lệnh",
|
||||
"args": "Tham số",
|
||||
"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."
|
||||
},
|
||||
"hooks": {
|
||||
"noHooks": "Chưa cấu hình hook.",
|
||||
"matcher": "Bộ khớp",
|
||||
"command": "Lệnh",
|
||||
"type": "Loại",
|
||||
"timeout": "Timeout",
|
||||
"fileMissing": "(không có file settings trong phạm vi này)"
|
||||
},
|
||||
"settings": {
|
||||
"fileMissing": "(không có file settings trong phạm vi này)"
|
||||
},
|
||||
"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.",
|
||||
"noMatches": "Không có tệp bộ nhớ nào khớp với tìm kiếm.",
|
||||
"indexFiles": "Chỉ mục",
|
||||
"jumpTo": "Nhảy tới tệp",
|
||||
"fileCount_one": "{{count}} tệp",
|
||||
"fileCount_other": "{{count}} tệp",
|
||||
"factFiles_one": "{{count}} sự kiện",
|
||||
"factFiles_other": "{{count}} sự kiện",
|
||||
"newFile": "Tệp mới",
|
||||
"newFileTitle": "Tệp bộ nhớ mới trong {{project}}",
|
||||
"namePlaceholder": "vd: my_fact.md",
|
||||
"nameHelp": "Tên tệp kết thúc bằng .md (sẽ tự thêm .md nếu bạn bỏ qua).",
|
||||
"projectLabel": "Dự án",
|
||||
"projectHelp": "Được tạo trong thư mục bộ nhớ của dự án này."
|
||||
},
|
||||
"edit": {
|
||||
"newButton": "Tạo mới",
|
||||
"editButton": "Sửa",
|
||||
"deleteButton": "Xoá",
|
||||
"save": "Lưu",
|
||||
"cancel": "Huỷ",
|
||||
"saving": "Đang lưu…",
|
||||
"deleting": "Đang xoá…",
|
||||
"newTitle": "Tạo mới {{type}}",
|
||||
"editTitle": "Sửa {{name}}",
|
||||
"namePlaceholder": "tên (kebab-case, không khoảng trắng)",
|
||||
"nameLabel": "Tên",
|
||||
"nameHelp": "Chữ, số, dấu chấm, gạch ngang, gạch dưới. Tối đa 64 ký tự.",
|
||||
"contentLabel": "Nội dung",
|
||||
"scopePicker": "Phạm vi",
|
||||
"writeError": "Lưu thất bại: {{message}}",
|
||||
"deleteError": "Xoá thất bại: {{message}}",
|
||||
"saveSuccess": "Đã lưu · bản sao tại {{path}}",
|
||||
"saveSuccessNew": "Đã tạo.",
|
||||
"deleteSuccess": "Đã xoá · bản sao tại {{path}}",
|
||||
"confirmDelete": "Xoá mục này?",
|
||||
"confirmDeleteBody": "Tệp (hoặc thư mục skill cùng tài nguyên đi kèm) sẽ được sao lưu kèm dấu thời gian trước khi xoá. Bản sao nằm ngoài thư mục Claude Code quét, nên mục này sẽ biến mất khỏi CLI.",
|
||||
"confirmDeletePath": "Đường dẫn: {{path}}",
|
||||
"confirmDeleteAction": "Xác nhận sao lưu và xoá",
|
||||
"templates": {
|
||||
"skills": "---\nname: my-skill\ndescription: Mô tả ngắn gọn\n---\n\nNội dung - skill làm gì, khi nào dùng, ví dụ.\n",
|
||||
"agents": "---\nname: my-agent\ndescription: Khi nào gọi subagent này\ntools: Read, Grep\nmodel: sonnet\n---\n\nSystem prompt cho subagent.\n",
|
||||
"commands": "---\ndescription: Mô tả hiển thị trong menu /\n---\n\n/my-command làm gì.\n",
|
||||
"output-styles": "---\nname: my-style\ndescription: Mô tả kiểu xuất\n---\n\nChỉ thị về kiểu.\n",
|
||||
"memory": "# Bộ nhớ dự án\n\nClaude đọc tệp này khi bắt đầu phiên.\n",
|
||||
"auto-memory": "---\nname: my-fact\ndescription: Tóm tắt một dòng về sự kiện được ghi nhớ\nmetadata:\n type: feedback\n---\n\nNội dung cần ghi nhớ.\n"
|
||||
}
|
||||
},
|
||||
"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 đổi tên bản sao về vị trí cũ:",
|
||||
"size": "Kích thước",
|
||||
"created": "Tạo lúc",
|
||||
"type": "Loại",
|
||||
"scopeLabel": "Phạm vi",
|
||||
"filterAll": "Tất cả loại"
|
||||
},
|
||||
"explain": {
|
||||
"hooks": {
|
||||
"title": "Hooks ở đây cố tình chỉ đọc",
|
||||
"body": "Hooks nằm trong khối `hooks` của các tệp `settings.json` mà Claude Code liên tục ghi vào. Sửa từ dashboard sẽ tranh chấp với CLI đang chạy và có thể ngầm phá hỏng đường tiếp nhận sự kiện của chính dashboard (`hook-handler.js` bên dưới).",
|
||||
"howTo": "Tự sửa bằng một trong các cách:",
|
||||
"cmd1": "claude config /hooks",
|
||||
"cmd1Note": "Trình chỉnh sửa hooks tương tác trong Claude Code",
|
||||
"cmd2": "$EDITOR ~/.claude/settings.json",
|
||||
"cmd2Note": "Sửa thủ công khối hooks ở phạm vi user",
|
||||
"cmd3": "$EDITOR .claude/settings.json",
|
||||
"cmd3Note": "Sửa thủ công khối hooks ở phạm vi dự án"
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings ở đây cố tình chỉ đọc",
|
||||
"body": "Các tệp JSON này được CLI `claude` ghi đè mỗi khi đổi model, theme, bật plugin… Việc dashboard ghi sẽ tranh chấp với CLI và mất trạng thái.",
|
||||
"howTo": "Sửa settings qua chính Claude Code:",
|
||||
"cmd1": "claude config set <key> <value>",
|
||||
"cmd1Note": "Đặt một khoá riêng lẻ an toàn",
|
||||
"cmd2": "/config",
|
||||
"cmd2Note": "Mở giao diện config tương tác trong CLI",
|
||||
"cmd3": "$EDITOR ~/.claude/settings.json",
|
||||
"cmd3Note": "Sửa thủ công (chỉ khi không có process claude nào đang chạy)"
|
||||
},
|
||||
"plugins": {
|
||||
"title": "Plugin được CLI quản lý",
|
||||
"body": "Plugin là bundle có registry riêng - `installed_plugins.json` và đường dẫn cài trong `plugins/cache/`. Dashboard đọc thôi; install/uninstall giao cho `claude plugin …` để giữ registry nhất quán.",
|
||||
"install": "Cài plugin:",
|
||||
"installCmd": "claude plugin install <marketplace>/<plugin>",
|
||||
"uninstall": "Gỡ plugin này:",
|
||||
"uninstallButton": "Sao chép lệnh gỡ"
|
||||
},
|
||||
"mcp": {
|
||||
"title": "MCP server được CLI quản lý",
|
||||
"body": "Cấu hình MCP server nằm trong `~/.claude.json`, đúng tệp mà CLI đang chạy ghi liên tục. Ghi đồng thời từ dashboard sẽ phá hỏng trạng thái dự án, nên flow add/remove đi qua chính Claude Code.",
|
||||
"list": "Liệt kê server đã cấu hình:",
|
||||
"listCmd": "claude mcp list",
|
||||
"add": "Thêm server:",
|
||||
"addCmd": "claude mcp add <name> <command> [args…]",
|
||||
"remove": "Gỡ server này:",
|
||||
"removeButton": "Sao chép lệnh gỡ"
|
||||
}
|
||||
},
|
||||
"snippet": {
|
||||
"copy": "Sao chép",
|
||||
"copied": "Đã sao chép"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"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"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"title": "Tổng quan",
|
||||
"subtitle": "Góc nhìn thời gian thực về hoạt động Agent Claude Code",
|
||||
"totalSessions": "Tổng số phiên",
|
||||
"activeAgents": "Agent đang hoạt động",
|
||||
"activeSubagents": "Subagent đang hoạt động",
|
||||
"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",
|
||||
"noAgents": "Không có Agent đang hoạt động",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"notFound": {
|
||||
"code": "404",
|
||||
"title": "Không tìm thấy trang",
|
||||
"description": "Đường dẫn bạn yêu cầu không tồn tại. Hãy dùng điều hướng để quay về trang hợp lệ.",
|
||||
"goDashboard": "Đi tới Tổng quan",
|
||||
"goBack": "Quay lại"
|
||||
},
|
||||
"notifications": {
|
||||
"newSession": "Phiên mới",
|
||||
"sessionDefault": "Phiên ",
|
||||
"sessionError": "Lỗi phiên",
|
||||
"subagentSpawned": "Đã tạo Subagent",
|
||||
"finishedResponding": "Claude đã phản hồi xong",
|
||||
"readyForInput": "Sẵn sàng nhận đầu vào",
|
||||
"sessionCompleted": "Phiên đã hoàn tất",
|
||||
"sessionClosed": "Phiên đã đóng",
|
||||
"defaultTitle": "Claude Code",
|
||||
"defaultBody": "Thông báo"
|
||||
},
|
||||
"toolLegend": {
|
||||
"read": "Đọc",
|
||||
"write": "Ghi",
|
||||
"edit": "Sửa",
|
||||
"bash": "Bash",
|
||||
"grep": "Grep",
|
||||
"glob": "Glob",
|
||||
"agent": "Agent",
|
||||
"other": "Khác"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"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ự."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"action.clear": "xóa",
|
||||
"action.forget": "quên làn đường",
|
||||
"action.purge": "xóa lịch sử",
|
||||
"action.remove": "xóa bỏ",
|
||||
"action.reset": "đặt lại worktree",
|
||||
"action.start": "bắt đầu",
|
||||
"action.stop": "dừng",
|
||||
"actionError": "Thao tác làn đường thất bại: {{message}}",
|
||||
"actionErrorUnknown": "Lỗi không xác định",
|
||||
"add": "Thêm lane",
|
||||
"addLane": "Tạo lane từ một thư mục làm việc",
|
||||
"addLaneBaseLabel": "Nhánh để tạo nhánh mới",
|
||||
"addLaneNoBranches": "Repo này chưa có commit nào — worktree sẽ bắt đầu trống.",
|
||||
"addLaneNotARepo": "Chưa phải repo git (hoặc không có quyền đọc).",
|
||||
"addLaneRepoHint": "Một repo git có sẵn. Dashboard tự tạo worktree mới cho lane, không phải thư mục bạn chọn.",
|
||||
"addLaneRepoLabel": "Repo nguồn",
|
||||
"addLaneTitleLabel": "Tiêu đề",
|
||||
"addLaneTitlePlaceholder": "Không bắt buộc",
|
||||
"autoStage": "tự động: {{stage}}",
|
||||
"cardId": "Làn đường {{id}}",
|
||||
"confirmRemoveCancel": "Hủy",
|
||||
"confirmRemoveConfirm": "Xóa",
|
||||
"confirmRemoveMessage": "Hành động này không thể hoàn tác.",
|
||||
"confirmRemoveTitle": "Xóa làn đường?",
|
||||
"countDead": "đã chết",
|
||||
"countNeedsYou": "cần bạn",
|
||||
"countRunning": "đang chạy",
|
||||
"countTotal": "làn đường",
|
||||
"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 làn đường 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 làn đường như một Git worktree, nên không thể tiếp tục thao tác này.",
|
||||
"destructive.cancel": "Hủy",
|
||||
"destructive.count.bytesEstimate": "Dung lượng giải phóng (ước tính)",
|
||||
"destructive.count.dirty": "Tệp đã sửa",
|
||||
"destructive.count.events": "Sự kiện",
|
||||
"destructive.count.head": "HEAD",
|
||||
"destructive.count.sessions": "Phiên",
|
||||
"destructive.count.tokenRows": "Dòng token",
|
||||
"destructive.count.unpushed": "Commit chưa đẩy",
|
||||
"destructive.count.untracked": "Tệp chưa theo dõi",
|
||||
"destructive.force": "Tôi hiểu các commit chưa đẩy này sẽ bị loại bỏ.",
|
||||
"destructive.loading": "Đang tải trạng thái hiện tại…",
|
||||
"destructive.notice.activeSessionSkipped": "Một hoặc nhiều phiên trong làn đường này vẫn đang hoạt động và sẽ được giữ lại, không bị dọn.",
|
||||
"destructive.notice.adopted": "Làn đường này trỏ tới thư mục của bạn. Chỉ bản ghi trên bảng điều khiển bị xóa — thư mục và các tệp bên trong không bị thay đổi.",
|
||||
"destructive.notice.missing": "Thư mục làn đường đã không còn. Việc xóa chỉ bỏ bản ghi trên bảng điều khiển và dọn mục worktree cũ trong Git; không tệp nào bị xóa khỏi đĩa.",
|
||||
"destructive.notice.unreadable": "Không thể đọc thư mục làn đường như một Git worktree. Hệ thống sẽ thử xóa; nếu Git tự chối, mục ghi worktree của nó sẽ được dọn trực tiếp thay thế. Trong mọi trường hợp, thư mục vẫn không bị thay đổi.",
|
||||
"destructive.purge.confirm": "Xóa lịch sử",
|
||||
"destructive.purge.message": "Hãy xác nhận các số liệu hiện tại trước khi xóa lịch sử phiên đã lưu.",
|
||||
"destructive.purge.title": "Xóa lịch sử làn đường?",
|
||||
"destructive.remove.confirm": "Xóa làn đường",
|
||||
"destructive.remove.message": "Hãy xác nhận các số liệu hiện tại trước khi thực hiện thao tác này.",
|
||||
"destructive.remove.title": "Xóa làn đường?",
|
||||
"destructive.reset.confirm": "Đặt lại worktree",
|
||||
"destructive.reset.message": "Hãy xác nhận các số liệu hiện tại trước khi đặt lại worktree này.",
|
||||
"destructive.reset.survives": "Các tệp Git bỏ qua như node_modules và .env được giữ lại; các tệp chưa theo dõi sẽ bị xóa.",
|
||||
"destructive.reset.title": "Đặt lại worktree được quản lý?",
|
||||
"destructive.warning.no-remote": "Chưa cấu hình Git remote, nên không có bản sao lưu ở xa. Bạn vẫn có thể tiếp tục.",
|
||||
"emptyState": "Chưa có làn đường nào. Tạo một từ thư mục làm việc:",
|
||||
"git.uncommitted": "{{dirty}} đã sửa · {{untracked}} chưa theo dõi",
|
||||
"kind.adopted": "đã nhận",
|
||||
"kind.managed": "được quản lý",
|
||||
"laneHeader": "Làn đường {{id}} · {{title}} · {{pipeline}}",
|
||||
"moreActions": "Thêm hành động",
|
||||
"preflightError": "Không thể tải trạng thái làn đường hiện tại.",
|
||||
"preflightErrorWithMessage": "Không thể tải trạng thái làn đường hiện tại: {{message}}",
|
||||
"status.failed": "thất bại",
|
||||
"status.idle": "rảnh",
|
||||
"status.provisioning": "đang khởi tạo",
|
||||
"status.running": "đang chạy",
|
||||
"statusDead": "ĐÃ CHẾT",
|
||||
"title": "Làn đường",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"activityFeed": "Luồng hoạt động",
|
||||
"agentBoard": "Bảng Kanban",
|
||||
"analytics": "Phân tích",
|
||||
"avg": "TB",
|
||||
"brand": "Bảng điều khiển Agent",
|
||||
"brandSub": "Giám sát Claude Code",
|
||||
"ccConfig": "Cấu hình Claude",
|
||||
"checkFailed": "Kiểm tra cập nhật thất bại",
|
||||
"checkForUpdates": "Kiểm tra cập nhật",
|
||||
"checkingForUpdates": "Đang kiểm tra cập nhật...",
|
||||
"close": "Đóng",
|
||||
"collapse": "Thu gọn thanh bên",
|
||||
"collapseShort": "Thu gọn",
|
||||
"connection": "Kết nối",
|
||||
"connectionDetails": "Chi tiết kết nối",
|
||||
"connectionUptime": "Đã kết nối",
|
||||
"dashboard": "Tổng quan",
|
||||
"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",
|
||||
"noEventsYet": "Chưa có sự kiện",
|
||||
"notConnected": "Chưa kết nối",
|
||||
"notFound": "Không tìm thấy",
|
||||
"peakRate": "Đỉnh",
|
||||
"recentActivity": "Hoạt động gần đây",
|
||||
"resetStats": "Đặt lại",
|
||||
"scrollDown": "Cuộn danh mục xuống",
|
||||
"scrollUp": "Cuộn danh mục lên",
|
||||
"secondsAgo": "{{count}} giây trước",
|
||||
"sessions": "Phiên",
|
||||
"settings": "Cài đặt",
|
||||
"skipToContent": "Bỏ qua đến nội dung",
|
||||
"statsPersisted": "Số liệu được lưu sau khi tải lại",
|
||||
"switchLanguage": "Chuyển sang {{language}}",
|
||||
"throughput60s": "Lưu lượng · 60s qua",
|
||||
"topEventTypes": "Loại sự kiện phổ biến",
|
||||
"unitEvents": "sự kiện",
|
||||
"unitPerSec": "sự kiện/s",
|
||||
"upToDate": "Đã là mới nhất",
|
||||
"updateAvailable": "Có bản cập nhật",
|
||||
"website": "Website",
|
||||
"workflows": "Quy trình",
|
||||
"workspace": "Không gian làm việc",
|
||||
"wsEndpoint": "WebSocket"
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
{
|
||||
"actions": {
|
||||
"newRun": "Lượt chạy mới",
|
||||
"send": "Gửi",
|
||||
"sending": "Đang gửi…",
|
||||
"start": "Chạy",
|
||||
"starting": "Đang khởi động…",
|
||||
"stop": "Dừng",
|
||||
"stopping": "Đang dừng…",
|
||||
"viewSession": "Xem phiên"
|
||||
},
|
||||
"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 `claude` trong PATH. Cài đặt Claude Code 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ì"
|
||||
},
|
||||
"errors": {
|
||||
"attachFailed": "Không gắn được vào run: {{message}}",
|
||||
"cwdRequired": "Cần thư mục làm việc để bắt đầu run",
|
||||
"killFailed": "Không dừng được: {{message}}",
|
||||
"laneCreateFailed": "Không thể tạo làn đường: {{message}}",
|
||||
"noLaneSelected": "Chưa chọn làn đường hoặc không thể tạo làn đường",
|
||||
"noRunIdReturned": "Không trả về ID run từ khởi động làn đường",
|
||||
"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}}",
|
||||
"startFailed": "Không khởi động đượ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": {
|
||||
"cwd": "Thư mục làm việc",
|
||||
"cwdGroups": {
|
||||
"dashboard": "Dashboard server",
|
||||
"home": "Home",
|
||||
"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ĩ",
|
||||
"model": "Model",
|
||||
"modelCustom": "Tuỳ chỉnh…",
|
||||
"modelCustomPlaceholder": "model id (vd: claude-opus-4-7-20260101)",
|
||||
"modelInheritLabel": "Kế thừa từ settings",
|
||||
"permissionAcceptEdits": "acceptEdits (khuyên dùng)",
|
||||
"permissionBypass": "bypassPermissions (NGUY HIỂM - cho phép tất cả mà không hỏi)",
|
||||
"permissionDefault": "default (prompt tương tác - headless sẽ treo)",
|
||||
"permissionMode": "Permission mode",
|
||||
"permissionPlan": "plan (chỉ đọc, lập kế hoạch)",
|
||||
"prompt": "Prompt",
|
||||
"promptPlaceholder": "Hỏi Claude bất cứ điều gì…"
|
||||
},
|
||||
"footer": {
|
||||
"cost": "Chi phí",
|
||||
"duration": "Thời lượng",
|
||||
"exitCode": "Exit code",
|
||||
"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.",
|
||||
"shortcut": "Cmd+Enter / Ctrl+Enter để gửi"
|
||||
},
|
||||
"limitations": {
|
||||
"dismiss": "Đã rõ"
|
||||
},
|
||||
"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",
|
||||
"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.",
|
||||
"resumeOption": "Tiếp tục phiên đã có",
|
||||
"search": "Tìm theo ID, cwd hoặc status…",
|
||||
"selectedBadge": "Đang tiếp tục"
|
||||
},
|
||||
"runs": {
|
||||
"allSessionsLink": "Xem tất cả phiên Claude Code →",
|
||||
"attached": "Đã gắn vào run đang chạy",
|
||||
"scopeNote": "Chỉ hiển thị các run bạn khởi chạy từ dashboard này.",
|
||||
"started": "Bắt đầu lúc {{when}}",
|
||||
"switcher": "Run đang chạy",
|
||||
"switcherEmpty": "Không có run đang chạy",
|
||||
"viewActive": "Xem run đang chạy",
|
||||
"viewActive_other": "{{count}} run đang chạy",
|
||||
"viewLabel": "Xem"
|
||||
},
|
||||
"status": {
|
||||
"abandoned": "Bị bỏ",
|
||||
"completed": "Hoàn tất",
|
||||
"error": "Lỗi",
|
||||
"idle": "Rảnh",
|
||||
"killed": "Đã dừng",
|
||||
"running": "Đang chạy",
|
||||
"spawning": "Khởi động…"
|
||||
},
|
||||
"statusHeader": {
|
||||
"cwd": "Cwd",
|
||||
"duration": "Đã chạy",
|
||||
"effort": "Effort",
|
||||
"envelopes": "Sự kiện",
|
||||
"model": "Model",
|
||||
"permissionMode": "Mode",
|
||||
"session": "Session"
|
||||
},
|
||||
"subtitle": "Khởi chạy một phiên Claude Code ngay trong dashboard. Stream output trực tiếp, hội thoại đa lượt, và chia sẻ cùng pipeline hooks/analytics với phiên ở terminal.",
|
||||
"title": "Chạy Claude",
|
||||
"tokens": {
|
||||
"cacheRead": "Cache hit",
|
||||
"cost": "Chi phí",
|
||||
"input": "Input",
|
||||
"label": "Context",
|
||||
"output": "Output"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"title": "Phiên",
|
||||
"searchPlaceholder": "Tìm phiên...",
|
||||
"filterAll": "Tất cả",
|
||||
"filterActive": "Đang hoạt động",
|
||||
"filterWaiting": "Đang chờ",
|
||||
"filterCompleted": "Hoàn tất",
|
||||
"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.",
|
||||
"tableSession": "Phiên",
|
||||
"tableStatus": "Trạng thái",
|
||||
"tableLastActive": "Hoạt động gần nhất",
|
||||
"tableDuration": "Thời lượng",
|
||||
"tableAgents": "Agent",
|
||||
"tableCost": "Chi phí",
|
||||
"tableDirectory": "Thư mục",
|
||||
"defaultName": "Phiên ",
|
||||
"detail": {
|
||||
"waitingBanner": {
|
||||
"title": "Đang chờ phản hồi của bạn",
|
||||
"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}})",
|
||||
"transcriptNotFound": "Không tìm thấy bản ghi hội thoại cho agent này. Tệp transcript có thể bị thiếu hoặc chưa được liên kết."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,435 @@
|
||||
{
|
||||
"title": "Cài đặt",
|
||||
"subtitle": "Quản lý định giá, thông báo, dữ liệu và hooks",
|
||||
"exportData": "Xuất dữ liệu",
|
||||
"acrossSessions": "Trên toàn bộ phiên đang được theo dõi",
|
||||
"basedOnUsage": "Dựa trên mức dùng token theo mô hình",
|
||||
"tabby": {
|
||||
"title": "Bạn đồng hành Tabby",
|
||||
"description": "Chú mèo nổi phản ứng với các phiên trực tiếp của bạn.",
|
||||
"enable": "Hiện Tabby",
|
||||
"enableDesc": "Hiển thị bạn đồng hành ở góc trên toàn bảng điều khiển (⌘B để mở)"
|
||||
},
|
||||
"pricing": {
|
||||
"title": "Định giá mô hình",
|
||||
"description": "Đơn giá theo một triệu token (USD). Dùng % làm ký tự đại diện trong mẫu. Một số mô hình có mức giá giới thiệu có thời hạn (hiển thị màu tím); usage vào hoặc trước ngày kết thúc tính theo mức đó, sau đó tính theo mức chuẩn.",
|
||||
"introNote": "Ưu đãi ${{input}}/${{output}} đến {{until}}",
|
||||
"introRatesTitle": "Giá giới thiệu",
|
||||
"introRatesHint": "Để trống ngày nếu không có ưu đãi",
|
||||
"introUntil": "Đến (ngày)",
|
||||
"introUntilInvalid": "Ngày kết thúc ưu đãi phải theo định dạng YYYY-MM-DD",
|
||||
"resetConfirm": "Xác nhận đặt lại",
|
||||
"resetDefaults": "Khôi phục mặc định",
|
||||
"resetResult": "Đã đặt lại về {{count}} quy tắc mặc định",
|
||||
"addModel": "Thêm mô hình",
|
||||
"pattern": "Mẫu",
|
||||
"patternPlaceholder": "claude-opus-4%",
|
||||
"namePlaceholder": "Claude Opus 4",
|
||||
"validationRequired": "Bắt buộc nhập mẫu và tên hiển thị",
|
||||
"lastUpdated": "Cập nhật lần cuối: ",
|
||||
"tooltip": {
|
||||
"title": "Cách hoạt động của định giá mô hình",
|
||||
"howItWorks": "Cách hoạt động",
|
||||
"howItWorksBody": "Khi một phiên báo cáo mức dùng, dashboard tìm quy tắc định giá đầu tiên có mẫu khớp với model id, rồi nhân (token đầu vào / 1 triệu) và (token đầu ra / 1 triệu) với các đơn giá bên dưới để tính chi phí. Quy tắc được duyệt từ trên xuống - quy tắc khớp đầu tiên sẽ được dùng.",
|
||||
"patternsTitle": "Cú pháp mẫu",
|
||||
"patternsBody": "Mẫu là dạng glob kiểu SQL. % là ký tự đại diện khớp với bất kỳ chuỗi nào. Ví dụ: claude-opus-4-7% khớp mọi model id bắt đầu bằng claude-opus-4-7 (ví dụ claude-opus-4-7, claude-opus-4-7-20260101). claude-%-haiku khớp mọi biến thể haiku. Một id chính xác như claude-sonnet-4-6 chỉ khớp với chính nó.",
|
||||
"manualUpdates": "Bạn phải cập nhật giá thủ công",
|
||||
"manualUpdatesBody": "Anthropic công bố thay đổi giá trên website của họ - không có nguồn dữ liệu trực tiếp. Khi có model mới ra mắt hoặc đơn giá thay đổi, hãy chỉnh sửa quy tắc tương ứng (hoặc thêm quy tắc mới ở phía trên quy tắc bao quát) để những phiên ghi nhận sau này được tính phí chính xác. Phiên đã lưu vẫn giữ nguyên giá đã áp dụng tại thời điểm nạp.",
|
||||
"apiPricing": "Chỉ để tham khảo - đơn giá API",
|
||||
"apiPricingBody": "Đây là đơn giá API trả theo lượng dùng. Nếu bạn dùng Claude Code theo gói thuê bao (Pro, Max, Team hoặc Enterprise), chi phí thực tế là phí cố định hàng tháng chứ không tính theo token - nên những con số ở đây thường cao hơn số tiền bạn thực trả. Hãy xem chi phí ở đây là ước tính mức dùng để tham khảo, không phải hóa đơn."
|
||||
},
|
||||
"cacheWrite5m": "Ghi bộ nhớ đệm (5m)",
|
||||
"cacheWrite1h": "Ghi bộ nhớ đệm (1h)",
|
||||
"fastInput": "Fast Input",
|
||||
"fastOutput": "Fast Output"
|
||||
},
|
||||
"claudeHome": {
|
||||
"title": "CLAUDE_HOME",
|
||||
"description": "Thư mục gốc chứa dữ liệu phiên Claude Code. Thay đổi sẽ cập nhật ngay đường dẫn quét cho transcript và import.",
|
||||
"save": "Lưu",
|
||||
"saving": "Đang lưu...",
|
||||
"current": "Hiện tại:",
|
||||
"placeholder": "/đường-dẫn/tới/claude-home",
|
||||
"saveFailed": "Cập nhật CLAUDE_HOME thất bại"
|
||||
},
|
||||
"hooks": {
|
||||
"title": "Cấu hình hook",
|
||||
"description": "Hooks của Claude Code chuyển tiếp sự kiện về dashboard theo thời gian thực.",
|
||||
"allInstalled": "Đã cài đầy đủ hooks",
|
||||
"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"
|
||||
},
|
||||
"notifications": {
|
||||
"title": "Thông báo",
|
||||
"description": "Thông báo trình duyệt cho các sự kiện quan trọng. Cần cấp quyền.",
|
||||
"enable": "Bật thông báo trình duyệt",
|
||||
"granted": "Đã cấp quyền",
|
||||
"blocked": "Đã chặn quyền",
|
||||
"required": "Cần cấp quyền",
|
||||
"notifyWhen": "Thông báo cho tôi khi...",
|
||||
"newSession": "Phiên mới bắt đầu",
|
||||
"sessionComplete": "Phiên hoàn tất",
|
||||
"sessionError": "Phiên gặp lỗi",
|
||||
"subagentSpawned": "Subagent được tạo",
|
||||
"testTitle": "Agent Monitor",
|
||||
"testBody": "Thông báo đang hoạt động!",
|
||||
"sendTest": "Gửi thông báo thử",
|
||||
"disabledInfo": "Thông báo đang tắt - bật để nhận cảnh báo sự kiện phiên"
|
||||
},
|
||||
"import": {
|
||||
"title": "Nhập lịch sử",
|
||||
"description": "Đưa các phiên Claude Code hiện có vào dashboard. Số token, chi phí theo mô hình, lần nén ngữ cảnh, subagent, lượt dùng tool và thời lượng từng lượt được dựng lại từ chính các transcript JSONL gốc - y hệt cách phiên trực tiếp được ghi nhận.",
|
||||
"accuracyNote": "Chạy lại nhiều lần luôn an toàn. Phiên được khử trùng lặp theo session ID, và mốc nén ngữ cảnh đảm bảo tổng token không bao giờ bị tính trùng.",
|
||||
"supportedFiles": "Định dạng được hỗ trợ: .jsonl, .meta.json, .zip, .tar, .tar.gz, .tgz, .gz",
|
||||
"instructions": "Cách thu thập lịch sử của bạn",
|
||||
"stepLocate": "1. Tìm lịch sử Claude Code của bạn",
|
||||
"stepLocateBody": "Mỗi phiên Claude Code được lưu thành một transcript JSONL trong thư mục projects. Mỗi thư mục con được đặt tên theo thư mục làm việc nơi phiên bắt đầu (dấu / đổi thành -).",
|
||||
"stepArchive": "2. Đóng gói để chuyển (tuỳ chọn)",
|
||||
"stepArchiveBody": "Để chuyển lịch sử từ máy khác, hãy nén toàn bộ thư mục trước, rồi sao chép qua (AirDrop, scp, USB, lưu trữ đám mây):",
|
||||
"stepChoose": "3. Chọn chế độ nhập bên dưới",
|
||||
"stepChooseBody": "Quét lại vị trí mặc định, trỏ tới thư mục bạn đã giải nén lịch sử, hoặc tải tệp/lưu trữ trực tiếp.",
|
||||
"stepVerify": "4. Kiểm tra token và chi phí",
|
||||
"stepVerifyBody": "Sau khi nhập xong, mở Analytics → Cost để kiểm tra phân tích chi phí. Nhập lại cùng một phiên luôn an toàn.",
|
||||
"defaultLocation": "Vị trí mặc định trên máy này",
|
||||
"locationFound": "Đã tìm thấy thư mục",
|
||||
"locationMissing": "Không tìm thấy thư mục",
|
||||
"projectsLabel": "dự án",
|
||||
"jsonlLabel": "tệp JSONL",
|
||||
"modeRescan": "Quét lại thư mục mặc định",
|
||||
"modeRescanDesc": "Đọc lại ~/.claude/projects và nhập mọi thứ mới.",
|
||||
"modeFolder": "Quét một thư mục",
|
||||
"modeFolderDesc": "Quét bất kỳ thư mục nào trên máy để tìm transcript JSONL (đệ quy thư mục con).",
|
||||
"modeUpload": "Tải tệp lên",
|
||||
"modeUploadDesc": "Kéo thả tệp JSONL hoặc lưu trữ (.zip / .tar.gz) trực tiếp vào trình duyệt.",
|
||||
"modeBackup": "Khôi phục sao lưu",
|
||||
"modeBackupDesc": "Nhập tệp xuất của bảng điều khiển (.json) — gộp lịch sử từ máy khác vào.",
|
||||
"backupHint": "Kéo tệp .json đã xuất vào đây hoặc bấm để chọn",
|
||||
"backupSub": "Tệp do nút Xuất dữ liệu tạo ra (đầu trang Cài đặt)",
|
||||
"runRestore": "Khôi phục",
|
||||
"backupResult": {
|
||||
"title": "Khôi phục hoàn tất",
|
||||
"sessionsImported": "Phiên đã thêm: {{count}}",
|
||||
"sessionsSkipped": "Đã có sẵn: {{count}}",
|
||||
"events": "Sự kiện: {{count}}",
|
||||
"pricing": "Quy tắc giá: {{count}}",
|
||||
"detail": "{{agents}} agent · {{workflows}} quy trình · {{runs}} lần chạy · {{rules}} quy tắc cảnh báo"
|
||||
},
|
||||
"folderPlaceholder": "/đường-dẫn-tuyệt-đối/tới/claude-history",
|
||||
"folderHelper": "Đường dẫn tuyệt đối. Ký tự ~ sẽ được mở rộng. Thư mục con được quét đệ quy.",
|
||||
"runRescan": "Quét lại ngay",
|
||||
"runScan": "Quét thư mục",
|
||||
"runUpload": "Tải lên & nhập",
|
||||
"dropzoneHint": "Kéo thả tệp vào đây hoặc bấm để chọn",
|
||||
"dropzoneSub": "Chấp nhận .jsonl, .meta.json, .zip, .tar, .tar.gz, .tgz, .gz",
|
||||
"filesSelected": "Đã chọn {{count}} tệp",
|
||||
"clearSelection": "Xóa lựa chọn",
|
||||
"copy": "Sao chép",
|
||||
"copied": "Đã sao chép",
|
||||
"progress": {
|
||||
"scan": "Đang quét thư mục...",
|
||||
"extract": "Đang giải nén ({{processed}}/{{total}})...",
|
||||
"parse": "Đang phân tích transcript ({{processed}}/{{total}})...",
|
||||
"complete": "Nhập hoàn tất",
|
||||
"error": "Nhập thất bại"
|
||||
},
|
||||
"result": {
|
||||
"imported": "Đã nhập: {{count}}",
|
||||
"backfilled": "Đã làm giàu phiên cũ: {{count}}",
|
||||
"skipped": "Đã cập nhật trước đó: {{count}}",
|
||||
"errors": "Lỗi: {{count}}",
|
||||
"filesScanned": "Tệp đã quét: {{count}}",
|
||||
"title": "Kết quả nhập gần nhất"
|
||||
},
|
||||
"errors": {
|
||||
"noFiles": "Chưa chọn tệp nào",
|
||||
"noJsonl": "Không tìm thấy tệp .jsonl trong nội dung tải lên",
|
||||
"pathRequired": "Cần nhập đường dẫn",
|
||||
"pathInvalid": "Đường dẫn phải là tuyệt đối",
|
||||
"pathNotFound": "Đường dẫn không tồn tại",
|
||||
"pathNotDir": "Đường dẫn không phải thư mục",
|
||||
"generic": "Nhập thất bại: {{message}}"
|
||||
}
|
||||
},
|
||||
"data": {
|
||||
"title": "Quản lý dữ liệu",
|
||||
"description": "Thông tin cơ sở dữ liệu, nhập/xuất và dọn dẹp.",
|
||||
"dbOverview": "Tổng quan cơ sở dữ liệu",
|
||||
"dbSize": "Kích thước CSDL",
|
||||
"loadingDb": "Đang tải thông tin cơ sở dữ liệu...",
|
||||
"sessionCleanup": "Dọn dẹp phiên",
|
||||
"cleanupDesc": "Đánh dấu bỏ dở các phiên cũ và xóa dữ liệu cũ",
|
||||
"abandonAfter": "Đánh dấu bỏ dở phiên đang hoạt động cũ hơn",
|
||||
"purgeAfter": "Xóa phiên hoàn tất/lỗi cũ hơn",
|
||||
"confirmCleanup": "Xác nhận dọn dẹp",
|
||||
"runCleanup": "Chạy dọn dẹp",
|
||||
"nothingToClean": "Không có gì để dọn dẹp",
|
||||
"abandonedResult": " phiên đã bị bỏ dở",
|
||||
"purgedResult": " phiên đã xóa ({{events}} sự kiện, {{agents}} Agent)"
|
||||
},
|
||||
"danger": {
|
||||
"title": "Vùng nguy hiểm",
|
||||
"description": "Các thao tác không thể hoàn tác, xóa dữ liệu vĩnh viễn",
|
||||
"warning": "Thao tác này sẽ xóa toàn bộ phiên, Agent, sự kiện và dữ liệu token. Bạn chắc chứ?",
|
||||
"yesClearAll": "Có, xóa tất cả",
|
||||
"clearAllData": "Xóa toàn bộ dữ liệu",
|
||||
"clearedResult": "Đã xóa {{count}} dòng"
|
||||
},
|
||||
"about": {
|
||||
"title": "Giới thiệu",
|
||||
"description": "Thông tin runtime của máy chủ.",
|
||||
"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ủ..."
|
||||
},
|
||||
"tables": {
|
||||
"sessions": "phiên",
|
||||
"agents": "Agent",
|
||||
"events": "sự kiện",
|
||||
"sessionsWithCost": "phiên có chi phí",
|
||||
"pricingRules": "quy tắc định giá"
|
||||
},
|
||||
"messages": {
|
||||
"failedLoad": "Tải dữ liệu thất bại",
|
||||
"failedSave": "Lưu thất bại",
|
||||
"failedDelete": "Xóa thất bại",
|
||||
"unknownError": "Không xác định",
|
||||
"actionFailed": "Lỗi: {{message}}"
|
||||
},
|
||||
"webhooks": {
|
||||
"title": "Thông báo Webhook",
|
||||
"description": "Chuyển tiếp cảnh báo đã kích hoạt tới Slack, Discord, Microsoft Teams hoặc bất kỳ endpoint HTTP nào. Gửi tự động, thử lại khi lỗi và không bao giờ chặn việc giám sát.",
|
||||
"count_one": "{{count}} đích",
|
||||
"count_other": "{{count}} đích",
|
||||
"add": "Thêm Webhook",
|
||||
"loading": "Đang tải webhook…",
|
||||
"empty": "Chưa cấu hình webhook nào. Thêm một cái để chuyển tiếp cảnh báo tới Slack, Discord, Teams hoặc endpoint tùy chỉnh.",
|
||||
"scopedTo_one": "{{count}} quy tắc",
|
||||
"scopedTo_other": "{{count}} quy tắc",
|
||||
"enabled": "Đã bật",
|
||||
"test": "Thử",
|
||||
"edit": "Sửa",
|
||||
"delete": "Xóa",
|
||||
"confirmDelete": "Xác nhận",
|
||||
"testOk": "Đã gửi (HTTP {{status}})",
|
||||
"testFail": "Thất bại: {{error}}",
|
||||
"addTitle": "Webhook mới",
|
||||
"editTitle": "Sửa Webhook",
|
||||
"fieldName": "Tên",
|
||||
"fieldNamePlaceholder": "vd: Slack nhóm #alerts",
|
||||
"fieldType": "Loại",
|
||||
"type": {
|
||||
"slack": "Slack",
|
||||
"discord": "Discord",
|
||||
"teams": "Microsoft Teams",
|
||||
"generic": "Tùy chỉnh (JSON)"
|
||||
},
|
||||
"fieldUrl": "URL Webhook",
|
||||
"urlKeepHint": "để trống để giữ nguyên",
|
||||
"urlKeepPlaceholder": "•••••••• (không đổi)",
|
||||
"urlPlaceholder": {
|
||||
"slack": "https://hooks.slack.com/services/…",
|
||||
"discord": "https://discord.com/api/webhooks/…",
|
||||
"teams": "https://outlook.office.com/webhook/…",
|
||||
"generic": "https://example.com/webhook"
|
||||
},
|
||||
"fieldSecret": "Khóa ký (tùy chọn)",
|
||||
"secretPlaceholder": "Khóa HMAC-SHA256",
|
||||
"secretKeepPlaceholder": "•••••••• (để trống để giữ nguyên)",
|
||||
"secretHint": "Khi đặt, yêu cầu được ký bằng header X-Webhook-Signature.",
|
||||
"fieldHeaders": "Header tùy chỉnh (tùy chọn)",
|
||||
"replaceHeaders": "Thay header",
|
||||
"headerKey": "Header",
|
||||
"headerValue": "Giá trị",
|
||||
"addHeader": "Thêm header",
|
||||
"scopeAll": "Nhận cảnh báo từ tất cả quy tắc",
|
||||
"enabledOnSave": "Bật",
|
||||
"save": "Lưu",
|
||||
"create": "Tạo",
|
||||
"cancel": "Hủy",
|
||||
"urlOptional": "ghi đè tùy chọn",
|
||||
"urlAuto": "URL được đặt tự động từ thông tin xác thực bên dưới.",
|
||||
"deleteTitle": "Xóa webhook?",
|
||||
"deleteMessage": "Xóa \"{{name}}\"? Cảnh báo sẽ ngừng được gửi tới đích này. Không thể hoàn tác.",
|
||||
"guideToggle": "Cách thiết lập {{provider}}",
|
||||
"guideDocs": "Tài liệu chính thức của {{provider}}",
|
||||
"guideStaleNote": "Giao diện thiết lập của nhà cung cấp thường thay đổi nên các bước này có thể đã lỗi thời - hãy luôn kiểm tra tài liệu chính thức."
|
||||
},
|
||||
"alertsHub": {
|
||||
"title": "Cảnh báo",
|
||||
"description": "Định nghĩa quy tắc cảnh báo, định tuyến tới các kênh webhook và xem những gì đã kích hoạt - tất cả ở một nơi.",
|
||||
"tabRules": "Quy tắc",
|
||||
"tabChannels": "Kênh",
|
||||
"tabActivity": "Hoạt động",
|
||||
"rulesHint": "Điều kiện kích hoạt cảnh báo. Được đánh giá ở phía máy chủ trên luồng sự kiện trực tiếp.",
|
||||
"rulesEmptyHint": "Thêm quy tắc để bắt đầu cảnh báo về lỗi, không hoạt động, agent bị treo hoặc ngưỡng token."
|
||||
},
|
||||
"jumpTo": "Chuyển tới",
|
||||
"webhookGuides": {
|
||||
"slack": {
|
||||
"steps": [
|
||||
"Tạo hoặc mở một Slack app tại api.slack.com/apps.",
|
||||
"Bật 'Incoming Webhooks', rồi nhấn 'Add New Webhook to Workspace'.",
|
||||
"Chọn kênh để đăng và cấp quyền.",
|
||||
"Sao chép URL được tạo (https://hooks.slack.com/services/…) và dán vào ô trên."
|
||||
]
|
||||
},
|
||||
"discord": {
|
||||
"steps": [
|
||||
"Mở server → Cài đặt máy chủ → Tích hợp → Webhook.",
|
||||
"Nhấn 'New Webhook', chọn kênh, đổi tên nếu muốn.",
|
||||
"Nhấn 'Copy Webhook URL' và dán vào ô trên."
|
||||
]
|
||||
},
|
||||
"teams": {
|
||||
"steps": [
|
||||
"Trong kênh Teams mục tiêu, nhấn ⋯ → 'Workflows'.",
|
||||
"Chọn mẫu 'Post to a channel when a webhook request is received'.",
|
||||
"Hoàn tất luồng và sao chép URL HTTP POST được tạo.",
|
||||
"Dán vào ô trên. (Office 365 connector cũ đã ngừng năm 2025 - dùng Workflows.)"
|
||||
]
|
||||
},
|
||||
"google_chat": {
|
||||
"steps": [
|
||||
"Mở không gian Google Chat → tên không gian → 'Ứng dụng & tích hợp'.",
|
||||
"Nhấn 'Webhooks' → 'Add webhook' và đặt tên.",
|
||||
"Sao chép URL webhook và dán vào ô trên."
|
||||
]
|
||||
},
|
||||
"mattermost": {
|
||||
"steps": [
|
||||
"Menu chính → Tích hợp → Incoming Webhooks (quản trị viên phải bật webhook trước).",
|
||||
"Nhấn 'Add Incoming Webhook' và chọn kênh.",
|
||||
"Lưu, rồi sao chép URL webhook và dán vào ô trên."
|
||||
]
|
||||
},
|
||||
"rocketchat": {
|
||||
"steps": [
|
||||
"Quản trị → Tích hợp → New → Incoming.",
|
||||
"Bật nó, chọn kênh và lưu.",
|
||||
"Sao chép 'Webhook URL' và dán vào ô trên."
|
||||
]
|
||||
},
|
||||
"telegram": {
|
||||
"steps": [
|
||||
"Nhắn @BotFather, chạy /newbot và sao chép bot token.",
|
||||
"Thêm bot vào nhóm/kênh của bạn (hoặc nhắn riêng cho nó).",
|
||||
"Tìm chat ID: gửi một tin nhắn, mở https://api.telegram.org/bot<token>/getUpdates, đọc result[].message.chat.id.",
|
||||
"Nhập Bot token và Chat ID ở trên - không cần URL."
|
||||
]
|
||||
},
|
||||
"pagerduty": {
|
||||
"steps": [
|
||||
"Mở Service mục tiêu → Integrations → 'Add integration'.",
|
||||
"Chọn 'Events API v2'.",
|
||||
"Sao chép Integration Key (routing key).",
|
||||
"Nhập làm Routing key ở trên - URL Events API đã được điền sẵn."
|
||||
]
|
||||
},
|
||||
"opsgenie": {
|
||||
"steps": [
|
||||
"Settings → Integrations → thêm tích hợp 'API'.",
|
||||
"Sao chép API key được tạo.",
|
||||
"Ghi nhớ vùng tài khoản (US hoặc EU).",
|
||||
"Nhập API key và vùng ở trên - URL cảnh báo được suy ra từ vùng."
|
||||
]
|
||||
},
|
||||
"splunk_oncall": {
|
||||
"steps": [
|
||||
"Integrations → REST Endpoint, và bật nó.",
|
||||
"Sao chép REST URL - nó đã chứa API key của bạn.",
|
||||
"Thay '$routing_key' ở cuối bằng một routing key của bạn.",
|
||||
"Dán URL đầy đủ vào ô trên."
|
||||
]
|
||||
},
|
||||
"zapier": {
|
||||
"steps": [
|
||||
"Tạo một Zap với trigger 'Webhooks by Zapier' → 'Catch Hook'.",
|
||||
"Sao chép URL webhook tùy chỉnh mà nó cấp.",
|
||||
"Dán vào ô trên. Cảnh báo đến dạng JSON: { event, alert }."
|
||||
]
|
||||
},
|
||||
"make": {
|
||||
"steps": [
|
||||
"Thêm module 'Webhooks' → 'Custom webhook' làm bước đầu của scenario.",
|
||||
"Nhấn 'Add', tạo hook và sao chép URL.",
|
||||
"Dán vào ô trên, rồi chạy một lần để Make học cấu trúc payload."
|
||||
]
|
||||
},
|
||||
"n8n": {
|
||||
"steps": [
|
||||
"Thêm node 'Webhook' vào workflow; đặt method là POST.",
|
||||
"Sao chép Production URL.",
|
||||
"Kích hoạt workflow và dán URL vào ô trên (http được phép cho bản tự host)."
|
||||
]
|
||||
},
|
||||
"pipedream": {
|
||||
"steps": [
|
||||
"Tạo workflow với trigger 'HTTP / Webhook'.",
|
||||
"Sao chép URL endpoint duy nhất.",
|
||||
"Dán vào ô trên; xem các lần gửi trong trình kiểm tra sự kiện của Pipedream."
|
||||
]
|
||||
},
|
||||
"generic": {
|
||||
"steps": [
|
||||
"Trỏ tới bất kỳ endpoint nào nhận JSON POST (https, hoặc http để thử cục bộ).",
|
||||
"Cấu trúc body: { event: 'alert.triggered', source, sent_at, alert: { … } }.",
|
||||
"Tùy chọn: đặt khóa ký (HMAC-SHA256 trên body → header X-Webhook-Signature) và header tùy chỉnh.",
|
||||
"Mẹo: dùng công cụ miễn phí như webhook.site để xem payload chính xác."
|
||||
]
|
||||
}
|
||||
},
|
||||
"remoteSources": {
|
||||
"title": "Nguồn dữ liệu từ xa",
|
||||
"description": "Thu thập mức sử dụng Claude Code từ các máy khác qua SSH - ví dụ một máy dev hoặc máy ảo trên cloud mà bạn điều khiển qua SSH trong khi chạy bảng điều khiển này cục bộ. Xác thực dùng cấu hình SSH của chính bạn (~/.ssh/config, khóa, agent); không có mật khẩu nào được lưu ở đây.",
|
||||
"scopeTitle": "Phạm vi dữ liệu",
|
||||
"scopeDesc": "Chọn dữ liệu của những máy nào sẽ hiển thị trên toàn bộ bảng điều khiển. Thay đổi được áp dụng ngay lập tức trên mọi trang — phiên, phân tích và chi phí.",
|
||||
"scopeAll": "Tất cả nguồn",
|
||||
"scopeAllDesc": "Máy này cùng với mọi nguồn từ xa đã cấu hình, kết hợp lại.",
|
||||
"scopeLocal": "Chỉ máy này",
|
||||
"scopeLocalDesc": "Chỉ các phiên được thu thập cục bộ — ẩn toàn bộ dữ liệu nguồn từ xa.",
|
||||
"scopeSelected": "Nguồn đã chọn",
|
||||
"scopeSelectedDesc": "Chọn chính xác những máy cần đưa vào, bên dưới.",
|
||||
"scopeSelectedCount": "Đã chọn {{n}} trong {{total}}",
|
||||
"scopePickMachines": "Máy cần đưa vào",
|
||||
"thisMachine": "Máy này",
|
||||
"listTitle": "Nguồn đã cấu hình",
|
||||
"add": "Thêm nguồn",
|
||||
"addTitle": "Thêm nguồn từ xa",
|
||||
"editTitle": "Sửa nguồn",
|
||||
"fieldLabel": "Nhãn",
|
||||
"fieldHost": "Máy chủ SSH",
|
||||
"fieldPort": "Cổng (tùy chọn)",
|
||||
"fieldIdentity": "Tệp danh tính (tùy chọn)",
|
||||
"fieldRemoteHome": "Thư mục Claude từ xa (tùy chọn)",
|
||||
"fieldRemoteHomeHint": "Linux/macOS: mặc định ~/.claude (hoặc đường dẫn tuyệt đối như /home/you/.claude). SSH vào Windows mà Claude chạy trong WSL: để trống (tự phát hiện) hoặc dùng wsl:~/.claude. Windows thuần: C:/Users/you/.claude.",
|
||||
"fieldEnabled": "Tự động đồng bộ ở chế độ nền",
|
||||
"empty": "Chưa có nguồn từ xa nào.",
|
||||
"emptyHint": "Thêm một máy bạn kết nối qua SSH để kéo dữ liệu sử dụng Claude Code của máy đó về.",
|
||||
"paused": "Tắt tự động đồng bộ",
|
||||
"sessionCount": "{{n}} phiên",
|
||||
"sessionCountLinked": "{{n}} đã liên kết",
|
||||
"sessionCountHint": "Phiên gắn với nguồn này (không phải mọi phiên bạn thấy khi phạm vi dữ liệu là Tất cả)",
|
||||
"lastSync": "Đồng bộ lần cuối: {{when}}",
|
||||
"neverSynced": "Chưa bao giờ đồng bộ",
|
||||
"imported": "Đã nhập {{n}}",
|
||||
"syncNew": "{{n}} mới",
|
||||
"syncOnRemote": "{{n}} trên máy từ xa",
|
||||
"test": "Kiểm tra",
|
||||
"syncNow": "Đồng bộ",
|
||||
"syncAll": "Đồng bộ tất cả",
|
||||
"enable": "Bật",
|
||||
"disable": "Tắt",
|
||||
"confirmDelete": "Xóa nguồn này?",
|
||||
"purgeData": "Đồng thời xóa các phiên đã nhập từ nguồn này (không thể hoàn tác)",
|
||||
"deleteAndPurge": "Xóa + xóa dữ liệu",
|
||||
"removeKeep": "Xóa (giữ dữ liệu)",
|
||||
"remoteSourceBadgeTitle": "Được thu thập từ một máy từ xa"
|
||||
},
|
||||
"cursorPathsNote": "Chỉ mang tính thông tin: phiên Cursor cũng được tính — Cursor tình cờ dùng cùng đường dẫn ~/.claude với Claude Code (cục bộ và trên máy từ xa đã đồng bộ)."
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"greeting": {
|
||||
"morning": "Chào buổi sáng",
|
||||
"afternoon": "Chào buổi chiều",
|
||||
"evening": "Chào buổi tối",
|
||||
"night": "Đêm đã khuya"
|
||||
},
|
||||
"tagline": "Mọi điều agent của bạn làm đều không ẩn trong bóng tối.",
|
||||
"sub1": "Khả năng quan sát thời gian thực cho mọi phiên Claude Code.",
|
||||
"sub2": "Token, công cụ, chi phí và workflow, tất cả trực tiếp.",
|
||||
"brand": "Giám sát Claude Code",
|
||||
"taglines": [
|
||||
"Mọi điều agent của bạn làm đều không ẩn trong bóng tối.",
|
||||
"Thấy rõ từng bước đi của agent.",
|
||||
"Agent của bạn, hoàn toàn trong tầm quan sát.",
|
||||
"Từng token, công cụ và lượt xử lý — hiện rõ trước mắt.",
|
||||
"Nhìn cả đội agent của bạn suy nghĩ.",
|
||||
"Nơi mọi phiên Claude Code trở nên rõ ràng.",
|
||||
"Đôi mắt thời gian thực dõi theo từng agent.",
|
||||
"Từ prompt đến kết quả, tất cả đều được ghi lại.",
|
||||
"Phòng điều khiển cho các AI agent của bạn.",
|
||||
"Từng subagent đều được nắm rõ.",
|
||||
"Biết chính xác agent của bạn tốn bao nhiêu.",
|
||||
"Workflow agentic của bạn, trở nên dễ đọc.",
|
||||
"Quan sát. Đo lường. Tối ưu.",
|
||||
"Trung tâm điều hành cho Claude Code.",
|
||||
"Biến mớ hỗn loạn của agent thành bức tranh rõ ràng.",
|
||||
"Bằng chứng cho mọi lần chạy."
|
||||
],
|
||||
"subs": [
|
||||
[
|
||||
"Khả năng quan sát thời gian thực cho mọi phiên Claude Code.",
|
||||
"Token, công cụ, chi phí và workflow, tất cả trực tiếp."
|
||||
],
|
||||
[
|
||||
"Phiên, agent và sự kiện trực tiếp ngay khi diễn ra.",
|
||||
"Phân tích token và chi phí theo từng model, không phải đoán mò."
|
||||
],
|
||||
[
|
||||
"Truy vết mọi lời gọi công cụ trên khắp cây agent của bạn.",
|
||||
"Phát hiện lượt chậm, model tốn kém, lỗi âm thầm."
|
||||
],
|
||||
["Hook truyền thẳng tới một dashboard cục bộ.", "Dữ liệu của bạn không bao giờ rời khỏi máy."],
|
||||
[
|
||||
"Nhìn các orchestrator giao việc cho subagent.",
|
||||
"DAG, xử lý đồng thời và lan truyền lỗi, được trực quan hóa."
|
||||
],
|
||||
[
|
||||
"Theo dõi chi phí đến từng token cache.",
|
||||
"Giá theo từng model với mốc cơ sở nhận biết compaction."
|
||||
],
|
||||
[
|
||||
"Mọi phiên, agent và sự kiện gom về một nơi.",
|
||||
"Tìm kiếm, phát lại và kiểm tra mà không cần rời khỏi phòng."
|
||||
],
|
||||
[
|
||||
"Từ SessionStart đến SessionEnd, được ghi lại trọn vẹn.",
|
||||
"Bao gồm cả compaction, lỗi API và thời lượng từng lượt."
|
||||
],
|
||||
[
|
||||
"Biết model nào đã làm gì, và tốn bao nhiêu.",
|
||||
"Subagent được tính theo giá riêng, không phải giá của orchestrator."
|
||||
],
|
||||
[
|
||||
"Đội workflow và các agent bên trong, được phơi bày.",
|
||||
"Kể cả những lần chạy chẳng bao giờ kích hoạt một hook nào."
|
||||
],
|
||||
[
|
||||
"Cửa sổ cục bộ ưu tiên nhìn vào agent của bạn.",
|
||||
"Không cloud, không tài khoản, không telemetry."
|
||||
],
|
||||
[
|
||||
"Đo năng suất, không phải cảm tính.",
|
||||
"Tốc độ, hiệu quả cache và mức hữu dụng của công cụ, được chấm điểm."
|
||||
],
|
||||
[
|
||||
"Bắt bất thường trước khi hóa đơn bắt được.",
|
||||
"Chi phí ngoại lệ và đột biến token, được cảnh báo sớm."
|
||||
],
|
||||
[
|
||||
"Cấu hình Claude Code của bạn, được lập bản đồ đầy đủ.",
|
||||
"Skill, agent, hook, MCP và bộ nhớ chỉ trong một cái nhìn."
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"title": "Có bản cập nhật cho bảng điều khiển",
|
||||
"lead": "Đã có commit mới trên nhánh remote. Hãy sao chép lệnh bên dưới và chạy trong terminal - bảng điều khiển sẽ không tự cập nhật.",
|
||||
"commitsBehind": "Chậm {{ref}} {{count}} commit",
|
||||
"copy": "Sao chép lệnh",
|
||||
"commandLabel": "Lệnh terminal để cập nhật bảng điều khiển",
|
||||
"copied": "Đã sao chép",
|
||||
"dismiss": "Bỏ qua",
|
||||
"fetchError": "Không kết nối được remote git. Thử lại khi có mạng.",
|
||||
"notGit": "Bản cài đặt này không phải bản git clone; hãy nâng cấp thủ công.",
|
||||
"restartNote": "Sau khi chạy xong lệnh, hãy khởi động lại bảng điều khiển theo cách bạn đã dùng để chạy nó.",
|
||||
"checkNow": "Kiểm tra ngay",
|
||||
"checking": "Đang kiểm tra...",
|
||||
"checkError": "Không thể kiểm tra cập nhật"
|
||||
}
|
||||
@@ -0,0 +1,468 @@
|
||||
{
|
||||
"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",
|
||||
"activeOnly": "Chỉ đang hoạt động",
|
||||
"completed": "Hoàn tất",
|
||||
"runs": {
|
||||
"title": "Quy trình động",
|
||||
"subtitle": "Các nhóm Agent do công cụ Workflow tạo ra, dựng lại từ nhật ký chạy trên đĩa",
|
||||
"sessionTitle": "Quy trình động",
|
||||
"loading": "Đang tải quy trình động…",
|
||||
"empty": "Chưa có quy trình động nào. Các lần chạy của công cụ Workflow hiện ở đây sau khi nhật ký được ghi (khi hoàn tất).",
|
||||
"noAgents": "Không có Agent con nào được ghi cho lần chạy này.",
|
||||
"openSession": "Mở phiên gốc",
|
||||
"filterPhase": "Lọc theo giai đoạn",
|
||||
"clearFilter": "Xóa",
|
||||
"resultsLabel": "Kết quả",
|
||||
"promptLabel": "Lời nhắc",
|
||||
"resultLabel": "Kết quả",
|
||||
"loadingFull": "Đang tải toàn bộ nội dung…",
|
||||
"tokens": "token",
|
||||
"agents_one": "{{count}} Agent",
|
||||
"agents_other": "{{count}} Agent",
|
||||
"tools_one": "{{count}} lệnh gọi công cụ",
|
||||
"tools_other": "{{count}} lệnh gọi công cụ",
|
||||
"status": {
|
||||
"running": "Đang chạy",
|
||||
"working": "Đang chạy",
|
||||
"queued": "Đang chờ",
|
||||
"completed": "Hoàn tất",
|
||||
"done": "Xong",
|
||||
"success": "Xong",
|
||||
"error": "Lỗi",
|
||||
"failed": "Thất bại"
|
||||
},
|
||||
"col": {
|
||||
"agent": "Agent",
|
||||
"phase": "Giai đoạn",
|
||||
"state": "Trạng thái",
|
||||
"tokens": "Token",
|
||||
"tools": "Công cụ",
|
||||
"duration": "Thời lượng"
|
||||
}
|
||||
},
|
||||
"chartInfo": {
|
||||
"labels": {
|
||||
"what": "Biểu đồ thể hiện điều gì",
|
||||
"howToRead": "Cách đọc",
|
||||
"why": "Vì sao quan trọng"
|
||||
},
|
||||
"orchestration": {
|
||||
"what": "DAG nhiều lớp mô tả cách phiên Claude Code phân nhánh: từ phiên gốc, vào main agent, sang từng loại Subagent, qua các lần nén ngữ cảnh, rồi tới kết quả cuối (hoàn tất / lỗi / bỏ dở).",
|
||||
"howToRead": "Mỗi cột là một lớp. Khung node có cùng kích thước; con số là số lần. Cạnh đi từ trái sang phải; cạnh càng dày = lượt chuyển càng phổ biến. Hover bất kỳ node để xem thống kê; bấm để lọc phần còn lại của trang theo node đó.",
|
||||
"why": "Dùng để trả lời 'công việc trong workflow của tôi đi đâu?' - loại Subagent nào chiếm ưu thế, nén ngữ cảnh xảy ra ở đâu, và đường nào kết thúc bằng lỗi so với hoàn tất sạch."
|
||||
},
|
||||
"toolFlow": {
|
||||
"what": "Biểu đồ kiểu Sankey về các lượt chuyển tool gọi liên tiếp trên mọi phiên trong phạm vi. Mỗi băng là một cặp (nguồn → đích) đếm trên toàn bộ phiên.",
|
||||
"howToRead": "Tool xuất hiện thành các thanh màu ở hai bên. Băng nối chúng: độ dày = số lần nguồn chạy ngay trước đích. Hover một băng để xem tỷ trọng-trong-nguồn và tỷ trọng-trong-đích; hover một node để xem tổng lượt dùng và tỷ trọng trên tổng tool.",
|
||||
"why": "Phơi bày những chuỗi tool quen thuộc (ví dụ Read → Edit → Bash). Hữu ích để phát hiện vòng lặp, bước thừa, và sự đơn điệu trong cách Agent dùng tool."
|
||||
},
|
||||
"pipeline": {
|
||||
"what": "Đồ thị có hướng về sự đồng xuất hiện của loại Agent: loại nào hay chạy ngay sau loại nào, và bao nhiêu lần.",
|
||||
"howToRead": "Hình tròn là loại Agent; kích thước mã hóa tổng số spawn. Mũi tên A → B nghĩa là B đã chạy ngay sau A trong cùng phiên, nhãn = số lần. Hover mũi tên để xem tỷ trọng nguồn/đích; hover hình tròn để xem số spawn, số phiên và tỷ lệ thành công. Có thể kéo các node để sắp xếp lại.",
|
||||
"why": "Phơi bày các pipeline ủy quyền có thực mà bạn có thể chưa cố ý thiết kế - ví dụ một code-review agent gần như luôn chạy sau build agent - để bạn chuẩn hóa hoặc đơn giản hóa."
|
||||
},
|
||||
"effectiveness": {
|
||||
"what": "Mỗi loại Subagent có một thẻ với vòng tròn tỷ lệ thành công, tổng số phiên, thời lượng trung bình và sparkline 7 ngày.",
|
||||
"howToRead": "Phần tô của vòng tròn là tỷ lệ thành công; số phần trăm ở giữa cũng vậy. Hai ô cho biết số lượng và thời gian thực trung bình. Sparkline là số phiên mỗi ngày của tuần qua - hover một thanh để xem số liệu ngày đó.",
|
||||
"why": "Kiểm tra sức khỏe nhanh theo Agent: Agent nào đáng tin, Agent nào chậm, và Agent nào đang tăng/giảm sử dụng."
|
||||
},
|
||||
"patterns": {
|
||||
"what": "Danh sách xếp hạng các chuỗi điều phối Agent lặp lại được phát hiện từ trace phiên, kèm thẻ riêng cho phiên đơn lẻ không có Subagent.",
|
||||
"howToRead": "Mỗi dòng là một chuỗi bước (main → sub → sub …). Bên phải hiển thị số phiên khớp và tỷ lệ trên tổng phiên. Bấm vào một mẫu để làm nổi bật.",
|
||||
"why": "Cho thấy các 'hình dáng' công việc tiêu chuẩn trong dự án. Mẫu phổ biến là ứng viên tốt để chuẩn hóa thành workflow hoặc skill có tên gọi."
|
||||
},
|
||||
"modelDelegation": {
|
||||
"what": "Sơ đồ luồng hai cột cho thấy mô hình chính nào ủy quyền cho mô hình Subagent nào, kèm số Agent và tổng token theo node.",
|
||||
"howToRead": "Cột trái = mô hình chính của phiên; cột phải = mô hình dùng bên trong Subagent. Đường nối chỉ các cặp main → Subagent quan sát được. Hover một node để xem tỷ trọng trên tổng Agent, số phiên, tổng token và mô tả họ mô hình (Opus / Sonnet / Haiku).",
|
||||
"why": "Giúp xác nhận phân tầng chi phí/độ trễ - ví dụ main trên Sonnet, Subagent trên Haiku - và phát hiện các trường hợp bị đẩy lên Opus ngoài ý muốn."
|
||||
},
|
||||
"errorPropagation": {
|
||||
"what": "Lỗi tập trung ở đâu trong phân cấp Agent: theo độ sâu (phiên/main vs Subagent trực tiếp vs lồng nhau), theo loại Agent, và theo nhóm lỗi API / phiên.",
|
||||
"howToRead": "Banner trên đầu cho biết tỷ lệ lỗi cấp phiên. Các thanh độ sâu cho biết bao nhiêu lỗi xảy ra ở từng cấp lồng. Danh sách 'loại dễ lỗi' xếp Subagent theo số lỗi. Khối dưới hiển thị tóm tắt lỗi API/phiên.",
|
||||
"why": "Xác định lỗi nằm ở trục điều phối (main agent), ở Subagent cụ thể, hay ở chuỗi lồng sâu - giúp định hướng nơi nên đầu tư retry, kiểm chứng hay viết lại."
|
||||
},
|
||||
"concurrency": {
|
||||
"what": "Thời điểm tổng hợp mà mỗi loại Agent hoạt động so với timeline phiên, kèm số phiên có Agent đó.",
|
||||
"howToRead": "Mỗi dòng là một loại Agent. Chiều dài thanh tỉ lệ với số phiên. Phần trăm bên phải cho biết vị trí bắt đầu và kết thúc trung bình trong một phiên (0% = đầu phiên, 100% = cuối phiên). Hover để xem mô tả mẫu thời gian (đầu phiên, giữa, cuối, ...).",
|
||||
"why": "Cho thấy nhịp của phiên - ví dụ lint ở đầu, code-review ở cuối - và phát hiện Agent chiếm trọn cả phiên."
|
||||
},
|
||||
"complexity": {
|
||||
"what": "Biểu đồ phân tán mỗi phiên: x = thời lượng thực, y = tổng số Agent, kích thước bong bóng = tổng token, màu = trạng thái cuối.",
|
||||
"howToRead": "Bong bóng phía trên-bên phải là phiên dài và nặng Agent. Bong bóng to dùng nhiều token nhất. Đỏ/vàng = kết quả lỗi/bỏ dở. Hover để xem đầy đủ thống kê phiên; bấm để xem chi tiết bên dưới.",
|
||||
"why": "Cho cái nhìn tổng thể về phân bố chi phí/độ phức tạp. Outlier chính là những phiên đáng điều tra vì hành vi bất thường hoặc đột biến chi phí."
|
||||
},
|
||||
"compaction": {
|
||||
"what": "Tần suất Claude kích hoạt nén ngữ cảnh: tổng số sự kiện, token thu hồi và phân bố theo từng phiên.",
|
||||
"howToRead": "Hai ô số liệu cho biết tổng số lần nén và tổng token đã thu hồi. Biểu đồ cột liệt kê các phiên có ít nhất một lần nén, sắp xếp giảm dần theo số lần.",
|
||||
"why": "Nén ngữ cảnh là dấu hiệu áp lực bộ nhớ. Nhiều phiên có số lần nén cao thường có nghĩa workflow nên được chia nhỏ, tóm tắt, hoặc chuyển sang model có ngữ cảnh dài hơn."
|
||||
},
|
||||
"drillIn": {
|
||||
"what": "Khung chi tiết theo phiên: cây Agent đầy đủ, dòng thời gian tool gọi và chuỗi sự kiện thô của phiên bạn chọn.",
|
||||
"howToRead": "Chọn phiên từ dropdown phía trên hoặc bấm một bong bóng trong biểu đồ phân tán. Các tab cho phép chuyển giữa góc nhìn phân cấp (Agent Tree), thời gian (Tool Timeline) và theo trình tự (Event Sequence) của cùng một phiên.",
|
||||
"why": "Khi biểu đồ tổng hợp đánh dấu một phiên đáng ngờ, đây là nơi bạn đọc chính xác chuyện gì đã xảy ra, theo đúng thứ tự."
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"avgAgentDepth": "Độ sâu Agent TB",
|
||||
"avgSubagentsPerSession": "Subagent TB / phiên",
|
||||
"agentSuccessRate": "Tỷ lệ thành công Agent",
|
||||
"mostCommonFlow": "Luồng phổ biến nhất",
|
||||
"avgCompactions": "Số lần nén TB",
|
||||
"avgDuration": "Thời lượng TB",
|
||||
"tooltip": {
|
||||
"howCalc": "Cách tính",
|
||||
"whatItMeans": "Con số này nghĩa là gì",
|
||||
"moreInfo": "Giải thích chỉ số này",
|
||||
"valueMeansFmt": "{{value}} {{phrase}} nghĩa là {{interpretation}}",
|
||||
"phrase": {
|
||||
"depth": "độ sâu Agent trung bình",
|
||||
"subagents": "subagent mỗi phiên",
|
||||
"success": "tỷ lệ thành công Agent",
|
||||
"topFlow": "luồng phổ biến nhất",
|
||||
"compactions": "số lần nén ngữ cảnh mỗi phiên",
|
||||
"duration": "thời lượng trung bình"
|
||||
},
|
||||
"calc": {
|
||||
"depth": "Với mỗi phiên, ta lấy mức lồng Agent sâu nhất (chính = 0, subagent trực tiếp = 1, subagent của subagent = 2, …) rồi tính trung bình các giá trị tối đa đó trên toàn bộ phiên trong bộ lọc hiện tại.",
|
||||
"subagents": "Tổng số lượt gọi subagent (mọi cặp Task / SubagentStop) chia cho số phiên trong phạm vi. Tính cả subagent chạy song song hay được spawn lại.",
|
||||
"success": "Trên toàn bộ lượt chạy main + subagent: lượt hoàn tất ÷ (hoàn tất + lỗi + bỏ dở) × 100. Một lượt được tính hoàn tất khi quan sát được Stop / SubagentStop mà không có sự kiện lỗi xen vào.",
|
||||
"topFlow": "Mỗi cặp tool gọi liên tiếp trong một phiên được đếm là một lượt chuyển. Cặp xuất hiện thường xuyên nhất trên mọi phiên hiển thị tại đây dạng 'nguồn → đích'.",
|
||||
"compactions": "Tổng số sự kiện nén ngữ cảnh ghi nhận bởi hook PreCompact / SessionStart(compact), chia cho số phiên trong phạm vi.",
|
||||
"duration": "Thời gian thực tính từ sự kiện đầu tiên (SessionStart) đến sự kiện cuối (Stop / SessionEnd / hook gần nhất) của mỗi phiên, trung bình trên mọi phiên trong phạm vi."
|
||||
},
|
||||
"depth": {
|
||||
"zero": "chưa quan sát được lồng Agent. Mọi phiên chỉ chạy với main agent - không có ủy quyền cho subagent.",
|
||||
"rare": "lồng Agent rất hiếm. Hầu hết phiên dừng ở độ sâu 0 (chỉ main agent); chỉ rất ít phiên đi vào subagent.",
|
||||
"single": "phiên thường ủy quyền cho một lớp subagent (main → subagent), không lồng sâu hơn.",
|
||||
"multi": "điều phối nhiều lớp khá phổ biến - bản thân subagent cũng spawn thêm subagent (main → sub → sub).",
|
||||
"deep": "điều phối lồng sâu là chuẩn mực. Phiên thường xuyên có chuỗi 3 lớp Agent trở lên."
|
||||
},
|
||||
"subagents": {
|
||||
"zero": "không có subagent nào kích hoạt. Phiên hoàn tất hoàn toàn bằng main agent.",
|
||||
"lowFreq": "thực tế: trung bình ~1 subagent mỗi {{count}} phiên. Đa số phiên không spawn subagent nào.",
|
||||
"moderate": "phiên thường ủy quyền cho 1–3 subagent - mức dùng vừa phải.",
|
||||
"heavy": "ủy quyền nhiều - phiên thường xuyên fan-out tới nhiều subagent.",
|
||||
"veryHeavy": "rất nặng về điều phối: phiên trung bình 6+ lượt subagent."
|
||||
},
|
||||
"success": {
|
||||
"perfect": "gần như hoàn hảo. Hầu hết lượt chạy Agent kết thúc bằng Stop sạch - không lỗi, không bỏ dở.",
|
||||
"healthy": "khỏe mạnh. Phần lớn lượt Agent hoàn tất thành công; chỉ thi thoảng có thất bại.",
|
||||
"acceptable": "chấp nhận được, nhưng cần theo dõi xu hướng lỗi - khoảng 1 trong 5–20 lượt thất bại hoặc bị bỏ dở.",
|
||||
"concerning": "đáng lo - một phần đáng kể lượt Agent thất bại. Hãy kiểm tra trang Errors.",
|
||||
"critical": "nghiêm trọng: phần lớn lượt Agent thất bại hoặc bỏ dở. Hãy kiểm tra ErrorPropagation và các bản triển khai gần đây."
|
||||
},
|
||||
"topFlow": {
|
||||
"none": "chưa có đủ cặp tool gọi liên tiếp để xác định cặp nổi bật.",
|
||||
"selfLoop": "{{tool}} thường nối tiếp chính nó - điển hình cho lặp đọc/sửa hoặc chuỗi shell.",
|
||||
"pair": "{{source}} thường chạy ngay trước {{target}}. Hiểu là một thói quen: Agent có xu hướng {{sourceLower}} rồi {{targetLower}} làm bước kế tiếp."
|
||||
},
|
||||
"compactions": {
|
||||
"zero": "chưa có nén ngữ cảnh. Phiên nằm thoải mái trong cửa sổ ngữ cảnh của model.",
|
||||
"lowFreq": "thực tế: ~1 lần nén mỗi {{count}} phiên. Phiên dài là ngoại lệ.",
|
||||
"moderate": "phiên thường gặp nén 1–2 lần - có áp lực ngữ cảnh nhưng vẫn xử lý được.",
|
||||
"high": "tỷ lệ nén cao. Phiên thường chạy đủ lâu để cần nhiều lần nén ngữ cảnh; cân nhắc chia nhỏ công việc."
|
||||
},
|
||||
"duration": {
|
||||
"zero": "chưa có phiên hoàn tất nào - thời lượng là 0.",
|
||||
"veryShort": "phiên rất ngắn (dưới 1 phút) - thường là tool gọi nhanh hoặc prompt một phát.",
|
||||
"short": "phiên ngắn, vài phút. Phù hợp cho công việc tập trung, một tính năng.",
|
||||
"medium": "phiên trung bình (5–30 phút). Nhịp phát triển tiêu chuẩn.",
|
||||
"long": "phiên dài (30–60 phút). Có thể là quy trình nhiều bước hoặc rà soát dài.",
|
||||
"veryLong": "phiên rất dài (1–3 giờ). Coi chừng nén ngữ cảnh và áp lực bộ nhớ.",
|
||||
"marathon": "phiên marathon (3+ giờ). Cân nhắc chia thành nhiều phiên ngắn hơn."
|
||||
}
|
||||
}
|
||||
},
|
||||
"orchestration": {
|
||||
"title": "Đồ thị điều phối Agent",
|
||||
"subtitle": "Mẫu spawn tổng hợp trên mọi phiên - Bấm nút để lọc",
|
||||
"sessions": "Phiên",
|
||||
"mainAgent": "Agent chính",
|
||||
"compactions": "Nén ngữ cảnh",
|
||||
"noData": "Chưa có dữ liệu điều phối",
|
||||
"noDataDesc": "Dữ liệu spawn Agent sẽ xuất hiện khi đã ghi nhận phiên có Subagent.",
|
||||
"legend": "Chú giải",
|
||||
"edgeWeight": "Trọng số cạnh = tần suất",
|
||||
"count": "Số lượng",
|
||||
"otherTypes": "{{count}} loại khác",
|
||||
"ariaLabel": "Đồ thị có hướng không chu trình điều phối Agent",
|
||||
"layers": {
|
||||
"origin": "Nguồn",
|
||||
"mainAgent": "Agent chính",
|
||||
"subagentTypes": "Loại Subagent",
|
||||
"compactions": "Nén ngữ cảnh",
|
||||
"outcomes": "Kết quả"
|
||||
},
|
||||
"tooltip": {
|
||||
"tipClickToFilter": "Mẹo: bấm để lọc phần còn lại của trang theo node này.",
|
||||
"layer": {
|
||||
"session": "Lớp 0 - Nguồn",
|
||||
"main": "Lớp 1 - Agent chính",
|
||||
"subagent": "Lớp 2 - Loại Subagent",
|
||||
"subagentOverflow": "Lớp 2 - Các loại Subagent",
|
||||
"nested": "Lớp 3 - Nén ngữ cảnh",
|
||||
"outcome": "Lớp 4 - Kết quả"
|
||||
},
|
||||
"desc": {
|
||||
"session": "Mỗi đơn vị là một phiên Claude Code khớp với bộ lọc trạng thái hiện tại. Cạnh ra trỏ tới các main agent mà các phiên này đã khởi chạy.",
|
||||
"main": "Lượt chạy Claude cấp cao nhất cho mỗi phiên. Mỗi phiên có đúng một main agent; từ đây đồ thị rẽ nhánh tới các loại Subagent đã được ủy quyền.",
|
||||
"subagent": "Một Subagent chuyên biệt mà main agent đã ủy quyền (ví dụ qua tool Task).",
|
||||
"subagentClean": " Mọi lượt chạy của Subagent này đều hoàn tất sạch.",
|
||||
"subagentAllError": " Mọi lượt chạy của Subagent này đều lỗi - hãy kiểm tra định nghĩa Agent.",
|
||||
"subagentSomeErrors": " {{count}} lượt bị lỗi - xem Error Propagation bên dưới để biết chi tiết.",
|
||||
"subagentOverflow": "Tất cả các loại Subagent còn lại được gộp vào một node để đồ thị dễ đọc. Hover bất kỳ Subagent nào khác để xem số liệu riêng.",
|
||||
"nested": "Sự kiện nén cửa sổ ngữ cảnh. Claude kích hoạt nén khi ngữ cảnh đang chạy gần chạm giới hạn của model; số đếm phản ánh điều đó xảy ra bao nhiêu lần trên các phiên trong phạm vi.",
|
||||
"outcomeCompleted": "Phiên có hook cuối là Stop sạch. Không có sự kiện lỗi nào trước khi kết thúc.",
|
||||
"outcomeError": "Phiên có ít nhất một sự kiện lỗi (lỗi tool, lỗi Subagent hoặc lỗi phiên) trước khi kết thúc.",
|
||||
"outcomeAbandoned": "Phiên dừng mà không có Stop sạch và cũng không có lỗi rõ ràng - thường là đóng giữa chừng.",
|
||||
"outcomeFallback": "Trạng thái cuối của các phiên trong phạm vi, được tính từ sự kiện hook cuối quan sát được."
|
||||
}
|
||||
}
|
||||
},
|
||||
"toolFlow": {
|
||||
"title": "Luồng thực thi công cụ",
|
||||
"subtitle": "Chuỗi liên kết giữa các công cụ - luồng có hướng kiểu Sankey",
|
||||
"noData": "Chưa có dữ liệu luồng công cụ",
|
||||
"transitionCount_one": "{{count}} lượt chuyển",
|
||||
"transitionCount_other": "{{count}} lượt chuyển",
|
||||
"tooltip": {
|
||||
"node": "Node công cụ",
|
||||
"link": "Lượt chuyển công cụ",
|
||||
"totalCalls": "Tổng số lượt gọi",
|
||||
"shareOfAll": "Tỷ trọng trên tổng dùng tool",
|
||||
"transitionsObserved": "Số lượt chuyển quan sát",
|
||||
"shareOfSourceFmt": "Tỷ trọng {{source}} → kế tiếp",
|
||||
"shareOfTargetFmt": "Tỷ trọng trước → {{target}}",
|
||||
"nodeDescFmt": "Chiều cao thanh thể hiện tần suất {{name}} xuất hiện trên mọi phiên trong phạm vi. Băng đi vào bên trái cho thấy tool chạy trước {{name}}; băng đi ra bên phải cho thấy tool chạy sau.",
|
||||
"linkDescFmt": "Trên mọi phiên, đây là số lần {{source}} chạy ngay trước {{target}}. Băng càng dày = lượt chuyển càng phổ biến; phần trăm cho biết bước này chiếm tỷ trọng bao nhiêu trong luồng ra/vào của mỗi tool."
|
||||
}
|
||||
},
|
||||
"pipeline": {
|
||||
"title": "Đồ thị pipeline Agent",
|
||||
"subtitle": "Quy trình có hướng - loại Agent nào chạy sau loại nào, kèm tần suất",
|
||||
"noData": "Chưa có dữ liệu pipeline",
|
||||
"noDataDesc": "Các cạnh quy trình sẽ xuất hiện khi loại Agent chạy tuần tự qua nhiều phiên.",
|
||||
"legend": "Chú giải",
|
||||
"legendDesc": "A chạy trước B (kèm số lần)",
|
||||
"frequency": "Tần suất",
|
||||
"meaning": "Ý nghĩa",
|
||||
"times": " lần",
|
||||
"ranAfter": " chạy sau ",
|
||||
"spawns": " lần spawn",
|
||||
"spawned": "Đã spawn",
|
||||
"inSessions": "Trong các phiên",
|
||||
"ariaLabel": "Đồ thị pipeline Agent",
|
||||
"tooltip": {
|
||||
"agentType": "Loại Agent",
|
||||
"edge": "Cạnh tuần tự",
|
||||
"shareOfAllSpawns": "Tỷ trọng trên tổng spawn",
|
||||
"sequentialPairs": "Cặp tuần tự",
|
||||
"totalSpawnsFmt": "Tổng spawn {{id}}",
|
||||
"shareOfSrcFmt": "Tỷ trọng {{source}} → kế tiếp",
|
||||
"shareOfTgtFmt": "Tỷ trọng trước → {{target}}",
|
||||
"edgeDescFmt": "{{target}} chạy ngay sau {{source}} {{count}} lần trên toàn bộ phiên. Mũi tên càng dày, hand-off càng thường xuyên. Dùng để phát hiện chuỗi ủy quyền quen thuộc trong quy trình của bạn.",
|
||||
"nodeDescFmt": "{{id}} đã chạy {{total}} lần trên {{sessions}} phiên; tỷ lệ thành công {{rate}}% ({{health}}). Kích thước hình tròn mã hóa tổng số spawn; mũi tên cho biết loại Agent nào hay chạy trước/sau nó.",
|
||||
"health": {
|
||||
"perfect": "gần như hoàn hảo",
|
||||
"healthy": "khỏe mạnh",
|
||||
"shaky": "hơi lung lay",
|
||||
"failing": "thường xuyên thất bại"
|
||||
}
|
||||
}
|
||||
},
|
||||
"effectiveness": {
|
||||
"title": "Hiệu quả Subagent",
|
||||
"subtitle": "Chỉ số hiệu năng theo từng loại Agent",
|
||||
"success": "Thành công",
|
||||
"sessions": "Phiên",
|
||||
"avgDuration": "Thời lượng TB",
|
||||
"weeklyActivity": "Hoạt động theo tuần",
|
||||
"noData": "Chưa có dữ liệu Subagent",
|
||||
"successRateAria": "Tỷ lệ thành công: {{rate}}%",
|
||||
"weeklyActivityAria": "Biểu đồ tia hoạt động theo tuần",
|
||||
"sessionCount_one": "{{count}} phiên",
|
||||
"sessionCount_other": "{{count}} phiên"
|
||||
},
|
||||
"patterns": {
|
||||
"title": "Mẫu quy trình phát hiện được",
|
||||
"subtitle": "Chuỗi điều phối Agent thường gặp",
|
||||
"noData": "Chưa phát hiện mẫu nào",
|
||||
"noDataDesc": "Mẫu sẽ xuất hiện khi nhiều phiên có cùng chuỗi Agent.",
|
||||
"solo": "đơn lẻ (không có Subagent)",
|
||||
"label": "Mẫu quy trình",
|
||||
"detail": {
|
||||
"clickHint": "Bấm để xem chi tiết",
|
||||
"stepsHeading": "Chuỗi bước đầy đủ",
|
||||
"statsHeading": "Thống kê",
|
||||
"stepsCount_one": "{{count}} bước",
|
||||
"stepsCount_other": "{{count}} bước",
|
||||
"uniqueAgents": "Số loại Agent khác nhau",
|
||||
"occurrences": "Số phiên khớp mẫu này",
|
||||
"shareOfSessions": "Tỷ trọng trên tổng phiên",
|
||||
"narrativeHeading": "Ý nghĩa của mẫu này",
|
||||
"suggestionHeading": "Gợi ý",
|
||||
"narrative": {
|
||||
"soloFmt": "Phiên chỉ chạy {{first}} - không ủy quyền cho loại Agent nào khác.",
|
||||
"twoStepFmt": "Hand-off hai bước: {{first}} ủy quyền thẳng cho {{last}}, không có nhánh nào khác.",
|
||||
"shortFmt": "Chuỗi {{count}} bước, bắt đầu ở {{first}} và kết thúc ở {{last}}.",
|
||||
"longFmt": "Chuỗi dài {{count}} bước - bắt đầu ở {{first}}, đi qua nhiều Agent, rồi dừng ở {{last}}.",
|
||||
"loopHintFmt": " {{agent}} xuất hiện nhiều lần trong chuỗi này - điển hình cho vòng lặp kiểm tra hoặc sửa lại.",
|
||||
"dominant": " Đây là quy trình chủ đạo trong dự án - hơn một nửa số phiên đi theo.",
|
||||
"common": " Là quy trình phổ biến, chiếm khoảng một phần tư số phiên.",
|
||||
"regular": " Là quy trình được nhận diện, nhưng chưa phải đa số.",
|
||||
"niche": " Là mẫu hiếm, chỉ thi thoảng mới xuất hiện."
|
||||
},
|
||||
"suggestion": {
|
||||
"solo": "Phiên đơn lẻ - liệu thêm code-reviewer hay test-runner Subagent có cải thiện chất lượng không?",
|
||||
"shortChain": "Chuỗi ngắn. Nếu lặp lại nhiều, hãy đặt tên thành slash command, skill hoặc workflow để dễ tái sử dụng.",
|
||||
"mediumChain": "Đủ phổ biến để chuẩn hóa. Một workflow/template có tên sẽ giúp tái sử dụng dễ dàng.",
|
||||
"longChain": "Chuỗi dài - xem xét liệu mọi bước có thực sự cần thiết, hay có thể gộp/bỏ bớt một số Agent.",
|
||||
"loop": "Phát hiện vòng lặp. Hãy xác nhận bước lặp là kiểm tra có chủ đích, không phải retry âm thầm một lệnh đang lỗi."
|
||||
}
|
||||
}
|
||||
},
|
||||
"modelDelegation": {
|
||||
"title": "Luồng ủy quyền mô hình",
|
||||
"subtitle": "Cách các mô hình đi qua phân cấp Agent",
|
||||
"mainModels": "MÔ HÌNH CHÍNH",
|
||||
"subagentModels": "MÔ HÌNH TÁC TỬ PHỤ",
|
||||
"noData": "Chưa có dữ liệu ủy quyền mô hình",
|
||||
"agentsCount_one": "{{count}} Agent",
|
||||
"agentsCount_other": "{{count}} Agent",
|
||||
"tokensCount": "{{tokens}} token",
|
||||
"sessionsCount_one": "{{count}} phiên",
|
||||
"sessionsCount_other": "{{count}} phiên",
|
||||
"ariaLabel": "Sơ đồ luồng ủy quyền mô hình",
|
||||
"tooltip": {
|
||||
"mainModel": "Mô hình chính",
|
||||
"subagentModel": "Mô hình Subagent",
|
||||
"agentRuns": "Lượt chạy Agent",
|
||||
"shareOfAll": "Tỷ trọng trên tổng Agent",
|
||||
"sessionsOnModel": "Phiên dùng mô hình này",
|
||||
"totalTokens": "Tổng token",
|
||||
"family": {
|
||||
"opus": "Opus - bậc khả năng cao nhất; tốt cho lý luận phức tạp, ngữ cảnh dài nhất, đắt nhất theo token.",
|
||||
"sonnet": "Sonnet - bậc cân bằng; mặc định tốt cho hầu hết quy trình code và dùng tool.",
|
||||
"haiku": "Haiku - bậc nhanh nhất, rẻ nhất; phù hợp cho Subagent ngắn, nhạy cảm độ trễ.",
|
||||
"other": "Mô hình ngoài Anthropic hoặc không nhận dạng được - không thuộc bộ Opus/Sonnet/Haiku tiêu chuẩn."
|
||||
},
|
||||
"lines": {
|
||||
"main": "Các đường bên phải cho thấy mô hình Subagent mà mô hình chính này đã ủy quyền.",
|
||||
"sub": "Các đường bên trái cho thấy mô hình chính nào đã ủy quyền cho mô hình Subagent này."
|
||||
}
|
||||
}
|
||||
},
|
||||
"errorPropagation": {
|
||||
"title": "Bản đồ lan truyền lỗi",
|
||||
"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",
|
||||
"errorsByDepth": "Lỗi theo độ sâu phân cấp",
|
||||
"errorProneTypes": "Loại Agent dễ lỗi",
|
||||
"apiSessionErrors": "Lỗi API & phiên",
|
||||
"depthLabels": {
|
||||
"sessionMain": "Phiên / Agent chính",
|
||||
"directSubagent": "Subagent trực tiếp",
|
||||
"nested": "Lồng nhau (độ sâu 2)",
|
||||
"deep": "Sâu (độ sâu 3+)"
|
||||
}
|
||||
},
|
||||
"concurrency": {
|
||||
"title": "Dòng thời gian đồng thời Agent",
|
||||
"subtitle": "Mẫu thực thi song song - thể hiện mức chồng lấp theo thời gian",
|
||||
"noData": "Chưa có dữ liệu đồng thời",
|
||||
"noDataDesc": "Dữ liệu đồng thời sẽ xuất hiện khi đã ghi nhận phiên có Subagent.",
|
||||
"sessions": "Phiên",
|
||||
"timing": "Thời gian",
|
||||
"max": " tối đa",
|
||||
"sessionInfo_one": "{{count}} phiên - hoạt động từ {{from}}%-{{to}}% thời lượng phiên",
|
||||
"sessionInfo_other": "{{count}} phiên - hoạt động từ {{from}}%-{{to}}% thời lượng phiên",
|
||||
"tooltip": {
|
||||
"lane": "Làn đồng thời",
|
||||
"sessionsWith": "Phiên có Agent này",
|
||||
"avgStart": "Bắt đầu TB trong phiên",
|
||||
"avgEnd": "Kết thúc TB trong phiên",
|
||||
"barHint": "Chiều dài thanh tỉ lệ với số phiên có loại Agent này. Phần trăm thời gian là trung bình trên các phiên đó.",
|
||||
"timing": {
|
||||
"wholeSession": "Hoạt động xuyên gần như cả phiên - chạy từ đầu tới cuối.",
|
||||
"frontLoadedFmt": "Dồn về đầu: thường hoạt động từ đầu phiên tới khoảng ~{{end}}% chặng đường.",
|
||||
"backLoadedFmt": "Dồn về cuối: thường khởi động quanh {{start}}% phiên và duy trì tới hết.",
|
||||
"tightFmt": "Phạm vi hẹp: chạy trong dải hẹp từ {{start}}% đến {{end}}% timeline phiên.",
|
||||
"midSessionFmt": "Công việc giữa phiên: chạy khoảng từ {{start}}% đến {{end}}% timeline phiên."
|
||||
}
|
||||
}
|
||||
},
|
||||
"complexity": {
|
||||
"title": "Biểu đồ phân tán độ phức tạp phiên",
|
||||
"subtitle": "Thời lượng vs số Agent vs token - kích thước bong bóng = lượng token",
|
||||
"noData": "Chưa có dữ liệu độ phức tạp phiên",
|
||||
"noDataDesc": "Phiên sẽ xuất hiện ở đây sau khi hoàn tất với hoạt động Agent.",
|
||||
"duration": "Thời lượng",
|
||||
"agentCount": "Số Agent",
|
||||
"ariaLabel": "Biểu đồ phân tán độ phức tạp phiên",
|
||||
"tooltip": {
|
||||
"duration": "Thời lượng:",
|
||||
"agents": "Agent:",
|
||||
"subagents": "Subagent:",
|
||||
"tokens": "Token:",
|
||||
"model": "Mô hình:"
|
||||
}
|
||||
},
|
||||
"compaction": {
|
||||
"title": "Phân tích tác động nén ngữ cảnh",
|
||||
"subtitle": "Cách nén ngữ cảnh phân bố trên các phiên của bạn",
|
||||
"help": "Khi cửa sổ ngữ cảnh của một phiên đầy, Claude Code nén phần lịch sử cũ thành bản tóm tắt. Mỗi lần nén dưới đây là một sự kiện như vậy.",
|
||||
"noData": "Chưa ghi nhận nén ngữ cảnh",
|
||||
"totalCompactions": "Tổng số lần nén",
|
||||
"sessionsAffected": "Phiên bị ảnh hưởng",
|
||||
"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",
|
||||
"summary": "{{affected}} trên {{total}} phiên ({{pct}}%) đã dùng nén ngữ cảnh.",
|
||||
"tokensFreed": "Nén đã giải phóng ~{{tokens}} token ngữ cảnh.",
|
||||
"ariaLabel": "Số phiên theo số lần nén",
|
||||
"tipTitle": "Nén {{count}} lần",
|
||||
"tipDetail": "{{sessions}} phiên · {{pct}}% số phiên bị ảnh hưởng"
|
||||
},
|
||||
"drillIn": {
|
||||
"title": "Phân tích chi tiết phiên",
|
||||
"subtitle": "Chọn phiên từ biểu đồ phân tán hoặc dùng danh sách để khám phá",
|
||||
"searchPlaceholder": "Tìm phiên...",
|
||||
"noSessionSelected": "Chưa chọn phiên",
|
||||
"noSessionDesc": "Hãy tìm và chọn phiên phía trên, hoặc bấm vào một bong bóng trong biểu đồ để xem cây Agent, dòng thời gian công cụ và chuỗi sự kiện.",
|
||||
"failedLoad": "Không thể tải phiên",
|
||||
"loading": "Đang tải...",
|
||||
"loadMore": "Tải thêm",
|
||||
"noMatch": "Không có phiên nào khớp với tìm kiếm.",
|
||||
"notFound": "Không tìm thấy phiên.",
|
||||
"unknownModel": "mô hình không xác định",
|
||||
"closePanel": "Đóng bảng phân tích chi tiết",
|
||||
"close": "Đóng",
|
||||
"tabs": {
|
||||
"agentTree": "Cây Agent",
|
||||
"toolTimeline": "Dòng thời gian công cụ",
|
||||
"eventSequence": "Chuỗi sự kiện"
|
||||
},
|
||||
"noAgentTree": "Không có dữ liệu cây Agent.",
|
||||
"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)"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user