{
  "lang": {
    "zhCN": "中文",
    "enUS": "English"
  },
  "common": {
    "ok": "OK",
    "cancel": "Cancel",
    "refresh": "Refresh",
    "close": "Close",
    "edit": "Edit",
    "delete": "Delete",
    "save": "Save",
    "loading": "Loading…",
    "search": "Search",
    "clearSearch": "Clear search",
    "noData": "No data",
    "confirm": "Confirm",
    "copy": "Copy",
    "copied": "Copied",
    "copyFailed": "Copy failed",
    "view": "View",
    "actions": "Actions",
    "loadFailed": "Load failed",
    "loadMore": "Load more",
    "untitled": "Untitled",
    "justNow": "Just now",
    "minutesAgo": "{{n}} min ago",
    "hoursAgo": "{{n}} h ago",
    "daysAgo": "{{n}} d ago"
  },
  "header": {
    "title": "CyberStrikeAI",
    "apiDocs": "API Docs",
    "github": "GitHub",
    "logout": "Sign out",
    "language": "Interface language",
    "backToDashboard": "Back to dashboard",
    "userMenu": "User menu",
    "userMenuFor": "User menu: {{name}}",
    "currentUser": "Current user",
    "unknownUser": "Unknown user",
    "scopeAll": "All resources",
    "scopeAssigned": "Assigned resources",
    "scopeOwn": "Own resources",
    "scopeUnknown": "Unknown scope",
    "rolesCount": "{{count}} roles",
    "permissionsCount": "{{count}} permissions",
    "version": "Current version",
    "toggleSidebar": "Collapse/expand sidebar"
  },
  "theme": {
    "system": "System",
    "light": "Light",
    "dark": "Dark",
    "titleSystem": "Current: system theme. Click to switch to light.",
    "titleLight": "Current: light theme. Click to switch to dark.",
    "titleDark": "Current: dark theme. Click to switch to system.",
    "toggle": "Toggle theme"
  },
  "notifications": {
    "title": "Notifications",
    "empty": "No new events",
    "markAllRead": "Mark all read",
    "markSingleRead": "Read",
    "itemDefaultTitle": "Notification"
  },
  "login": {
    "title": "Sign in to CyberStrikeAI",
    "titlePrefix": "Sign in to",
    "subtitle": "Sign in with a platform account. The default administrator is admin.",
    "usernameLabel": "Username",
    "usernamePlaceholder": "admin",
    "passwordLabel": "Password",
    "passwordPlaceholder": "Enter password",
    "submit": "Sign in"
  },
  "nav": {
    "dashboard": "Dashboard",
    "chat": "Chat",
    "infoCollect": "Recon",
    "tasks": "Tasks",
    "projects": "Projects",
    "vulnerabilities": "Vulnerabilities",
    "webshell": "WebShell Management",
    "chatFiles": "File Management",
    "mcp": "MCP",
    "mcpMonitor": "MCP Monitor",
    "mcpManagement": "MCP Management",
    "knowledge": "Knowledge",
    "knowledgeRetrievalLogs": "Retrieval history",
    "knowledgeManagement": "Knowledge Management",
    "skills": "Skills",
    "skillsMonitor": "Skills monitor",
    "skillsManagement": "Skills Management",
    "agents": "Agents",
    "agentsManagement": "Agent management",
    "roles": "Roles",
    "rolesManagement": "Roles Management",
    "workflows": "Graph Orchestration",
    "settings": "System settings",
    "hitl": "Human-in-the-loop",
    "c2": "C2",
    "c2Listeners": "Listeners",
    "c2Sessions": "Sessions",
    "c2Tasks": "Tasks",
    "c2Payloads": "Payload",
    "c2Events": "Events",
    "c2Profiles": "Traffic profiles",
    "platformRbac": "Platform Access"
  },
  "dashboard": {
    "title": "Dashboard",
    "refresh": "Refresh",
    "refreshData": "Refresh data",
    "runningTasks": "Running tasks",
    "runningConversations": "Running conversations",
    "vulnTotal": "Total vulnerabilities",
    "toolCalls": "Tool invocations",
    "successRate": "Tool success rate",
    "clickToViewTasks": "Click to view tasks",
    "clickToViewChat": "Click to view conversations",
    "clickToViewVuln": "Click to view vulnerabilities",
    "clickToViewMCP": "Click to view MCP monitor",
    "accessOverviewTitle": "Access overview",
    "accessTabsAria": "C2 and WebShell",
    "c2OverviewTitle": "C2 overview",
    "c2GoManage": "Open C2 →",
    "webshellGoManage": "Open WebShell →",
    "webshellConnections": "Active connections",
    "webshellClickConnections": "View connections",
    "c2ListenersRunning": "Listeners running",
    "c2SessionsOnline": "Sessions online",
    "c2TasksPending": "Pending / queued tasks",
    "c2ClickListeners": "View listeners",
    "c2ClickSessions": "View sessions",
    "c2ClickTasks": "View tasks",
    "severityDistribution": "Vulnerability severity distribution",
    "severityCritical": "Critical",
    "severityHigh": "High",
    "severityMedium": "Medium",
    "severityLow": "Low",
    "severityInfo": "Info",
    "totalVulns": "Total vulnerabilities",
    "riskLevel": "Risk level",
    "riskScore": "Weighted risk score",
    "riskSafe": "Safe",
    "riskLow": "Low",
    "riskMedium": "Medium",
    "riskHigh": "High",
    "riskSevere": "Severe",
    "latestFound": "Latest found",
    "noneYet": "None yet",
    "runOverview": "Run overview",
    "batchQueues": "Batch task queues",
    "pending": "Pending",
    "executing": "Running",
    "completed": "Completed",
    "toolInvocations": "Tool invocations",
    "callsUnit": "calls",
    "toolsUnit": "tools",
    "knowledgeLabel": "Knowledge",
    "knowledgeItems": "items",
    "categoriesUnit": "categories",
    "skillsLabel": "Skills",
    "skillUnit": "Skills",
    "quickLinks": "Quick links",
    "toolsExecCount": "Tool execution count",
    "ctaTitle": "Start your security journey",
    "ctaSub": "Describe your target in chat, AI will assist with scanning and vulnerability analysis",
    "goToChat": "Go to chat",
    "noTasks": "No tasks",
    "totalCount": "{{count}} total",
    "notEnabled": "Disabled",
    "enabled": "Enabled",
    "toConfigure": "To configure",
    "toUse": "To use",
    "active": "Active",
    "highFreq": "High frequency",
    "noCallData": "No call data",
    "severityClickHint": "Click to view",
    "lastUpdated": "Last updated",
    "viewAll": "View all →",
    "recentVulns": "Recent vulnerabilities",
    "recentFacts": "Recent facts",
    "noVulnYet": "No recent vulnerabilities",
    "noFactsYet": "No recent facts",
    "noFactsDesc": "In project-bound chats, the agent records targets, findings, and attack chains",
    "createFirstProjectBtn": "Create first project",
    "factProjectMeta": "{{project}} · {{key}}",
    "factsAcrossProjects_one": "{{count}} active project · {{facts}} facts",
    "factsAcrossProjects_other": "{{count}} active projects · {{facts}} facts",
    "capabilities": "Capabilities",
    "mcpTools": "MCP tools",
    "rolesLabel": "Roles",
    "agentsLabel": "Agents",
    "webshellLabel": "WebShell",
    "pendingCountLabel": "{{count}} pending",
    "highCountLabel": "High {{count}}",
    "toolsCountLabel_one": "{{count}} tool",
    "toolsCountLabel_other": "{{count}} tools",
    "failedNCalls_one": "{{count}} failed",
    "failedNCalls_other": "{{count}} failed",
    "noCallYet": "No calls yet",
    "allClear": "No new risks",
    "allIdle": "System idle",
    "executingNow": "Running",
    "healthyStatus": "Healthy",
    "normalStatus": "Mostly OK",
    "degradedStatus": "Needs attention",
    "alertTitle": "Heads up",
    "alertWarningTitle": "Needs attention",
    "alertDangerTitle": "Action required",
    "alertCriticalReason_one": "{{count}} open critical vulnerability — please review immediately",
    "alertCriticalReason_other": "{{count}} open critical vulnerabilities — please review immediately",
    "alertFailedReason_one": "Tool success rate is low ({{count}} failed call) — check MCP monitor",
    "alertFailedReason_other": "Tool success rate is low ({{count}} failed calls) — check MCP monitor",
    "alertHitlReason_one": "{{count}} HITL request pending — Agent is waiting for your decision",
    "alertHitlReason_other": "{{count}} HITL requests pending — Agent is waiting for your decision",
    "alertMcpDownReason_one": "{{count}} External MCP server is down — related tools are unavailable",
    "alertMcpDownReason_other": "{{count}} External MCP servers are down — related tools are unavailable",
    "alertDismiss": "Dismiss (this session)",
    "openHighCountLabel": "Open high {{count}}",
    "allHandled": "All high severity handled",
    "viewVulns": "View vulnerabilities",
    "viewMonitor": "View monitor",
    "viewHitl": "Approve",
    "viewMcpManagement": "Manage MCP",
    "statusOpen": "Open",
    "statusConfirmed": "Confirmed",
    "statusFixed": "Fixed",
    "statusFalsePositive": "False positive",
    "statusIgnored": "Ignored",
    "statusFilter": "Status filter",
    "allStatuses": "All statuses",
    "fixRate": "Fix rate",
    "dataStale": "Data may be stale — please refresh",
    "recommendedActions": "Recommended Actions",
    "recommendedActionsHint": "Generated based on current state",
    "recoFixCritical_one": "Fix {{count}} open critical vulnerability",
    "recoFixCritical_other": "Fix {{count}} open critical vulnerabilities",
    "recoFixCriticalDesc": "Critical-level vulnerabilities should be addressed first",
    "recoApproveHitl_one": "Approve {{count}} HITL request",
    "recoApproveHitl_other": "Approve {{count}} HITL requests",
    "recoApproveHitlDesc": "Agent needs your decision to proceed",
    "recoRestartMcp_one": "Check {{count}} stopped External MCP",
    "recoRestartMcp_other": "Check {{count}} stopped External MCPs",
    "recoRestartMcpDesc": "Related tools are unavailable until MCP recovers",
    "recoCheckMonitor_one": "Investigate {{count}} failed tool call",
    "recoCheckMonitor_other": "Investigate {{count}} failed tool calls",
    "recoCheckMonitorDesc": "View failed request details in MCP monitor",
    "recoSetupMcp": "Configure your first MCP tool",
    "recoSetupMcpDesc": "Install MCP server before Agent can invoke specific capabilities",
    "recoStartScan": "Start a scan from chat",
    "recoStartScanDesc": "Describe your target in chat, AI will help execute",
    "recentEvents": "Recent Events",
    "eventUntitled": "Event",
    "externalMcpServers": "External MCP",
    "mcpAllRunning": "All running",
    "mcpPartialDown_one": "{{count}} stopped",
    "mcpPartialDown_other": "{{count}} stopped",
    "mcpAllDown": "All stopped",
    "noVulnDesc": "This list shows recent records; new results appear here when detection completes in chat",
    "startScanBtn": "Go to chat to scan"
  },
  "projects": {
    "title": "Projects",
    "showArchived": "Show archived",
    "newProjectCta": "+ New project",
    "projectList": "Project list",
    "searchProjectsPlaceholder": "Search projects…",
    "paginationShow": "Show {{start}}-{{end}} of {{total}}",
    "paginationRange": "{{start}}-{{end}}/{{total}}",
    "paginationTotal": "{{total}} total",
    "paginationPage": "{{page}}/{{total}}",
    "paginationPerPage": "Per page",
    "paginationPrev": "Previous",
    "paginationNext": "Next",
    "selectOrCreateTitle": "Select or create a project",
    "selectOrCreateHint": "Projects share a cross-chat fact board; target, environment, auth and other facts are auto-injected in bound conversations.",
    "createFirstProject": "Create first project",
    "defaultProjectName": "Project",
    "statusActive": "Active",
    "statusArchived": "Archived",
    "vulnerabilityManagement": "Vulnerability management",
    "addFactCta": "+ Add fact",
    "tabFacts": "Fact board",
    "tabGraph": "Attack path",
    "tabConversations": "Bound conversations",
    "tabVulns": "Related vulnerabilities",
    "tabSettings": "Settings",
    "factToolbarHint": "Index includes key and summary only (must include what + where + how to verify); put attack chain / POC in body, and reproduce via get_project_fact.",
    "graphToolbarHint": "Graph arrows match stored fact links (source → target). Nodes are layered target→infra→finding→exploit. Dashed edges are tentative.",
    "graphView": "View",
    "graphViewPath": "Attack path",
    "graphViewFull": "Full graph",
    "graphSearchSr": "Search nodes",
    "graphSearchPlaceholder": "Search nodes…",
    "graphRefresh": "Refresh",
    "graphCenter": "Center",
    "graphEmpty": "No graph data yet. Add links on finding/exploit facts (discovered_on → target/*) to build the path.",
    "graphEmptyTitle": "Build your attack path",
    "graphEmptyStep1": "Add target facts (domains, endpoints, scope)",
    "graphEmptyStep2": "Record findings/exploits with links between facts",
    "graphEmptyStep3": "Use Connect mode or edit facts to add relationships",
    "graphEmptyCta": "Add first fact",
    "graphStats": "Nodes: {{nodes}} | Edges: {{edges}}",
    "graphStatsNodes": "Nodes",
    "graphStatsEdges": "Edges",
    "graphLegendNodes": "Nodes",
    "graphLegendEdges": "Edges",
    "graphLegendNodeTarget": "TARGET",
    "graphLegendNodeInfra": "INFRA",
    "graphLegendNodeFinding": "FINDING",
    "graphLegendNodeVuln": "VULN",
    "graphLegendNodeExploit": "EXPLOIT",
    "graphLegendNodeMissing": "MISSING",
    "graphLegendDiscovered": "discovered_on",
    "graphLegendLeads": "leads_to",
    "graphLegendExploits": "exploits",
    "graphLegendTentative": "Tentative (dashed)",
    "factLinksLabel": "Links (from → this fact)",
    "factLinksPlaceholder": "discovered_on: target/primary_domain\nexploits: exploit/upload-rce",
    "factLinksHint": "One per line: type: source_fact_key (source → this fact). Common types: discovered_on, depends_on, leads_to, enables, exploits. Saving replaces all links.",
    "factIncomingLinksLabel": "Incoming links (read-only)",
    "factIncomingLinksHint": "Derived from outgoing links on source facts. e.g. finding discovered_on → target/* appears as incoming on the target; edit the source fact's outgoing links.",
    "factIncomingLinksEmpty": "No incoming links",
    "graphEdgeFromSelf": "From this node",
    "graphEdgeToSelf": "To this node",
    "linksColumn": "Links",
    "linkCountsTitle": "Outgoing / incoming edge counts",
    "graphConnect": "Connect",
    "graphConnectActive": "Connecting…",
    "graphConnectPickTarget": "Source {{source}} selected — click target node",
    "graphEdgeTypePrompt": "Edge type (discovered_on / leads_to / depends_on / enables / exploits)",
    "graphConnectFailed": "Failed to create edge",
    "graphConnectSuccess": "Edge created",
    "graphEdgesTitle": "Links",
    "graphEdgesHint": "Arrow direction matches the database and edit modal (source → target). Click an edge to focus it.",
    "graphEdgesEmpty": "No links yet",
    "graphEdgeOutgoing": "Outgoing",
    "graphEdgeIncoming": "Incoming",
    "graphEdgeSynthetic": "Auto-generated from fact link; edit the fact to remove",
    "confirmDeleteGraphEdge": "Delete this link?",
    "graphEdgeDeleteFailed": "Failed to delete edge",
    "graphEdgeDeleteSuccess": "Edge deleted",
    "graphDeleteEdge": "Delete",
    "viewVulnerability": "View vulnerability",
    "graphVulnSidebarHint": "Linked vulnerability node. Use the button below to open it in Vulnerability Management.",
    "promoteAttackChain": "Promote chain",
    "promoteAttackChainTitle": "Promote conversation attack chain to project facts",
    "confirmPromoteAttackChain": "Promote this conversation's attack chain into the project? Facts and edges will be created or updated.",
    "promoteAttackChainFailed": "Promote failed",
    "promoteAttackChainSuccess": "Promoted: {{facts_created}} new / {{facts_updated}} updated / {{edges_created}} edges",
    "searchFactsSr": "Search facts",
    "searchFactsPlaceholder": "Search key, summary, body…",
    "category": "Category",
    "all": "All",
    "confidence": "Confidence",
    "confidenceConfirmed": "Confirmed",
    "confidenceTentative": "Tentative",
    "confidenceDeprecated": "Deprecated",
    "displayOptions": "Display options",
    "sparseOnly": "Sparse only",
    "hideDeprecated": "Hide deprecated",
    "summary": "Summary",
    "updated": "Updated",
    "boundConversationsHint": "Conversations bound to this project; click to open",
    "titleLabel": "Title",
    "projectVulnSummaryHint": "Vulnerability summary under this project",
    "searchVulnsSr": "Search vulnerabilities",
    "searchVulnsPlaceholder": "Search title, description, type, target…",
    "noMatchingVulns": "No matching vulnerabilities, try adjusting filters",
    "viewInVulnerabilityManagement": "View in vulnerability management",
    "severity": "Severity",
    "status": "Status",
    "modalNewTitle": "New project",
    "modalNewSubtitle": "After creation, bind conversations to share fact board across chats",
    "modalEditTitle": "Edit project",
    "modalEditSubtitle": "Update project name and description",
    "projectName": "Project name",
    "projectNamePlaceholder": "e.g. Client A Web pentest",
    "projectDescription": "Project description",
    "projectDescriptionPlaceholder": "Client/task notes, team collaboration…",
    "createProject": "Create project",
    "newProject": "New project",
    "chatSelectorButton": "Share fact board across chats after binding a project",
    "selectProject": "Select project",
    "noProject": "No project",
    "factBodyEnvTitle": "Environment fact",
    "factBodyHasDetail": "Has details",
    "factBodySparseTitle": "Missing attack-chain/POC structure",
    "factBodySparse": "Incomplete",
    "factBodyReproducibleTitle": "Contains reproducible structure",
    "factBodyReproducible": "Reproducible",
    "factHintAttackSparse": "Attack-chain fact: fill complete body (steps, HTTP/command, response evidence); avoid conclusion-only notes. You can insert the attack-chain template.",
    "factHintAttackReady": "Attack-chain fact: body is used for audit reproduction, keep original request/response and step-by-step flow.",
    "factHintEnv": "Environment fact: body should include evidence source; for findings/exploitation use finding|chain|exploit|poc category.",
    "confirmOverwriteBodyTemplate": "Overwrite current body content with template?",
    "loadProjectsFailed": "Failed to load projects",
    "restoreTitle": "Restore as tentative and re-index into board",
    "restore": "Restore",
    "deprecateTitle": "Mark as deprecated",
    "deprecate": "Deprecate",
    "editTitle": "Edit fields",
    "viewBodyTitle": "View full body",
    "details": "Details",
    "deleteForeverTitle": "Delete permanently",
    "noProjects": "No projects",
    "noMatchingProjects": "No matching projects",
    "pinned": "Pinned",
    "archived": "Archived",
    "statsFacts": "{{count}} facts",
    "statsVulns": "{{count}} vulnerabilities",
    "statsConversations": "{{count}} conversations",
    "statsSparse": "{{count}} incomplete",
    "projectNotFound": "Project not found",
    "updatedPrefix": "Updated {{time}}",
    "descExpand": "Show all",
    "descCollapse": "Show less",
    "descriptionLengthHint": "For team reference only — the Agent does not read this. Keep it brief (max 4000 chars). Put anything the Agent should know in the fact board.",
    "noMatchingFacts": "No matching facts, try adjusting filters",
    "noFacts": "No facts yet. Click Add fact or let Agent write facts automatically",
    "relatedVulnIdTitle": "Related vulnerability ID",
    "noBoundConversations": "No bound conversations yet; select this project in chat to bind",
    "untitledConversation": "Untitled conversation",
    "open": "Open",
    "unbindProjectTitle": "Unbind project",
    "unbind": "Unbind",
    "confirmUnbindConversation": "Unbind this conversation from current project?",
    "unbindFailed": "Unbind failed",
    "factMetaCategory": "Category: {{value}}",
    "factMetaConfidence": "Confidence: {{value}}",
    "factMetaUpdated": "Updated: {{time}}",
    "factMetaRelatedVuln": "Related vulnerability: {{value}}",
    "factMetaSourceConversation": "Source conversation: {{value}}",
    "factMetaHasPrevious": "Has previous version",
    "emptyBody": "(empty body)",
    "factSparseWarn": "This fact belongs to attack-chain/exploit category, but body lacks reproducible structure (steps, HTTP/command, request/response, etc.). Edit and complete it for audit reproduction.",
    "factPreviousMeta": "Archived at {{time}} · Summary: {{summary}} · Confidence: {{confidence}}",
    "loadVulnerabilityListFailed": "Failed to load vulnerability list",
    "noVulnerabilitiesInProject": "No vulnerabilities in this project yet. Create one first or let Agent record it.",
    "promptLinkFactToVuln": "Enter index to link fact \"{{factKey}}\":\n\n{{lines}}",
    "invalidIndex": "Invalid index",
    "linkFailed": "Link failed",
    "linkSuccess": "Linked vulnerability",
    "promptConversationIdForVulnCreate": "Conversation ID is required to create vulnerability (can be source conversation):",
    "cancelledNoConversationId": "Cancelled: conversation_id not provided",
    "createVulnerabilityFailed": "Failed to create vulnerability",
    "createVulnerabilityAndLinkSuccess": "Created vulnerability and linked: {{value}}",
    "confirmDeprecateFact": "Mark fact {{factKey}} as deprecated?",
    "operationFailed": "Operation failed",
    "confirmRestoreFact": "Restore fact {{factKey}}? It will re-enter board index with tentative status.",
    "noVulnerabilityRecords": "No vulnerability records in this project",
    "viewRelatedFactsTitle": "View related facts",
    "facts": "Facts",
    "loadRelatedFactsFailed": "Failed to load related facts",
    "noFactsForVulnerability": "This vulnerability has no related facts yet. Link vulnerability or generate vulnerability draft from fact detail.",
    "promptChooseFactByIndex": "This vulnerability is linked to {{count}} facts. Enter index to view:\n{{lines}}",
    "enterProjectName": "Please enter project name",
    "writePermissionDenied": "This account is read-only and cannot create or edit projects",
    "saveFailed": "Save failed",
    "invalidJson": "Invalid JSON format",
    "scopeNoteAuthorizedWebOnly": "Authorized for Web application layer testing only",
    "invalidScopeJson": "Invalid scope JSON, please fix it first or click Format",
    "saved": "Saved",
    "confirmArchiveProject": "After archiving, this project is hidden from active list by default. Continue?",
    "confirmRestoreProjectActive": "Restore to active?",
    "confirmDeleteProject": "Delete this project? Facts will be deleted and conversations unbound.",
    "deleteFailed": "Delete failed",
    "addFact": "Add fact",
    "saveFact": "Save fact",
    "editFact": "Edit fact",
    "saveChanges": "Save changes",
    "customCategoryOption": "{{value}} (custom)",
    "selectProjectFirst": "Please select a project first",
    "loadFactFailed": "Failed to load fact",
    "factKeySummaryRequired": "fact_key and summary are required",
    "confirmSaveSparseFact": "This fact is attack-chain/exploit related, but body does not contain reproducible structure (steps, HTTP/command, request/response).\nSave anyway? It's recommended to insert attack-chain template and fill POC first.",
    "confirmDeleteFact": "Delete this fact?",
    "notUpdatedYet": "Not updated yet",
    "clearStaleProjectBindingFailed": "Failed to clear stale project binding",
    "noProjectDescription": "No project binding",
    "noProjectsClickCreate": "No projects yet, click New project below",
    "sharedFactBoard": "Shared fact board",
    "loadFailedRetry": "Load failed, please retry later",
    "projectBound": "Project bound",
    "projectUnbound": "Project unbound",
    "updateProjectBindingFailed": "Failed to update project binding",
    "basicInfoTitle": "Basic information",
    "basicInfoHint": "Name and description are shown in project details",
    "settingsIntroTitle": "Project settings",
    "settingsIntroHint": "Configure project metadata and Agent authorization boundary; takes effect immediately for bound conversations after saving.",
    "pinProject": "Pin project (show first in list)",
    "pinFact": "Pin fact (prioritize in list and blackboard index)",
    "editDescriptionPlaceholder": "Client/task notes, contacts, collaboration…",
    "scopeTitle": "Test scope",
    "scopeHint": "JSON format for Agent authorization boundary and target assets",
    "formatJson": "Format",
    "example": "Example",
    "scopeJsonLabel": "Scope JSON",
    "scopeFootnote": "Supports targets, exclude, notes and more. Empty means no scope limit.",
    "dangerZoneTitle": "Danger zone",
    "dangerZoneHint": "Archived projects are hidden unless 'Show archived' is enabled; deletion removes all facts permanently.",
    "archiveRestore": "Archive / Restore",
    "archiveProject": "Archive",
    "editProject": "Edit",
    "restoreProjectActive": "Restore to active",
    "projectActions": "Project actions",
    "deleteProject": "Delete project",
    "saveChangesHint": "Click save to sync changes to server",
    "saveSettings": "Save changes",
    "factModalSubtitle": "Summary is indexed on board; body stores attack chain and POC for audit reproduction (separate from vulnerability records).",
    "relatedVulnIdLabel": "Related vulnerability ID",
    "optional": "Optional",
    "factDetails": "Fact details",
    "previousVersion": "Previous version",
    "currentVersion": "Current version",
    "linkVulnerability": "Link vulnerability",
    "createVulnerabilityDraft": "Create vulnerability draft",
    "generatedFromFact": "Generated from project fact {{factKey}}"
  },
  "chat": {
    "newChat": "New chat",
    "toggleConversationPanel": "Collapse/expand conversation list",
    "searchHistory": "Search history...",
    "conversationGroups": "Conversation groups",
    "addGroup": "New group",
    "recentConversations": "Recent conversations",
    "filterByProject": "Filter by project",
    "filterAllProjects": "All projects",
    "filterUnboundProjects": "Unbound",
    "filterProjectSearch": "Search projects…",
    "filterProjectSearchEmpty": "No matching projects",
    "filterProjectSearchHint": "Type to search projects",
    "filterProjectSearchMore": "Type to find more projects",
    "filterProjectSearchLoading": "Searching…",
    "filterProjectSearchFailed": "Failed to load projects. Try again.",
    "projectConversationsTitle": "{{name}} · Conversations",
    "unboundConversationsTitle": "Unbound conversations",
    "noProjectConversations": "No conversations in this project",
    "noUnboundConversations": "No unbound conversations",
    "sortConversations": "Sort",
    "sortByCreatedAt": "Created time",
    "sortByUpdatedAt": "Updated time",
    "batchManage": "Batch manage",
    "paginationShow": "Show {{start}}-{{end}} of {{total}}",
    "paginationRange": "{{start}}-{{end}}/{{total}}",
    "paginationTotal": "{{total}} total",
    "paginationPage": "{{page}}/{{total}}",
    "paginationPerPage": "Per page",
    "paginationPrev": "Previous",
    "paginationNext": "Next",
    "attackChain": "Attack chain",
    "viewAttackChain": "View attack chain",
    "selectRole": "Select role",
    "defaultRole": "Default",
    "inputPlaceholder": "Enter target or command... (type @ to select tools | Shift+Enter newline, Enter send)",
    "selectFile": "Select file",
    "uploadFile": "Upload file (multi-select or drag & drop)",
    "readingAttachmentsDetail": "Reading attachment {{current}}/{{total}} · {{name}} · {{percent}}%",
    "uploadingAttachmentsDetail": "Uploading attachments · {{done}}/{{total}} done · {{percent}}% overall",
    "waitingAttachmentsUpload": "Waiting for attachments to finish uploading…",
    "attachmentsUploadIncomplete": "Some attachments failed to upload. Remove the failed items or pick files again before sending.",
    "attachmentUploading": "Uploading…",
    "attachmentUploadFailed": "Failed",
    "attachmentUploadAlert": "Upload failed: {{name}}",
    "send": "Send",
    "searchInGroup": "Search in group...",
    "loadingTools": "Loading tools...",
    "noMatchTools": "No matching tools",
    "penetrationTestDetail": "Penetration test details",
    "expandDetail": "Expand details",
    "expandDetailLazyHint": "Expand details (loads iteration details on click)",
    "viewToolDetail": "View details",
    "collapseToolDetail": "Collapse",
    "liveTimelinePruned": "Collapsed the first {{count}} live process details. View the full record page by page after the task completes.",
    "liveTimelinePrunedSingleRound": "main-agent round {{n}}",
    "liveTimelinePrunedRoundRange": "main-agent rounds {{from}}–{{to}}",
    "toolExecutionsCount": "{{n}} tool runs",
    "collapseToolExecutions": "Collapse tool runs",
    "noProcessDetail": "No process details (execution may be too fast or no detailed events)",
    "copyMessageTitle": "Copy message",
    "deleteTurnTitle": "Delete this turn",
    "deleteTurnConfirm": "Delete this entire turn (user message and assistant reply)? This cannot be undone. The next reply will use only the remaining messages; saved context snapshots will be cleared.",
    "deleteTurnFailed": "Failed to delete turn",
    "emptyGroupConversations": "This group has no conversations yet.",
    "noMatchingConversationsInGroup": "No matching conversations found.",
    "noHistoryConversations": "No conversation history yet",
    "renameGroupPrompt": "Please enter new name:",
    "deleteGroupConfirm": "Are you sure you want to delete this group? Conversations in the group will not be deleted, but will be removed from the group.",
    "deleteConversationConfirm": "Delete this conversation? Chat messages cannot be recovered, but recorded vulnerabilities will remain in the vulnerability library.",
    "renameFailed": "Rename failed",
    "downloadConversationFailed": "Failed to download conversation",
    "viewAttackChainSelectConv": "Please select a conversation to view attack chain",
    "viewAttackChainCurrentConv": "View attack chain of current conversation",
    "executeFailed": "Execution failed",
    "callOpenAIFailed": "Call OpenAI failed",
    "systemReadyMessage": "System is ready. Please enter your test requirements, and the system will automatically perform the corresponding security tests.",
    "addNewGroup": "+ New group",
    "callNumber": "Call #{{n}}",
    "iterationRound": "Iteration {{n}}",
    "einoOrchestratorRound": "Orchestrator · round {{n}}",
    "einoPlanExecuteRound": "Plan-Execute · round {{n}} · {{phase}}",
    "planExecuteStreamPlanner": "Planning output",
    "planExecuteStreamExecutor": "Execution output",
    "planExecuteStreamReplanning": "Replanning output",
    "planExecuteStreamPhase": "Phase output",
    "einoSubAgentStep": "Sub-agent {{agent}} · step {{n}}",
    "aiThinking": "AI thinking",
    "reasoningChain": "Reasoning process",
    "planning": "Planning",
    "assistantStreamPhase": "Assistant output",
    "toolCallsDetected": "Detected {{count}} tool call(s)",
    "callTool": "Call tool: {{name}} ({{index}}/{{total}})",
    "toolExecComplete": "Tool {{name}} completed",
    "toolExecFailed": "Tool {{name}} failed",
    "knowledgeRetrieval": "Knowledge retrieval",
    "knowledgeRetrievalTag": "Knowledge retrieval",
    "error": "Error",
    "streamNetworkErrorHint": "Connection lost ({{detail}}). A long task may still be running on the server; check running tasks at the top or refresh this conversation later.",
    "streamEndedWithoutDone": "The connection ended before a completion signal was received. The task may still be running on the server; check running tasks at the top or refresh this conversation.",
    "taskCancelled": "Task cancelled",
    "userInterruptContinueTitle": "⏸️ User interrupt & continue",
    "unknownTool": "Unknown tool",
    "einoAgentReplyTitle": "Sub-agent reply",
    "einoStreamErrorTitle": "⚠️ Eino stream interrupted ({{agent}})",
    "einoStreamErrorMessage": "Streaming read failed; the system will retry or terminate according to policy.",
    "einoRunRetryTitle": "🔁 Transient error retry",
    "einoEmptyResponseContinueTitle": "🔁 Auto resume (no assistant text)",
    "einoEmptyResponseContinueMessage": "Session ended without captured assistant text; resuming from trace…",
    "einoRunRetryErrorDetail": "Error detail",
    "iterationLimitReachedTitle": "⛔ Iteration limit reached",
    "iterationLimitReachedMessage": "Maximum iteration count reached; automatic iteration has stopped.",
    "einoPendingOrphanedTitle": "🧹 Tool call reconciliation",
    "einoPendingOrphanedMessage": "Detected {{count}} unclosed tool call(s); marked as failed and finalized automatically.",
    "noDescription": "No description",
    "noResponseData": "No response data",
    "loading": "Loading...",
    "loadFailed": "Load failed: {{message}}",
    "noAttackChainData": "No attack chain data",
    "copyFailedManual": "Copy failed, please select and copy manually",
    "searching": "Searching...",
    "loadFailedRetry": "Load failed, please retry",
    "dataFormatError": "Data format error",
    "progressInProgress": "Penetration test in progress...",
    "scrollToBottom": "Scroll to bottom",
    "scrollToBottomHasNew": "↓ New content below",
    "scrollToBottomNew": "↓ {{count}} new update(s)",
    "executionFailed": "Execution failed",
    "penetrationTestComplete": "Penetration test complete",
    "yesterday": "Yesterday",
    "historyGroupToday": "Today",
    "historyGroupLast7Days": "Past 7 days",
    "historyGroupEarlier": "Older",
    "agentModeSelectAria": "Choose conversation execution mode",
    "agentModePanelTitle": "Conversation mode",
    "agentModeEinoSingle": "Eino single (ADK)",
    "agentModeEinoSingleHint": "Eino ChatModelAgent + Runner with MCP tools (/api/eino-agent)",
    "agentModeDeep": "Deep (DeepAgent)",
    "agentModeDeepHint": "Eino DeepAgent for complex security testing, multi-stage task delegation, and synthesis",
    "agentModePlanExecuteLabel": "Plan-Execute",
    "agentModePlanExecuteHint": "Plan → execute → replan (single executor with tools)",
    "agentModeSupervisorLabel": "Supervisor (Expert routing)",
    "agentModeSupervisorHint": "Expert-routing scenarios: route across multiple specialist sub-agents via transfer",
    "agentModeSingle": "Single-agent",
    "agentModeMulti": "Multi-agent",
    "agentModeSingleHint": "Eino ADK single-agent for chat and tool use",
    "agentModeMultiHint": "Eino prebuilt orchestration: Deep for complex tasks, Plan-Execute for structured loops, Supervisor for expert routing",
    "reasoningModeLabel": "Model reasoning",
    "reasoningEffortLabel": "Reasoning effort",
    "reasoningModeDefault": "Use system default",
    "reasoningModeOff": "Off",
    "reasoningModeOn": "On",
    "reasoningModeAuto": "Auto",
    "reasoningEffortUnset": "Unspecified",
    "reasoningCompactLabel": "Reasoning",
    "reasoningCompactAria": "Open model reasoning options",
    "reasoningPanelTitle": "Model reasoning",
    "reasoningPanelHint": "Only Eino single- and multi-agent requests use these; merged with defaults in Settings.",
    "reasoningSummaryFollow": "System",
    "reasoningSummaryDash": "—",
    "agentModeOrchPlanExecute": "Plan-Exec",
    "agentModeOrchSupervisor": "Supervisor",
    "hitlTitle": "Human-in-the-loop",
    "hitlCardSubtitle": "Approvals & allowlist",
    "hitlReviewerLabel": "Reviewer",
    "hitlReviewerHuman": "Human approval",
    "hitlReviewerAgent": "Audit Agent",
    "hitlReviewerHint": "Switch between human and Audit Agent anytime; rules and whitelist stay the same. You can pre-select even when HITL is off.",
    "hitlConfigTitle": "Collaboration mode config",
    "hitlModeLabel": "Mode",
    "hitlModeOff": "Off",
    "hitlModeApproval": "Approval",
    "hitlModeReviewEdit": "Review & Edit",
    "hitlSensitiveTools": "Sensitive tools (comma-separated)",
    "hitlWhitelistTools": "Whitelisted tools (skip approval, comma-separated)",
    "hitlWhitelistPlaceholder": "e.g. read_file, grep or one tool per line (merged with global allowlist in config)",
    "hitlWhitelistHint": "Separate with commas or new lines; shown merged with the global allowlist in config.",
    "hitlApply": "Apply",
    "hitlApplyOkSync": "HITL settings saved and synced to the server.",
    "hitlApplyOkWhitelistYaml": "Tool whitelist merged into config.yaml and active. Mode and timeout still require selecting a conversation and clicking Apply to sync session settings to the server.",
    "hitlApplyOkLocal": "Saved in this browser.",
    "hitlApplyFail": "Failed to sync to server",
    "hitlStatusOff": "Human-in-the-loop: Off"
  },
  "hitl": {
    "pageTitle": "HITL approvals",
    "pageReviewerLabel": "Current reviewer",
    "pageReviewerHint": "Applies to the selected conversation. Without a conversation, saved to config.yaml as the global default for new chats. Takes effect immediately.",
    "pageReviewerSaved": "Reviewer saved.",
    "whitelistLabel": "Tool whitelist (no approval)",
    "whitelistHint": "One per line or comma-separated. Saved to config.yaml global whitelist and takes effect immediately (synced with chat sidebar).",
    "whitelistSaved": "Whitelist saved.",
    "whitelistSaveFailed": "Failed to save whitelist",
    "strategyLabel": "Audit strategy (prompt)",
    "strategyHint": "Whitelisted tools skip approval. Other tools are judged by the model using this prompt when Audit Agent is selected.",
    "strategyTabApproval": "Approval mode",
    "strategyTabReviewEdit": "Review & edit mode",
    "strategyHintApproval": "Whitelisted tools skip approval. In approval mode the Audit Agent only approves or rejects.",
    "strategyHintReviewEdit": "In review & edit mode the Audit Agent may narrow parameters via editedArguments before approve; reject if parameters cannot be safely adjusted.",
    "strategyReset": "Reset to default",
    "strategySaved": "Audit strategy saved.",
    "strategySaveFailed": "Failed to save audit strategy",
    "tabPending": "Pending",
    "tabLogs": "Audit logs",
    "tabStrategy": "Audit strategy",
    "tabWhitelist": "Tool whitelist",
    "pendingTitle": "Pending approvals",
    "searchLabel": "Search",
    "searchPlaceholder": "Tool, conversation, payload, comment…",
    "searchApply": "Search",
    "filterDecision": "Decision",
    "filterDecidedBy": "Reviewer",
    "filterAll": "All",
    "decisionApprove": "Approve",
    "decisionReject": "Reject",
    "reviewerHuman": "Human",
    "reviewerAgent": "Audit Agent",
    "reviewerSystem": "System",
    "reviewerManual": "Manual entry",
    "logCreate": "New log",
    "logModalTitle": "Audit log",
    "logModalEdit": "Edit audit log",
    "fieldConversation": "Conversation ID",
    "fieldTool": "Tool name",
    "fieldComment": "Comment",
    "fieldPayload": "Payload (JSON)",
    "fieldUserMessage": "User message",
    "fieldThinking": "Thinking",
    "fieldReasoning": "Reasoning chain",
    "fieldPlanning": "Planning",
    "colId": "ID",
    "colTool": "Tool",
    "colConversation": "Conversation",
    "colDecision": "Decision",
    "colDecidedBy": "Reviewer",
    "colContext": "Context",
    "colTime": "Time",
    "colActions": "Actions",
    "viewDetail": "Detail",
    "logModalView": "Audit log detail",
    "fieldExecutionResult": "Execution result",
    "executionSuccess": "success",
    "executionFailed": "failed",
    "edit": "Edit",
    "delete": "Delete",
    "logsEmpty": "No audit logs",
    "logsEmptyHint": "Records are created automatically when HITL approvals are approved or rejected.",
    "pageInfo": "{{total}} total",
    "prevPage": "Previous",
    "nextPage": "Next",
    "conversationRequired": "Conversation ID is required",
    "toolRequired": "Tool name is required",
    "saveFailed": "Save failed",
    "deleteConfirm": "Delete this audit log?",
    "deleteFailed": "Delete failed",
    "retentionHint": "Audit logs are kept for {{days}} days, then purged automatically.",
    "selectedCount": "{{count}} selected",
    "selectAll": "Select all",
    "deselectAll": "Deselect all",
    "batchDelete": "Batch delete",
    "batchDeleteConfirm": "Delete the selected {{count}} audit log(s)? This cannot be undone.",
    "batchDeleteSuccess": "Successfully deleted {{count}} audit log(s)",
    "batchDeleteFailed": "Batch delete failed",
    "clearAll": "Clear all",
    "clearAllConfirm": "Clear all {{count}} audit log(s) matching the current filters? This cannot be undone.",
    "clearAllConfirmNoFilter": "No filters are set. This will clear all {{count}} audit log(s). This cannot be undone. Continue?",
    "clearAllSuccess": "Cleared {{count}} audit log(s)",
    "clearAllFailed": "Clear failed",
    "selectLogsFirst": "Select audit logs to delete first",
    "loading": "Loading...",
    "emptyState": "No pending approvals",
    "dismiss": "Dismiss",
    "conversationLabel": "Conversation:",
    "reviewEditHelp": "Review & edit mode: provide a JSON object to override tool arguments. Example: {\"command\":\"ls -la\"}",
    "approvalHelp": "Approval mode: only approve/reject, argument editing is disabled.",
    "commentHelp": "Comment (optional): briefly note the approval reason.",
    "commentPlaceholder": "e.g. allow read-only command",
    "reject": "Reject",
    "approve": "Approve",
    "loadFailed": "Failed to load",
    "invalidJson": "Invalid JSON arguments",
    "submitFailedPrefix": "Submit failed:"
  },
  "progress": {
    "callingAI": "Calling AI model...",
    "callingTool": "Calling tool: {{name}}",
    "lastIterSummary": "Last iteration: generating summary and next steps...",
    "summaryDone": "Summary complete",
    "generatingFinalReply": "Generating final reply...",
    "maxIterSummary": "Max iterations reached, generating summary...",
    "analyzingRequestShort": "Analyzing your request...",
    "analyzingRequestPlanning": "Analyzing your request and planning test strategy...",
    "startingEinoDeepAgent": "Starting Eino DeepAgent...",
    "startingEinoMultiAgent": "Starting Eino multi-agent...",
    "einoAgent": "Eino agent: {{name}}",
    "peAgentPlanner": "Planner",
    "peAgentExecutor": "Executor",
    "peAgentReplanning": "Replanner"
  },
  "timeline": {
    "params": "Parameters:",
    "executionResult": "Execution result:",
    "executionId": "Execution ID:",
    "noResult": "No result",
    "running": "Running...",
    "completed": "Completed",
    "execFailed": "Execution failed",
    "resultMissing": "Result record missing",
    "toolSucceeded": "Succeeded",
    "toolFailed": "Failed"
  },
  "tasks": {
    "title": "Task Management",
    "stopTask": "Stop task",
    "interruptModalTitle": "Interrupt current step",
    "interruptReasonLabel": "Interrupt note",
    "interruptModalHint": "When a tool is running: same as MCP monitor \"Stop tool\" — only that call is stopped and the run continues; your note can be merged into the tool result (USER INTERRUPT NOTE). When no tool is running (model thinking/streaming only): \"Interrupt & continue\" still works — current output pauses, your note is merged into context and the run resumes automatically; the progress timeline shows a \"User interrupt & continue\" entry. Use this instead of a full stop when you only want to steer; use \"Stop completely\" to end the whole task.",
    "interruptReasonPlaceholder": "e.g. Tool is too slow—skip and summarize…",
    "interruptReasonRequired": "Please enter a short note so the model can continue accordingly.",
    "interruptSubmitting": "Submitting...",
    "interruptConfirmContinue": "Interrupt & continue",
    "interruptHardStop": "Stop completely",
    "interruptModalClose": "Close",
    "userInterruptTimelineTitle": "User interrupt note (continuing)",
    "collapseDetail": "Collapse details",
    "newTask": "New task",
    "autoRefresh": "Auto refresh",
    "historyHint": "Tip: Completed task history available. Check \"Show history\" to view.",
    "statusRunning": "Running",
    "statusCancelling": "Cancelling",
    "statusFailed": "Failed",
    "statusTimeout": "Timeout",
    "statusCancelled": "Cancelled",
    "statusCompleted": "Completed",
    "historyBadge": "History",
    "duration": "Duration",
    "completedAt": "Completed at",
    "startedAt": "Started at",
    "clickToCopy": "Click to copy",
    "unnamedTask": "Unnamed task",
    "unknown": "Unknown",
    "unknownTime": "Unknown time",
    "clearHistoryConfirm": "Clear all task history?",
    "cancelTaskFailed": "Cancel task failed",
    "cancelFailed": "Cancel failed",
    "taskInfoNotSynced": "Task info not synced yet, please try again later.",
    "loadActiveTasksFailed": "Failed to load active tasks",
    "cannotGetTaskStatus": "Cannot get task status",
    "copiedToast": "Copied!",
    "cancelling": "Cancelling...",
    "enterTaskPrompt": "Enter at least one task",
    "noValidTask": "No valid tasks",
    "createBatchQueueFailed": "Failed to create batch task queue",
    "noBatchQueues": "Currently there are no batch task queues",
    "recentCompletedTasks": "Recently completed tasks (last 24 hours)",
    "clearHistory": "Clear history",
    "cancelTask": "Cancel task",
    "viewConversation": "View conversation",
    "viewVulnerabilities": "View vulnerabilities",
    "viewVulnerabilitiesQueueTitle": "View vulnerabilities: open management filtered to this queue",
    "runSingleTask": "Run task",
    "confirmRunSingleTask": "Run this task only? The queue will pause when it finishes and will not continue other pending items.",
    "runSingleTaskFailed": "Failed to run task",
    "runSingleTaskUnavailable": "Unavailable while the queue or a task is running",
    "runSingleTaskUnavailableSelf": "This task is running",
    "runSingleTaskUnavailableQueue": "Queue is running; pause it before running another task individually",
    "conversationIdLabel": "Conversation ID",
    "statusPending": "Pending",
    "statusPaused": "Paused",
    "statusCronCycleIdle": "Round done · scheduled loop",
    "statusCronRunning": "Running · cron queue",
    "cronNextRunLine": "Next run: {{time}}",
    "cronRoundDoneProgressHint": "Cron queue: subtasks finished; next round starts on schedule",
    "cronRunningProgressHint": "This round is running; the next full cycle follows Cron / next run time",
    "cronPendingScheduled": "Cron scheduled · next {{time}}",
    "cronPendingProgressNote": "Will start on schedule, or click Start to run a round now",
    "cronRecurringCallout": "Cron queues start a new round at each scheduled time. Turn off \"Allow Cron auto-run\" to stop looping.",
    "confirmCancelTasks": "Cancel {{n}} selected task(s)?",
    "batchCancelResultPartial": "Batch cancel: {{success}} succeeded, {{fail}} failed",
    "batchCancelResultSuccess": "Successfully cancelled {{n}} task(s)",
    "taskCount": "{{count}} task(s)",
    "queueIdLabel": "Queue ID",
    "createdTimeLabel": "Created at",
    "totalLabel": "Total",
    "pendingLabel": "Pending",
    "runningLabel": "Running",
    "completedLabel": "Completed",
    "failedLabel": "Failed",
    "cancelledLabel": "Cancelled",
    "loadingTasks": "Loading...",
    "loadFailedRetry": "Load failed",
    "loadTaskListFailed": "Failed to load task list",
    "getQueueDetailFailed": "Failed to load queue details",
    "startBatchQueueFailed": "Failed to start batch queue",
    "pauseQueueFailed": "Failed to pause queue",
    "pauseQueueConfirm": "Pause this batch queue? The current task will be stopped; remaining tasks will stay pending.",
    "deleteQueueConfirm": "Delete this batch queue? This cannot be undone.",
    "deleteQueueFailed": "Failed to delete batch queue",
    "rerunQueueConfirm": "Rerun this batch queue? All tasks will be reset to pending and re-executed.",
    "rerunQueueFailed": "Failed to rerun batch queue",
    "batchQueueTitle": "Batch task queue",
    "batchQueueUntitled": "Untitled queue",
    "resumeExecute": "Resume",
    "taskIncomplete": "Task information incomplete",
    "cannotGetTaskMessageInput": "Cannot get task message input",
    "taskMessageRequired": "Task message is required",
    "saveTaskFailed": "Failed to save task",
    "queueInfoMissing": "Queue information not found",
    "addTaskFailed": "Failed to add task",
    "confirmDeleteTask": "Delete this task?\n\nTask: {{message}}\n\nThis cannot be undone.",
    "deleteTaskFailed": "Failed to delete task",
    "paginationShow": "Show {{start}}-{{end}} of {{total}} records",
    "paginationPerPage": "Per page",
    "paginationFirst": "First",
    "paginationPrev": "Previous",
    "paginationNext": "Next",
    "paginationLast": "Last",
    "paginationPage": "Page {{current}} / {{total}}",
    "deleteQueue": "Delete queue",
    "retry": "Retry",
    "noMatchingTasks": "No matching tasks",
    "updateTaskFailed": "Failed to update task",
    "durationSeconds": "s",
    "durationMinutes": "m",
    "durationHours": "h"
  },
  "infoCollect": {
    "enterFofaQuery": "Enter FOFA query syntax",
    "querying": "Querying...",
    "queryFailed": "Query failed",
    "enterNaturalLanguage": "Enter natural language description",
    "cancelParse": "Cancel parse",
    "clickToCancelParse": "Click to cancel AI parse",
    "parseToFofa": "Parse natural language to FOFA query",
    "parseResultEmpty": "Parse result empty: Please add/modify FOFA query in popup",
    "queryPlaceholder": "e.g. app=\"Apache\" && country=\"CN\"",
    "selectAll": "Select all/none",
    "selectRow": "Select row",
    "copyTarget": "Copy target",
    "sendToChat": "Send to chat (editable; Ctrl/Cmd+click to send directly)",
    "noTargetToCopy": "No target to copy",
    "targetCopied": "Target copied",
    "manualCopyHint": "Copy failed, please copy manually: ",
    "cannotInferTarget": "Cannot infer scan target from row (include host/ip/port/domain in fields)",
    "noSendMessage": "sendMessage() not found, please refresh and retry",
    "filledToInput": "Filled to chat input, edit and send",
    "noExportResult": "No results to export",
    "xlsxNotLoaded": "XLSX library not loaded, please refresh and retry",
    "noResults": "No results",
    "selectRowsFirst": "Select rows to scan first",
    "noScanTarget": "No scan targets inferred from selection (include host/ip/port/domain in fields)",
    "batchScanFailed": "Batch scan failed",
    "batchQueueCreated": "Batch scan queue created",
    "field": "Field",
    "parsePending": "AI parsing...",
    "parsePendingClickCancel": "AI parsing... (click button to cancel)",
    "parseSlow": "AI parse is taking a while, still processing…",
    "parseDone": "AI parse complete",
    "parseCancelled": "AI parse cancelled",
    "parseFailed": "AI parse failed: ",
    "parseResultTitle": "AI parse result",
    "naturalLanguageLabel": "Natural language",
    "fofaQueryEditable": "FOFA query (editable)",
    "confirmBeforeQuery": "Confirm syntax and scope before running the query.",
    "reminder": "Reminder",
    "explanation": "Explanation",
    "actions": "Actions",
    "batchScanTitle": "FOFA batch scan",
    "queueCreatedSkipped": "Queue created ({{n}} rows skipped, no target)",
    "createQueueFailed": "Failed to create batch queue",
    "loading": "Loading...",
    "none": "None",
    "truncated": "truncated",
    "resultsMeta": "Total {{total}} · This page {{count}} · page={{page}} · size={{size}}",
    "parseModalCancel": "Cancel",
    "parseModalApply": "Fill into query",
    "parseModalApplyRun": "Fill and query"
  },
  "vulnerability": {
    "title": "Vulnerability Management",
    "addVuln": "Add vulnerability",
    "editVuln": "Edit vulnerability",
    "loadFailed": "Failed to load vulnerabilities",
    "deleteConfirm": "Delete this vulnerability?"
  },
  "webshell": {
    "title": "WebShell Management",
    "addConnection": "Add connection",
    "connections": "Connections",
    "noConnections": "No connections. Click \"Add connection\" to add one.",
    "selectOrAdd": "Select a connection from the list or add a new WebShell connection.",
    "url": "Shell URL",
    "urlPlaceholder": "http(s)://target.com/shell.php",
    "password": "Password / Key",
    "passwordPlaceholder": "e.g. IceSword/AntSword connection password",
    "method": "Request method",
    "methodPost": "POST",
    "methodGet": "GET",
    "type": "Shell type",
    "typePhp": "PHP",
    "typeAsp": "ASP",
    "typeAspx": "ASPX",
    "typeJsp": "JSP",
    "typeCustom": "Custom",
    "cmdParam": "Command parameter name",
    "cmdParamPlaceholder": "Leave empty for cmd; e.g. xxx for xxx=command",
    "encoding": "Response encoding",
    "encodingAuto": "Auto detect",
    "encodingUtf8": "UTF-8",
    "encodingGbk": "GBK (Simplified Chinese Windows)",
    "encodingGb18030": "GB18030",
    "encodingHint": "Switch to GBK or GB18030 if the Simplified Chinese Windows target shows garbled output.",
    "os": "Target OS",
    "osAuto": "Auto (infer from Shell type)",
    "osLinux": "Linux / Unix",
    "osWindows": "Windows",
    "osHint": "Determines whether file manager / uploads use Linux or Windows commands. Choose Windows for PHP/JSP hosted on Windows.",
    "remark": "Remark",
    "remarkPlaceholder": "Friendly name for this connection",
    "deleteConfirm": "Delete this connection?",
    "editConnection": "Edit",
    "editConnectionTitle": "Edit connection",
    "tabTerminal": "Virtual terminal",
    "tabFileManager": "File manager",
    "tabAiAssistant": "AI Assistant",
    "tabDbManager": "Database Manager",
    "tabMemo": "Memo",
    "dbType": "Database type",
    "dbHost": "Host",
    "dbPort": "Port",
    "dbUsername": "Username",
    "dbPassword": "Password",
    "dbName": "Database name",
    "dbSqlitePath": "SQLite file path",
    "dbSqlPlaceholder": "Enter SQL, e.g. SELECT version();",
    "dbRunSql": "Run SQL",
    "dbTest": "Test connection",
    "dbOutput": "Output",
    "dbNoConn": "Please select a WebShell connection first",
    "dbSqlRequired": "Please enter SQL",
    "dbRunning": "Database command is running, please wait",
    "dbCliHint": "If command not found appears, install mysql/psql/sqlite3/sqlcmd on the target host first",
    "dbExecFailed": "Database execution failed",
    "dbSchema": "Database Schema",
    "dbLoadSchema": "Load Schema",
    "dbNoSchema": "No schema yet, click Load Schema",
    "dbSelectTableHint": "Click a table to expand columns and generate SQL",
    "dbNoColumns": "No column details",
    "dbResultTable": "Result Table",
    "dbClearSql": "Clear SQL",
    "dbTemplateSql": "SQL Template",
    "dbRows": "rows",
    "dbColumns": "columns",
    "dbSchemaFailed": "Failed to load schema",
    "dbSchemaLoaded": "Schema loaded successfully",
    "dbAddProfile": "Add connection",
    "dbExecSuccess": "SQL executed successfully",
    "dbNoOutput": "Execution completed (no output)",
    "dbRenameProfile": "Rename",
    "dbDeleteProfile": "Delete connection",
    "dbDeleteProfileConfirm": "Delete this database connection profile?",
    "dbProfileNamePrompt": "Enter profile name",
    "dbProfiles": "Database connections",
    "aiSystemReadyMessage": "System is ready. Please enter your test requirements, and the system will automatically perform the corresponding security tests.",
    "aiNewConversation": "New conversation",
    "aiPreviousConversation": "Previous conversation",
    "aiDeleteConversation": "Delete conversation",
    "aiDeleteConversationConfirm": "Delete this conversation?",
    "aiPlaceholder": "e.g. List files in the current directory",
    "aiSend": "Send",
    "aiMemo": "Memo",
    "aiMemoPlaceholder": "Save key commands, testing ideas, and repro steps...",
    "aiMemoClear": "Clear",
    "aiMemoSaving": "Saving...",
    "aiMemoSaved": "Saved locally",
    "quickCommands": "Quick commands",
    "downloadFile": "Download",
    "terminalWelcome": "WebShell virtual terminal — type a command and press Enter (Ctrl+L clear)",
    "filePath": "Current path",
    "listDir": "List directory",
    "readFile": "Read",
    "editFile": "Edit",
    "deleteFile": "Delete",
    "saveFile": "Save",
    "cancelEdit": "Cancel",
    "parentDir": "Parent directory",
    "execError": "Execution failed",
    "testConnectivity": "Test connectivity",
    "testSuccess": "Connection OK, shell is reachable",
    "testFailed": "Connectivity test failed",
    "testNoExpectedOutput": "Shell responded but expected output was not found. Check password and command parameter name.",
    "clearScreen": "Clear",
    "copyTerminalLog": "Copy log",
    "terminalIdle": "Idle",
    "terminalRunning": "Running",
    "terminalCopyOk": "Log copied",
    "terminalCopyFail": "Copy failed",
    "terminalNewWindow": "New terminal",
    "terminalWindowPrefix": "Terminal",
    "running": "Running…",
    "waitFinish": "Please wait for the current command to finish",
    "newDir": "New directory",
    "rename": "Rename",
    "upload": "Upload",
    "newFile": "New file",
    "filterPlaceholder": "Filter by name",
    "batchDelete": "Batch delete",
    "batchDownload": "Batch download",
    "refresh": "Refresh",
    "selectAll": "Select all",
    "searchPlaceholder": "Search connections...",
    "noMatchConnections": "No matching connections",
    "breadcrumbHome": "Root",
    "dirTree": "Directory tree",
    "back": "Back",
    "moreActions": "More actions",
    "batchProbe": "Batch probe",
    "probeRunning": "Probing",
    "probeOnline": "Online",
    "probeOffline": "Offline",
    "probeNoConnections": "No connections to probe",
    "colModifiedAt": "Modified",
    "colPerms": "Permissions",
    "colOwner": "Owner",
    "colGroup": "Group",
    "colType": "Type"
  },
  "mcp": {
    "monitorTitle": "MCP Status Monitor",
    "execStats": "Execution stats",
    "latestExecutions": "Latest executions",
    "toolSearch": "Tool search",
    "toolSearchPlaceholder": "Enter tool name...",
    "statusFilter": "Status filter",
    "filterAll": "All",
    "filterEnabled": "Enabled",
    "filterDisabled": "Disabled",
    "selectedCount": "{{count}} selected",
    "selectAll": "Select all",
    "deselectAll": "Deselect all",
    "deleteSelected": "Batch delete",
    "deleteExecConfirm": "Delete this execution record?",
    "batchDeleteFailed": "Batch delete failed",
    "managementTitle": "MCP Management",
    "addExternal": "Add external MCP",
    "toolConfig": "MCP tool config",
    "saveToolConfig": "Save tool config",
    "alwaysVisibleLabel": "Pinned",
    "alwaysVisibleHint": "Always keep visible in Tool Search results",
    "alwaysVisibleBuiltinLabel": "Builtin default",
    "alwaysVisibleBuiltinHint": "Backend builtin tool is pinned by default and cannot be disabled",
    "externalConfig": "External MCP config",
    "loadingTools": "Loading tools...",
    "loadToolsTimeout": "Tools load timeout. External MCP may be slow. Click Refresh to retry or check connection.",
    "loadToolsFailed": "Failed to load tools",
    "noTools": "No tools",
    "externalBadge": "External",
    "externalFrom": "External ({{name}})",
    "externalToolFrom": "External MCP - Source: {{name}}",
    "clickToViewTools": "Click to view tools from {{name}}",
    "filterBySource": "Source: {{name}}",
    "clearSourceFilter": "Clear source filter",
    "noDescription": "No description",
    "paginationInfo": "{{start}}-{{end}} of {{total}} tools",
    "perPage": "Per page:",
    "firstPage": "First",
    "prevPage": "Previous",
    "nextPage": "Next",
    "lastPage": "Last",
    "pageInfo": "Page {{page}} of {{total}}",
    "currentPageEnabled": "Enabled on current page",
    "totalEnabled": "Total enabled",
    "toolsConfigSaved": "Tool configuration saved!",
    "saveToolsConfigFailed": "Failed to save tool config",
    "getConfigFailed": "Failed to get config",
    "noExternalMCP": "No external MCP configured",
    "clickToAddExternal": "Click \"Add external MCP\" to configure",
    "connected": "Connected",
    "connecting": "Connecting...",
    "connectionFailed": "Connection failed",
    "disabled": "Disabled",
    "disconnected": "Disconnected",
    "stopConnection": "Stop connection",
    "startConnection": "Start connection",
    "stop": "Stop",
    "start": "Start",
    "editConfig": "Edit config",
    "deleteConfig": "Delete config",
    "transportMode": "Transport",
    "toolCount": "Tool count",
    "description": "Description",
    "timeout": "Timeout",
    "command": "Command",
    "addExternalMCP": "Add external MCP",
    "editExternalMCP": "Edit external MCP",
    "jsonEmpty": "JSON cannot be empty",
    "jsonError": "JSON format error",
    "configMustBeObject": "Config error: Must be JSON object with name as key",
    "configNeedOne": "Config error: At least one config item required",
    "configNameEmpty": "Config error: Name cannot be empty",
    "configMustBeObj": "Config error: \"{{name}}\" must be object",
    "configNeedCommand": "Config error: \"{{name}}\" needs command (stdio) or url (http/sse)",
    "configStdioNeedCommand": "Config error: \"{{name}}\" stdio mode needs command",
    "configHttpNeedUrl": "Config error: \"{{name}}\" http mode needs url",
    "configSseNeedUrl": "Config error: \"{{name}}\" sse mode needs url",
    "configEditMustContainName": "Config error: In edit mode, JSON must contain config name \"{{name}}\"",
    "saveSuccess": "Saved",
    "deleteSuccess": "Deleted",
    "deleteExternalConfirm": "Delete external MCP \"{{name}}\"?",
    "operationFailed": "Operation failed",
    "connectionFailedCheck": "Connection failed. Check config and network.",
    "connectionTimeout": "Connection timeout. Check config and network.",
    "totalCount": "Total",
    "enabledCount": "Enabled",
    "disabledCount": "Disabled",
    "connectedCount": "Connected",
    "toolsCountValue": "🔧 {{count}} tools",
    "connectionErrorLabel": "Connection error:",
    "secondsUnit": "s",
    "urlLabel": "URL",
    "loadExternalMCPFailed": "Load failed"
  },
  "settings": {
    "title": "System settings",
    "nav": {
      "basic": "Basic",
      "hitl": "Human-in-the-loop",
      "knowledge": "Knowledge base",
      "c2": "C2",
      "robots": "Bots",
      "terminal": "Terminal",
      "security": "Security",
      "rbac": "Platform permissions",
      "audit": "Audit logs",
      "infocollect": "Recon"
    },
    "infocollect": {
      "title": "Reconnaissance"
    },
    "hitl": {
      "title": "Human-in-the-loop",
      "approvalTitle": "Approval",
      "defaultReviewer": "Global default reviewer",
      "defaultReviewerHint": "Used when no conversation is selected and for new conversations; the chat sidebar can still override it.",
      "auditModelTitle": "Audit Agent model",
      "auditModelReuseMain": "Follow main model config",
      "auditModelBaseUrlPlaceholder": "Leave blank to reuse the main Base URL",
      "auditModelApiKeyPlaceholder": "Leave blank to reuse the main API Key",
      "auditModelName": "Approval model",
      "auditModelNamePlaceholder": "Leave blank to reuse the main model; a small model is recommended",
      "auditModelHint": "Used only for Audit Agent approvals; manual approval does not call a model.",
      "testAuditModel": "Test audit model",
      "retentionDays": "Resolved audit log retention days",
      "retentionDaysHint": "0 keeps logs forever; blank uses the 90-day default.",
      "toolWhitelist": "No-approval tool whitelist",
      "toolWhitelistPlaceholder": "read_file, list_dir, glob",
      "toolWhitelistHint": "One per line or comma-separated; whitelisted tools skip human-in-the-loop approval.",
      "auditAgentTitle": "Audit Agent strategy",
      "auditPromptApproval": "Approval-mode prompt",
      "auditPromptHint": "Leave blank to use the backend default strategy.",
      "auditPromptReviewEdit": "Review-edit-mode prompt",
      "auditPromptReviewEditHint": "Review-edit mode can approve with narrowed editedArguments."
    },
    "knowledge": {
      "title": "Knowledge base"
    },
    "c2": {
      "title": "C2",
      "sectionTitle": "Built-in C2",
      "enableLabel": "Enable built-in C2 (listeners, sessions, payloads, MCP tools)",
      "enableHint": "When off, listeners are not started and C2 MCP tools are not registered; the C2 sidebar is hidden—useful for local-only chat/knowledge deployments. Click Apply to save."
    },
    "robots": {
      "title": "Bot settings",
      "description": "Configure WeChat (iLink), WeCom, DingTalk and Lark bots so you can chat with CyberStrikeAI on your phone without opening the web UI.",
      "managerTitle": "Bot management",
      "managerDesc": "Choose a bot type first, then configure only the fields that belong to that platform.",
      "newBot": "New bot",
      "configure": "Configure",
      "statusNotConfigured": "Not configured",
      "statusConfigured": "Configured",
      "statusEnabled": "Enabled",
      "emptyTitle": "Select a bot to configure",
      "emptyDesc": "Pick a platform above, or use New bot to choose by type.",
      "createTitle": "New bot",
      "createDesc": "Choose a bot type to open its dedicated setup. This version supports one built-in configuration per platform.",
      "wechat": {
        "title": "WeChat / iLink",
        "subtitle": "Bind personal WeChat via QR code and chat with CyberStrikeAI on your phone",
        "statusIdle": "Not bound",
        "statusBound": "Connected",
        "statusScanning": "Binding…",
        "step1": "Generate QR",
        "step2": "Scan in WeChat",
        "step3": "Confirm",
        "enabled": "Enable WeChat bot",
        "bindButton": "Generate QR code and bind",
        "bindHint": "Scan with WeChat to confirm; settings are saved automatically.",
        "qrLoading": "Generating QR code…",
        "verifyCodeLabel": "Code on your phone (only if WeChat asks)",
        "rebindButton": "Re-bind",
        "boundBotId": "Bound Bot ID: ",
        "verifyCodeSubmit": "Submit",
        "advanced": "Advanced settings",
        "baseUrl": "API Base URL",
        "botType": "Bot Type",
        "botAgent": "Bot Agent",
        "ilinkBotId": "iLink Bot ID (filled after bind)",
        "boundSuccess": "Binding successful. WeChat bot is enabled.",
        "alreadyBound": "This WeChat account is already bound.",
        "openLink": "QR not showing? Open link in WeChat on your phone"
      },
      "wecom": {
        "title": "WeCom",
        "subtitle": "HTTP callback mode for enterprise internal app bots",
        "enabled": "Enable WeCom bot",
        "token": "Token",
        "tokenPlaceholder": "Token",
        "encodingAesKey": "EncodingAESKey",
        "encodingAesKeyPlaceholder": "EncodingAESKey (leave empty for plain mode)",
        "corpId": "CorpID",
        "corpIdPlaceholder": "Corp ID",
        "secret": "Secret",
        "secretPlaceholder": "App Secret",
        "agentId": "AgentID",
        "agentIdPlaceholder": "App AgentId"
      },
      "dingtalk": {
        "title": "DingTalk",
        "subtitle": "Enterprise internal app bot using Stream connection",
        "enabled": "Enable DingTalk bot",
        "clientIdLabel": "Client ID (AppKey)",
        "clientIdPlaceholder": "DingTalk App Key",
        "clientSecretLabel": "Client Secret",
        "clientSecretPlaceholder": "DingTalk App Secret",
        "streamHint": "Enable bot capability and configure streaming access in the open platform."
      },
      "lark": {
        "title": "Lark",
        "subtitle": "Enterprise app bot for direct chat and group mentions",
        "enabled": "Enable Lark bot",
        "appIdLabel": "App ID",
        "appIdPlaceholder": "Lark/Feishu App ID",
        "appSecretLabel": "App Secret",
        "appSecretPlaceholder": "Lark/Feishu App Secret",
        "verifyTokenLabel": "Verify Token (Optional)",
        "verifyTokenPlaceholder": "Event subscription Verification Token"
      },
      "telegram": {
        "title": "Telegram",
        "subtitle": "Bot API long polling; direct chat and group @",
        "enabled": "Enable Telegram bot",
        "botToken": "Bot Token",
        "botTokenHint": "Receives via getUpdates long poll; no public callback URL needed",
        "botUsername": "Bot Username (optional)",
        "allowGroup": "Allow group chat (respond to @ only)"
      },
      "slack": {
        "title": "Slack",
        "subtitle": "Socket Mode; no public callback URL needed",
        "enabled": "Enable Slack bot",
        "botToken": "Bot Token (xoxb-)",
        "appToken": "App-Level Token (xapp-)",
        "appTokenHint": "Requires connections:write scope for Socket Mode"
      },
      "discord": {
        "title": "Discord",
        "subtitle": "Gateway WebSocket; DMs and server @",
        "enabled": "Enable Discord bot",
        "botToken": "Bot Token",
        "botTokenHint": "Create bot in Developer Portal; enable Message Content Intent",
        "allowGuild": "Allow guild channels (respond to @ only)"
      },
      "qq": {
        "title": "QQ Bot",
        "subtitle": "QQ Open Platform WebSocket; C2C and group @",
        "enabled": "Enable QQ bot",
        "appId": "App ID",
        "clientSecret": "Client Secret",
        "secretHint": "From QQ Bot Open Platform; use sandbox before going live",
        "sandbox": "Sandbox environment"
      }
    },
    "apply": {
      "button": "Apply configuration",
      "loadFailed": "Failed to load configuration",
      "fillRequired": "Please fill in all required fields (marked with *)",
      "applyFailed": "Failed to apply configuration",
      "applySuccess": "Configuration applied successfully!"
    },
    "security": {
      "changePassword": "Change password",
      "fillPasswordHint": "Fill current and new password correctly. New password at least 8 characters, must match twice.",
      "changePasswordFailed": "Failed to change password",
      "passwordUpdated": "Password updated. Please sign in again with new password."
    }
  },
  "auth": {
    "sessionExpired": "Session expired, please sign in again",
    "unauthorized": "Unauthorized",
    "forbidden": "Insufficient permissions",
    "requestFailed": "Request failed",
    "enterPassword": "Please enter password",
    "loginFailedCheck": "Sign-in failed, please check the username or password",
    "loginFailedRetry": "Sign-in failed, please try again later",
    "loggedOut": "Signed out"
  },
  "knowledge": {
    "title": "Knowledge Management",
    "retrievalLogs": "Retrieval history",
    "totalItems": "Total items",
    "categories": "Categories",
    "addKnowledge": "Add knowledge",
    "buildIndex": "Build index",
    "buildIndexConfirm": "Build vectors for knowledge items that are not indexed yet?",
    "rebuildIndexFull": "Full rebuild",
    "rebuildIndexFullConfirm": "Re-index all knowledge items? This may take a while.",
    "deleteItemConfirm": "Delete this knowledge item?",
    "notEnabledTitle": "Knowledge base function not enabled",
    "notEnabledHint": "Please go to system settings to enable knowledge retrieval.",
    "goToSettings": "Go to settings"
  },
  "roles": {
    "title": "Role Management",
    "createRole": "Create role",
    "searchPlaceholder": "Search roles...",
    "deleteConfirm": "Delete this role?",
    "loadFailed": "Failed to load roles",
    "noDescription": "No description",
    "defaultRoleDescription": "Default role, no extra user prompt, uses default MCP",
    "noMatchingRoles": "No matching roles",
    "noRoles": "No roles",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "noDescriptionShort": "No description"
  },
  "skills": {
    "title": "Skills Management",
    "monitorTitle": "Skills monitor",
    "createSkill": "Create Skill",
    "callStats": "Call stats",
    "addSkill": "Add Skill",
    "editSkill": "Edit Skill",
    "loadListFailed": "Failed to load skills list",
    "noSkills": "No skills. Click \"Create Skill\" to add first.",
    "noMatch": "No matching skills",
    "searchFailed": "Search failed",
    "refreshed": "Refreshed",
    "loadDetailFailed": "Failed to load skill details",
    "viewFailed": "Failed to view skill",
    "saving": "Saving...",
    "saveFailed": "Failed to save skill",
    "deleteFailed": "Failed to delete skill",
    "loadStatsFailed": "Failed to load skills monitor data",
    "clearStatsConfirm": "Clear all Skills statistics? This cannot be undone.",
    "statsCleared": "Skills statistics cleared",
    "clearStatsFailed": "Failed to clear statistics",
    "noDescription": "No description",
    "viewSkillTitle": "View Skill: {{name}}",
    "descriptionLabel": "Description:",
    "pathLabel": "Path:",
    "modTimeLabel": "Modified:",
    "contentLabel": "Content:",
    "cardVersion": "v{{version}}",
    "cardScripts": "{{count}} script(s)",
    "cardFiles": "{{count}} file(s)",
    "versionLabel": "Version:",
    "scriptsHeading": "Scripts:",
    "summaryHint": "(summary — load full body if needed)",
    "loadFullBody": "Load full body",
    "loadFullFailed": "Failed to load full skill body",
    "nameRequired": "Skill name is required",
    "contentRequired": "Skill content is required",
    "nameInvalid": "Use lowercase letters, digits, and hyphens only (Agent Skills name rules)",
    "descriptionRequired": "Description is required (written to SKILL.md front matter)",
    "saveSuccess": "Skill updated",
    "createdSuccess": "Skill created",
    "deleteConfirm": "Are you sure you want to delete skill \"{{name}}\"? This cannot be undone.",
    "deleteConfirmWithRoles": "Are you sure you want to delete skill \"{{name}}\"?\n\n⚠️ This skill is currently bound to {{count}} role(s):\n{{roles}}\n\nAfter deletion, the system will automatically remove this skill from those roles.\n\nThis cannot be undone. Continue?",
    "deleteSuccess": "Skill deleted",
    "deleteSuccessWithRoles": "Skill deleted and automatically removed from {{count}} role(s): {{roles}}",
    "loadFailedShort": "Load failed",
    "totalSkillsCount": "Total Skills",
    "totalCallsCount": "Total Call Count",
    "successfulCalls": "Successful Calls",
    "failedCalls": "Failed Calls",
    "successRate": "Success Rate",
    "skillName": "Skill Name",
    "totalCalls": "Total Calls",
    "success": "Success",
    "failure": "Failure",
    "lastCallTime": "Last Call Time",
    "noCallRecords": "No Skills call records yet",
    "loadStatsErrorShort": "Failed to load statistics",
    "loadCallStatsError": "Failed to load call statistics"
  },
  "apiDocs": {
    "pageTitle": "API Docs - CyberStrikeAI",
    "title": "API Docs",
    "subtitle": "CyberStrikeAI platform API documentation with online testing",
    "authTitle": "API Authentication",
    "authAllNeedToken": "All API endpoints require Token authentication.",
    "authGetToken": "1. Get Token:",
    "authGetTokenDesc": "After logging in on the frontend, the Token is saved automatically. You can also get it via:",
    "authUseToken": "2. Use Token:",
    "authUseTokenDesc": "Add the Authorization header:",
    "authTip": "💡 This page will use your logged-in Token automatically; no need to fill it manually.",
    "tokenDetected": "✓ Token detected - You can test API endpoints directly",
    "tokenNotDetected": "⚠ No Token detected - Please log in on the frontend first, then refresh this page. When testing, add Authorization: Bearer token in the request header",
    "sidebarGroupTitle": "API Groups",
    "allApis": "All APIs",
    "loading": "Loading...",
    "loadingDesc": "Loading API documentation",
    "errorLoginRequired": "Login required to view API docs. Please log in on the frontend first, then refresh this page.",
    "errorLoadSpec": "Failed to load API spec: ",
    "errorLoadFailed": "Failed to load API docs: ",
    "errorSpecInvalid": "Invalid API spec format",
    "loadFailed": "Load failed",
    "backToLogin": "Back to login",
    "noApis": "No APIs",
    "noEndpointsInGroup": "No API endpoints in this group",
    "sectionDescription": "Description",
    "viewDetailDesc": "View details",
    "hideDetailDesc": "Hide details",
    "noDescription": "No description",
    "sectionParams": "Parameters",
    "paramName": "Parameter",
    "type": "Type",
    "description": "Description",
    "required": "Required",
    "optional": "Optional",
    "sectionRequestBody": "Request body",
    "example": "Example",
    "exampleJson": "Example JSON:",
    "sectionResponse": "Response",
    "testSection": "Test",
    "requestBodyJson": "Request body (JSON)",
    "queryParams": "Query parameters:",
    "sendRequest": "Send request",
    "copyCurl": "Copy cURL",
    "clearResult": "Clear result",
    "copyCurlTitle": "Copy cURL command",
    "clearResultTitle": "Clear test result",
    "sendingRequest": "Sending request...",
    "errorPathParamRequired": "Path parameter {{name}} is required",
    "errorQueryParamRequired": "Query parameter {{name}} is required",
    "errorTokenRequired": "No Token detected. Please log in on the frontend and refresh, or add Authorization: Bearer your_token in the request header",
    "errorJsonInvalid": "Invalid request body JSON: ",
    "requestFailed": "Request failed: ",
    "copied": "Copied",
    "curlCopied": "curl command copied to clipboard!",
    "copyFailedManual": "Copy failed, please copy manually:\n\n",
    "curlGenFailed": "Failed to generate cURL command: ",
    "requestBodyPlaceholder": "Enter request body in JSON format",
    "tags": {
      "auth": "Authentication",
      "conversationManagement": "Conversation Management",
      "conversationInteraction": "Conversation Interaction",
      "batchTasks": "Batch Tasks",
      "conversationGroups": "Conversation Groups",
      "vulnerabilityManagement": "Vulnerability Management",
      "roleManagement": "Role Management",
      "skillsManagement": "Skills Management",
      "monitoring": "Monitoring",
      "configManagement": "Configuration Management",
      "externalMCPManagement": "External MCP Management",
      "attackChain": "Attack Chain",
      "knowledgeBase": "Knowledge Base",
      "mcp": "MCP",
      "fofaRecon": "FOFA Recon",
      "terminal": "Terminal",
      "webshellManagement": "WebShell Management",
      "chatUploads": "Chat Uploads",
      "robotIntegration": "Robot Integration",
      "markdownAgents": "Markdown Agents",
      "projectManagement": "Project Management"
    },
    "summary": {
      "login": "User login",
      "logout": "User logout",
      "changePassword": "Change password",
      "validateToken": "Validate Token",
      "createConversation": "Create conversation",
      "listConversations": "List conversations",
      "getConversationDetail": "Get conversation detail",
      "updateConversation": "Update conversation",
      "deleteConversation": "Delete conversation",
      "getConversationResult": "Get conversation result",
      "sendMessageNonStream": "Send message and get AI reply (non-stream)",
      "sendMessageStream": "Send message and get AI reply (stream)",
      "cancelTask": "Cancel task",
      "listRunningTasks": "List running tasks",
      "listCompletedTasks": "List completed tasks",
      "createBatchQueue": "Create batch task queue",
      "listBatchQueues": "List batch task queues",
      "getBatchQueue": "Get batch task queue",
      "deleteBatchQueue": "Delete batch task queue",
      "startBatchQueue": "Start batch task queue",
      "pauseBatchQueue": "Pause batch task queue",
      "addTaskToQueue": "Add task to queue",
      "sqlInjectionScan": "SQL injection scan",
      "portScan": "Port scan",
      "updateBatchTask": "Update batch task",
      "deleteBatchTask": "Delete batch task",
      "createGroup": "Create group",
      "listGroups": "List groups",
      "getGroup": "Get group",
      "updateGroup": "Update group",
      "deleteGroup": "Delete group",
      "getGroupConversations": "Get conversations in group",
      "addConversationToGroup": "Add conversation to group",
      "removeConversationFromGroup": "Remove conversation from group",
      "listVulnerabilities": "List vulnerabilities",
      "createVulnerability": "Create vulnerability",
      "getVulnerabilityStats": "Get vulnerability statistics",
      "getVulnerability": "Get vulnerability",
      "updateVulnerability": "Update vulnerability",
      "deleteVulnerability": "Delete vulnerability",
      "listRoles": "List roles",
      "createRole": "Create role",
      "getRole": "Get role",
      "updateRole": "Update role",
      "deleteRole": "Delete role",
      "getAvailableSkills": "Get available Skills list",
      "listSkills": "List Skills",
      "createSkill": "Create Skill",
      "getSkillStats": "Get Skill statistics",
      "clearSkillStats": "Clear Skill statistics",
      "getSkill": "Get Skill",
      "updateSkill": "Update Skill",
      "deleteSkill": "Delete Skill",
      "getBoundRoles": "Get bound roles",
      "clearSkillStatsAlt": "Clear Skill statistics",
      "getMonitorInfo": "Get monitoring info",
      "getExecutionRecords": "Get execution records",
      "deleteExecutionRecord": "Delete execution record",
      "batchDeleteExecutionRecords": "Batch delete execution records",
      "getStats": "Get statistics",
      "getConfig": "Get configuration",
      "updateConfig": "Update configuration",
      "getToolConfig": "Get tool configuration",
      "applyConfig": "Apply configuration",
      "listExternalMCP": "List external MCP",
      "getExternalMCPStats": "Get external MCP statistics",
      "getExternalMCP": "Get external MCP",
      "addOrUpdateExternalMCP": "Add or update external MCP",
      "stdioModeConfig": "stdio mode config",
      "sseModeConfig": "SSE mode config",
      "deleteExternalMCP": "Delete external MCP",
      "startExternalMCP": "Start external MCP",
      "stopExternalMCP": "Stop external MCP",
      "getAttackChain": "Get attack chain",
      "regenerateAttackChain": "Regenerate attack chain",
      "pinConversation": "Pin conversation",
      "pinGroup": "Pin group",
      "pinGroupConversation": "Pin conversation in group",
      "getCategories": "Get categories",
      "listKnowledgeItems": "List knowledge items",
      "createKnowledgeItem": "Create knowledge item",
      "getKnowledgeItem": "Get knowledge item",
      "updateKnowledgeItem": "Update knowledge item",
      "deleteKnowledgeItem": "Delete knowledge item",
      "getIndexStatus": "Get index status",
      "startKnowledgeIndex": "Build index",
      "scanKnowledgeBase": "Scan knowledge base",
      "searchKnowledgeBase": "Search knowledge base",
      "basicSearch": "Basic search",
      "searchByRiskType": "Search by risk type",
      "getRetrievalLogs": "Get retrieval logs",
      "deleteRetrievalLog": "Delete retrieval log",
      "mcpEndpoint": "MCP endpoint",
      "listAllTools": "List all tools",
      "invokeTool": "Invoke tool",
      "initConnection": "Initialize connection",
      "successResponse": "Success response",
      "errorResponse": "Error response",
      "deleteConversationTurn": "Delete conversation turn",
      "getMessageProcessDetails": "Get message process details",
      "rerunBatchQueue": "Rerun batch task queue",
      "updateBatchQueueMetadata": "Update queue metadata",
      "updateBatchQueueSchedule": "Update queue schedule",
      "setBatchQueueScheduleEnabled": "Toggle cron auto-schedule",
      "getAllGroupMappings": "Get all group mappings",
      "fofaSearch": "FOFA search",
      "fofaParse": "Parse natural language to FOFA syntax",
      "testOpenAI": "Test OpenAI API connection",
      "terminalRun": "Run terminal command",
      "terminalRunStream": "Run terminal command (stream)",
      "terminalWS": "WebSocket terminal",
      "listWebshellConnections": "List WebShell connections",
      "createWebshellConnection": "Create WebShell connection",
      "updateWebshellConnection": "Update WebShell connection",
      "deleteWebshellConnection": "Delete WebShell connection",
      "getWebshellConnectionState": "Get connection state",
      "saveWebshellConnectionState": "Save connection state",
      "getWebshellAIHistory": "Get AI chat history",
      "listWebshellAIConversations": "List AI conversations",
      "webshellExec": "Execute WebShell command",
      "webshellFileOp": "WebShell file operation",
      "listChatUploads": "List uploads",
      "uploadChatFile": "Upload file",
      "deleteChatUpload": "Delete upload",
      "downloadChatUpload": "Download upload",
      "getChatUploadContent": "Get file text content",
      "putChatUploadContent": "Write file text content",
      "mkdirChatUpload": "Create upload directory",
      "renameChatUpload": "Rename upload",
      "wecomCallbackVerify": "WeCom callback verification",
      "wecomCallbackMessage": "WeCom message callback",
      "dingtalkCallback": "DingTalk message callback",
      "larkCallback": "Lark message callback",
      "testRobot": "Test robot message processing",
      "listMarkdownAgents": "List Markdown agents",
      "createMarkdownAgent": "Create Markdown agent",
      "getMarkdownAgent": "Get Markdown agent detail",
      "updateMarkdownAgent": "Update Markdown agent",
      "deleteMarkdownAgent": "Delete Markdown agent",
      "listSkillPackageFiles": "List skill package files",
      "getSkillPackageFile": "Get skill package file content",
      "putSkillPackageFile": "Write skill package file",
      "batchGetToolNames": "Batch get tool names",
      "getKnowledgeStats": "Get knowledge base stats",
      "listProjects": "List projects",
      "createProject": "Create project",
      "getProject": "Get project",
      "updateProject": "Update project",
      "deleteProject": "Delete project",
      "listProjectFacts": "List or get fact by key",
      "upsertProjectFact": "Create/update fact",
      "getProjectFactGraph": "Get project fact attack path graph",
      "listProjectFactEdges": "List all project fact edges",
      "createProjectFactEdge": "Add fact edge",
      "deleteProjectFactEdge": "Delete fact edge",
      "promoteAttackChainToProject": "Promote conversation attack chain to project fact graph"
    },
    "response": {
      "getSuccess": "Success",
      "unauthorized": "Unauthorized",
      "unauthorizedToken": "Unauthorized, valid Token required",
      "createSuccess": "Created successfully",
      "badRequest": "Bad request",
      "conversationNotFound": "Conversation not found",
      "conversationOrResultNotFound": "Conversation or result not found",
      "badRequestTaskEmpty": "Bad request (e.g. task is empty)",
      "badRequestGroupNameExists": "Bad request or group name already exists",
      "groupNotFound": "Group not found",
      "badRequestConfig": "Bad request (e.g. invalid config or missing required fields)",
      "badRequestQueryEmpty": "Bad request (e.g. query is empty)",
      "methodNotAllowed": "Method not allowed (POST only)",
      "loginSuccess": "Login successful",
      "invalidPassword": "Invalid password",
      "logoutSuccess": "Logout successful",
      "passwordChanged": "Password changed successfully",
      "tokenValid": "Token valid",
      "tokenInvalid": "Token invalid or expired",
      "conversationCreated": "Conversation created",
      "internalError": "Internal server error",
      "updateSuccess": "Updated successfully",
      "deleteSuccess": "Deleted successfully",
      "queueNotFound": "Queue not found",
      "startSuccess": "Started successfully",
      "pauseSuccess": "Paused successfully",
      "addSuccess": "Added successfully",
      "taskNotFound": "Task not found",
      "conversationOrGroupNotFound": "Conversation or group not found",
      "cancelSubmitted": "Cancel request submitted",
      "noRunningTask": "No running task found",
      "messageSent": "Message sent, AI reply returned",
      "streamResponse": "Stream response (Server-Sent Events)",
      "badRequestOrDeleteFailed": "Bad request or delete failed",
      "paramError": "Invalid parameters",
      "onlyCompletedOrCancelledCanRerun": "Only completed or cancelled queues can be rerun",
      "badRequestOrQueueRunning": "Bad request or queue is running",
      "setSuccess": "Set successfully",
      "searchSuccess": "Search successful",
      "parseSuccess": "Parse successful",
      "testResult": "Test result",
      "executionDone": "Execution completed",
      "sseEventStream": "SSE event stream",
      "wsEstablished": "WebSocket connection established",
      "fileDownload": "File download",
      "fileNotFound": "File not found",
      "writeSuccess": "Written successfully",
      "renameSuccess": "Renamed successfully",
      "wecomVerifySuccess": "Verification successful, decrypted echostr returned",
      "processSuccess": "Processed successfully",
      "agentNotFound": "Agent not found",
      "saveSuccess": "Saved successfully",
      "operationResult": "Operation result",
      "executionResult": "Execution result",
      "connectionNotFound": "Connection not found",
      "projectList": "Project list",
      "projectDetail": "Project detail",
      "projectFactList": "Fact list or single fact (may include link_counts / outgoing_links)",
      "success": "Success",
      "factGraphNodesEdges": "nodes + edges",
      "edgeList": "Edge list",
      "edgeCreated": "Edge created",
      "promoteAttackChainResult": "Promotion result (facts/edges/graph)"
    }
  },
  "chatGroup": {
    "search": "Search",
    "edit": "Edit",
    "delete": "Delete",
    "clearSearch": "Clear search",
    "searchInGroupPlaceholder": "Search in group...",
    "attackChain": "Attack chain",
    "viewAttackChain": "View attack chain",
    "selectRole": "Select role",
    "close": "Close",
    "selectFile": "Select file",
    "uploadFile": "Upload file (multi-select or drag & drop)",
    "send": "Send",
    "rolePanelTitle": "Select role",
    "copyMessage": "Copy message",
    "remove": "Remove"
  },
  "mcpMonitor": {
    "deselectAll": "Deselect all",
    "statusPending": "Pending",
    "statusSuccess": "Succeeded",
    "statusCompleted": "Completed",
    "statusRunning": "Running",
    "statusFailed": "Failed",
    "statusCancelled": "Cancelled",
    "terminateExecution": "Stop",
    "loading": "Loading...",
    "noStatsData": "No statistical data",
    "noExecutions": "No execution records",
    "emptyHint": "Execution records will appear here after you invoke MCP tools in chat or tasks",
    "noRecordsWithFilter": "No records with current filter",
    "paginationInfo": "Show {{start}}-{{end}} of {{total}} records",
    "perPageLabel": "Per page",
    "firstPage": "First",
    "prevPage": "Previous",
    "nextPage": "Next",
    "lastPage": "Last",
    "pageInfo": "Page {{page}} of {{total}}",
    "loadStatsError": "Failed to load statistics",
    "loadExecutionsError": "Failed to load execution records",
    "totalCalls": "Total calls",
    "successFailed": "Success {{success}} / Failed {{failed}}",
    "successRate": "Success rate",
    "statsFromAllTools": "From all tool calls",
    "lastCall": "Last call",
    "lastRefreshTime": "Last refresh",
    "noCallsYet": "No calls yet",
    "unknownTool": "Unknown tool",
    "successFailedRate": "Success {{success}} / Failed {{failed}} · {{rate}}% success rate",
    "topToolsTitle": "Top {{n}} tools by calls",
    "toolRankingTitle": "Tool call ranking",
    "toolStatsTitle": "Tool statistics",
    "toolStatsHint": "Click a bar segment or row to filter records below; hover to highlight",
    "scopeCumulative": "All time",
    "scopeTimeline": "Trend period",
    "filterActive": "Filtered: {{tool}}",
    "kpiScopeNote": "Lifetime totals",
    "columnCalls": "Calls",
    "columnShare": "Share",
    "columnSuccessRate": "Success rate",
    "rankingSummary": "Top {{n}} {{pct}}% · {{total}} total calls",
    "barVolumeLegend": "Bar length: relative call volume; green/red: success vs failure share",
    "clickToFilterTool": "Click a row to filter records below",
    "toolRowAriaLabel": "{{name}}, {{total}} calls, {{rate}}% success rate. Click to filter records.",
    "successRateAria": "Success rate {{rate}}%",
    "filterByToolTitle": "Filtered by: {{tool}}",
    "clearToolFilter": "Clear tool filter",
    "successCount": "Success {{n}}",
    "failedCount": "Failed {{n}}",
    "rateHealthy": "Running smoothly",
    "rateWarning": "Some failures detected",
    "rateCritical": "High failure rate",
    "statsSubtitle": "Refreshed {{time}} · {{count}} tools",
    "retentionHint": "Execution records are kept for {{days}} days, then purged automatically.",
    "timelineTitle": "Call trend",
    "timelineHint": "All tools combined (not split by tool)",
    "timelineRange24h": "24h",
    "timelineRange7d": "7d",
    "timelineRange30d": "30d",
    "timelineSummary": "{{total}} calls in range · peak {{peak}}",
    "timelineSparseHint": "Most buckets are empty; peak {{peak}} calls at {{peakTime}}",
    "timelineNoData": "No calls in this period",
    "timelineLoading": "Loading trend…",
    "timelineEmptyHint": "Switch the time range or invoke MCP tools in chat or tasks",
    "timelineLoadError": "Failed to load call trend",
    "timelineTotalLegend": "Total calls",
    "timelineFailedLegend": "Failed",
    "timelineTooltip": "{{time}}: {{total}} calls ({{failed}} failed)",
    "distTitle": "Call distribution",
    "distLegend": "Slice area shows share of all calls",
    "distClickHint": "Click a bar segment to filter records",
    "distHeaderHint": "{{n}} total calls",
    "distSegmentAria": "{{name}}, {{pct}}% of calls, {{calls}} times",
    "distOthersNoFilter": "Other tools cannot be filtered individually",
    "distTotalCalls": "{{n}} total calls",
    "distTop6Share": "Top {{n}} share of all calls",
    "distOthers": "Other tools",
    "distCallsUnit": "{{n}} calls",
    "riskTitle": "Failure alerts",
    "riskNone": "No recent failures",
    "riskItem": "{{name}}: {{failed}} / {{total}} failed",
    "selectedToolTitle": "Active filter",
    "selectedToolEmpty": "Click a tool on the left to filter records below",
    "selectedToolStats": "{{total}} calls · {{success}} ok · {{failed}} failed · {{rate}}% success",
    "columnTool": "Tool",
    "columnStatus": "Status",
    "columnStartTime": "Start time",
    "columnDuration": "Duration",
    "columnActions": "Actions",
    "viewDetail": "View details",
    "delete": "Delete",
    "deleteExecTitle": "Delete this execution record",
    "deleteExecConfirmSingle": "Are you sure you want to delete this execution record? This cannot be undone.",
    "deleteExecFailed": "Failed to delete execution record",
    "execDeleted": "Execution record deleted",
    "selectExecFirst": "Please select execution record(s) to delete first",
    "batchDeleteConfirm": "Are you sure you want to delete the selected {{count}} execution record(s)? This cannot be undone.",
    "batchDeleteSuccess": "Successfully deleted {{count}} execution record(s)",
    "unknown": "Unknown",
    "durationSeconds": "{{n}} sec",
    "durationMinutes": "{{minutes}} min {{seconds}} sec",
    "durationMinutesOnly": "{{minutes}} min",
    "durationHours": "{{hours}} hr {{minutes}} min",
    "durationHoursOnly": "{{hours}} hr"
  },
  "knowledgePage": {
    "totalContent": "Total content",
    "categoryFilter": "Category filter",
    "all": "All",
    "searchPlaceholder": "Search knowledge...",
    "loading": "Loading..."
  },
  "retrievalLogs": {
    "totalRetrievals": "Total retrievals",
    "successRetrievals": "Success",
    "successRate": "Success rate",
    "retrievedItems": "Items retrieved",
    "conversationId": "Conversation ID",
    "messageId": "Message ID",
    "filter": "Filter",
    "optionalConversation": "Optional: filter by conversation",
    "optionalMessage": "Optional: filter by message",
    "loading": "Loading...",
    "noRecords": "No retrieval records yet",
    "noQuery": "No query content",
    "itemsUnit": "items",
    "hasResults": "Has results",
    "noResults": "No results",
    "clickToCopy": "Click to copy",
    "retrievalResult": "Retrieval result",
    "foundCount": "Found {{count}} related knowledge item(s)",
    "foundUnknown": "Found related knowledge (count unknown)",
    "noMatch": "No matching knowledge items",
    "retrievedItemsLabel": "Retrieved knowledge items:",
    "viewDetails": "View details",
    "loadError": "Failed to load retrieval logs",
    "detailError": "Unable to get retrieval details",
    "deleteError": "Failed to delete retrieval log",
    "detailsTitle": "Retrieval details",
    "queryInfo": "Query info",
    "queryContent": "Query content:",
    "retrievalInfo": "Retrieval info",
    "riskType": "Risk type",
    "retrievalTime": "Retrieval time",
    "noItemDetails": "No knowledge item details found",
    "noContentPreview": "No content preview",
    "untitled": "Untitled",
    "uncategorized": "Uncategorized",
    "relatedInfo": "Related info",
    "itemsCount": "{{count}} knowledge item(s)",
    "deleteConfirm": "Delete this retrieval record?"
  },
  "infoCollectPage": {
    "title": "Recon",
    "reset": "Reset",
    "confirm": "OK",
    "fofaQuerySyntax": "FOFA query syntax",
    "naturalLanguage": "Natural language (AI parses to FOFA)",
    "returnCount": "Return count",
    "pageNum": "Page",
    "returnFields": "Return fields (comma-separated)",
    "queryResults": "Query results",
    "selectedRows": "{{count}} selected",
    "selectedRowsZero": "0 selected",
    "columns": "Columns",
    "exportCsv": "Export CSV",
    "exportJson": "Export JSON",
    "exportXlsx": "Export XLSX",
    "batchScan": "Batch scan",
    "showColumns": "Show columns",
    "columnsPanelAll": "Select all",
    "columnsPanelNone": "Deselect all",
    "columnsPanelClose": "Close",
    "formHint": "See FOFA docs for query syntax; supports && / || / ().",
    "parseBtn": "AI parse",
    "parseHint": "Result will open in a popup for editing before running the query.",
    "minFields": "Min fields",
    "webCommon": "Web common",
    "intelEnhanced": "Intel enhanced",
    "presetApache": "Apache + China",
    "presetLogin": "Login page + China",
    "presetDomain": "By domain",
    "presetIp": "By IP",
    "queryPresetsAria": "FOFA query presets",
    "fieldsPresetsAria": "FOFA field presets",
    "resultsToolbarAria": "Results toolbar",
    "fillExample": "Fill example",
    "parseBtnTitle": "Parse natural language to FOFA query",
    "minFieldsTitle": "For quick export",
    "webCommonTitle": "For browsing and filtering",
    "intelEnhancedTitle": "More fingerprint/intel",
    "fullLabel": "full",
    "nlPlaceholder": "e.g. Apache sites in Missouri, US, title contains Home",
    "showHideColumns": "Show/hide columns",
    "exportCsvTitle": "Export results as CSV (UTF-8)",
    "exportJsonTitle": "Export results as JSON",
    "exportXlsxTitle": "Export results as Excel",
    "batchScanTitle": "Create batch task queue from selected rows"
  },
  "chatFilesPage": {
    "title": "File Management",
    "intro": "Files uploaded in chat appear here. Drag files into the list below, or click Upload to pick files (multiple allowed). Click “Copy path” to copy the server absolute path and paste it into a conversation so the model can reference the file.",
    "upload": "Upload",
    "conversationFilter": "Conversation ID",
    "conversationPlaceholder": "Leave empty for all",
    "searchName": "File name",
    "searchNamePlaceholder": "Filter by file name",
    "groupBy": "Group by",
    "groupNone": "None (flat list)",
    "groupByDate": "By date",
    "groupByConversation": "By conversation",
    "groupByFolder": "By folder (path navigation)",
    "browseRoot": "chat_uploads",
    "browseUp": "Up",
    "enterFolderTitle": "Open folder",
    "copyFolderPathTitle": "Copy relative path under chat_uploads/…",
    "folderPathCopied": "Folder path copied — paste into chat if needed",
    "folderEmpty": "This folder is empty",
    "confirmDeleteFolder": "Delete this folder and everything inside it? This cannot be undone.",
    "folderRemovedStale": "That folder is not on the server anymore; list refreshed.",
    "deleteFolderTitle": "Delete folder",
    "uploadToFolderTitle": "Upload file into this folder",
    "newFolderButton": "New folder",
    "newFolderTitle": "New folder",
    "newFolderLocation": "Location",
    "newFolderNameLabel": "Folder name",
    "newFolderNamePlaceholder": "Name only, no slashes",
    "mkdirOk": "Folder created",
    "mkdirExists": "A file or folder with that name already exists",
    "mkdirInvalidName": "Invalid name: cannot be empty or contain /, \\, or use . or ..",
    "colSubPath": "Subfolder",
    "folderRoot": "(root)",
    "groupCount": "{{count}} files",
    "convManual": "Manual upload",
    "convNew": "New chat",
    "colDate": "Date",
    "colConversation": "Conversation",
    "colName": "Name",
    "colSize": "Size",
    "colModified": "Modified",
    "colActions": "Actions",
    "copyPath": "Copy path",
    "copyPathTitle": "Copy the absolute path on the server; paste into chat to reference this file",
    "pathCopied": "Path copied — paste it into chat",
    "uploadOkHint": "Uploaded. Use “Copy path” to copy the absolute path.",
    "uploadingFile": "Uploading {{name}} · {{percent}}%",
    "moreActions": "More: open chat, edit, rename, delete",
    "download": "Download",
    "edit": "Edit",
    "rename": "Rename",
    "openChat": "Open chat",
    "confirmDelete": "Delete this file?",
    "editTitle": "Edit file",
    "renameTitle": "Rename",
    "renameCurrentFile": "Current file",
    "newFileName": "New file name",
    "empty": "No chat uploads yet",
    "errorLoad": "Failed to load",
    "editBinaryHint": "Binary files (images, archives, etc.) cannot be edited as text here. Use Download and open locally.",
    "editUnavailable": "N/A",
    "editTooLarge": "File exceeds 2MB and cannot be edited here. Download and edit locally.",
    "errorGeneric": "Something went wrong. Please try again."
  },
  "vulnerabilityPage": {
    "statTotal": "Total",
    "statClickAll": "View all (clear severity filter)",
    "statClickFilter": "Click to filter by this severity; click again to clear",
    "advancedFilters": "Advanced filters",
    "moreFilters": "More filters",
    "applyFilters": "Apply",
    "clearAdvanced": "Clear",
    "clearAll": "Reset all",
    "activeFilters": "Active filters",
    "chipRemove": "Remove",
    "filter": "Filter",
    "clear": "Clear",
    "vulnId": "Vuln ID",
    "conversationId": "Conversation ID",
    "taskOrQueueId": "Task / queue ID",
    "filterTaskOrQueue": "Filter by task or queue ID",
    "conversationTag": "Conversation tag",
    "filterConversationTag": "Filter by conversation tag",
    "taskTag": "Task tag",
    "filterTaskTag": "Filter by task tag",
    "severity": "Severity",
    "status": "Status",
    "statusOpen": "Open",
    "statusConfirmed": "Confirmed",
    "statusFixed": "Fixed",
    "statusFalsePositive": "False positive",
    "statusIgnored": "Ignored",
    "statusChangeLabel": "Change status",
    "statusUpdateFailed": "Failed to update status",
    "searchVulnId": "Search vuln ID",
    "searchKeyword": "Search title, description, type, target…",
    "searchKeywordShort": "Keyword",
    "filterExactId": "Exact vuln ID",
    "filterEnterHint": "Press Enter to filter",
    "filterConversation": "Filter by conversation",
    "loading": "Loading...",
    "loadListFailed": "Failed to load",
    "noRecords": "No vulnerability records",
    "batchExport": "Batch export",
    "batchDelete": "Batch delete",
    "batchDeleteNoResults": "No vulnerabilities match the current filters to delete",
    "batchDeleteConfirm": "Delete {{count}} vulnerability record(s) matching the current filters? This cannot be undone.",
    "batchDeleteConfirmAll": "No filters are set. This will delete all {{count}} vulnerability record(s). This cannot be undone. Continue?",
    "batchDeleteSuccess": "Successfully deleted {{count}} vulnerability record(s)",
    "batchDeleteFailed": "Batch delete failed",
    "downloadMarkdownTitle": "Download Markdown",
    "exportNoResults": "No vulnerabilities match the current filters",
    "exportStarted": "Started downloading {{count}} file(s)",
    "exportFailed": "Export failed",
    "saveRequiredFields": "Please fill in conversation ID, title, description, severity, type, target, reproduction steps, evidence/POC, impact, and remediation",
    "saveFailed": "Save failed",
    "fetchFailed": "Failed to fetch vulnerability",
    "deleteFailed": "Delete failed",
    "detailVulnId": "Vuln ID",
    "detailType": "Type",
    "detailTarget": "Target",
    "detailProject": "Project",
    "projectUnbound": "No project",
    "allProjects": "All projects",
    "filterByProject": "Filter by project",
    "projectBindHint": "Once bound, agents can list this finding under the project scope.",
    "projectBindFailed": "Failed to update project binding",
    "projectBindOk": "Project binding updated",
    "detailConversationId": "Conversation ID",
    "openConversation": "View conversation",
    "detailTaskId": "Task ID",
    "detailTaskQueueId": "Task queue ID",
    "detailConversationTag": "Conversation tag",
    "detailTaskTag": "Task tag",
    "detailPreconditions": "Preconditions",
    "detailReproductionSteps": "Reproduction steps",
    "detailEvidence": "Evidence / POC",
    "detailImpact": "Impact",
    "detailRecommendation": "Remediation",
    "detailRetestNotes": "Retest method",
    "downloadOkTitle": "Downloaded",
    "exportFailedMessage": "Export failed",
    "downloadFailed": "Download failed"
  },
  "tasksPage": {
    "statusFilter": "Status filter",
    "statusPending": "Pending",
    "statusPaused": "Paused",
    "statusCancelled": "Cancelled",
    "searchQueuePlaceholder": "Search queue ID, title or created time",
    "searchKeywordPlaceholder": "Enter keyword..."
  },
  "skillsPage": {
    "clearStats": "Clear stats",
    "clearStatsTitle": "Clear all statistics",
    "skillsCallStats": "Skills call stats",
    "searchPlaceholder": "Search Skills...",
    "overviewTotal": "Skills",
    "overviewCurrent": "This page",
    "overviewFiles": "Files",
    "overviewScripts": "Scripts",
    "loading": "Loading...",
    "paginationShow": "Show {{start}}-{{end}} of {{total}}",
    "perPageLabel": "Per page",
    "firstPage": "First",
    "prevPage": "Previous",
    "pageOf": "Page {{current}} / {{total}}",
    "nextPage": "Next",
    "lastPage": "Last"
  },
  "agentsPage": {
    "title": "Agent management",
    "create": "New agent",
    "hint": "Agents are .md files under agents_dir (front matter + body as system prompt). The orchestrator is the Deep coordinator and is not listed as a task sub-agent.",
    "dirLabel": "Directory",
    "loading": "Loading...",
    "empty": "No Markdown sub-agents yet. Click New agent to create one.",
    "noDesc": "No description",
    "loadFailed": "Failed to load list",
    "loadOneFailed": "Failed to load agent",
    "createTitle": "New agent",
    "editTitle": "Edit agent",
    "filename": "File name (.md)",
    "filenamePlaceholder": "e.g. code-reviewer.md",
    "fieldRole": "Type",
    "roleSub": "Sub-agent",
    "roleOrchestrator": "Orchestrator (Deep)",
    "roleHint": "Orchestrators are mode-specific: Deep → orchestrator.md (or one .md with kind: orchestrator); plan_execute → orchestrator-plan-execute.md; supervisor → orchestrator-supervisor.md. At most one of each. Empty body falls back to multi_agent.orchestrator_instruction / orchestrator_instruction_plan_execute / orchestrator_instruction_supervisor or built-in defaults (PE/SV do not reuse Deep orchestrator_instruction).",
    "badgeOrchestrator": "Orchestrator",
    "badgeSub": "Sub-agent",
    "filenameInvalid": "File name must end with .md and use only letters, digits, ._-",
    "fieldId": "Agent id (optional; derived from name if empty)",
    "fieldName": "Display name",
    "namePlaceholder": "Code Reviewer",
    "fieldDesc": "Description",
    "descPlaceholder": "When the orchestrator should delegate to this agent",
    "fieldTools": "Tools (comma-separated; same keys as role tools)",
    "fieldBindRole": "Bind role (optional)",
    "fieldMaxIter": "Max iterations (0 = use Settings → agent.max_iterations)",
    "fieldInstruction": "System prompt (Markdown body)",
    "instructionPlaceholder": "You are a specialist agent...",
    "nameRequired": "Display name is required",
    "instructionRequired": "System prompt body is required",
    "saveOk": "Saved",
    "createOk": "Created",
    "saveFailed": "Save failed",
    "deleteConfirm": "Delete {{name}}?",
    "deleteOk": "Deleted",
    "deleteFailed": "Delete failed"
  },
  "settingsBasic": {
    "basicTitle": "Basic settings",
    "openaiConfig": "OpenAI config",
    "apiProvider": "API Provider",
    "providerOpenAI": "OpenAI / OpenAI-compatible API",
    "providerClaude": "Claude (Anthropic Messages API)",
    "visionProviderReuseOpenAI": "Reuse OpenAI config (leave empty)",
    "fofaConfig": "FOFA config",
    "agentConfig": "Agent config",
    "knowledgeConfig": "Knowledge base config",
    "baseUrl": "Base URL",
    "apiKey": "API Key",
    "model": "Model",
    "openaiBaseUrlPlaceholder": "https://api.openai.com/v1",
    "openaiApiKeyPlaceholder": "Enter OpenAI API Key",
    "modelPlaceholder": "gpt-4",
    "fetchModels": "Fetch list",
    "modelsListFetching": "Fetching model list...",
    "modelsListSelectPlaceholder": "Select a model",
    "modelsListSuccess": "Loaded {count} models — use the dropdown on the right, or type in the input",
    "modelsListFailed": "Failed to fetch model list",
    "modelsListNeedApiKey": "Please enter API Key first",
    "modelsListClaudeHint": "Claude does not support auto model list; enter the model name manually",
    "maxTotalTokens": "Max Context Tokens",
    "maxTotalTokensPlaceholder": "120000",
    "maxTotalTokensHint": "Shared by memory compression and attack chain building. Default: 120000",
    "openaiReasoningTitle": "Model reasoning (Eino)",
    "openaiReasoningHint": "Applies to Eino single-agent and multi-agent only; works with chat-page reasoning controls.",
    "openaiReasoningProfile": "Wire profile",
    "openaiReasoningAllowClient": "Allow chat page to override reasoning options",
    "fofaBaseUrlPlaceholder": "https://fofa.info/api/v1/search/all (optional)",
    "fofaBaseUrlHint": "Leave empty for default.",
    "email": "Email",
    "fofaEmailPlaceholder": "Enter FOFA email",
    "fofaApiKeyPlaceholder": "Enter FOFA API Key",
    "fofaApiKeyHint": "Stored in server config (config.yaml) only.",
    "maxIterations": "Max iterations",
    "iterationsPlaceholder": "30",
    "enableMultiAgent": "Enable Eino multi-agent",
    "enableMultiAgentHint": "After enabling, the chat page can use multi-agent mode; sub-agents are set in multi_agent.sub_agents or the agents/ directory. Orchestration is configured below.",
    "multiAgentOrchestration": "Multi-agent orchestration",
    "multiAgentOrchestrationHint": "deep = DeepAgent + task; plan_execute = plan / execute / replan; supervisor = expert routing (transfer, specific scenarios). Takes effect after save & apply.",
    "multiAgentOrchDeep": "deep — DeepAgent (task sub-agents)",
    "multiAgentOrchPlanExecute": "plan_execute — plan / execute / replan",
    "multiAgentOrchSupervisor": "supervisor — expert routing (transfer)",
    "multiAgentPeLoop": "plan_execute outer loop limit",
    "multiAgentPeLoopPlaceholder": "0 uses Eino default (10)",
    "multiAgentPeLoopHint": "Only for plan_execute; max execute↔replan rounds.",
    "multiAgentRobotMode": "Default conversation mode for bots",
    "multiAgentRobotModeHint": "Execution mode for WeCom / DingTalk / Lark bot messages. Deep / Plan-Execute / Supervisor require multi-agent to be enabled.",
    "agentAdvanced": "Advanced settings",
    "userLedgerMaxRunes": "User input ledger total character limit",
    "userLedgerMaxRunesHint": "Total limit for the original user input ledger injected after compaction; 0 uses the backend default. DB-stored original messages are not truncated.",
    "userLedgerEntryMaxRunes": "Per-message user input character limit",
    "userLedgerEntryMaxRunesHint": "Model-visible limit for each user message in the ledger; 0 uses the backend default and does not affect DB originals.",
    "latestUserMaxRunes": "Latest user input character limit",
    "latestUserMaxRunesHint": "Runtime limit for the current user message sent to the model; oversized input is persisted and only a preview is injected. 0 uses the backend default.",
    "latestUserHeadRunes": "Latest user input head preview",
    "latestUserHeadRunesHint": "Head characters kept visible to the model for oversized current user input.",
    "latestUserTailRunes": "Latest user input tail preview",
    "latestUserTailRunesHint": "Tail characters kept visible to the model for oversized current user input.",
    "multiAgentBatchUse": "Use multi-agent for batch task queues",
    "multiAgentBatchUseHint": "When enabled, each sub-task executed by queue in Task Management will run through Eino DeepAgent (requires multi-agent).",
    "enableKnowledge": "Enable knowledge retrieval",
    "knowledgeBasePath": "Knowledge base path",
    "knowledgeBasePathPlaceholder": "knowledge_base",
    "knowledgeBasePathHint": "Relative to config file directory",
    "embeddingConfig": "Embedding config",
    "provider": "Provider",
    "embeddingBaseUrlPlaceholder": "Leave empty to use OpenAI base_url",
    "embeddingApiKeyPlaceholder": "Leave empty to use OpenAI api_key",
    "modelName": "Model name",
    "embeddingModelPlaceholder": "text-embedding-v4",
    "retrievalConfig": "Retrieval config",
    "topK": "Top-K results",
    "topKPlaceholder": "5",
    "topKHint": "Number of top-K results to return",
    "similarityThreshold": "Similarity threshold",
    "similarityPlaceholder": "0.7",
    "similarityHint": "Results below this value are filtered (0-1)",
    "subIndexFilter": "Sub-index filter (optional)",
    "subIndexFilterPlaceholder": "e.g. prod, must match an indexing sub_indexes tag",
    "subIndexFilterHint": "Empty = no filter. When set, only rows whose sub_indexes contain this tag (legacy rows with empty sub_indexes still match).",
    "ragPipelineHeader": "RAG pipeline (MultiQuery + Rerank)",
    "ragPipelineHint": "MultiQuery and rerank are always on: LLM query rewrite → vector prefetch & fusion → HTTP rerank → dedupe & budget truncate.",
    "multiQueryMaxQueries": "MultiQuery rewrite variant limit",
    "multiQueryMaxQueriesPlaceholder": "4",
    "multiQueryMaxQueriesHint": "Max LLM-generated retrieval variants (including paraphrases of the original query). Recommended 3–4, max 8.",
    "rerankProvider": "Rerank provider",
    "rerankProviderAuto": "Auto (infer from Base URL)",
    "rerankProviderCohere": "Cohere-compatible API",
    "rerankProviderHint": "DashScope uses gte-rerank; other compatible endpoints use /v1/rerank. Leave empty to infer from Base URL below.",
    "rerankModel": "Rerank model (optional)",
    "rerankModelPlaceholder": "Empty: DashScope→gte-rerank, Cohere→rerank-multilingual-v3.0",
    "rerankBaseUrl": "Rerank Base URL (optional)",
    "rerankBaseUrlPlaceholder": "Leave empty to reuse embedding / OpenAI base_url",
    "rerankApiKey": "Rerank API Key (optional)",
    "rerankApiKeyPlaceholder": "Leave empty to reuse embedding / OpenAI api_key",
    "rerankApiKeyHint": "On rerank failure, results fall back to fusion order; search still works.",
    "postRetrieveHeader": "Post-retrieval (dedupe / budget)",
    "postRetrieveDedupeAuto": "Results are always deduped by normalized text (whitespace-collapsed bodies). No setting required.",
    "prefetchTopK": "Prefetch candidates (vector stage)",
    "prefetchTopKPlaceholder": "20",
    "prefetchTopKHint": "Vector candidates per MultiQuery variant; 0 uses built-in max(top_k×4, 20) (max 200).",
    "maxContextChars": "Max returned characters (Unicode)",
    "maxContextCharsPlaceholder": "0",
    "maxContextCharsHint": "0 = unlimited; keeps whole chunks in rank order until the budget is exceeded.",
    "maxContextTokens": "Max returned tokens",
    "maxContextTokensPlaceholder": "0",
    "maxContextTokensHint": "0 = unlimited; tiktoken estimate (embedding model name, fallback cl100k_base).",
    "indexConfig": "Index config",
    "chunkStrategy": "Chunking strategy",
    "chunkStrategyMarkdownRecursive": "Markdown headers, then recursive (recommended)",
    "chunkStrategyRecursive": "Recursive only",
    "chunkStrategyHint": "Matches Eino-style pipelines: Markdown headers + recursive for docs; plain text can use recursive only.",
    "requestTimeoutSeconds": "Embedding HTTP timeout (seconds)",
    "requestTimeoutPlaceholder": "120",
    "requestTimeoutHint": "0 uses the default 120s embedding HTTP client timeout.",
    "batchSize": "Embedding batch size",
    "batchSizePlaceholder": "64",
    "batchSizeHint": "Max texts per embedding request (SQLite indexer batches writes accordingly).",
    "preferSourceFile": "Prefer on-disk source file when indexing (Eino FileLoader)",
    "preferSourceFileHint": "When enabled, content comes from file_path; falls back to DB content if load fails.",
    "subIndexes": "Eino sub-indexes (comma-separated)",
    "subIndexesPlaceholder": "e.g. prod, knowledge",
    "subIndexesHint": "Passed to indexer.WithSubIndexes; stored in the sub_indexes column.",
    "chunkSize": "Chunk size",
    "chunkSizePlaceholder": "512",
    "chunkSizeHint": "Max tokens per chunk (default 512)",
    "chunkOverlap": "Chunk overlap",
    "chunkOverlapPlaceholder": "50",
    "chunkOverlapHint": "Overlap tokens between chunks (default 50)",
    "maxChunksPerItem": "Max chunks per item",
    "maxChunksPlaceholder": "0",
    "maxChunksHint": "Max chunks per knowledge item (0 = no limit)",
    "maxRpm": "Max RPM",
    "maxRpmPlaceholder": "0",
    "maxRpmHint": "Max requests per minute (0 = no limit)",
    "rateLimitDelay": "Rate limit delay (ms)",
    "rateLimitPlaceholder": "300",
    "rateLimitHint": "Delay between requests (ms); 0 = no limit",
    "maxRetries": "Max retries",
    "maxRetriesPlaceholder": "3",
    "maxRetriesHint": "Retries on rate limit or server error",
    "retryDelay": "Retry delay (ms)",
    "retryDelayPlaceholder": "1000",
    "retryDelayHint": "Delay between retries (ms)",
    "visionConfig": "Vision analysis (analyze_image)",
    "visionEnabled": "Enable analyze_image vision tool",
    "visionEnabledHint": "Registers the MCP tool when enabled; images are sent only for one VL call; agent context keeps text summaries only. Save & apply to take effect.",
    "visionBaseUrlPlaceholder": "Leave empty to reuse OpenAI Base URL",
    "visionApiKeyPlaceholder": "Leave empty to reuse OpenAI API Key",
    "visionModel": "Vision model",
    "visionModelPlaceholder": "qwen-vl-max",
    "visionModelRequired": "Vision model name is required when vision is enabled",
    "visionAdvanced": "Advanced: preprocessing & limits",
    "visionMaxImageBytes": "Max original file size (bytes)",
    "visionMaxDimension": "Max long-edge pixels",
    "visionJpegQuality": "JPEG quality",
    "visionMaxPayloadBytes": "Max API payload (bytes)",
    "visionSkipPreprocessBytes": "Passthrough below (bytes)",
    "visionSkipPreprocessHint": "0 = always JPEG compress; must also fit long-edge and payload limits.",
    "visionDetail": "Image detail",
    "visionTimeout": "Timeout (seconds)",
    "visionTestFillRequired": "Enter vision model and ensure API Key is available (or reuse OpenAI)",
    "testConnection": "Test Connection",
    "testFillRequired": "Please fill in API Key and Model first",
    "testing": "Testing connection...",
    "testSuccess": "Connection successful",
    "testFailed": "Connection failed",
    "testError": "Test error"
  },
  "settingsTerminal": {
    "title": "Terminal",
    "description": "Run commands on the server for ops and debugging. Commands run on the server; avoid sensitive or destructive operations.",
    "terminalTab": "Terminal {{n}}",
    "welcomeLine": "CyberStrikeAI Terminal — real shell session; type commands directly. Ctrl+L to clear screen",
    "sessionClosed": "[Session closed]",
    "connectionError": "[Terminal connection error]",
    "connectFailed": "[Cannot connect to terminal service: {{msg}}]",
    "closeTabTitle": "Close",
    "containerClickTitle": "Click here, then type commands",
    "xtermNotLoaded": "xterm.js failed to load. Refresh the page or check your network.",
    "close": "×",
    "newTerminal": "+"
  },
  "settingsAudit": {
    "title": "Audit logs",
    "description": "Platform admin actions (login, config, deletes). Does not log chat content, per-command terminal/WebShell runs, or per-tool invocations.",
    "filterCategory": "Category",
    "filterAction": "Action",
    "filterEvent": "Event type",
    "filterAllCategories": "All categories",
    "filterAllActions": "All actions",
    "filterCascadeHint": "Select a category to filter by action",
    "filterResult": "Result",
    "pageSize": "Per page",
    "statTotal": "Filtered total",
    "statSuccess": "Success",
    "statFailures": "Failures",
    "statRecent7d": "Last 7 days",
    "retentionHint": "Audit records are kept for {{days}} days, then purged automatically.",
    "disabledHint": "Audit logging is disabled; new actions are not written.",
    "filterSince": "From",
    "filterUntil": "Until",
    "filterTimeZone": "Timezone: {{tz}} (filter uses your browser's local time)",
    "datetimePlaceholder": "Select date & time",
    "timePresets": "Quick range",
    "preset15m": "Last 15 min",
    "preset1h": "Last 1 hour",
    "preset24h": "Last 24 hours",
    "preset7d": "Last 7 days",
    "presetToday": "Today",
    "pickerHour": "Hour",
    "pickerMinute": "Min",
    "pickerClear": "Clear",
    "pickerToday": "Today",
    "pickerConfirm": "OK",
    "filterQuery": "Keyword",
    "filterQueryPlaceholder": "Message / resource ID / action",
    "colTime": "Time",
    "colMessage": "Message",
    "colCategory": "Category",
    "colAction": "Action",
    "colResult": "Result",
    "colIp": "IP",
    "colResource": "Resource ID",
    "cat": {
      "auth": "Auth",
      "config": "Config",
      "terminal": "Terminal",
      "c2": "C2",
      "webshell": "WebShell",
      "knowledge": "Knowledge",
      "conversation": "Conversation",
      "vulnerability": "Vulnerability",
      "externalMcp": "External MCP",
      "task": "Tasks",
      "tool": "Tools",
      "file": "Files",
      "hitl": "HITL",
      "role": "Roles",
      "skill": "Skills",
      "agent": "Sub-agents"
    },
    "act": {
      "login": "Login",
      "logout": "Logout",
      "login_failed": "Login failed",
      "password_change": "Password change",
      "change_password": "Change password",
      "apply": "Apply config",
      "update": "Update",
      "exec": "Terminal exec",
      "exec_stream": "Terminal stream",
      "listener_create": "Create listener",
      "listener_delete": "Delete listener",
      "listener_start": "Start listener",
      "listener_stop": "Stop listener",
      "session_delete": "Delete session",
      "task_create": "Create task",
      "task_cancel": "Cancel task",
      "task_delete": "Delete task",
      "connection_create": "Create connection",
      "connection_delete": "Delete connection",
      "item_delete": "Delete knowledge item",
      "index_build": "Build knowledge index",
      "index_rebuild_full": "Full knowledge index rebuild",
      "delete": "Delete",
      "delete_turn": "Delete turn",
      "create": "Create",
      "upsert": "Upsert external MCP",
      "create_queue": "Create batch queue",
      "start_queue": "Start batch queue",
      "delete_queue": "Delete batch queue",
      "pause_queue": "Pause batch queue",
      "rerun_queue": "Rerun batch queue",
      "delete_batch_task": "Delete batch subtask",
      "execution_delete": "Delete execution",
      "execution_delete_batch": "Batch delete executions",
      "upload": "Upload",
      "decision": "HITL decision",
      "markdown_create": "Create sub-agent",
      "markdown_update": "Update sub-agent",
      "markdown_delete": "Delete sub-agent"
    },
    "openResource": "Open linked resource",
    "openResourceChat": "Open linked resource (chat)",
    "resourceIdLabel": "Resource ID",
    "resourceRemoved": "(resource no longer exists)",
    "filterAll": "All",
    "filterBtn": "Filter",
    "resetBtn": "Reset",
    "exportBtn": "Export",
    "exportJson": "Export JSON",
    "export": "Export JSON",
    "exportCsv": "Export CSV",
    "exportDone": "Export complete",
    "loading": "Loading...",
    "empty": "No audit records",
    "result": {
      "success": "success",
      "failure": "failure"
    },
    "msg": {
      "auth": {
        "login": "Login successful",
        "login_failed": "Login failed: incorrect password",
        "logout": "Logged out",
        "change_password": "Login password changed",
        "change_password_failed": "Password change failed: current password incorrect"
      },
      "config": {
        "apply": "Configuration applied",
        "update": "In-memory configuration updated",
        "apply_fail_kb_init": "Failed to apply config: knowledge base init",
        "apply_fail_kb_reinit": "Failed to apply config: knowledge base re-init",
        "apply_fail_c2": "Failed to apply config: C2"
      },
      "conversation": {
        "create": "Conversation created",
        "delete": "Conversation deleted",
        "delete_turn": "Conversation turn deleted"
      },
      "c2": {
        "listener_create": "C2 listener created",
        "listener_delete": "C2 listener deleted",
        "listener_start": "C2 listener started",
        "listener_stop": "C2 listener stopped",
        "session_delete": "C2 session deleted",
        "task_create": "C2 task created",
        "task_cancel": "C2 task cancelled",
        "task_delete": "C2 tasks deleted (batch)"
      },
      "webshell": {
        "connection_create": "WebShell connection created",
        "connection_delete": "WebShell connection deleted"
      },
      "knowledge": {
        "item_delete": "Knowledge item deleted",
        "index_build": "Knowledge index built",
        "index_rebuild_full": "Knowledge index fully rebuilt"
      },
      "vulnerability": {
        "create": "Vulnerability record created",
        "update": "Vulnerability record updated",
        "delete": "Vulnerability record deleted",
        "delete_batch": "Vulnerability records deleted (batch)"
      },
      "external_mcp": {
        "upsert": "External MCP configuration updated",
        "delete": "External MCP configuration deleted"
      },
      "task": {
        "create_queue": "Batch task queue created",
        "start_queue": "Batch task queue started",
        "delete_queue": "Batch task queue deleted",
        "pause_queue": "Batch task queue paused",
        "rerun_queue": "Batch task queue rerun",
        "delete_batch_task": "Batch subtask deleted"
      },
      "tool": {
        "execution_delete": "Tool execution record deleted",
        "execution_delete_batch": "Tool execution records deleted (batch)"
      },
      "file": {
        "upload": "Chat attachment uploaded",
        "delete": "Chat attachment deleted"
      },
      "hitl": {
        "decision": "HITL approval decision"
      },
      "role": {
        "create": "Role created",
        "update": "Role updated",
        "delete": "Role deleted"
      },
      "skill": {
        "create": "Skill created",
        "update": "Skill updated",
        "delete": "Skill deleted"
      },
      "agent": {
        "markdown_create": "Markdown sub-agent created",
        "markdown_update": "Markdown sub-agent updated",
        "markdown_delete": "Markdown sub-agent deleted"
      }
    },
    "paginationShow": "{{start}}-{{end}} of {{total}}",
    "detailTitle": "Audit detail",
    "detailTime": "Time",
    "detailCategory": "Category",
    "detailResult": "Result",
    "detailMessage": "Message",
    "detailSession": "Session"
  },
  "settingsSecurity": {
    "changePasswordTitle": "Change password",
    "changePasswordDesc": "After changing password, sign in again with the new password.",
    "currentPassword": "Current password",
    "currentPasswordPlaceholder": "Enter current password",
    "newPassword": "New password",
    "newPasswordPlaceholder": "New password (at least 8 characters)",
    "confirmPassword": "Confirm new password",
    "confirmPasswordPlaceholder": "Enter new password again",
    "clear": "Clear",
    "changePasswordBtn": "Change password"
  },
  "settingsRobotsExtra": {
    "botCommandsTitle": "Bot command instructions",
    "botCommandsEntryDesc": "View robot commands for identity, authorization, conversations, roles, modes, projects, and safety diagnostics.",
    "viewAllCommands": "View all commands",
    "botCommandsDesc": "You can send the following commands in chat (Chinese and English supported):",
    "botCmdCategoryGeneral": "General",
    "botCmdCategoryIdentity": "Identity and authorization",
    "botCmdCategoryConversation": "Conversation",
    "botCmdCategoryRole": "Role",
    "botCmdCategoryMode": "Mode",
    "botCmdCategoryDiagnostics": "Diagnostics and safety",
    "botCmdCategoryProject": "Project",
    "botCmdHelp": "Show this help",
    "botCmdIdentity": "Show the platform sender, authorization mode, and effective RBAC identity",
    "botCmdBindUser": "Bind this platform identity to an RBAC user (user-binding mode only)",
    "botCmdUnbindUser": "Remove this platform identity binding (user-binding mode only; confirmation required)",
    "botAuthHint": "Service-account mode does not accept bind or unbind commands; only configured allowlisted senders are accepted.",
    "botCmdList": "List conversations",
    "botCmdSwitch": "Switch to conversation",
    "botCmdNew": "Start new conversation",
    "botCmdClear": "Clear context",
    "botCmdStatus": "Show the current conversation, mode, role and project",
    "botCmdTask": "Show current task status and elapsed time",
    "botCmdRename": "Rename the current conversation",
    "botCmdPermissions": "Show effective business permissions",
    "botCmdDoctor": "Check key configuration status",
    "botCmdConfirmation": "Confirm or cancel a risky action",
    "botCmdStop": "Stop running task",
    "botCmdRoles": "List roles",
    "botCmdRole": "Switch role",
    "botCmdModes": "List conversation modes and the current selection",
    "botCmdMode": "Switch conversation mode",
    "botCmdDelete": "Delete conversation (confirmation required)",
    "botCmdVersion": "Show version",
    "botCmdProjects": "List projects",
    "botCmdNewProject": "Create project and bind current conversation",
    "botCmdBindProject": "Bind current conversation to a project",
    "botCmdUnbindProject": "Unbind project from current conversation",
    "botCommandsFooter": "Otherwise, text is sent to AI under the bound user or service account's current RBAC permissions."
  },
  "mcpDetailModal": {
    "title": "Tool call details",
    "execInfo": "Execution info",
    "tool": "Tool",
    "status": "Status",
    "statusPending": "Pending",
    "statusRunning": "Running",
    "statusCompleted": "Completed",
    "statusFailed": "Failed",
    "statusCancelled": "Cancelled",
    "unknown": "Unknown",
    "getDetailFailed": "Failed to get details",
    "runningNoResponseYet": "No output yet; the tool may still be running. If it hangs, use \"Stop tool\" below to end this call only.",
    "abortTitle": "Execution control",
    "abortHint": "Stops only this tool call. The conversation / multi-step task continues (unlike stopping the whole task).",
    "abortBtn": "Stop tool",
    "abortConfirm": "Stop this tool call? The overall conversation or iterative task will not be cancelled.",
    "abortSuccess": "Cancellation requested; status will update when the tool returns.",
    "abortFailed": "Failed to stop tool",
    "abortNoteModalTitle": "Stop tool with a note",
    "abortNoteModalHint": "Optional: why you stopped or how the model should continue. The model sees any tool output first, then a labeled block (USER INTERRUPT NOTE — not raw tool output), then your text. Leave empty for a plain stop.",
    "abortNoteLabel": "Note (optional)",
    "abortNotePlaceholder": "e.g. Output is enough—skip waiting and continue…",
    "abortNoteSubmit": "Stop tool",
    "abortNoteClose": "Cancel",
    "execSuccessNoContent": "Execution succeeded with no displayable content.",
    "time": "Time",
    "executionId": "Execution ID",
    "requestParams": "Request params",
    "copyJson": "Copy JSON",
    "responseResult": "Response",
    "copyContent": "Copy content",
    "correctInfo": "Correct info",
    "errorInfo": "Error info",
    "copyError": "Copy error",
    "contentTruncated": "… (display truncated; use read_file on the path in persisted-output for the full file)"
  },
  "attackChainModal": {
    "title": "Attack chain",
    "regenerate": "Regenerate",
    "regenerateTitle": "Regenerate attack chain (include latest conversation)",
    "exportPng": "Export PNG",
    "exportSvg": "Export SVG",
    "refreshTitle": "Refresh current attack chain",
    "nodesEdges": "Nodes: {{nodes}} | Edges: {{edges}}",
    "searchPlaceholder": "Search nodes...",
    "allTypes": "All types",
    "target": "Target",
    "action": "Action",
    "vulnerability": "Vulnerability",
    "allRisks": "All risks",
    "highRisk": "High (80-100)",
    "mediumHighRisk": "Medium-high (60-79)",
    "mediumRisk": "Medium (40-59)",
    "lowRisk": "Low (0-39)",
    "resetFilter": "Reset filter",
    "loading": "Loading...",
    "riskLevel": "Risk level",
    "lineMeaning": "Line meaning",
    "blueLine": "Blue: action finds vulnerability",
    "redLine": "Red: enables/contributes",
    "grayLine": "Gray: logical order",
    "nodeDetails": "Node details",
    "closeDetails": "Close details"
  },
  "externalMcpModal": {
    "configJson": "Config JSON",
    "formatLabel": "Format:",
    "formatDesc": "JSON object; key = config name, value = config. Use Start/Stop buttons to control state. Supports ${VAR} and ${VAR:-default} env variable syntax.",
    "configExample": "Configuration example:",
    "stdioMode": "stdio mode:",
    "httpMode": "HTTP mode:",
    "sseMode": "SSE mode:",
    "placeholder": "{\n  \"my-server\": {\n    \"command\": \"python3\",\n    \"args\": [\"${HOME}/mcp/server.py\"],\n    \"env\": { \"API_KEY\": \"${API_KEY}\" },\n    \"timeout\": 300\n  }\n}",
    "exampleStdio": "{\n  \"my-server\": {\n    \"command\": \"python3\",\n    \"args\": [\"${HOME}/mcp/server.py\"],\n    \"env\": { \"API_KEY\": \"${API_KEY}\", \"LOG_LEVEL\": \"${LOG_LEVEL:-INFO}\" },\n    \"timeout\": 300\n  }\n}",
    "exampleHttp": "{\n  \"remote-mcp\": {\n    \"type\": \"http\",\n    \"url\": \"https://mcp.example.com/mcp\",\n    \"headers\": { \"Authorization\": \"Bearer ${MCP_TOKEN}\" }\n  }\n}",
    "exampleSse": "{\n  \"sse-mcp\": {\n    \"type\": \"sse\",\n    \"url\": \"http://127.0.0.1:8081/mcp/sse\"\n  }\n}",
    "exampleDescription": "Example description",
    "formatJson": "Format JSON",
    "loadExample": "Load example"
  },
  "skillModal": {
    "addSkill": "Add Skill",
    "editSkill": "Edit Skill",
    "skillName": "Skill name",
    "skillNamePlaceholder": "e.g. sql-injection-testing",
    "skillNameHint": "Lowercase letters, digits, hyphens (Agent Skills name)",
    "description": "Description",
    "descriptionPlaceholder": "Short description",
    "descriptionHint": "Maps to the description field in SKILL.md YAML (when creating/editing SKILL.md)",
    "packageFiles": "Package files",
    "packageFilesHint": "Click a file to edit; folders are labels only and cannot be opened",
    "folderHint": "Folder (not editable)",
    "clickToEdit": "Click to edit this file",
    "editingFile": "Editing",
    "newFile": "New file",
    "newFilePlaceholder": "Relative path, e.g. FORMS.md or scripts/extra.sh",
    "newFilePathRequired": "Enter a path for the new file",
    "newFilePathInvalid": "Invalid path (no .. or absolute paths)",
    "noPackageFiles": "No files listed",
    "unsavedSwitch": "You have unsaved changes. Switch file anyway?",
    "contentLabel": "Content",
    "contentPlaceholder": "Edit the selected file…",
    "contentPlaceholderAdd": "SKILL.md body only (front matter is generated)…",
    "bodyHintEdit": "For SKILL.md this is the body only (no --- header); save merges with name/description into standard SKILL.md.",
    "contentHintAdd": "Creates standard SKILL.md (YAML front matter + body). Drop open-source skill folders into skills/ as-is.",
    "contentHint": "See Claude Agent Skills format"
  },
  "knowledgeItemModal": {
    "addKnowledge": "Add knowledge",
    "editKnowledge": "Edit knowledge",
    "category": "Category (risk type)",
    "categoryPlaceholder": "e.g. SQL injection",
    "title": "Title",
    "titlePlaceholder": "Knowledge item title",
    "contentLabel": "Content (Markdown)",
    "contentPlaceholder": "Enter content in Markdown..."
  },
  "batchManageModal": {
    "title": "Manage conversations · {{count}} total",
    "searchPlaceholder": "Search history",
    "conversationName": "Conversation name",
    "project": "Project",
    "group": "Group",
    "noProject": "No project",
    "unknownProject": "Unknown project",
    "noGroup": "Ungrouped",
    "unknownGroup": "Unknown group",
    "filterByProject": "Filter by project",
    "filterByGroup": "Filter by group",
    "filterAllGroups": "All groups",
    "filterUngrouped": "Ungrouped",
    "lastTime": "Last activity",
    "action": "Action",
    "selectAll": "Select all",
    "setGroup": "Set group",
    "noGroupOption": "Ungrouped",
    "deleteSelected": "Delete selected",
    "confirmDeleteNone": "Please select at least one conversation to delete",
    "confirmDeleteN": "Delete {{count}} selected conversation(s)? Chat messages cannot be recovered, but recorded vulnerabilities will remain in the vulnerability library.",
    "confirmGroupChangeNone": "Please select at least one conversation",
    "confirmMoveN": "Move {{count}} selected conversation(s) to \"{{group}}\"?",
    "confirmRemoveNoGroup": "None of the selected conversations belong to a group",
    "confirmRemoveN": "Remove {{count}} selected conversation(s) from their group(s)?",
    "removeFailed": "Remove failed",
    "moveFailed": "Move failed",
    "deleteFailed": "Delete failed",
    "unnamedConversation": "Unnamed conversation"
  },
  "createGroupModal": {
    "title": "Create group",
    "description": "Group conversations for easier management.",
    "selectIcon": "Click to choose icon",
    "groupNamePlaceholder": "Enter group name",
    "pickIcon": "Pick icon",
    "customIcon": "Custom",
    "confirmIcon": "OK",
    "create": "Create",
    "cancel": "Cancel",
    "suggestionPenetrationTest": "Penetration Testing",
    "suggestionCtf": "CTF",
    "suggestionRedTeam": "Red Team",
    "suggestionVulnerabilityMining": "Vulnerability Mining",
    "nameExists": "Group name already exists, please use another name.",
    "createFailed": "Create failed",
    "unknownError": "Unknown error"
  },
  "contextMenu": {
    "viewAttackChain": "View attack chain",
    "viewVulnerabilities": "View vulnerabilities",
    "downloadMarkdown": "Download Markdown",
    "downloadMarkdownSummary": "Summary",
    "downloadMarkdownFull": "Full",
    "rename": "Rename",
    "pinConversation": "Pin conversation",
    "unpinConversation": "Unpin",
    "batchManage": "Batch manage",
    "moveToGroup": "Move to group",
    "deleteConversation": "Delete conversation",
    "pinGroup": "Pin group",
    "unpinGroup": "Unpin",
    "deleteGroup": "Delete group"
  },
  "batchImportModal": {
    "title": "New task",
    "queueTitle": "Queue title",
    "queueTitlePlaceholder": "Enter queue title (optional, for identification and filtering)",
    "queueTitleHint": "Set a title for the batch task queue to make it easier to find and manage later.",
    "role": "Role",
    "defaultRole": "Default",
    "roleHint": "Select a role; all tasks will be executed using that role's configuration (prompt and tools).",
    "project": "Project",
    "projectNone": "(Unbound)",
    "projectHint": "Optionally bind this queue to a project; leave empty to keep it unbound.",
    "agentMode": "Agent mode",
    "agentModeSingle": "Single-agent (Eino ADK)",
    "agentModeMulti": "Multi-agent (Eino)",
    "agentModeHint": "Same as chat: Eino single-agent (ADK), or Deep / Plan-Execute / Supervisor (last three require multi_agent.enabled).",
    "concurrency": "Concurrency",
    "concurrencyHint": "Number of subtasks to run in parallel (1-8). Default 1 is serial; use 1-2 for scan-heavy tasks.",
    "scheduleMode": "Schedule mode",
    "scheduleModeManual": "Manual",
    "scheduleModeCron": "Cron expression",
    "scheduleModeHint": "Manual is for one-time runs; Cron is for recurring runs. Validate tasks manually first.",
    "cronExpr": "Cron expression",
    "cronExprPlaceholder": "e.g. 0 */2 * * * (run every 2 hours)",
    "cronExprHint": "Use standard 5-field Cron: minute hour day month weekday. Example: `0 2 * * *` runs at 02:00 daily.",
    "cronExprRequired": "Please fill in a Cron expression when Cron schedule is selected",
    "cronExprInvalid": "Invalid Cron expression format. Must have 5 fields (minute hour day month weekday), e.g.: 0 */2 * * *",
    "executeNow": "Run immediately after creation",
    "executeNowHint": "Default is off. When disabled, the queue stays pending and can be started manually later.",
    "tasksList": "Task list (one task per line)",
    "tasksListPlaceholder": "Enter task list, one per line",
    "tasksListPlaceholderExample": "Enter task list, one per line, for example:\nScan open ports of 192.168.1.1\nCheck if https://example.com has SQL injection\nEnumerate subdomains of example.com",
    "tasksListHint": "Enter one task command per line; the system runs them via a concurrency pool. Empty lines are ignored.",
    "tasksListHintFull": "Hint: Enter one task command per line; the system runs them via a concurrency pool. Empty lines are ignored.",
    "createQueue": "Create queue"
  },
  "batchQueueDetailModal": {
    "title": "Batch queue details",
    "addTask": "Add task",
    "startExecute": "Start",
    "startExecuteNow": "Run now (one round)",
    "startExecuteNowConfirm": "This is a Cron queue. Clicking Start will run the current round immediately instead of waiting for the next Cron time. Continue?",
    "pauseQueue": "Pause queue",
    "rerunQueue": "Rerun",
    "deleteQueue": "Delete queue",
    "queueTitle": "Task title",
    "role": "Role",
    "defaultRole": "Default",
    "queueId": "Queue ID",
    "status": "Status",
    "createdAt": "Created at",
    "startedAt": "Started at",
    "nextRunAt": "Next run at",
    "scheduleCronAuto": "Allow Cron auto-run",
    "scheduleCronAutoHint": "When off, the cron expression is kept but the queue will not run on schedule; use Start to run manually.",
    "editSchedule": "Edit Schedule",
    "editScheduleTitle": "Edit Schedule Configuration",
    "editScheduleSuccess": "Schedule updated",
    "editScheduleError": "Failed to update schedule",
    "editMetadata": "Edit Info",
    "lastScheduleTriggerAt": "Last scheduled trigger",
    "lastScheduleError": "Last schedule error",
    "lastRunError": "Last run failure summary",
    "cronSchedulePausedBadge": "Schedule paused",
    "scheduleToggleFailed": "Failed to update schedule toggle",
    "completedAt": "Completed at",
    "taskTotal": "Total tasks",
    "concurrency": "Concurrency",
    "concurrencyEditHint": "Click to edit. Cannot change while the queue is running.",
    "taskList": "Task list",
    "startLabel": "Start",
    "completeLabel": "Complete",
    "errorLabel": "Error",
    "resultLabel": "Result",
    "technicalDetails": "Technical details (ID, times, schedule)"
  },
  "editBatchTaskModal": {
    "title": "Edit task",
    "taskMessage": "Task message",
    "taskMessagePlaceholder": "Enter task message"
  },
  "addBatchTaskModal": {
    "title": "Add task",
    "taskMessage": "Task message",
    "taskMessagePlaceholder": "Enter task message",
    "add": "Add"
  },
  "vulnerabilityModal": {
    "project": "Project",
    "projectNone": "(Unbound)",
    "projectHint": "Bound findings appear in list_vulnerabilities for that project; leave empty to infer from the conversation when possible.",
    "conversationId": "Conversation ID",
    "conversationIdPlaceholder": "Enter conversation ID",
    "conversationTag": "Conversation tag",
    "conversationTagPlaceholder": "e.g. engagement A, weekly report",
    "taskTag": "Task tag",
    "taskTagPlaceholder": "e.g. batch scan Q2, retest",
    "title": "Title",
    "titlePlaceholder": "/api/login is vulnerable to SQL injection",
    "description": "Description",
    "descriptionPlaceholder": "Describe the summary, trigger point, observed abnormal behavior, and why it is exploitable.",
    "severity": "Severity",
    "pleaseSelect": "Please select",
    "severityCritical": "Critical",
    "severityHigh": "High",
    "severityMedium": "Medium",
    "severityLow": "Low",
    "severityInfo": "Info",
    "status": "Status",
    "statusOpen": "Open",
    "statusConfirmed": "Confirmed",
    "statusFixed": "Fixed",
    "statusFalsePositive": "False positive",
    "statusIgnored": "Ignored",
    "type": "Vulnerability type",
    "typePlaceholder": "e.g. SQL injection, XSS, CSRF",
    "target": "Target",
    "targetPlaceholder": "Be specific: URL, IP:port, endpoint path, and parameter name.",
    "preconditions": "Preconditions",
    "preconditionsPlaceholder": "Login state, permissions, account, headers/cookies, required data, environment/version; write none if not needed.",
    "reproductionSteps": "Reproduction steps",
    "reproductionStepsPlaceholder": "Number the steps and include entry point, parameter, payload, command, and observation point.",
    "evidence": "Evidence / POC",
    "evidencePlaceholder": "Raw request/response, curl/tool command, screenshot notes, logs, DNSLog/callback records, database results, file paths, timestamps, etc.",
    "impact": "Impact",
    "impactPlaceholder": "Describe the verified real-world impact, such as which data can be read or changed.",
    "recommendation": "Recommendation",
    "recommendationPlaceholder": "Write the concrete fix and retest criteria.",
    "retestNotes": "Retest method",
    "retestNotesPlaceholder": "How to verify the fix, including expected status code, error message, or access-control result."
  },
  "vulnerabilityMd": {
    "headingBasic": "Basic information",
    "labelId": "Vulnerability ID",
    "labelSeverity": "Severity",
    "labelStatus": "Status",
    "labelType": "Type",
    "labelTarget": "Target",
    "labelConversationId": "Conversation ID",
    "labelTaskId": "Task ID",
    "labelTaskQueueId": "Task queue ID",
    "labelConversationTag": "Conversation tag",
    "labelTaskTag": "Task tag",
    "labelCreated": "Created at",
    "labelUpdated": "Updated at",
    "headingDescription": "Description",
    "headingPreconditions": "Preconditions",
    "headingReproductionSteps": "Reproduction steps",
    "headingEvidence": "Evidence / POC",
    "headingImpact": "Impact",
    "headingRecommendation": "Remediation",
    "headingRetestNotes": "Retest method"
  },
  "roleModal": {
    "addRole": "Add role",
    "editRole": "Edit role",
    "roleName": "Role name",
    "roleNamePlaceholder": "Enter role name",
    "roleDescription": "Role description",
    "roleDescriptionPlaceholder": "Enter role description",
    "roleIcon": "Role icon",
    "roleIconPlaceholder": "Enter emoji, e.g. 🏆",
    "roleIconHint": "Emoji shown in role selector.",
    "userPrompt": "User prompt",
    "userPromptPlaceholder": "Appended before user message...",
    "userPromptHint": "This prompt is appended before user message to guide AI. It does not change system prompt.",
    "relatedTools": "Related tools (optional)",
    "defaultRoleToolsTitle": "Default role uses all tools",
    "defaultRoleToolsDesc": "Default role uses all tools enabled in MCP Management.",
    "searchToolsPlaceholder": "Search tools...",
    "loadingTools": "Loading tools...",
    "relatedToolsHint": "Use “Linked / Not linked” above to filter by this role’s checkboxes. MCP-wide on/off is in MCP Management.",
    "enableRole": "Enable this role",
    "selectAll": "Select All",
    "deselectAll": "Deselect All",
    "roleNameRequired": "Role name is required",
    "roleNotFound": "Role not found",
    "firstRoleNoToolsHint": "First role with no tools selected will use all tools by default.",
    "filterRoleAll": "All",
    "filterRoleOn": "Linked to role",
    "filterRoleOff": "Not linked",
    "statsPageLinked": "This page checked: {{current}} / {{total}}",
    "statsPageLinkedTitle": "Checked = link tool to this role; unrelated to MCP on/off",
    "statsRoleLinked": "Role checked: {{current}} / {{max}}",
    "statsRoleLinkedTitle": "Numerator: checked tools (MCP on only). Denominator: MCP-on tool count (same as MCP Management filter)",
    "statsRoleLinkedNoMax": "Role checked: {{current}} (switch filter to All, no search, load once to sync cap)",
    "statsRoleLinkedNoMaxTitle": "MCP-on total not cached yet",
    "statsRoleUsesAll": "Policy: all MCP-on tools ({{mcpOn}}) · {{all}} total in catalog (incl. MCP off)",
    "statsRoleUsesAllTitle": "Matches MCP Management “enabled” count; no explicit tool list",
    "statsListScopeAll": "List: all {{n}}",
    "statsListScopeRoleOn": "List: linked to this role {{n}}",
    "statsListScopeRoleOff": "List: not linked to this role {{n}}",
    "usingAllEnabledTools": "(Using all enabled tools)",
    "loadToolsFailed": "Failed to load tools",
    "cannotDeleteDefaultRole": "Cannot delete default role",
    "usingAllTools": "Use all tools",
    "andNMore": " and {{count}} more",
    "toolsLabel": "Tools:",
    "noTools": "No tools",
    "paginationShow": "{{start}}-{{end}} of {{total}} tools",
    "paginationSearch": " (search: \"{{keyword}}\")",
    "firstPage": "First",
    "prevPage": "Previous",
    "pageOf": "Page {{page}} / {{total}}",
    "nextPage": "Next",
    "lastPage": "Last",
    "mcpDisabledBadge": "MCP off",
    "mcpDisabledBadgeTitle": "Off in MCP Management; check only expresses role linkage—turn on in MCP to run",
    "roleFilterOnBanner": "These tools are checked and linked to this role (independent of MCP-wide enable).",
    "roleFilterOffBanner": "These tools are unchecked and not linked to this role.",
    "checkboxLinkTitle": "Check to link this tool to this role",
    "bindWorkflow": "Bind graph workflow",
    "bindWorkflowHint": "When a workflow is selected, conversations with this role automatically run the bound graph; workflow fields are configured freely in the graph JSON.",
    "workflowPolicy": "Workflow trigger policy",
    "workflowPolicyAuto": "Auto trigger",
    "workflowPolicyOff": "Off",
    "noWorkflowBind": "No workflow",
    "workflowDisabledSuffix": " (disabled)"
  },
  "workflows": {
    "title": "Graph Orchestration",
    "newGraph": "New graph",
    "processLibrary": "Process library",
    "nodeLibrary": "Node library",
    "emptyList": "No graph workflows yet",
    "statusEnabled": "Enabled",
    "statusDisabled": "Disabled",
    "metaId": "ID",
    "metaName": "Name",
    "metaDescription": "Description",
    "metaEnabled": "Enabled",
    "metaIdHint": "Cannot be changed after creation; used for API and role binding",
    "metaModalTitle": "Workflow details",
    "editMeta": "Edit",
    "untitled": "Untitled workflow",
    "toggleEnabled": "Enable/disable",
    "metaEnabledHint": "Disabled workflows cannot be auto-triggered by roles",
    "enabledUpdated": "Enabled status updated",
    "enabledUpdateFailed": "Failed to update enabled status",
    "namePlaceholder": "Basic Web scan",
    "descriptionPlaceholder": "Optional",
    "connect": "Connect",
    "connecting": "Connecting",
    "deleteSelected": "Delete selected",
    "autoLayout": "Auto layout",
    "dryRun": "Dry run",
    "canvasEmpty": "Drag nodes from the left onto the canvas, or click node buttons to add quickly",
    "properties": "Properties",
    "nodeProperties": "Node properties",
    "edgeProperties": "Edge properties",
    "deleteNode": "Delete node",
    "deleteEdge": "Delete edge",
    "propertyEmpty": "Select a node or edge to edit properties",
    "propLabel": "Name",
    "propType": "Type",
    "customFields": "Custom fields",
    "addField": "Add field",
    "noCustomFields": "No custom fields",
    "nodes": {
      "start": "Start",
      "tool": "Tool",
      "agent": "Agent",
      "condition": "Condition",
      "hitl": "Approval",
      "output": "Output",
      "end": "End",
      "default": "Node"
    },
    "edges": {
      "yes": "Yes",
      "no": "No"
    },
    "config": {
      "inputKeys": "Input variables",
      "mcpTool": "MCP tool",
      "selectTool": "Select a tool",
      "searchTool": "Search tools…",
      "noToolsFound": "No matching tools",
      "noToolsAvailable": "No tools available",
      "toolDisabled": " (disabled)",
      "argumentsTemplate": "Arguments template",
      "argumentsStatic": "Tool arguments (JSON)",
      "timeoutSeconds": "Timeout (seconds)",
      "optional": "Optional",
      "agentMode": "Agent mode",
      "inputSource": "Input source",
      "inputBinding": "Input field binding",
      "inputBindingHint": "from = data source, field = field name (e.g. output, message)",
      "nodeInstruction": "Node instruction",
      "instructionPlaceholder": "Describe what this node should accomplish",
      "outputKey": "Output variable name",
      "conditionExpression": "Condition expression",
      "conditionHint": "The node computes matched (true/false); outgoing edges define branches: first edge is \"Yes\", second is \"No\". You can also write <code>{{previous.matched}} == \"true\"</code> on the edge.",
      "conditionGuideTitle": "Available syntax",
      "conditionGuideVars": "Variables: {{previous.output}}, {{previous.matched}}, {{inputs.message}}, {{outputs.name}}, {{nodeId.output}}",
      "conditionGuideOps": "Operators: ==, !=, >, >=, <, <=, contains, matches, &&, ||",
      "conditionGuideJson": "Nested fields: jsonpath(value, \"$.status\") or jq(value, \".severity\")",
      "edgeCondition": "Edge condition",
      "edgeBranch": "Condition branch",
      "selectBranch": "Select",
      "edgeConditionHintCondition": "{{previous.matched}} == \"true\" (Yes) or == \"false\" (No)",
      "edgeConditionHintExample": "e.g. {{previous.output}} == \"ok\"",
      "edgeBranchHint": "The first edge from a condition node defaults to the \"Yes\" branch, the second to \"No\"; you can customize conditions here.",
      "joinStrategy": "Join strategy",
      "joinStrategyHint": "When multiple upstream nodes enter this node, choose how to build previous: merge all, last by canvas order, first non-empty, or fail fast.",
      "hitlPrompt": "Approval prompt",
      "hitlPromptPlaceholder": "Approve to continue",
      "hitlReviewer": "Reviewer",
      "hitlInteractiveHint": "The run pauses at this node; approve or reject via API or the monitor panel to continue.",
      "promptBinding": "Prompt field binding",
      "promptBindingHint": "When prompt text is empty, read approval text from the bound field",
      "outputSource": "Variable source",
      "sourceBinding": "Output field binding",
      "sourceBindingHint": "Write the bound field value to the output variable; static value below overrides when set",
      "staticValue": "Static output value",
      "resultBinding": "End summary binding",
      "resultBindingHint": "Field shown in the end node summary",
      "endTemplate": "End summary template"
    },
    "defaultHitlPrompt": "Please approve whether this step should continue",
    "nodeFallback": "Node {{n}}",
    "loadFailed": "Failed to load workflows",
    "saveFailed": "Failed to save workflow",
    "dryRunPrompt": "Input message for dry-run",
    "dryRunFailed": "Dry-run failed",
    "dryRunDone": "Dry-run completed",
    "dryRunTrace": "Dry-run trace",
    "dryRunNoTrace": "No trace",
    "deleteFailed": "Failed to delete workflow",
    "saved": "Workflow saved",
    "deleted": "Workflow deleted",
    "idNameRequired": "Workflow ID and name are required",
    "selectToDelete": "Select a workflow to delete",
    "confirmDelete": "Delete workflow {{id}}?",
    "duplicateEdge": "An edge already exists between these two nodes",
    "connectModeOn": "Connect mode: click source node then target node",
    "connectModeOff": "Exited connect mode",
    "validation": {
      "needStart": "At least one Start node is required",
      "needOutput": "At least one Output node is required",
      "edgeSelfLoop": "Edge {{id}} cannot point to itself",
      "edgeSourceMissing": "Edge {{id}} source node does not exist",
      "edgeTargetMissing": "Edge {{id}} target node does not exist",
      "startIncoming": "Start node {{label}} must not have incoming edges",
      "outputOutgoing": "Output node {{label}} must not have outgoing edges",
      "toolNeedsMcp": "Tool node {{label}} requires an MCP tool",
      "conditionNeedsExpr": "Condition node {{label}} requires a condition expression",
      "conditionNeedsOutEdge": "Condition node {{label}} needs at least one outgoing edge (Yes/No branch)",
      "conditionTooManyEdges": "Condition node {{label}} should have at most two outgoing edges (Yes/No); configure edge conditions for a third and beyond",
      "conditionBranchLabel": "Condition node {{label}} outgoing edges must be marked Yes/No",
      "conditionBranchDuplicate": "Condition node {{label}} has duplicate branches",
      "nodeNeedsIncoming": "Node {{label}} needs an incoming edge",
      "nodeNeedsOutgoing": "Node {{label}} needs an outgoing edge",
      "nodeUnreachable": "Node {{label}} cannot be reached from Start",
      "graphCycle": "Workflow contains a cycle; keep it as a DAG",
      "serverFailed": "Server graph validation failed",
      "outputNeedsKey": "Output node {{label}} requires an output variable name"
    }
  },
  "c2": {
    "clipboardCopied": "Copied to clipboard",
    "common": {
      "justNow": "Just now",
      "minutesAgo": "{{n}}m ago",
      "hoursAgo": "{{n}}h ago"
    },
    "fmt": {
      "durationMs": "{{n}}ms",
      "durationSec": "{{n}}s",
      "durationMin": "{{n}}m"
    },
    "files": {
      "parent": "Parent",
      "refresh": "Refresh",
      "upload": "Upload",
      "uploading": "Uploading {{name}} · {{percent}}%",
      "uploadOk": "Uploaded",
      "uploadQueued": "Upload task queued",
      "uploadPendingApproval": "Upload task pending HITL approval",
      "uploadUnsupported": "Upload is not supported for this session",
      "uploadCurlBeacon": "Curl beacons cannot upload files; use an HTTP Beacon",
      "uploadTcpShell": "This is a TCP reverse shell (bash/nc): commands and download only. For upload, reconnect with: (1) a compiled CSB1 Beacon on the same listener, or (2) an HTTP/HTTPS Beacon.",
      "uploadTcpReverse": "This is a TCP reverse shell (bash/nc): commands and download only. For upload, reconnect with: (1) a compiled CSB1 Beacon on the same listener, or (2) an HTTP/HTTPS Beacon.",
      "loading": "Loading…",
      "timeout": "Timed out loading files",
      "emptyDir": "Empty directory",
      "colName": "Name",
      "colSize": "Size",
      "colMode": "Mode",
      "colActions": "Actions",
      "open": "Open",
      "download": "Download",
      "downloadOk": "Downloaded",
      "failed": "Failed"
    },
    "listeners": {
      "title": "Listener Management",
      "create": "Create Listener",
      "name": "Name",
      "type": "Type",
      "bindHost": "Bind Host",
      "bindPort": "Bind Port",
      "status": "Status",
      "remark": "Remark",
      "actions": "Actions",
      "start": "Start",
      "stop": "Stop",
      "delete": "Delete",
      "edit": "Edit",
      "running": "Running",
      "stopped": "Stopped",
      "placeholderName": "Enter listener name",
      "placeholderHost": "Default 127.0.0.1",
      "placeholderPort": "Enter port number",
      "placeholderRemark": "Optional remark",
      "emptyTitle": "No listeners yet",
      "emptyHint": "Create your first C2 listener using the button below",
      "headerCreateBtn": "+ Create Listener",
      "modalCreateTitle": "Create Listener",
      "placeholderNameExample": "e.g. http-beacon-01",
      "bindHintExternal": "Use 0.0.0.0 to allow external access",
      "callbackHost": "Callback host (optional)",
      "callbackHostHint": "Public IP or hostname stored for payloads/beacons; separate from bind address. If empty, payload generation falls back to bind address / auto-detect.",
      "allowLegacyShell": "Allow unencrypted classic reverse shell (lab only)",
      "allowLegacyShellHint": "Off by default. When enabled, raw bash/nc TCP connections register sessions and are vulnerable to internet scanners; use encrypted Beacon builds for production.",
      "malleableProfile": "Malleable Profile",
      "malleableProfileHint": "Optional; HTTP/HTTPS Beacon response headers and traffic disguise. Stop and start the listener again for changes to take effect.",
      "malleableProfileNone": "None",
      "malleableProfileNonHttpHint": "This listener type does not use a Malleable Profile. You can still bind one here for later if you switch to HTTP/HTTPS Beacon.",
      "malleableProfileEmptyListHint": "No saved profiles yet. Create one under C2 → Traffic disguise / Malleable Profile, then pick it here.",
      "placeholderRemarkLong": "Optional remark",
      "editTitle": "Edit Listener",
      "startedAt": "Started {{time}}",
      "startedAtPrefix": "Started",
      "statusError": "Error",
      "bindEndpoint": "Listen address",
      "callbackShort": "Callback",
      "profileBadgeTitle": "Malleable Profile bound",
      "confirmDelete": "Delete this listener? All related sessions and tasks will be removed.",
      "toastFillRequired": "Please fill in all required fields",
      "toastCreated": "Listener created",
      "toastStarted": "Listener started",
      "toastStopped": "Listener stopped",
      "toastDeleted": "Listener deleted",
      "toastUpdated": "Listener updated",
      "loadingProfiles": "Loading Malleable Profiles…",
      "toastProfilesLoadFailed": "Failed to load Malleable Profiles",
      "submitCreate": "Create",
      "typeLabels": {
        "http_beacon": "HTTP Beacon",
        "https_beacon": "HTTPS Beacon",
        "tcp_reverse": "TCP Reverse",
        "websocket": "WebSocket"
      }
    },
    "sessions": {
      "title": "Session Management",
      "hostname": "Hostname",
      "username": "Username",
      "os": "OS",
      "arch": "Arch",
      "ip": "IP Address",
      "status": "Status",
      "active": "Active",
      "sleeping": "Sleeping",
      "dead": "Dead",
      "isAdmin": "Admin",
      "pid": "PID",
      "sleep": "Sleep Interval",
      "jitter": "Jitter",
      "firstSeen": "First Seen",
      "lastCheckIn": "Last Check-in",
      "selectSession": "Select Session",
      "terminal": "Terminal",
      "files": "Files",
      "tasks": "Tasks",
      "info": "Info",
      "execute": "Execute Command",
      "kill": "Kill Session",
      "cardDeleteSession": "Delete",
      "btnSleep": "Sleep",
      "emptyTitle": "No active sessions",
      "emptyHint": "Start a listener and run a payload on the target",
      "unknownHost": "unknown",
      "rootBadge": "ROOT",
      "curlBeaconTitle": "Lightweight Curl beacon",
      "curlBeaconBody": "This session was created with a Curl oneliner: heartbeat and tasks only.\nInteractive terminal and file management require a compiled Beacon binary or a TCP reverse listener.",
      "infoSessionId": "Session ID",
      "infoImplantUuid": "Implant UUID",
      "infoHostname": "Hostname",
      "infoUsername": "Username",
      "infoOs": "OS",
      "infoArch": "Arch",
      "infoPid": "PID",
      "infoProcess": "Process",
      "infoAdmin": "Admin",
      "infoInternalIp": "Internal IP",
      "infoSleep": "Sleep",
      "infoSleepLine": "{{sec}}s (jitter {{jitter}}%)",
      "infoFirstSeen": "First seen",
      "infoLastCheckin": "Last check-in",
      "infoNote": "Note",
      "infoNoteEmpty": "No notes",
      "infoSectionIdentity": "Identity",
      "infoSectionSystem": "System",
      "infoSectionNetwork": "Network & beacon",
      "infoSectionTimeline": "Timeline",
      "infoSectionNote": "Notes",
      "adminYes": "Yes",
      "adminNo": "No",
      "promptSleepSeconds": "Sleep interval (seconds)",
      "promptJitterPercent": "Jitter percent (0–100)",
      "sleepModalHint": "Saves to the server and queues a sleep task. The implant applies it on the next task poll; later check-ins keep this config.",
      "sleepModalTitle": "Beacon interval",
      "sleepModalCurrent": "Current {{sec}}s · jitter {{jitter}}%",
      "sleepModalPreview": "Estimated {{min}} – {{max}} s",
      "sleepModalPresets": "Presets",
      "toastSleepInvalid": "Sleep interval must be at least 1 second",
      "toastSleepUpdated": "Sleep settings updated",
      "confirmExitSession": "Send exit command to this session?",
      "confirmDeleteSession": "Remove this session and related tasks/files from the server? (Does not send exit to the implant; use Kill Session to exit the agent.)",
      "toastExitSent": "Exit command sent",
      "toastSessionDeleted": "Session record deleted",
      "terminalWelcome": "CyberStrikeAI C2 Terminal — Enter to run; ↑↓ history; Ctrl+L clear; Ctrl+C cancel input",
      "termStatusReady": "Ready",
      "termStatusExec": "Executing…",
      "termStatusErr": "Error",
      "termStatusTimeout": "Timeout",
      "termNoSession": "Error: no session selected",
      "termWaitTimeout": "[Timed out waiting for result]",
      "termCleared": "Terminal cleared",
      "termNoSelection": "No text selected",
      "termWaitFinish": "Please wait for the current command to finish",
      "termCtrlC": "Remote interrupt is not supported in this version",
      "termQueued": "[Command queued — will run after the current task completes]",
      "clearTerminal": "Clear",
      "batchDelete": "Delete selected",
      "deleteFiltered": "Delete filtered",
      "selectAll": "Select all",
      "filterAllStatus": "All statuses",
      "filterAllListeners": "All listeners",
      "filterSearchPlaceholder": "Search hostname / user / IP",
      "filterApply": "Filter",
      "filterReset": "Reset",
      "filterSuspicious": "Likely false positives",
      "filterCount": "{{n}} total, {{selected}} selected",
      "emptyFilter": "No sessions match the current filters",
      "listEmpty": "No sessions",
      "selectPromptTitle": "Select a session",
      "selectPromptHint": "Click a session in the list on the left to view terminal, files, and tasks.",
      "confirmBatchDelete": "Delete {{n}} selected session(s)? Related tasks and file records will be removed.",
      "confirmDeleteFiltered": "Delete all {{n}} session(s) in the current filter results?",
      "toastSelectFirst": "Select at least one session to delete",
      "toastBatchDeleted": "Deleted {{n}} session(s)"
    },
    "tasks": {
      "title": "Task Management",
      "taskId": "Task ID",
      "type": "Type",
      "status": "Status",
      "result": "Result",
      "error": "Error",
      "duration": "Duration",
      "createdAt": "Created At",
      "queued": "Queued",
      "sent": "Sent",
      "running": "Running",
      "success": "Success",
      "failed": "Failed",
      "cancelled": "Cancelled",
      "viewResult": "View Result",
      "cancel": "Cancel Task",
      "refresh": "Refresh Tasks",
      "pending": "Pending",
      "emptyAll": "No tasks yet",
      "emptySession": "No tasks for this session",
      "sessionTaskHistory": "Task history",
      "sessionTaskCount": "{{n}} tasks",
      "colTask": "Task",
      "colSession": "Session",
      "colType": "Type",
      "colCommand": "Command",
      "colStatus": "Status",
      "colDuration": "Duration",
      "colCreated": "Created",
      "colActions": "Actions",
      "view": "View",
      "cancelBtn": "Cancel",
      "modalTitle": "Task details",
      "labelId": "ID",
      "labelSession": "Session",
      "labelType": "Type",
      "labelCommand": "Command",
      "labelPayload": "Payload",
      "labelStatus": "Status",
      "labelCreated": "Created",
      "labelSent": "Sent",
      "labelCompleted": "Completed",
      "labelDuration": "Duration",
      "labelError": "Error",
      "labelResult": "Output",
      "toastCancelled": "Task cancelled",
      "batchDelete": "Delete selected",
      "selectAll": "Select all on this page",
      "deleteOne": "Delete task",
      "deleteBtn": "Delete",
      "confirmDeleteOne": "Delete this task record from the server? This cannot be undone.",
      "confirmBatchDelete": "Delete {{n}} selected task record(s)? This cannot be undone.",
      "toastSelectFirst": "Select tasks to delete first",
      "toastDeleted": "Deleted {{n}} task(s)",
      "paginationShow": "Showing {{start}}-{{end}} / {{total}} records",
      "paginationPerPage": "Per page",
      "paginationFirst": "First",
      "paginationPrev": "Previous",
      "paginationPage": "Page {{current}} / {{total}}",
      "paginationNext": "Next",
      "paginationLast": "Last"
    },
    "payloads": {
      "386": "386",
      "title": "Payload Generator",
      "oneliner": "Oneliner Payload",
      "build": "Build Beacon",
      "listener": "Listener",
      "kind": "Kind",
      "host": "Callback Host",
      "generate": "Generate",
      "copy": "Copy to Clipboard",
      "copied": "Copied",
      "os": "Target OS",
      "arch": "Target Arch",
      "buildBtn": "Build",
      "building": "Building...",
      "download": "Download",
      "linux": "Linux",
      "windows": "Windows",
      "darwin": "macOS",
      "amd64": "AMD64",
      "arm64": "ARM64",
      "arm": "ARM",
      "onelinerDesc": "Generate a one-line reverse shell for the target (Bash / Python / PowerShell / Curl).",
      "buildDesc": "Cross-compile a full Beacon binary for Linux / Windows / macOS.",
      "hostOptional": "Callback host (optional)",
      "placeholderListenerHost": "Leave empty: listener callback host, else bind address",
      "generateOnelinerBtn": "Generate Oneliner",
      "buildBeaconBtn": "Build Beacon",
      "loopbackBeaconWarning": "127.0.0.1 works only when the beacon and C2 share the same host and network namespace (simple local test). If C2 runs in Docker and the beacon runs on the host, 127.0.0.1 hits the host loopback, not the container — use the published port plus the host LAN IP or host.docker.internal. For remote targets, bind 0.0.0.0 and rebuild.",
      "noBeaconListenersTcpOnly": "tcp_reverse supports compiled Beacon (TCP + CSB1 framing); classic shell still uses Oneliner above",
      "noListenersOption": "No listeners available",
      "noKindOption": "No kinds available",
      "toastLoadListenersFail": "Failed to load listeners: {{msg}}",
      "toastPickListener": "Select a listener first",
      "toastOnelinerFail": "Failed to generate oneliner: {{msg}}",
      "toastBuildFail": "Failed to build beacon: {{msg}}",
      "toastBuildSuccess": "Build succeeded: {{bytes}} bytes",
      "buildSuccessTitle": "Build succeeded",
      "buildMetaOsArch": "OS: {{os}} | Arch: {{arch}}",
      "buildSize": "Size: {{bytes}} bytes",
      "clickToCopyTitle": "Click to copy",
      "toastDownloadQueued": "Download task queued"
    },
    "events": {
      "title": "Event Audit",
      "level": "Level",
      "category": "Category",
      "message": "Message",
      "time": "Time",
      "info": "Info",
      "warn": "Warning",
      "critical": "Critical",
      "listener": "Listener",
      "session": "Session",
      "task": "Task",
      "payload": "Payload",
      "opsec": "OPSEC",
      "refresh": "Refresh",
      "empty": "No events yet",
      "batchDelete": "Delete selected",
      "selectAll": "Select all on this page",
      "deleteOne": "Delete",
      "confirmDeleteOne": "Delete this event? This cannot be undone.",
      "confirmBatchDelete": "Delete {{n}} selected event(s)? This cannot be undone.",
      "toastSelectFirst": "Select events to delete first",
      "toastDeleted": "Deleted {{n}} event(s)",
      "paginationShow": "Showing {{start}}-{{end}} / {{total}} records",
      "paginationPerPage": "Per page",
      "paginationFirst": "First",
      "paginationPrev": "Previous",
      "paginationPage": "Page {{current}} / {{total}}",
      "paginationNext": "Next",
      "paginationLast": "Last"
    },
    "profiles": {
      "title": "Malleable Profile",
      "name": "Name",
      "userAgent": "User-Agent",
      "uris": "URI Paths",
      "headers": "Headers",
      "jitter": "Jitter Range",
      "create": "Create Profile",
      "createBtn": "+ Create Profile",
      "delete": "Delete",
      "empty": "No profiles yet",
      "defaultValue": "Default",
      "modalCreateTitle": "Create Malleable Profile",
      "profileNameLabel": "Profile name",
      "placeholderProfileName": "e.g. cdn-fronting",
      "hintUa": "Custom User-Agent for Beacon HTTP requests",
      "labelBeaconUris": "Beacon URIs (one per line)",
      "hintUris": "URI paths used when the beacon checks in",
      "labelJitterMin": "Jitter min (ms)",
      "labelJitterMax": "Jitter max (ms)",
      "labelRespHeaders": "Custom response headers (JSON)",
      "hintHeaders": "HTTP response headers to mimic a legitimate server",
      "toastNameRequired": "Profile name is required",
      "toastInvalidHeadersJson": "Invalid JSON in response headers",
      "toastCreated": "Profile created",
      "toastDeleted": "Profile deleted",
      "confirmDelete": "Delete this profile?",
      "submitCreate": "Create"
    }
  },
  "rbac": {
    "title": "Platform Access",
    "pageSubtitle": "Manage members, roles, and accessible data in one place.",
    "createUser": "Add Member",
    "memberManagement": "Member Management",
    "memberManagementHint": "Assign roles and data scope to members",
    "roleManagement": "Role Management",
    "roleManagementHint": "Define permission sets and default visibility",
    "users": "Users",
    "usersHint": "Select an account to manage roles and resource scope.",
    "searchUsers": "Search username or display name",
    "metricUsers": "Accounts",
    "metricEnabled": "Enabled",
    "metricRoles": "Roles",
    "metricAssignments": "Resource Grants",
    "metricUsersPill": "accounts",
    "metricEnabledPill": "enabled accounts",
    "metricRolesPill": "roles",
    "metricAssignmentsPill": "grants",
    "selectUser": "Select User",
    "selectUserHint": "Select a platform user to edit roles, status, and resource grants.",
    "createRole": "New Role",
    "tabRoles": "Roles & Permissions",
    "tabAssignments": "Resource Grants",
    "tabAudit": "Change History",
    "roleMembership": "Role Membership",
    "roleMembershipHint": "Roles control allowed actions; resource scope controls visible data.",
    "unsavedChanges": "Unsaved changes",
    "saveRoleChanges": "Save Role Changes",
    "resourceType": "Resource Type",
    "resourceId": "Resource ID",
    "resourceIdPlaceholder": "Enter resource IDs; separate multiple IDs with commas",
    "searchResource": "Search Real Resources",
    "searchResourcePlaceholder": "Search by name or ID",
    "assignSelected": "Grant Selected Resources",
    "advancedAssignment": "Advanced: Enter Resource IDs",
    "advancedAssignmentHint": "For known IDs copied from logs or APIs. Resource existence is still validated on submit.",
    "availableResources": "Available Resources",
    "availableResourcesHint": "Select on this page; selections persist across pages",
    "currentAssignments": "Current Explicit Grants",
    "allResourceTypes": "All Types",
    "searchAssignments": "Search granted resource names or IDs",
    "items": "items",
    "assignmentHelp": "Only Assigned Resources roles need explicit grants. Project grants also cover conversations and vulnerabilities in that project.",
    "assignResource": "Grant",
    "roleCatalog": "Role Catalog",
    "roleCatalogHint": "Define permissions and resource scope first, then assign the role to members.",
    "searchRoles": "Search roles or permissions",
    "filterRoles": "Filter Roles",
    "userModalTitle": "Platform User",
    "username": "Username",
    "displayName": "Display Name",
    "password": "Password",
    "passwordPlaceholder": "Leave blank when editing to keep unchanged",
    "enabled": "Enable account",
    "roles": "Roles",
    "roleModalTitle": "Platform Role",
    "roleName": "Role Name",
    "description": "Description",
    "scope": "Resource Scope",
    "permissions": "Permissions",
    "searchPermissions": "Search permissions, e.g. project:read",
    "selectVisible": "Select visible",
    "clearVisible": "Clear visible",
    "deleteUserConfirm": "Delete this platform user? This will revoke the user's active sessions immediately.",
    "deleteBuiltinUser": "The built-in admin user cannot be deleted",
    "deleteRoleConfirm": "Delete this platform role?",
    "scopeHint": "Resource scope and operation permissions jointly determine effective access.",
    "builtinAccount": "Built-in account",
    "statusEnabled": "Enabled",
    "statusDisabled": "Disabled",
    "noRoleAssigned": "No role assigned",
    "noExplicitGrant": "No explicit grants",
    "notConfigured": "Not configured",
    "noRoleDescription": "No role description",
    "noDescription": "No description",
    "systemBuiltin": "System role",
    "customRole": "Custom",
    "operationPermissions": "Operation permissions",
    "assignedMembers": "Assigned members",
    "viewPermissions": "View permissions",
    "effectivePermissions": "Effective permissions",
    "effectiveScope": "Effective resource scope",
    "revoke": "Revoke",
    "retry": "Retry",
    "alreadyAssigned": "Assigned",
    "loadingResources": "Loading real resources…",
    "viewSystemRole": "View System Role",
    "editRole": "Edit Role",
    "resourceCount": "{{count}} resources",
    "permissionCount": "{{count}} permissions",
    "userCount": "{{count}} users",
    "confirmDiscardSwitchUser": "Role changes are not saved. Discard them and switch members?",
    "confirmDiscardEditUser": "Role changes are not saved. Discard them and edit the member profile?",
    "confirmDiscardSwitchTab": "Role changes are not saved. Discard them and switch tabs?",
    "confirmDiscardResourceType": "Switching resource type clears the current selection. Continue?",
    "pendingGrants": "Pending Grants",
    "clearSelection": "Clear Selection",
    "confirmGrant": "Confirm Grant",
    "removePending": "Remove",
    "selectedCount": "{{count}} selected",
    "noRoleNoticeTitle": "No role assigned",
    "noRoleNoticeHint": "Assign a role before configuring resource grants. Without a role, only self-created data is accessible and most features are unavailable.",
    "assignRolesNow": "Assign Roles",
    "viewPermissionsDetail": "View details",
    "hidePermissions": "Hide details",
    "effectivePermissionsDetail": "Effective permission details",
    "editUserRolesHint": "Manage roles on the member detail page under Roles & Permissions.",
    "auditTitle": "Permission change history",
    "auditHint": "Audit events related to this member's platform access.",
    "unknownActor": "Unknown actor",
    "metricUserContext": "Selected member: {{name}} · {{roles}} roles · {{grants}} grants",
    "deleteUserConfirmDetailed": "Delete member {{name}} (@{{username}})?\n\nThis will revoke active sessions and remove {{roles}} role bindings and {{grants}} resource grants.",
    "auditActions": {
      "create_user": "Create platform user",
      "update_user": "Update platform user",
      "delete_user": "Delete platform user",
      "create_role": "Create platform role",
      "update_role": "Update platform role",
      "delete_role": "Delete platform role",
      "assign_resource": "Grant resource access",
      "delete_resource_assignment": "Revoke resource grant"
    },
    "copyId": "Copy ID",
    "copiedId": "Copied",
    "resourceIdLabel": "ID",
    "resourceDetailProject": "Project {{id}}",
    "pagination": {
      "previous": "Previous",
      "next": "Next",
      "resourcePage": "Page {{page}}",
      "pageSummary": "Page {{page}} / {{pages}} · {{total}} items",
      "emptySummary": "0 items"
    },
    "resourceTypes": {
      "project": "Project",
      "conversation": "Conversation",
      "vulnerability": "Vulnerability",
      "webshell": "WebShell Connection",
      "batch_task": "Batch Task",
      "c2_listener": "C2 Listener"
    },
    "scopes": {
      "all": {
        "label": "All Resources",
        "hint": "Can access all platform data",
        "option": "All Resources — Access all platform data"
      },
      "assigned": {
        "label": "Assigned Resources",
        "hint": "Only data explicitly granted by an administrator",
        "option": "Assigned Resources — Only administrator-granted data"
      },
      "own": {
        "label": "Created by Me",
        "hint": "Only data created by the member",
        "option": "Created by Me — Only self-created data"
      }
    },
    "systemRoles": {
      "admin": { "name": "Administrator", "description": "Full platform administration access" },
      "operator": { "name": "Operator", "description": "Run daily security workflows without account or core configuration management" },
      "auditor": { "name": "Auditor", "description": "Read-only access to audits, monitoring, and assets" },
      "viewer": { "name": "Read-only User", "description": "Read-only access to explicitly granted resources" }
    },
    "empty": {
      "noMatchingUsers": "No matching members",
      "noUsers": "No platform members yet",
      "tryAnotherKeyword": "Try another keyword",
      "addFirstUser": "Use “Add Member” to create the first member",
      "noMatchingRoles": "No matching roles",
      "adjustRoleSearch": "Adjust the search or create a custom role",
      "noRoles": "No roles available",
      "selectUserFirst": "Select a member first",
      "noAssignments": "No resource grants",
      "addAssignmentHint": "Select resources on the left, then use Confirm Grant above",
      "noMatchingAssignments": "No matching grants",
      "adjustAssignmentFilter": "Adjust the resource type or search",
      "noMatchingResources": "No matching real resources",
      "noMatchingPermissions": "No matching permissions",
      "noEffectivePermissions": "No effective permissions",
      "assignRoleFirst": "Assign a role to view permission details",
      "noAuditLogs": "No change history",
      "noAuditLogsHint": "Role and grant changes for this member will appear here"
    },
    "messages": {
      "roleChangesSaved": "Role changes saved and effective immediately",
      "grantPartial": "Added {{created}} grants; {{skipped}} already existed or were duplicated",
      "grantSuccess": "Granted {{count}} {{resource}} resources"
    },
    "errors": {
      "loadFailed": "Load failed",
      "loadDataFailed": "Unable to load access-control data",
      "loadResourcesFailed": "Unable to load resources",
      "saveFailed": "Save failed",
      "saveUserFailed": "Unable to save member",
      "saveRoleFailed": "Unable to save role",
      "deleteFailed": "Delete failed",
      "deleteUserFailed": "Unable to delete member",
      "deleteRoleFailed": "Unable to delete role",
      "enterResourceId": "Enter at least one resource ID",
      "tooManyResources": "A maximum of 100 resources can be granted at once",
      "batchGrantFailed": "Batch grant failed",
      "grantFailed": "Grant failed",
      "revokeFailed": "Revoke failed",
      "loadAuditFailed": "Unable to load audit history"
    },
    "permissionModules": {
      "agent": "Agent Execution",
      "agents": "Agent Definitions",
      "attackchain": "Attack Chains",
      "audit": "Audit",
      "auth": "Account Security",
      "c2": "C2",
      "chat": "Conversations",
      "config": "System Configuration",
      "dashboard": "Dashboard",
      "files": "Files",
      "fofa": "FOFA",
      "group": "Conversation Groups",
      "hitl": "Human-in-the-loop",
      "knowledge": "Knowledge Base",
      "mcp": "MCP",
      "monitor": "Execution Monitor",
      "notification": "Notifications",
      "openapi": "OpenAPI",
      "project": "Projects",
      "rbac": "Platform Access",
      "robot": "Robots",
      "roles": "Testing Roles",
      "skills": "Skills",
      "tasks": "Tasks",
      "terminal": "Terminal",
      "vulnerability": "Vulnerabilities",
      "webshell": "WebShell",
      "workflow": "Workflows"
    },
    "permissionDescriptions": {
      "auth": { "self": "Manage own session and password" },
      "dashboard": { "read": "View dashboard summaries" },
      "chat": {
        "read": "View conversations",
        "write": "Create and update conversations",
        "delete": "Delete conversations and turns"
      },
      "agent": { "execute": "Run AI agents and workflows" },
      "hitl": {
        "read": "View human-in-the-loop queues and logs",
        "write": "Approve, dismiss, and configure human-in-the-loop requests"
      },
      "tasks": {
        "read": "View task queues",
        "write": "Create and run task queues",
        "delete": "Delete task queues"
      },
      "project": {
        "read": "View projects and project facts",
        "write": "Create and update projects and project facts",
        "delete": "Delete projects and project facts"
      },
      "vulnerability": {
        "read": "View vulnerabilities",
        "write": "Create and update vulnerabilities",
        "delete": "Delete vulnerabilities"
      },
      "webshell": {
        "read": "View WebShell connections",
        "write": "Manage and use WebShell connections",
        "delete": "Delete WebShell connections"
      },
      "c2": {
        "read": "View C2 listeners, sessions, tasks, events, and profiles",
        "write": "Operate C2 listeners, sessions, tasks, payloads, files, and profiles",
        "delete": "Delete C2 objects"
      },
      "mcp": {
        "read": "View MCP status and external MCP configuration",
        "write": "Manage external MCP servers and invoke the MCP endpoint"
      },
      "knowledge": {
        "read": "View the knowledge base and retrieval logs",
        "write": "Create, update, index, and scan the knowledge base",
        "delete": "Delete knowledge items and retrieval logs"
      },
      "skills": {
        "read": "View Skills and statistics",
        "write": "Create and update Skills",
        "delete": "Delete Skills and statistics"
      },
      "agents": {
        "read": "View Markdown agents",
        "write": "Create and update Markdown agents",
        "delete": "Delete Markdown agents"
      },
      "roles": {
        "read": "View AI testing roles",
        "write": "Create and update AI testing roles",
        "delete": "Delete AI testing roles"
      },
      "workflow": {
        "read": "View workflow definitions and runs",
        "write": "Create, update, validate, run, and resume workflows",
        "delete": "Delete workflows"
      },
      "config": {
        "read": "View system configuration",
        "write": "Update and apply system configuration"
      },
      "terminal": { "execute": "Execute terminal commands" },
      "audit": {
        "read": "View and export audit logs",
        "delete": "Delete audit logs"
      },
      "rbac": {
        "read": "View users, platform roles, permissions, and grants",
        "write": "Manage users, platform roles, permissions, and grants"
      },
      "notification": {
        "read": "View notifications",
        "write": "Mark notifications as read"
      },
      "robot": {
        "read": "View robot binding status",
        "write": "Manage robot bindings and test callbacks"
      },
      "files": {
        "read": "View chat uploads",
        "write": "Upload, edit, and rename chat files",
        "delete": "Delete chat files"
      },
      "attackchain": {
        "read": "View attack chains",
        "write": "Regenerate attack chains"
      },
      "fofa": { "execute": "Run FOFA searches and parse queries" },
      "openapi": { "read": "Read OpenAPI aggregation results" },
      "group": {
        "read": "View conversation groups",
        "write": "Create and update conversation groups",
        "delete": "Delete conversation groups"
      },
      "monitor": {
        "read": "View the execution monitor",
        "write": "Cancel monitored executions",
        "delete": "Delete execution-monitor records"
      }
    }
  }
}
