{
  "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",
    "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",
    "version": "Current version",
    "toggleSidebar": "Collapse/expand sidebar"
  },
  "notifications": {
    "title": "Notifications",
    "empty": "No new events",
    "markAllRead": "Mark all read",
    "markSingleRead": "Read",
    "itemDefaultTitle": "Notification"
  },
  "login": {
    "title": "Sign in to CyberStrikeAI",
    "subtitle": "Enter the access password from config",
    "passwordLabel": "Password",
    "passwordPlaceholder": "Enter password",
    "submit": "Sign in"
  },
  "nav": {
    "dashboard": "Dashboard",
    "chat": "Chat",
    "infoCollect": "Recon",
    "tasks": "Tasks",
    "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",
    "settings": "System settings",
    "hitl": "Human-in-the-loop",
    "c2": "C2",
    "c2Manage": "C2 management",
    "c2Listeners": "Listeners",
    "c2Sessions": "Sessions",
    "c2Tasks": "Tasks",
    "c2Payloads": "Payload",
    "c2Events": "Events",
    "c2Profiles": "Traffic profiles"
  },
  "dashboard": {
    "title": "Dashboard",
    "refresh": "Refresh",
    "refreshData": "Refresh data",
    "runningTasks": "Running tasks",
    "vulnTotal": "Total vulnerabilities",
    "toolCalls": "Tool invocations",
    "successRate": "Tool success rate",
    "clickToViewTasks": "Click to view tasks",
    "clickToViewVuln": "Click to view vulnerabilities",
    "clickToViewMCP": "Click to view MCP monitor",
    "c2OverviewTitle": "C2 overview",
    "c2GoManage": "Open C2 →",
    "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",
    "noVulnYet": "No recent vulnerabilities",
    "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",
    "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"
  },
  "chat": {
    "newChat": "New chat",
    "toggleConversationPanel": "Collapse/expand conversation list",
    "searchHistory": "Search history...",
    "conversationGroups": "Conversation groups",
    "addGroup": "New group",
    "recentConversations": "Recent conversations",
    "batchManage": "Batch manage",
    "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",
    "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": "Are you sure you want to delete this conversation?",
    "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.",
    "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.",
    "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...",
    "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",
    "agentModeReactNative": "Native ReAct",
    "agentModeReactNativeHint": "Classic single-agent ReAct with MCP tools",
    "agentModeEinoSingle": "Eino single (ADK)",
    "agentModeEinoSingleHint": "Eino ChatModelAgent + Runner with MCP tools (/api/eino-agent)",
    "agentModeDeep": "Deep (DeepAgent)",
    "agentModeDeepHint": "Eino DeepAgent with task delegation to sub-agents",
    "agentModePlanExecuteLabel": "Plan-Execute",
    "agentModePlanExecuteHint": "Plan → execute → replan (single executor with tools)",
    "agentModeSupervisorLabel": "Supervisor",
    "agentModeSupervisorHint": "Supervisor coordinates via transfer to sub-agents",
    "agentModeSingle": "Single-agent",
    "agentModeMulti": "Multi-agent",
    "agentModeSingleHint": "Single-model ReAct loop for chat and tool use",
    "agentModeMultiHint": "Eino prebuilt orchestration (deep / plan_execute / supervisor) for complex tasks",
    "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",
    "hitlReviewer": "Review",
    "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",
    "pendingTitle": "Pending approvals",
    "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"
  },
  "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",
    "retryTask": "Retry",
    "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}}",
    "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",
      "knowledge": "Knowledge base",
      "c2": "C2",
      "robots": "Bots",
      "terminal": "Terminal",
      "security": "Security",
      "infocollect": "Recon"
    },
    "infocollect": {
      "title": "Reconnaissance"
    },
    "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 WeCom, DingTalk and Lark bots so you can chat with CyberStrikeAI on your phone without opening the web UI.",
      "wecom": {
        "title": "WeCom",
        "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",
        "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",
        "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"
      }
    },
    "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",
    "enterPassword": "Please enter password",
    "loginFailedCheck": "Sign-in failed, please check the 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",
    "rebuildIndex": "Rebuild index",
    "rebuildIndexConfirm": "Rebuild index?",
    "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"
    },
    "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",
      "rebuildIndex": "Rebuild 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"
    },
    "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"
    }
  },
  "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",
    "statusCompleted": "Completed",
    "statusRunning": "Running",
    "statusFailed": "Failed",
    "statusCancelled": "Cancelled",
    "terminateExecution": "Stop",
    "loading": "Loading...",
    "noStatsData": "No statistical data",
    "noExecutions": "No execution records",
    "noRecordsWithFilter": "No records with current filter",
    "paginationInfo": "Show {{start}}-{{end}} of {{total}} records",
    "perPageLabel": "Per page",
    "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",
    "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",
    "distTitle": "Call distribution",
    "distLegend": "Slice area shows share of all calls",
    "distClickHint": "Click legend or slice 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. 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",
    "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",
    "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",
    "searchVulnId": "Search vuln ID",
    "filterConversation": "Filter by conversation",
    "loading": "Loading...",
    "loadListFailed": "Failed to load",
    "noRecords": "No vulnerability records",
    "batchExport": "Batch export",
    "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, and severity",
    "saveFailed": "Save failed",
    "fetchFailed": "Failed to fetch vulnerability",
    "deleteFailed": "Delete failed",
    "detailVulnId": "Vuln ID",
    "detailType": "Type",
    "detailTarget": "Target",
    "detailConversationId": "Conversation ID",
    "detailTaskId": "Task ID",
    "detailTaskQueueId": "Task queue ID",
    "detailConversationTag": "Conversation tag",
    "detailTaskTag": "Task tag",
    "detailProof": "Proof",
    "detailImpact": "Impact",
    "detailRecommendation": "Remediation",
    "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...",
    "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 sub-agent iterations (0 = use global default)",
    "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",
    "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",
    "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 (single executor tool loop); supervisor = supervisor + transfer. Takes effect after save & apply.",
    "multiAgentOrchDeep": "deep — DeepAgent (task sub-agents)",
    "multiAgentOrchPlanExecute": "plan_execute — plan / execute / replan",
    "multiAgentOrchSupervisor": "supervisor — supervisor + transfer",
    "multiAgentPeLoop": "plan_execute outer loop limit",
    "multiAgentPeLoopPlaceholder": "0 uses Eino default (10)",
    "multiAgentPeLoopHint": "Only for plan_execute; max execute↔replan rounds.",
    "multiAgentRobotUse": "Use multi-agent for WeCom / DingTalk / Lark bots",
    "multiAgentRobotUseHint": "Requires 'Enable multi-agent' to be checked; usage and cost will be higher.",
    "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).",
    "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": "0",
    "prefetchTopKHint": "0 = same as Top-K; larger values fetch more vector hits before dedupe/truncate (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)",
    "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": "+"
  },
  "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",
    "botCommandsDesc": "You can send the following commands in chat (Chinese and English supported):",
    "botCmdHelp": "Show this help",
    "botCmdList": "List conversations",
    "botCmdSwitch": "Switch to conversation",
    "botCmdNew": "Start new conversation",
    "botCmdClear": "Clear context",
    "botCmdCurrent": "Show current conversation",
    "botCmdStop": "Stop running task",
    "botCmdRoles": "List roles",
    "botCmdRole": "Switch role",
    "botCmdDelete": "Delete conversation",
    "botCmdVersion": "Show version",
    "botCommandsFooter": "Otherwise, send any text for AI penetration testing / security analysis."
  },
  "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"
  },
  "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",
    "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",
    "lastTime": "Last activity",
    "action": "Action",
    "selectAll": "Select all",
    "deleteSelected": "Delete selected",
    "confirmDeleteNone": "Please select at least one conversation to delete",
    "confirmDeleteN": "Delete {{count}} selected conversation(s)?",
    "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).",
    "agentMode": "Agent mode",
    "agentModeSingle": "Single-agent (ReAct)",
    "agentModeMulti": "Multi-agent (Eino)",
    "agentModeHint": "Same as chat: native ReAct, Eino single-agent (ADK), or Deep / Plan-Execute / Supervisor (the last three require multi-agent enabled).",
    "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 will execute them in order. Empty lines are ignored.",
    "tasksListHintFull": "Hint: Enter one task command per line; the system will execute these tasks in order. 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",
    "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": {
    "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": "Vulnerability title",
    "description": "Description",
    "descriptionPlaceholder": "Detailed description",
    "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",
    "type": "Vulnerability type",
    "typePlaceholder": "e.g. SQL injection, XSS, CSRF",
    "target": "Target",
    "targetPlaceholder": "Affected target (URL, IP, etc.)",
    "proof": "Proof (POC)",
    "proofPlaceholder": "Proof: request/response, screenshots, etc.",
    "impact": "Impact",
    "impactPlaceholder": "Impact description",
    "recommendation": "Recommendation",
    "recommendationPlaceholder": "Remediation"
  },
  "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",
    "headingProof": "Proof (POC)",
    "headingImpact": "Impact",
    "headingRecommendation": "Remediation"
  },
  "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"
  },
  "c2": {
    "title": "C2 Management",
    "welcomeTitle": "AI-Native C2 Framework",
    "welcomeDesc": "MCP-native design: let LLM call C2 like calling nmap to complete the full chain: initial access → control → tasks → lateral movement → cleanup",
    "statListeners": "Running Listeners",
    "statSessions": "Online Sessions",
    "statPending": "Pending Tasks",
    "goListeners": "Manage Listeners",
    "goSessions": "View Sessions",
    "clipboardCopied": "Copied to clipboard",
    "fmt": {
      "durationMs": "{{n}}ms",
      "durationSec": "{{n}}s",
      "durationMin": "{{n}}m"
    },
    "files": {
      "parent": "Parent",
      "refresh": "Refresh",
      "loading": "Loading…",
      "timeout": "Timed out loading files",
      "emptyDir": "Empty directory",
      "colName": "Name",
      "colSize": "Size",
      "colMode": "Mode",
      "colActions": "Actions",
      "open": "Open",
      "download": "Download",
      "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.",
      "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",
      "adminYes": "Yes",
      "adminNo": "No",
      "promptSleepSeconds": "Sleep interval (seconds)",
      "promptJitterPercent": "Jitter percent (0–100)",
      "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 — AI-Native Command & Control",
      "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",
      "clearTerminal": "Clear"
    },
    "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",
      "colTask": "Task",
      "colSession": "Session",
      "colType": "Type",
      "colStatus": "Status",
      "colDuration": "Duration",
      "colCreated": "Created",
      "colActions": "Actions",
      "view": "View",
      "cancelBtn": "Cancel",
      "modalTitle": "Task details",
      "labelId": "ID",
      "labelSession": "Session",
      "labelType": "Type",
      "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": {
      "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",
      "386": "386",
      "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"
    }
  }
}
