hermes-web-ui 0.6.24 → 0.6.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/js/{ChannelsView-DV-LtXVi.js → ChannelsView-p3dSvD02.js} +1 -1
- package/dist/client/assets/js/{ChatPanel-DyZWRnQs.js → ChatPanel-DRCE0v4g.js} +1 -1
- package/dist/client/assets/js/{ChatView-CuWpMwOd.js → ChatView-CAoJp8-Q.js} +1 -1
- package/dist/client/assets/js/{CodingAgentsView-D_Ngirz0.js → CodingAgentsView-X0I-H0Yu.js} +1 -1
- package/dist/client/assets/js/{DesktopPetView-BGY-7Dcd.js → DesktopPetView-BH9a1zur.js} +1 -1
- package/dist/client/assets/js/{DevicesView-BNZqDe2U.js → DevicesView-CMcwuGZ6.js} +1 -1
- package/dist/client/assets/js/{FileEditor-BPFC-M3W.js → FileEditor-CzWdryd5.js} +1 -1
- package/dist/client/assets/js/{FileRenameModal-5mJtyNBP.js → FileRenameModal-C2YmHkSN.js} +1 -1
- package/dist/client/assets/js/{FilesView-CRbkvC6l.js → FilesView-CKxvh6yi.js} +1 -1
- package/dist/client/assets/js/{GlobalAgentView-my3AKdll.js → GlobalAgentView-77p8MKvy.js} +1 -1
- package/dist/client/assets/js/{GroupChatView-btwSVoC0.js → GroupChatView-D1WFEfIs.js} +1 -1
- package/dist/client/assets/js/{HistoryMessageList-IubX9-tb.js → HistoryMessageList-BcG-gj6N.js} +1 -1
- package/dist/client/assets/js/{HistoryView-N3v7MNfo.js → HistoryView-CzybyBXj.js} +1 -1
- package/dist/client/assets/js/{JobsView-CHq_TJQ6.js → JobsView-BviznpSY.js} +1 -1
- package/dist/client/assets/js/{KanbanView-BMh8IgQo.js → KanbanView-B0c6OMrf.js} +1 -1
- package/dist/client/assets/js/{LoginView-sE4g4Zua.js → LoginView-B9nES8-3.js} +1 -1
- package/dist/client/assets/js/{LogsView-awh5ZCp8.js → LogsView-kLI6-05w.js} +1 -1
- package/dist/client/assets/js/{MarkdownRenderer-BbGvq6C-.js → MarkdownRenderer-DQvs79tf.js} +1 -1
- package/dist/client/assets/js/{McpManagerView-CnSCITtQ.js → McpManagerView-BZU1Puf0.js} +1 -1
- package/dist/client/assets/js/{MemoryView-CbQOeUKI.js → MemoryView-BH4LZtYd.js} +1 -1
- package/dist/client/assets/js/{MessageItem-DSHiAgFE.js → MessageItem-Cu3_aQT8.js} +2 -2
- package/dist/client/assets/js/{MessageList-oRCKlivC.js → MessageList-Ds_mjMbf.js} +1 -1
- package/dist/client/assets/js/{ModelsView-B0esXyBm.js → ModelsView-CZK6wwtt.js} +1 -1
- package/dist/client/assets/js/{OutlinePanel-BofcYepl.js → OutlinePanel-CYuSrNX9.js} +1 -1
- package/dist/client/assets/js/{PageSidebarFooter-BPeWlPvZ.js → PageSidebarFooter-Dk-OfmNy.js} +1 -1
- package/dist/client/assets/js/{PerformanceView-gc12dWCZ.js → PerformanceView-DkXk4HB_.js} +1 -1
- package/dist/client/assets/js/{PetdexView-CZjbg41u.js → PetdexView-DGkSZYVi.js} +1 -1
- package/dist/client/assets/js/{PluginsView-DRwyXTJC.js → PluginsView-D197obRC.js} +1 -1
- package/dist/client/assets/js/{ProfilesView-zVd3TfNW.js → ProfilesView-BhGBaYDE.js} +1 -1
- package/dist/client/assets/js/{SettingRow-G7ZusJw_.js → SettingRow-DfRI-z7L.js} +1 -1
- package/dist/client/assets/js/{SettingsCircuitBadge-CFo2KqP-.js → SettingsCircuitBadge-Eiv8LQz0.js} +1 -1
- package/dist/client/assets/js/{SettingsView-DDjt6UpN.js → SettingsView-B4ipIIOj.js} +1 -1
- package/dist/client/assets/js/{SkillsUsageView-DnVnAYHG.js → SkillsUsageView-DT4o1LA9.js} +1 -1
- package/dist/client/assets/js/{SkillsView-CHi4L7Oi.js → SkillsView-CUK-9OLz.js} +1 -1
- package/dist/client/assets/js/{TerminalPanel-Dx7huJY2.js → TerminalPanel-gyT2AS7Z.js} +1 -1
- package/dist/client/assets/js/{TerminalView-PQIIFHwX.js → TerminalView-C3a6BwEG.js} +1 -1
- package/dist/client/assets/js/{UsageView-Dzr2wBc7.js → UsageView-DrUS9OIk.js} +1 -1
- package/dist/client/assets/js/{VersionPreviewView-JQrieRPU.js → VersionPreviewView-qbXwqYd3.js} +1 -1
- package/dist/client/assets/js/{WorkflowView-DRanDY9s.js → WorkflowView-D-6z--9A.js} +1 -1
- package/dist/client/assets/js/{_plugin-vue_export-helper-fFMkIM4P.js → _plugin-vue_export-helper-CvnFozKy.js} +2 -2
- package/dist/client/assets/js/{chat-timestamp-CZtP79YD.js → chat-timestamp-CkDNtK9Y.js} +1 -1
- package/dist/client/assets/js/{files-DOpu4Qfg.js → files-CBYc0MSs.js} +1 -1
- package/dist/client/assets/js/index-B2IKGvbR.js +3 -0
- package/dist/client/assets/js/{models-y7NaVj-e.js → models-DetB4_Ug.js} +1 -1
- package/dist/client/assets/js/{session-browser-prefs-BOqwOeHi.js → session-browser-prefs-BYjSnxJq.js} +1 -1
- package/dist/client/assets/js/{skills-D7ZMzzzG.js → skills-5qxphanX.js} +1 -1
- package/dist/client/assets/js/{system-CRmVbE8Z.js → system-Onp4yS9N.js} +1 -1
- package/dist/client/assets/js/{ttsHelpers-vHLmbeY4.js → ttsHelpers-DNcZ5khq.js} +1 -1
- package/dist/client/assets/js/{useSttSettings-s4LBWl55.js → useSttSettings-C-jexrW7.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/agent-bridge/python/bridge_runtime.py +2 -2
- package/dist/server/index.js +3 -3
- package/dist/server/openapi.json +1 -1
- package/package.json +1 -1
- package/dist/client/assets/js/index-Brl4qW5V.js +0 -3
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as Vn,i as Gn,n as Re,r as jn}from"./rolldown-runtime-M0oDzQ_3.js";import{$t as Fa,An as Mo,Bn as ot,Bt as Gt,Dn as $n,Fn as Ni,H as Jn,Hn as W,I as Qn,It as Da,K as mo,Kt as Oe,Nn as _t,Ot as je,P as Yn,Pn as Xn,Qn as Zn,Qt as so,R as er,Rt as ii,S as tr,Un as lo,V as Ro,W as or,Yn as ar,Yt as ir,an as s,cn as $,cr as p,dn as qi,en as tt,er as w,fn as Te,fr as zi,g as Va,hn as nt,in as ee,jn as _,kn as go,mt as Bi,n as nr,on as ke,pn as se,pr as y,sn as le,t as Mt,tn as xt,ur as Ze,vt as rr,w as ni,wn as Oi}from"./ui-vendor-DDMfmCj2.js";import{D as sr,F as lr,I as ho,L as Qt,M as vo,N as la,O as gt,P as da,k as St}from"./vue-vendor-BsMpqyaC.js";import{a as Ga,c as dr,d as cr,f as K,i as Wi,l as ri,n as ht,o as Yt,r as ur,s as fo,t as vt,u as rt}from"./_plugin-vue_export-helper-CvnFozKy.js";import{M as Ki,N as pr,j as Vi}from"./vendor-B1Lfatlz.js";import{_ as mr,b as gr,i as hr,l as vr,p as fr,r as br,t as wr,v as yr,y as Sr}from"./system-Onp4yS9N.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const c of r)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&n(u)}).observe(document,{childList:!0,subtree:!0});function a(r){const c={};return r.integrity&&(c.integrity=r.integrity),r.referrerPolicy&&(c.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?c.credentials="include":r.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function n(r){if(r.ep)return;r.ep=!0;const c=a(r);fetch(r.href,c)}})();Oe();Qt();vo();rt();ur();gt();var Gi={login:{title:"Hermes Web UI",description:"Enter your username and password to continue.",placeholder:"Access token",submit:"Login",tokenRequired:"Please enter your access token",invalidToken:"Invalid token",connectionFailed:"Cannot connect to server",passwordLogin:"Password",tokenLogin:"Token",usernamePlaceholder:"Username",passwordPlaceholder:"Password",defaultCredentialsHint:"Default username: admin. Default password: 123456.",credentialsRequired:"Please enter username and password",invalidCredentials:"Invalid username or password",tooManyAttempts:"Too many failed attempts, please try again later",lockResetHint:"If this is your server, clear the login lock with:",defaultLoginResetHint:"To reset the default admin password, run:",sessionExpired:"Login expired. Please sign in again.",accessDenied:"You do not have permission to access this resource.",passwordMismatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",setupSuccess:"Password login configured successfully",passwordChanged:"Password changed successfully",passwordRemoved:"Password login removed",setupPassword:"Set Up Password Login",changePassword:"Change Password",changeUsername:"Change Username",removePasswordLogin:"Remove",username:"Username",currentPassword:"Current Password",newPassword:"New Password",confirmPassword:"Confirm Password",newUsername:"New Username",usernameChanged:"Username changed successfully",usernameTooShort:"Username must be at least 2 characters",setupDescription:"Manage the username and password used to sign in.",removeConfirm:"Password login is required for user accounts.",passwordLoginNotConfigured:"Password login is not configured",passwordLoginConfigured:"Current account: {username}",defaultCredentialTitle:"Change the default account credentials",defaultCredentialMessage:"This account is still using the default username or password. To prevent unauthorized access, update the username and password as soon as possible.",defaultCredentialAction:"Update now",defaultCredentialLater:"Remind me later"},users:{title:"Account Management",description:"Create users, assign roles, and control which profiles regular admins can access.",create:"Create User",edit:"Edit User",username:"Username",role:"Role",statusLabel:"Status",profiles:"Accessible Profiles",profilesPlaceholder:"Select accessible profiles",allProfiles:"All profiles",noProfiles:"No profiles assigned",lastLogin:"Last Login",newPasswordOptional:"New Password (leave blank to keep)",loadFailed:"Failed to load users",deleteConfirm:"Delete this user?",enable:"Enable",disable:"Disable",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Active",disabled:"Disabled"}},common:{loading:"Loading...",cancel:"Cancel",delete:"Delete",edit:"Edit",save:"Save",retry:"Retry",reset:"Reset",saved:"Saved",update:"Update",create:"Create",saveFailed:"Save failed",deleteFailed:"Delete failed",ok:"OK",copied:"Copied",copy:"Copy",noData:"No data",expired:"Expired",fetch:"Fetch",add:"Add",enable:"Enable",disable:"Disable",configured:"Configured",notConfigured:"Not configured",confirm:"Confirm",expand:"Expand",collapse:"Collapse",start:"Start",stop:"Stop"},mcp:{title:"MCP Servers",loadFailed:"Failed to load MCP servers",reloadAll:"Reload All",refresh:"Refresh",total:"Total",connected:"Connected",disconnected:"Disconnected",tools:"tools",tool:"Tools",searchPlaceholder:"Search servers...",addServer:"+ Add Server",zeroTools:"0 tools",loading:"Loading...",empty:"No MCP servers configured",reloaded:"Reloaded {server}",reloadedAll:"All MCP servers reloaded",reloadFailed:"Reload failed",serverAdded:'Server "{name}" added',addFailed:"Failed to add server",serverUpdated:'Server "{name}" updated',updateFailed:"Failed to update server",saveFailed:"Save failed",serverRemoved:'Removed "{name}"',enabled:"Enabled {name}",disabled:"Disabled {name}",connectedStatus:"Connected",disconnectedStatus:"Disconnected",disabledStatus:"Disabled",toolList:"Tool List",count:" ",more:"more",removeFailed:"Failed to remove server",testOk:"Test OK — {count} tools available",testEmpty:"Test returned no tools",testFailed:"Test failed",edit:"Edit",test:"Test",reload:"Reload",remove:"Remove",confirmRemove:'Remove server "{name}"?',cancel:"Cancel",add:"Add",save:"Save",addTitle:"Add MCP Server",editTitle:"Edit MCP Server",invalidJson:"Invalid JSON format",invalidYaml:"Invalid YAML format",invalidConfig:"Invalid configuration",invalidServerConfig:"Invalid server configuration",missingCommandOrUrl:"Must have command or url",manageTools:"Manage Tools",toolsVisibilityTitle:"Tools Visibility Management",fetchTools:"Fetch Tools List",fetchToolsFailed:"Failed to fetch tools list",toolsMode:"Mode:",toolsModeAll:"All",toolsModeInclude:"Include",toolsModeExclude:"Exclude",toolsListHeader:"Tool Name",toolsEmpty:"No tools available, please fetch tools list first",toolsSummaryAll:"{count} tools total, all enabled",toolsSummaryInclude:"{total} tools total, {count} selected",toolsSummaryExclude:"{total} tools total, {count} excluded",toolsVisibilitySaved:"Tools visibility saved",toolsSelectAll:"Select all",toolsClearSelection:"Clear selection",toolsExcludeAll:"Exclude all",toolsClearExcluded:"Clear excluded"},sidebar:{chat:"Chat",backToChat:"Back",search:"Search",apiRelay:"API Relay",history:"History",jobs:"Jobs",kanban:"Kanban",workflow:"Workflow",models:"Models",profiles:"Profiles",skills:"Skills",plugins:"Plugins",mcp:"MCP",petdex:"Pets",memory:"Memory",logs:"Logs",usage:"Usage",performance:"Performance",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",singleChat:"Chat",globalAgent:"Global Agent",groupChat:"Group Chat",files:"Files",devices:"Devices",groupConversation:"Conversation",groupConversationShort:"Conv",groupPlatform:"Platform",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Monitoring",groupMonitoringShort:"Mon",groupTools:"Tools",groupToolsShort:"Tools",codingAgents:"Coding Agents",versionPreview:"Version Preview",settings:"Settings",connected:"Connected",disconnected:"Disconnected",collapse:"Collapse menu",expand:"Expand menu",updateTip:'Run "hermes-web-ui update" in terminal to update',updateVersion:"Upgrade to v{version}",reloadClientVersion:"Reload for v{version}",updating:"Updating...",updateSuccess:"Update successful. Please refresh the page shortly. If it does not start after a while, start it manually.",updateFailed:"Update failed",logout:"Sign Out",nodeVersionWarning:"Detected Node.js v{version}. Please upgrade to version 23 or later.",changelog:"Changelog",noChangelog:"No changelog available",versionManagement:"Version Management"},runtimeVersions:{title:"Version Management",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Platform",currentWebUi:"Current Web UI",activeVersion:"Active version",active:"Active",installed:"Installed",download:"Download",downloadGithub:"GitHub Download",downloadCf:"Cloudflare Download",github:"GitHub",cf:"Cloudflare",useVersion:"Use on next restart",deleteVersion:"Delete",deleteRuntimeConfirm:"Delete Hermes Runtime {version}?",deleteWebUiConfirm:"Delete Web UI {version}?",deleteRuntimeSuccess:"Runtime deleted",deleteWebUiSuccess:"Web UI deleted",refresh:"Refresh",noVersions:"No versions available",remoteLoadFailed:"Failed to load remote versions",downloadTasks:"Download tasks",downloadStarted:"Download started",activateSuccess:"Version selection saved. Restart Hermes Studio to use it.",jobStatus:{queued:"Queued",running:"Running",completed:"Completed",failed:"Failed"},jobStageStatus:{queued:"Queued",resolve:"Resolving",download:"Downloading",verify:"Verifying",extract:"Extracting",install:"Installing",completed:"Completed",failed:"Failed"},jobStage:{queued:"Queued",download:"Downloading",resolveRuntime:"Resolving runtime package",verifyRuntime:"Verifying runtime archive",extractRuntime:"Extracting runtime archive",installRuntime:"Installing runtime",resolveWebUi:"Resolving Web UI package",verifyWebUi:"Verifying Web UI archive",extractWebUi:"Extracting Web UI archive",installWebUi:"Installing Web UI",completed:"Completed",failed:"Failed"}},devices:{title:"Devices",count:"{count} devices",lastScanned:"Last scanned: {time}",refresh:"Refresh",empty:"No devices found",computer:"Computer",endpointLabel:"Endpoint",statusLabel:"Status",online:"Online",offline:"Offline",address:"Address",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Latency",lastSeen:"Last seen",open:"Open",never:"Never",unknown:"Unknown",loadFailed:"Failed to load devices",scanFailed:"Failed to scan devices",updateFailed:"Failed to update device",duplicateRequest:"A pending pairing request already exists",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Processed",unprocessed:"Unprocessed",deleteHistory:"Delete record",deleteHistoryConfirm:"Delete this request record and revoke this device connection access?",requests:"Requests",requestsWithCount:"Requests ({count})",noRequests:"No requests",requestPairing:"Request pairing",paired:"Paired",approve:"Approve",reject:"Reject",block:"Block",unblock:"Unblock",inboundStatus:{none:"Allowed to request",pending:"Pending",approved:"Approved",rejected:"Rejected",blocked:"Blocked"},outboundStatus:{none:"Unpaired",pending:"Requested",approved:"Paired",rejected:"Rejected",blocked:"Blocked"},endpoint:{web:"Web",desktop:"Desktop",custom:"Custom"}},performance:{title:"Performance",subtitle:"Inspect system resources, bridge broker, workers, and active sessions",refresh:"Refresh",autoRefreshOn:"Auto refresh",autoRefreshOff:"Manual refresh",loadFailed:"Failed to load performance metrics",systemCpu:"System CPU",systemMemory:"System Memory",activeSessions:"Active Sessions",runningSessions:"Running {count}",workers:"Workers",totalWorkerMemory:"Worker memory",processes:"Processes",uptime:"Uptime",running:"Running",stopped:"Stopped",workerMemory:"Worker Memory",lastUpdated:"Updated",profile:"Profile",memory:"Memory",sessions:"Sessions",runningActiveSessions:"Running / Active",lastUsed:"Last Used",status:"Status",noWorkers:"No workers",sessionsByProfile:"Sessions by Profile",noActiveSessions:"No active sessions"},drawer:{terminal:"Terminal",files:"Workspace"},chat:{contextRemaining:"remaining",contextClickToEdit:"Click to edit context length",contextEditTitle:"Edit Context Length",contextEditDesc:"Set context length limit for current model (in tokens)",contextEditPlaceholder:"Enter context length",contextEditHint:"Common values: 256k (Hermes default), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Save",contextEditCancel:"Cancel",contextEditInvalid:"Please enter a valid context length",contextEditSuccess:"Context length updated",contextEditFailed:"Update failed",emptyState:"Start a conversation with Hermes Agent",emptyStateAgent:"Start a conversation with {agent}",viewOlderInHistory:"View earlier messages in History",scrollToBottom:"Scroll to bottom",forkedFrom:"Forked from",previousLastMessage:"Previous last message",cliEmptyState:"Start a CLI chat session",outlineTitle:"Conversation Outline",outlineEmpty:"No conversation content",outlineUserQuestion:"User question",inputPlaceholder:"Type a message... (Enter to send, Shift+Enter for new line)",inputHeightResizeHint:"Drag to resize the chat input. Double-click to reset.",slashCommandArgs:{message:"<message>",title:"<title>",text:"<text>"},slashCommands:{usage:"Calculate current session usage",status:"Show session status and queue",abort:"Stop the active bridge run",queue:"Queue a message behind the active run",learn:"Learn a reusable skill from described sources",plan:"Write a markdown implementation plan",moa:"Run one prompt through the default model ensemble",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"Clear the current display",clearHistory:"Delete this session’s stored message history",title:"Rename this session",compress:"Run context compression while idle",fork:"Fork this idle session into a new linked conversation",steer:"Send steering text to the active bridge run",destroy:"Release the bridge agent for this session",reloadMcp:"Reload MCP servers",reloadSkills:"Reload skill commands"},attachFiles:"Attach files",reasoningEffort:{tooltip:"Reasoning effort",defaultLabel:"Default",options:{default:"Default (config.yaml)",none:"None",minimal:"Minimal",low:"Low",medium:"Medium",high:"High",xhigh:"Extra high"}},autoPlaySpeech:"Auto-play voice",voiceInput:{startCapture:"Start voice capture",stopCaptureAndInsert:"Stop voice capture and place transcript in the input",cancelCapture:"Cancel voice dialogue",statusLabel:"Status: {status}",transcriptLabel:"Transcript: {text}",errorLabel:"Error: {error}",recentEvents:"Recent events",status:{idle:"Idle",capturing:"Capturing",transcribing:"Transcribing",sending:"Adding to input",error:"Error"},browserSpeechUnsupported:"Browser speech recognition is not supported in this browser.",browserSpeechFailed:"Browser speech recognition failed.",browserSpeechFailedWithReason:"Browser speech recognition failed: {error}.",microphoneUnsupported:"Microphone capture is not supported in this browser.",microphoneRecordingFailed:"Microphone recording failed."},showToolCalls:"Show tool calls",hideToolCalls:"Hide tool calls",messageQueue:"Message queue",removeQueuedMessage:"Remove queued message",stop:"Stop",start:"Start",stopGateway:"Stop Gateway",send:"Send",contextUsed:"Context used:",sessions:"Sessions",webUiSessions:"Sessions",allProfiles:"All profiles",profileMissingModelsTip:'Profile "{profile}" has no available provider or model for this session',sessionScopeHint:"Chat shows Web UI/API Server sessions only. CLI, Telegram, Discord, Cron, and other channel sessions are read-only in History.",openHistory:"Open History",hermesHistory:"Hermes History",historyScopeHint:"Read-only Hermes history sessions for the current profile, grouped by source.",noSessions:"No sessions",searchTitle:"Search Sessions",searchSubtitle:"Search by title or message content",searchScope:"Search scope: Web UI local session database only. Read-only Hermes history sessions are not included.",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"Search sessions...",searchEmpty:"Recent sessions",searchRecent:"Recent session",searchNoResults:"No sessions match your search",searchNoSnippet:"No snippet available",searchEnterHint:"Enter to open · Esc to close",searchFailed:"Failed to search sessions",newChat:"New Chat",agent:"Agent",approvalKicker:"Terminal permission",approvalTitle:"Review command before running",approvalAgree:"Agree",approvalAllowOnce:"Allow once",approvalAllowSession:"Allow session",approvalAlways:"Always",approvalDeny:"Deny",clarifyKicker:"Agent needs clarification",clarifyTitle:"The agent has a question for you",clarifyPlaceholder:"Type your answer...",clarifySubmit:"Reply",clarifyDismiss:"Dismiss",newCliChat:"New CLI",deleteSession:"Delete this session?",sessionDeleted:"Session deleted",toggleBatchMode:"Batch selection",selectAll:"Select all",confirmBatchDelete:"Delete {count} selected sessions?",batchDeleteSuccess:"Deleted {count} sessions",batchDeletePartial:"{failed} sessions failed to delete",batchDeleteFailed:"Batch delete failed",importToWebUi:"Import to Web UI",importSessionSuccess:"Session imported to Web UI",importSessionAlreadyExists:"Session already exists in Web UI",importSessionFailed:"Failed to import session",rename:"Rename",archiveSession:"Archive",unarchiveSession:"Unarchive",pin:"Pin",unpin:"Unpin",pinned:"Pinned",chatMode:"Chat",liveMode:"Live",liveSessions:"Live Sessions",recentBadge:"Recent",linkedSessions:"{count} linked",noVisibleMessages:"No human-visible messages.",monitorRoleUser:"User",monitorRoleAssistant:"Assistant",copySessionLink:"Copy Session Link",openSessionInNewTab:"Open in new tab",sessionLinkCopied:"Session link copied",copySessionId:"Copy Session ID",export:"Export",exportFull:"Full Export (JSON)",exportCompressed:"Compressed Export (TXT)",exportCompressing:"Compressing context, please wait...",exportSuccess:"Session exported",exportFailed:"Export failed",renamed:"Renamed",renameFailed:"Rename failed",sessionArchived:"Session archived",archiveSessionFailed:"Failed to archive session",sessionUnarchived:"Session unarchived",unarchiveSessionFailed:"Failed to unarchive session",renameSession:"Rename Session",sessionNotFound:"Session not found",enterNewTitle:"Enter new title",workspace:"Workspace",setWorkspace:"Set Workspace",setWorkspaceTitle:"Set Session Workspace",workspacePlaceholder:"Enter project path, e.g. /home/user/project",folderPickerEmpty:"(Empty)",folderPickerNoFolders:"No workspace folders",folderPickerSelected:"Selected:",workspaceSet:"Workspace set",workspaceSetFailed:"Failed to set workspace",setModel:"Set Model",setModelTitle:"Set Session Model",modelSet:"Model set",modelSetFailed:"Failed to set model",other:"Other",runFailed:"Run failed",error:"Error",tool:"Tool",arguments:"Arguments",result:"Result",workspaceChanges:"Workspace changes",changedFiles:"{files} files changed",diffUnavailable:"Diff unavailable",binaryFileDiffUnavailable:"Binary file diff unavailable",truncated:"... (truncated)",unchangedLines:"{count} unchanged lines",executionDuration:"Execution time",thinkingLabel:"Thinking",thinkingInProgress:"Thinking",thinkingShow:"Show thinking",thinkingHide:"Hide thinking",thinkingDuration:"Observed {duration}",thinkingChars:"{count} chars",copyBubble:"Copy message",copiedBubble:"Message copied",copyFailed:"Copy failed",playSpeech:"Play voice",pauseSpeech:"Pause",resumeSpeech:"Resume",stopSpeech:"Stop",speechNotSupported:"Voice playback not supported in this browser"},workflow:{title:"Workflow",profile:"Profile",namePlaceholder:"Workflow name",workspace:{title:"Select Workspace",select:"Select workspace",clear:"Clear workspace"},actions:{newWorkflow:"New Workflow",addNode:"Add Node",createWorkflowFirst:"Please create a workflow first",reset:"Reset",startExecution:"Start Execution",executionPending:"Workflow execution is not connected yet",executionStarted:"Workflow execution started",executionCompleted:"Workflow execution completed",executionFailed:"Workflow execution failed",rerunDownstreamKeepNode:"Keep this node and run downstream",rerunDownstreamClearNode:"Clear this node and run downstream",rerunDownstreamStarted:"Downstream rerun started",rerunFromNodeStarted:"Rerun from this node started",rerunFailed:"Workflow rerun failed",deleteNode:"Delete Node",deleteEdge:"Delete Connection"},batch:{toggle:"Batch selection",selectAll:"Select all",confirmDelete:"Delete {count} selected workflows?",deleteSuccess:"Deleted {count} workflows",deletePartial:"{failed} workflows failed to delete",deleteFailed:"Batch delete failed"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Node name",agent:"Agent",model:"Model",apiMode:"API Mode",input:"Input",promptPlaceholder:"Describe what this agent should do...",skillsPlaceholder:"Skills, press Enter to add",uploadImages:"Upload images"},status:{idle:"Idle",queued:"Queued",running:"Running",completed:"Completed",failed:"Failed",canceled:"Canceled"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Selected Node",none:"No node selected"},stats:{nodes:"Nodes",edges:"Links"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Default Model",fast:"Fast Model",reasoning:"Reasoning Model"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Enter this node input.",node2:"Enter this node input.",node3:"Enter this node input.",plan:"Break the request into actionable steps.",execute:"Run the implementation steps and produce artifacts.",review:"Review output quality and identify follow-up work."},newNodeTitle:"Node {count}"},kanban:{title:"Kanban Board",createTask:"New Task",noTasks:"No tasks",allStatuses:"All Statuses",allAssignees:"All Assignees",board:{create:"New Board",archive:"Archive Board",slugPlaceholder:"Board slug, e.g. project-a",namePlaceholder:"Display name (optional)",slugRequired:"Board slug is required",created:"Board created",archived:"Board archived",archiveConfirm:"Archive the current board?"},columns:{triage:"Triage",todo:"To Do",scheduled:"Scheduled",ready:"Ready",running:"Running",blocked:"Blocked",review:"Review",done:"Done",archived:"Archived"},form:{title:"Title",titlePlaceholder:"Task title",titleRequired:"Title is required",body:"Description",bodyPlaceholder:"Task description (optional)",assignee:"Assignee",selectAssignee:"Select assignee...",priority:"Priority",selectPriority:"Select priority...",tenant:"Tenant",tenantPlaceholder:"Tenant (optional)",workspace:"Workspace",workspaceScratch:"Scratch workspace",workspaceDir:"Use directory",workspaceWorktree:"Use worktree",workspacePath:"Workspace path",workspacePathPlaceholder:"Absolute path (optional)",branch:"Branch",branchPlaceholder:"Worktree branch",skills:"Skills",skillsPlaceholder:"Select skills...",triage:"Create in triage",goalMode:"Goal mode",maxRuntime:"Max runtime",maxRuntimePlaceholder:"e.g. 30m, 2h",maxRetries:"Max retries",maxRetriesPlaceholder:"Number of retries",goalMaxTurns:"Goal max turns",goalMaxTurnsPlaceholder:"Maximum turns"},card:{assigneeTooltip:"Assignee",priority:{low:"Low",medium:"Medium",high:"High"},timeAgo:{justNow:"just now",minutes:"{count}m ago",hours:"{count}h ago",days:"{count}d ago"}},detail:{status:"Status",assignee:"Assignee",priority:"Priority",tenant:"Tenant",createdAt:"Created",startedAt:"Started",completedAt:"Completed",comments:"Comments",events:"Events",runs:"Runs",result:"Result",sessions:"Related Sessions",sessionMessages:"Session Messages",noSessions:"No related sessions found.",artifacts:"Artifacts",sources:"Sources",highlights:"Highlights",noLog:"No log found for this task.",addComment:"Add Comment",commentPlaceholder:"Write a task comment...",operations:"Operations"},action:{title:"Actions",complete:"Complete",completeSummary:"Completion summary (optional)",block:"Block",blockReason:"Reason for blocking",unblock:"Unblock",assign:"Assign",assignTo:"Assign to...",dispatch:"Dispatch",recoveryReason:"Recovery reason (optional)",reclaim:"Reclaim",reassign:"Reassign",specify:"Specify",loadLog:"Load Log",loadDiagnostics:"Load Diagnostics"},message:{taskCreated:"Task created",taskCompleted:"Task completed",taskBlocked:"Task blocked",taskUnblocked:"Task unblocked",taskAssigned:"Task assigned",dispatchNudged:"Dispatcher nudged",commentAdded:"Comment added",taskReclaimed:"Task reclaimed",taskReassigned:"Task reassigned",taskSpecified:"Task specified",loadFailed:"Failed to load task"},stats:{total:"Total",tasks:"Tasks"}},jobs:{title:"Scheduled Jobs",createJob:"Create Job",editJob:"Edit Job",noJobs:"No scheduled jobs yet. Create one to get started.",sortBy:"Sort",sortByName:"Name Sort",sortByTime:"Time Sort",sortByNameHint:"Click to sort by name",sortByTimeHint:"Click to sort by time",sortAsc:"Ascending",sortDesc:"Descending",name:"Name",namePlaceholder:"Job name",schedule:"Schedule (Cron Expression)",schedulePlaceholder:"e.g. 0 9 * * *",quickPresets:"Quick Presets",selectPreset:"Select a preset...",presetEveryMinute:"Every minute",presetEvery5Min:"Every 5 minutes",presetEveryHour:"Every hour",presetEveryDay:"Every day at 00:00",presetEveryDay9:"Every day at 09:00",presetEveryMonday:"Every Monday at 09:00",presetEveryMonth:"Every month 1st at 09:00",prompt:"Prompt",promptPlaceholder:"The prompt to execute",skills:"Skills",skillsPlaceholder:"Select skills...",deliverTarget:"Deliver Target",origin:"Origin",local:"Local",repeatCount:"Repeat Count (optional)",modelPlaceholder:"Default model",repeatPlaceholder:"Leave empty for infinite",jobCreated:"Job created",jobUpdated:"Job updated",nameRequired:"Name is required",scheduleRequired:"Schedule is required",loadFailed:"Failed to load job",jobPaused:"Job paused",jobResumed:"Job resumed",jobTriggered:"Job triggered",modelUpdated:"Model updated",jobDeleted:"Job deleted",status:{running:"Running",paused:"Paused",disabled:"Disabled",scheduled:"Scheduled"},info:{model:"Model",schedule:"Schedule",lastRun:"Last Run",nextRun:"Next Run",deliver:"Deliver",repeat:"Repeat"},action:{pause:"Pause",pauseJob:"Pause job",resume:"Resume",resumeJob:"Resume job",runNow:"Run Now",triggerImmediately:"Trigger immediately"},runHistory:{title:"Run History",runs:"runs",noRuns:"No run history found."}},skills:{title:"Skills",targetFilter:"Runtime",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Search skills...",noMatch:"No skills match your search",noSkills:"No skills found",backTo:"Back to",attachedFiles:"Attached Files",loadFailed:"Failed to load skill",fileLoadFailed:"Failed to load file",modified:"Modified",archived:"Archived",pinned:"Pinned",pin:"Pin skill",unpin:"Unpin skill",pinFailed:"Failed to change pin status",edit:"Edit",saving:"Saving...",editorLabel:"Skill editor",saveSuccess:"Skill saved",saveFailed:"Failed to save skill",toggleFailed:"Failed to toggle skill",source:{builtin:"Builtin",hub:"Hub",local:"Local",external:"External"},delete:"Delete",deleteConfirm:'Delete skill "{name}"? This cannot be undone.',deleteSuccess:"Skill deleted",deleteFailed:"Failed to delete skill",import:"Import",importTitle:"Import skill",importModeZip:"Zip",importModeFolder:"Folder",importHintZip:"Upload a .zip archive containing a directory with SKILL.md",importHintFolder:"Pick a local skill folder (must contain SKILL.md)",importTargetCategory:"Target category (optional)",importTargetCategoryPlaceholder:"Leave empty to drop under misc",importSelectFile:"Choose .zip file",importSelectFolder:"Choose folder",importInvalidFile:"Only .zip archives are supported",importFileCount:"files",importNoSelection:"Please choose a file or folder first",importSuccess:"Skill imported",importFailed:"Failed to import skill",path:{local:"Local",external:"External"},externalDirs:{manage:"External dirs",title:"Manage external skill dirs",hint:"Manages config.skills.external_dirs. Supports ~ and $VAR; missing paths are greyed out.",add:"Add external dir",placeholder:"/path/to/skills or ~/my-skills",empty:"No external dirs",missing:"Path not found",notDir:"Not a directory",saveSuccess:"External dirs saved",saveFailed:"Save failed",loadFailed:"Failed to load external dirs",removeRow:"Remove"},pathCopied:"Path copied",pathCopyFailed:"Failed to copy path",reloadHint:"Active sessions: run /reload-skills; new sessions pick it up automatically.",writeApprovalButton:"Pending {count}",writeApprovalTitle:"Pending write approvals",writeApprovalDescription:"Approve or reject staged Hermes Agent memory and skill writes.",writeApprovalRefresh:"Refresh",writeApprovalEmpty:"No pending writes.",writeApprovalUnsupported:"This Hermes Agent version does not support write approvals. Upgrade Hermes Agent to use this feature.",writeApprovalMemory:"Memory",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Review",writeApprovalHideDiff:"Hide",writeApprovalNoDiff:"No diff available.",writeApprovalLoadFailed:"Failed to load pending writes",writeApprovalDiffFailed:"Failed to load write details",writeApprovalActionFailed:"Failed to resolve pending write",writeApprovalApproved:"Pending write approved",writeApprovalRejected:"Pending write rejected",writeApprovalApprove:"Approve",writeApprovalReject:"Reject",writeApprovalPendingMemoryWrite:"Pending memory write",writeApprovalCurrentFile:"Current {file}",writeApprovalProposedFile:"Proposed {file}",writeApprovalDiffSection:"Diff",writeApprovalPatchOldStringMissing:"The patch old_string was not found in the current {file}, so approving it will not change the file.",writeApprovalRequestedOldString:"Requested old_string",writeApprovalCurrentReadFailed:"The current {file} could not be read as UTF-8 text.",writeApprovalDeleteSkill:"This approval deletes skill {skill}.",writeApprovalRemoveFile:"This approval removes {file} from skill {skill}."},plugins:{title:"Plugins",refresh:"Refresh",notice:"Inventory of discoverable Hermes plugin manifests. Discovery metadata is read without loading plugin code. Standalone user plugins can be enabled or disabled here; changes take effect in new Hermes sessions.",loadFailed:"Failed to load plugins",updateFailed:"Failed to update plugin",enableSuccess:"Enabled {name}",disableSuccess:"Disabled {name}",commandCopied:"Command copied",searchPlaceholder:"Search key, name, description, path...",source:"Source",kind:"Kind",statusTitle:"Status",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"Copy command",managedElsewhere:"managed elsewhere",noMatch:"No plugins match the current filters",enabled:"enabled",disabled:"disabled",summary:{total:"Total",active:"Enabled / auto",inactive:"Inactive",disabled:"Disabled",providerManaged:"Provider-managed"},status:{enabled:"Enabled","auto-active":"Auto-active",inactive:"Inactive",disabled:"Disabled","provider-managed":"Provider-managed"},statusLabel:{enabled:"Enabled by config","auto-active":"Auto-active",inactive:"Inactive",disabled:"Disabled","provider-managed":"Provider-managed"},configStatuses:{enabled:"enabled",disabled:"disabled","not-enabled":"not enabled",auto:"auto","provider-managed":"provider-managed"},table:{plugin:"Plugin",status:"Status",source:"Source",kind:"Kind",capabilities:"Capabilities",path:"Path / entrypoint",manage:"Manage"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"Project plugins"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Memory",refresh:"Refresh",loadFailed:"Failed to load memory",myNotes:"My Notes",noNotes:"No notes yet.",notesPlaceholder:"Write your notes...",userProfile:"User Profile",noProfile:"No profile yet.",profilePlaceholder:"Write your profile...",soul:"Soul",noSoul:"No soul configuration yet.",soulPlaceholder:"Write soul configuration..."},models:{title:"Models",searchPlaceholder:"Search models...",noResults:"No results",noModels:"No models",addProvider:"Add Provider",refreshModelCache:"Refresh model cache",refreshModelCacheLoading:"Refreshing model cache...",refreshModelCacheSuccess:"Model cache refreshed",refreshModelCacheFailed:"Failed to refresh model cache",providerType:"Provider Type",preset:"Preset",custom:"Custom",selectProvider:"Select Provider",chooseProvider:"Choose a provider...",getApiKey:"Get API Key",name:"Name",autoGeneratedName:"Auto-generated from Base URL",baseUrl:"Base URL",region:"Region",regionIntl:"International",regionCn:"Mainland China",baseUrlPlaceholder:"e.g. https://api.example.com/v1",apiKey:"API Key",apiKeyPlaceholder:"sk-...",defaultModel:"Default Model",selectOrInput:"Select or type a model name...",selectModel:"Select a model...",providerAdded:"Provider added",providerDeleted:"Provider deleted",providerCredentialsCleared:"Provider credentials cleared",clearProviderCredentials:"Clear credentials",clearCredentialsConfirm:'Clear stored credentials for "{name}"? This built-in provider will stay listed and can be used again after credentials are configured.',disableProvider:"Disable provider",disableProviderConfirm:'Disable built-in provider "{name}"? The provider will stay built in and can be enabled again later.',providerDisabled:"Provider disabled",defaultProviderUpdated:"Default provider updated",defaultProviderUpdateFailed:"Failed to update default provider",defaultModelUpdated:"Default model updated",defaultModelUpdateFailed:"Failed to update default model",deleteProvider:"Delete Provider",deleteConfirm:'Are you sure you want to delete "{name}"?',codexLoginTitle:"OpenAI Codex Login",codexWaiting:"Enter this code at the authorization page to complete login:",codexCopyCode:"Code copied",codexOpenLink:"Open authorization page",codexApproved:"Login successful",codexExpired:"Authorization expired. Please try again.",nousLoginTitle:"Nous Portal Login",nousWaiting:"Enter this code at the authorization page to complete login:",nousCopyCode:"Code copied",nousOpenLink:"Open authorization page",nousApproved:"Login successful",nousDenied:"Authorization was denied. Please try again.",nousExpired:"Authorization expired. Please try again.",copilotLoginTitle:"GitHub Copilot Login",copilotWaiting:"Open GitHub and enter the device code below to authorize. The window will close automatically once approved.",copilotCopyCode:"Code copied",copilotOpenLink:"Open GitHub authorization page",copilotApproved:"Sign-in succeeded!",copilotDenied:"Authorization denied.",copilotExpired:"The authorization link has expired. Please retry.",copilotAddDetectedTitle:"GitHub Copilot detected",copilotAddDetected:"A GitHub Copilot OAuth token was detected on this machine. Click Add to enable Copilot in Hermes.",copilotAddSourceEnv:"Source: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source: VS Code Copilot extension (apps.json)",copilotDeleteHintEnv:"This will clear COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Other tools are not affected.",copilotDeleteHintGhCli:"Copilot will be hidden from Hermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.",copilotDeleteHintAppsJson:"Copilot will be hidden from Hermes. Your VS Code Copilot extension login is not affected.",xaiLoginTitle:"xAI Grok OAuth Login",xaiWaiting:"Complete authorization in the opened xAI page. This window will close automatically once approved.",xaiOpenLink:"Open xAI authorization page",xaiCopyLink:"Copy authorization link",xaiApproved:"Sign-in succeeded!",xaiExpired:"The authorization link has expired. Please retry.",anthropicLoginTitle:"Claude OAuth Login",anthropicWaiting:"Complete authorization on the Claude page, then paste the returned code here.",anthropicOpenLink:"Open Claude authorization page",anthropicCopyLink:"Copy authorization link",anthropicCodePlaceholder:"Paste the authorization code...",anthropicSubmitCode:"Submit code",anthropicApproved:"Sign-in succeeded!",anthropicExpired:"Authorization expired. Please retry.",geminiLoginTitle:"Google Gemini OAuth Login",geminiWaiting:"Complete authorization on the opened Google page. This window will close automatically once approved.",geminiOpenLink:"Open Google authorization page",geminiCopyLink:"Copy authorization link",geminiApproved:"Sign-in succeeded!",geminiExpired:"The authorization link has expired. Please retry.",customBadge:"CUSTOM",previewBadge:"PREVIEW",disabledBadge:"UNAVAILABLE",disabledTooltip:"This model is currently unavailable for your account.",customModelPlaceholder:"Unlisted model ID",customModelHint:"For provider-supported models not returned by the API; not a display rename. Press Enter to load.",removeCustomModel:"Remove this unlisted model",refresh:"Refresh model list (reload config.yaml)",noProviders:"No providers found. Add a custom provider to get started.",models:"Models",count:"models",more:"more",aliasEdit:"Rename",aliasTitle:"Model display name",aliasTitleFor:"Display name for {model}",aliasPlaceholder:"Leave empty to use original model ID",aliasHint:"Display-only alias. Hermes still receives the canonical model ID.",aliasCanonical:"Original ID: {model}",aliasUseOriginal:"Use original ID",aliasManage:"Display names",aliasManageFor:"Display names for {provider}",aliasSaveFailed:"Failed to save display name",manageVisibleModels:"Manage visible models",manageVisibleModelsFor:"Manage visible models for {name}",visibilityHint:"Only affects the Web UI model picker and Models page. Hermes CLI provider/model config is not rewritten; calls still use canonical model IDs.",visibilitySelectOne:"Keep at least one visible model",visibilitySaved:"Visible models saved",visibilitySaveFailed:"Failed to save visible models",showAllModels:"Show all models",clearVisibleModels:"Clear selection",generalTitle:"General Models",auxiliaryTitle:"Auxiliary Models",auxiliarySubtitle:"Side-task model overrides for compression, vision, approvals, MCP, and background maintenance.",combinationTitle:"Model Ensembles",combinationSubtitle:"Configure MoA presets: reference models provide perspectives first, then one aggregator model handles the final response and tool calls.",combinationPreset:"Preset",combinationName:"Name",combinationAddModel:"Add model ensemble",combinationEditModel:"Edit model ensemble",combinationNewPreset:"New preset",combinationPresetPlaceholder:"e.g. review",combinationAddPreset:"Add preset",combinationSetDefault:"Set default",combinationEnabled:"Enable references",combinationReferenceModels:"Reference models",combinationReferenceModel:"Reference model",combinationAddReference:"Add reference model",combinationAggregator:"Aggregator model",combinationReferenceTemperature:"Reference temperature",combinationAggregatorTemperature:"Aggregator temperature",combinationMaxTokens:"Max tokens",combinationNotSet:"Not set",combinationSaved:"Model ensemble saved",combinationLoadFailed:"Failed to load model ensemble",combinationSaveFailed:"Failed to save model ensemble",combinationPresetExists:"Preset already exists",combinationNameRequired:"Enter a model ensemble name",combinationNameInvalid:"Name can only contain letters, numbers, underscores, hyphens, and dots",combinationReferenceRequired:"Add at least one reference model",combinationAggregatorRequired:"Select an aggregator model",auxiliaryRefresh:"Refresh",auxiliaryTask:"Task",auxiliaryTimeout:"Timeout",auxiliaryDownloadTimeout:"Download timeout",auxiliaryActions:"Actions",auxiliaryDefault:"Default",auxiliaryCustomEndpoint:"Custom endpoint",auxiliaryProviderAuto:"Auto",auxiliaryProviderMain:"Main model",auxiliaryProviderPlaceholder:"auto, main, or provider key",auxiliaryDownloadShort:"download",auxiliaryExtraBody:"Extra body JSON",auxiliaryClear:"Clear",auxiliarySaved:"Auxiliary models saved",auxiliaryLoadFailed:"Failed to load auxiliary models",auxiliarySaveFailed:"Failed to save auxiliary models",auxiliaryInvalidExtraBody:"Extra body must be a JSON object",auxiliaryTaskCompression:"Compression",auxiliaryTaskVision:"Vision",auxiliaryTaskWebExtract:"Web extract",auxiliaryTaskSkillsHub:"Skills hub",auxiliaryTaskApproval:"Approval",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Title generation",auxiliaryTaskTriageSpecifier:"Triage specifier",auxiliaryTaskKanbanDecomposer:"Kanban decomposer",auxiliaryTaskProfileDescriber:"Profile describer",auxiliaryTaskCurator:"Curator",auxiliaryTaskSessionSearch:"Session search",auxiliaryTaskFlushMemories:"Flush memories",currentDefault:"Current default",defaultShort:"Default",setDefaultProvider:"Set default provider",setDefault:"Set default",builtIn:"Built-in",customType:"Custom",provider:"Provider",contextLength:"Context Length",contextLengthPlaceholder:"e.g. 256000 (optional)",apiMode:"API Mode",local:"Local ({host})",selectProviderRequired:"Please select a provider",baseUrlRequired:"Base URL is required",apiKeyRequired:"API Key is required",modelRequired:"Default Model is required",enterBaseUrl:"Please enter Base URL first",unexpectedFormat:"Unexpected response format",foundModels:"Found {count} models",fetchFailed:"Failed to fetch models"},gateways:{title:"Gateways",running:"Running",stopped:"Stopped",started:"Started",startFailed:"Failed to start gateway",stopFailed:"Failed to stop gateway"},profiles:{title:"Profiles",create:"Create Profile",import:"Import",export:"Export",rename:"Rename",delete:"Delete",editConfig:"Edit Config",switchTo:"Switch Hermes Profile",switchConfirm:"This will run `hermes profile use {name}` and change the active Hermes CLI profile. Continue?",switchSuccess:'Hermes active profile switched to "{name}"',switchFailed:"Failed to switch Hermes profile. Gateway may need manual restart.",createSuccess:'Profile "{name}" created',createFailed:"Failed to create profile",renameSuccess:"Profile renamed",renameFailed:"Failed to rename profile",deleteConfirm:'Are you sure you want to delete profile "{name}"?',deleteSuccess:"Profile deleted",deleteFailed:"Failed to delete profile",exportSuccess:"Profile exported",exportFailed:"Failed to export profile",importSuccess:"Profile imported",importFailed:"Failed to import profile",importSelectFile:"Select archive file",importInvalidFile:"Please select a valid archive (.tar.gz, .tgz, .gz, .zip)",name:"Profile Name",namePlaceholder:"Lowercase letters, numbers, hyphens only",nameValidation:"Profile name can only contain lowercase letters, numbers, underscores, and hyphens",newName:"New Name",newNamePlaceholder:"Lowercase letters, numbers, hyphens",cloneFromCurrent:"Clone from current profile",cloneCleanupNotice:"Cloning automatically skips exclusive platform credentials (Weixin / Telegram / Slack, etc.) to avoid conflicts with the source profile",cloneStrippedCredentials:"Stripped {count} exclusive credential(s): {list}",cloneDisabledPlatforms:"Disabled {count} platform(s): {list}",cloneStrippedConfigCredentials:"Stripped {count} embedded credential(s) from config.yaml: {list}",archivePath:"Archive Path",archivePathPlaceholder:"Server path to archive file",importName:"Profile Name (optional)",importNamePlaceholder:"Leave empty to use archive name",active:"Active",model:"Model",gateway:"Gateway",alias:"Alias",provider:"Provider",path:"Path",skills:"Skills",hasEnv:"Has .env",hasSoulMd:"Has soul.md",noProfiles:"No profiles found. Create one to get started.",avatar:{title:"Custom Avatar",customize:"Avatar",upload:"Upload Image",random:"Randomize",reset:"Use Default",hint:"PNG, JPEG, or WebP. Max 1MB.",invalidType:"Please choose a PNG, JPEG, or WebP image",tooLarge:"Avatar image must be 1MB or smaller",saveSuccess:"Avatar saved",saveFailed:"Failed to save avatar",resetSuccess:"Default avatar restored",resetFailed:"Failed to restore default avatar"},runtime:{activeProfile:"Active: {name}",bridgeWorker:"Bridge worker",gateway:"Gateway",active:"Active",activeTag:"Active",idle:"Idle",checking:"Checking",running:"Running",stopped:"Stopped",restartGateway:"Restart Gateway",restartProfile:"Restart Profile",switchProfile:"Switch Frontend Profile",gatewayRestarted:"Gateway restarted: {name}",gatewayRestartFailed:"Failed to restart gateway",profileRestarted:"Profile restarted: {name}",profileRestartFailed:"Failed to restart profile"}},logs:{title:"Logs",all:"All",searchPlaceholder:"Search...",refresh:"Refresh",noEntries:"No log entries"},settings:{title:"Settings",saved:"Saved",saveFailed:"Save failed",tabs:{display:"Display",account:"Current Account",users:"Account Management",agent:"Agent",proxy:"Proxy",memory:"Memory",compression:"Compression",session:"Session",privacy:"Privacy",apiServer:"API Server",models:"Models",voice:"Voice"},models:{apiKey:"API Key",apiKeyPlaceholder:"Enter API key",save:"Save",saved:"Saved",saveFailed:"Save failed",noProviders:"No providers configured"},display:{streaming:"Stream Responses",streamingHint:"Show AI replies in real-time",compact:"Compact Mode",compactHint:"Reduce message spacing",showReasoning:"Show Reasoning",showReasoningHint:"Show model thinking process",showCost:"Show Cost",showCostHint:"Show token usage in replies",inlineDiffs:"Inline Diffs",inlineDiffsHint:"Show code changes inline",bellOnComplete:"Completion Sound",bellOnCompleteHint:"Play sound when AI finishes",notifyOnComplete:"Completion Notification",notifyOnCompleteHint:"Show a system notification when AI finishes",notifyOnCompleteMacHint:"On macOS, allow browser notifications in System Settings.",notifyOnCompleteDenied:"Notification permission was denied",notifyOnCompleteInsecure:"Browser notifications require HTTPS or localhost",notifyOnCompleteUnsupported:"This browser does not support notifications",notifyOnCompleteTest:"Notifications are enabled.",notifyOnCompleteTestButton:"Test",notifyOnCompleteTesting:"Sending test notification...",notifyOnCompleteTestSent:"Test notification sent",notifyOnCompleteTestFailed:"Failed to send test notification",busyInputMode:"Busy Input Mode",busyInputModeHint:"Allow input while AI is processing",theme:"Theme",themeHint:"Choose light, dark, or follow system preference",themeLight:"Light",themeDark:"Dark",themeSystem:"System",chatInputHeight:"Chat input height",chatInputHeightHint:"Default desktop chat input height in pixels. Mobile keeps auto height."},agent:{maxTurns:"Max Turns",maxTurnsHint:"Maximum interaction rounds per conversation",gatewayTimeout:"Gateway Timeout",gatewayTimeoutHint:"Request timeout in seconds",restartDrainTimeout:"Restart Drain Timeout",restartDrainTimeoutHint:"Drain timeout before restart in seconds",toolEnforcement:"Tool Enforcement",toolEnforcementHint:"Control tool call execution mode",auto:"Auto",always:"Always",never:"Never"},gatewayAutoStart:{title:"Gateway Auto-Start",description:"Control which local Hermes profile gateways the Web UI starts during startup. This is stored in the Web UI config, not a profile config.yaml.",enabled:"Auto-start gateways",enabledHint:"When disabled, startup will not automatically start any profile gateway.",management:"Unified gateway",managementHint:"Requires Hermes Agent 0.17.0 or later. When enabled, Web UI writes multiplex_profiles so the default gateway serves every profile; other profiles cannot configure separate Feishu, Weixin, QQBot, or similar messaging entrypoints. Turning it off removes that config.",managementAuto:"Auto",managementPerProfile:"One gateway per profile",managementUnified:"Unified default gateway",mode:"Profile policy",modeHint:"Start all discovered profiles or only the explicit include list.",modeAll:"All discovered profiles",modeInclude:"Only included profiles",include:"Included profiles",includeHint:"Comma-separated profile names. In include mode, an empty list starts none.",exclude:"Excluded profiles",excludeHint:"Comma-separated profile names to skip after the include/all policy is applied.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway Proxy",description:"Set proxy environment variables for the selected profile gateway. Changes restart the gateway so messaging platforms can use the new network settings.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Proxy for HTTPS requests. Usually the main value to set.",httpProxy:"HTTP_PROXY",httpProxyHint:"Proxy for plain HTTP requests.",allProxy:"ALL_PROXY",allProxyHint:"Fallback proxy used when a protocol-specific proxy is not set.",noProxy:"NO_PROXY",noProxyHint:"Comma-separated hosts or domains that should bypass the proxy.",save:"Save Proxy Settings"},memory:{enabled:"Enable Memory",enabledHint:"Allow AI to remember conversation context",userProfile:"User Profile",userProfileHint:"Allow AI to remember user preferences",charLimit:"Memory Char Limit",charLimitHint:"Max characters for MEMORY.md",userCharLimit:"User Profile Char Limit",userCharLimitHint:"Max characters for USER.md"},compression:{enabled:"Enable Compression",enabledHint:"Automatically compress long chat history before it exceeds the model context",threshold:"Compression Threshold",thresholdHint:"Start compression when estimated tokens exceed this context ratio",targetRatio:"Target Ratio",targetRatioHint:"Target history size after compression as a context ratio",protectLastN:"Protect Recent Messages",protectLastNHint:"Keep this many latest messages uncompressed",protectFirstN:"Protect First Messages",protectFirstNHint:"Keep this many earliest messages uncompressed"},session:{mode:"Reset Mode",modeHint:"Trigger condition for session reset",modeBoth:"Idle + Scheduled",modeIdle:"Idle Only",modeDaily:"Scheduled Only",modeNone:"Never (Manual Only)",idleMinutes:"Idle Timeout",idleMinutesHint:"Wait time before auto-reset (minutes)",atHour:"Scheduled Reset Time",humanOnly:"Show human sessions only",humanOnlyHint:"Hide sub-agent/session monitor noise by default",liveMonitorHumanOnly:"Live monitor: show human sessions only",liveMonitorHumanOnlyHint:"Hide sub-agent/session monitor noise in the Live monitor by default",atHourHint:"Reset session at this hour daily",requireAuth:"Session Authorization",requireAuthHint:"Require authorization for session operations",memoryWriteApproval:"Review memory writes",memoryWriteApprovalHint:"Stage Hermes Agent memory writes for approval before they are saved.",skillsWriteApproval:"Review skill writes",skillsWriteApprovalHint:"Stage Hermes Agent skill changes for approval before they are saved.",writeApprovalTitle:"Pending write approvals",writeApprovalDescription:"Approve or reject staged Hermes Agent memory and skill writes.",writeApprovalRefresh:"Refresh",writeApprovalEmpty:"No pending writes.",writeApprovalMemory:"Memory",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Review",writeApprovalHideDiff:"Hide",writeApprovalNoDiff:"No diff available.",writeApprovalLoadFailed:"Failed to load pending writes",writeApprovalDiffFailed:"Failed to load write details",writeApprovalActionFailed:"Failed to resolve pending write",writeApprovalApproved:"Pending write approved",writeApprovalRejected:"Pending write rejected",writeApprovalApprove:"Approve",writeApprovalReject:"Reject",writeApprovalPendingMemoryWrite:"Pending memory write",writeApprovalCurrentFile:"Current {file}",writeApprovalProposedFile:"Proposed {file}",writeApprovalDiffSection:"Diff",writeApprovalPatchOldStringMissing:"The patch old_string was not found in the current {file}, so approving it will not change the file.",writeApprovalRequestedOldString:"Requested old_string",writeApprovalCurrentReadFailed:"The current {file} could not be read as UTF-8 text.",writeApprovalDeleteSkill:"This approval deletes skill {skill}.",writeApprovalRemoveFile:"This approval removes {file} from skill {skill}."},privacy:{redactPii:"Redact PII",redactPiiHint:"Auto-detect and hide sensitive info (passwords, keys, etc.)"},apiServer:{enable:"Enable",enableHint:"Enable API server",host:"Host",hostHint:"Listen address",port:"Port",portHint:"Listen port",key:"Key",keyHint:"API access key",cors:"CORS Origins",corsHint:"Allowed cross-origin sources"},lockedIps:{title:"Locked IPs",count:"{count} locked",empty:"No locked IPs",unlock:"Unlock",unlockAll:"Unlock All",unlockAllConfirm:"Unlock all locked IPs?",unlocked:"IP unlocked",allUnlocked:"{count} IPs unlocked",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"User Avatar",upload:"Upload Image",random:"Generate Random",reset:"Reset to Default",hint:"Supports PNG/JPEG/WebP up to 1MB, auto-compressed to under 500KB",invalidType:"Please choose a PNG, JPEG, or WebP image",tooLarge:"Avatar image must be under 1MB",saveSuccess:"Avatar saved",saveFailed:"Failed to save avatar",resetSuccess:"Avatar reset to default",resetFailed:"Failed to reset avatar"},voice:{activeTtsApi:"Active TTS API",activeSttApi:"Active STT API",ttsProvidersTitle:"TTS providers",ttsProvidersDescription:"Manage text-to-speech integrations used to play assistant responses and voice previews.",sttProvidersTitle:"STT providers",sttProvidersDescription:"Manage speech-to-text integrations used by the microphone and voice input flow.",noneSelected:"None selected",keyStored:"Stored",keyMissing:"Missing",customApi:"API",localBuiltin:"Local built-in",ttsCardHint:"Speech synthesis provider",sttCardHint:"Speech transcription provider",setActive:"Set active",testAction:"Test",connect:"Connect",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Free high-quality cloud voices from Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"Custom TTS",presetBrowserSttLabel:"Browser STT",presetBrowserSttDescription:"Native browser speech recognition API.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"Custom STT",apiCompatibility:"API compatibility",openaiCompatible:"OpenAI-compatible",manualCustomEndpoint:"Manual custom endpoint",connectionStep:"Connection",discoveryManualHint:"Manual custom endpoint selected. Model discovery is not available; enter the model name manually.",discoveryCredentialHint:"Enter Base URL and API key, then connect to fetch available models.",discoveryNoAutoProbeHint:"No requests are sent while typing. Use Connect when the credentials are ready.",apiKeyConnectPlaceholder:"Paste API key to connect; stored keys are never shown",connectFetchModels:"Connect & fetch models",modelRecommendedSuffix:"recommended",modelConnectManualHint:"Connect to auto-fill, or enter manually.",modelRequiredConnectManual:"Model is required. Connect to auto-fill, or enter manually.",apiKeyRequired:"API key is required.",apiKeyRequiredForDiscovery:"API key is required to fetch models.",baseUrlRequired:"Base URL is required.",baseUrlHttpsRequired:"Please use http:// or https://.",baseUrlInvalid:"Enter a valid Base URL, including https://.",discoveryFailedManualFallback:"Could not fetch models. You can still enter the model name manually.",completeRequiredProviderFields:"Complete the required provider fields before saving.",fetchingModels:"Fetching models…",recommendedModel:"Recommended: {model}.",useRecommendedModel:"Use this.",modelsDiscovered:"{count} models discovered. Recommended model is selected when the field is empty.",remove:"Remove",testSuccess:"Test completed",testTextRequired:"Enter text before testing.",keyMissingForTest:"Add an API key before testing this provider.",testing:"Testing…",transcribing:"Transcribing…",browserSttTestHint:"Browser STT is tested from the chat microphone.",sttEmptyAudio:"No audio was captured. Try again.",sttTestSuccess:"Transcription completed",sttRecordingHint:"Recording… click Stop to transcribe.",keepStoredKeyPlaceholder:"Leave blank to keep the stored key",apiKeyPlaceholder:"Enter API key",lastTest:"Last test",notTested:"—",recording:"Recording",testFailedShort:"Failed",testFailedSummary:"Test failed. Check provider settings and try again.",showDetails:"Show details",hideDetails:"Hide details",moreActions:"More",moreActionsFor:"More actions for {provider}",addTtsApi:"Add TTS API",addSttApi:"Add STT API",active:"Active",builtin:"Built-in",connected:"Connected",disconnected:"Disconnected",source:"Source",model:"Model",voice:"Voice",doubaoVoiceHint:"Select a Seed TTS 2.0 voice; the resource field is updated automatically.",apiKey:"API key",confirmDeleteSecret:"Delete the stored API key for this voice API?",ttsTitle:"Text-to-speech",ttsSaved:"TTS settings saved on the server",ttsSaveFailed:"Failed to save TTS settings",ttsTestSaved:"Audition succeeded; TTS settings saved on the server",ttsTestSaving:"Saving TTS settings before audition…",ttsMissingBaseUrl:"Base URL is required before testing. Enter a provider endpoint, then test again.",ttsMissingApiKey:"API key is required before testing. Paste the key, or save a stored server key first.",ttsCleared:"Stored TTS key cleared",ttsClearFailed:"Failed to clear stored TTS key",storedBaseUrlsTitle:"Stored Base URLs",storedBaseUrlsHint:"Saved voice provider endpoints. Field-level inputs only clear the current value; delete saved endpoints here.",storedBaseUrlsEmpty:"No custom voice Base URLs are saved on the server.",storedBaseUrlDelete:"Delete URL",storedApiKeysTitle:"Stored API keys",storedApiKeysHint:"Masked list of server-stored voice API keys. Only provider/source is shown; raw keys are never displayed.",storedApiKeysEmpty:"No voice API keys are stored on the server.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Delete key",baseUrlPresetClear:"Clear URL",baseUrlPresetCleared:"Base URL cleared from the field.",baseUrlPresetDelete:"Delete URL",baseUrlPresetDeleted:"Base URL removed from saved list.",baseUrlPresetDeleteFailed:"Failed to remove saved Base URL.",ttsPendingSecret:"New key will be saved",ttsStoredSecret:"Server has stored key: {value}",ttsClearKey:"Clear stored key",sttTitle:"Speech-to-text",sttProvider:"STT Provider",sttProviderHint:"Choose how voice input is transcribed",sttProviderBrowser:"Browser",sttProviderOpenai:"OpenAI-compatible",sttProviderCustom:"Custom",sttBrowserHint:"Use built-in browser speech recognition when available.",sttApiKey:"API Key",sttApiKeyHint:"Stored server-side for STT providers that require authentication.",sttStoredSecret:"Stored server key: {value}",sttPendingSecret:"Stored server key: will be updated on save",sttClearKey:"Clear stored key",sttModel:"Model",sttModelHint:"Speech-to-text model to use.",sttLanguage:"Language",sttLanguageHint:"Optional language hint such as en or zh.",sttPrompt:"Prompt",sttPromptHint:"Optional transcription prompt.",sttAudioTranscode:"Audio transcoding",sttAudioTranscodeNone:"Send original audio",sttAudioTranscodeFfmpeg:"Convert to WAV with ffmpeg",sttBaseUrl:"Base URL",sttBaseUrlHint:"Custom OpenAI-compatible speech-to-text endpoint.",sttSave:"Save STT settings",sttSaved:"STT settings saved on server.",sttSaveFailed:"Failed to save STT settings.",sttCleared:"Stored STT secret cleared from server.",sttClearFailed:"Failed to clear stored STT secret.",sttActiveSaved:"Active STT provider saved on server.",sttSaveActive:"Save active STT provider",sttEndpointHint:"Final transcription endpoint: {endpoint}",sttTestTitle:"Test speech-to-text",sttTestButton:"Test STT API",sttTestStopButton:"Stop and transcribe",sttTestBackendOnly:"STT API test is available for OpenAI-compatible and Custom providers.",sttTestRecording:"Recording test sample… click Stop and transcribe when done.",sttTestTranscribing:"Transcribing test sample…",sttTestEmpty:"No audio was captured for the STT test.",sttTestSucceeded:"STT test succeeded.",sttTestFailed:"STT test failed: {error} — {hint}",sttFailureHintMissingConfig:"Check that the provider is saved with a base URL/model and an API key before testing.",sttFailureHintAuth:"Check the API key. If a key was already stored, paste the current key again and save before testing.",sttFailureHintForbidden:"The key reached the provider but does not have permission for this STT model or account. Check provider access/billing.",sttFailureHintEndpointModel:"Check the Base URL and model. For Groq, use {endpoint} with whisper-large-v3-turbo or another Groq STT model.",sttFailureHintModel:"Check that the selected STT model exists and is enabled for this account.",sttFailureHintQuota:"The provider reports quota, billing, or rate-limit trouble. Check account quota/billing or retry later.",sttFailureHintNetworkCustom:"The server could not reach the custom STT endpoint. Check that {endpoint} is reachable from the Web UI server and is OpenAI-compatible.",sttFailureHintNetwork:"The Web UI server could not reach the STT provider. Check network/proxy/firewall and retry.",sttFailureHintAudio:"The recorded audio was empty or rejected. Try a short clear sample, allow microphone access, or retry in Chrome.",sttFailureHintGenericCustom:"Check API key, Base URL, model, and the final endpoint {endpoint}.",sttFailureHintGeneric:"Check API key, model, and provider account access, then retry.",sttTestRecordFailed:"Could not start microphone recording: {error}",sttTestTranscript:"Transcript: {text}",ttsProvider:"TTS Provider",ttsProviderHint:"Choose the text-to-speech engine for message playback",providerWebSpeech:"WebSpeech API (Browser)",providerOpenai:"OpenAI TTS",providerCustom:"Custom Endpoint (OpenAI-compatible)",providerEdge:"Edge TTS (Free, no API Key)",webspeechVoice:"Voice",webspeechVoiceHint:"Select a voice from your browser or OS",webspeechVoicePlaceholder:"Auto (default voice)",openaiKey:"API Key",openaiKeyHint:"Your OpenAI API key with TTS access",openaiUrl:"API Base URL",openaiUrlHint:"e.g. https://api.openai.com/v1/audio/speech",openaiModel:"Model",openaiModelHint:"tts-1 (faster) / tts-1-hd (higher quality)",openaiVoice:"Voice",openaiVoiceHint:"Voice to use for synthesis",customHint:"Use any OpenAI-compatible TTS API — works with GPT-SoVITS, CosyVoice, etc.",customUrl:"API URL",customUrlHint:"Base URL of your TTS service",customUrlPlaceholder:"The address configured in the local adapter, e.g. http://127.0.0.1:9880",customApiKey:"API Key (Optional)",customApiKeyHint:"Some custom endpoints require authentication",customApiKeyPlaceholder:"Leave blank if not needed",edgeHint:"Powered by Microsoft Edge TTS (node-edge-tts).",edgeUrl:"Adapter URL",edgeUrlHint:"Address of your Edge TTS adapter, e.g. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voice",edgeVoiceHint:"Select a voice for speech synthesis",edgeRate:"Speed",edgeRateHint:"Adjust speech speed (0.5x ~ 2.0x)",edgePitch:"Pitch",edgePitchHint:"Adjust speech pitch (-20 ~ +20 Hz)",testTitle:"Test Voice",testText:"Test Text",testTextPlaceholder:"Enter text to test...",testTextDefault:"Hello, this is a voice test.",testButton:"Test",testButtonPlaying:"Playing...",testFailed:"Test failed: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — supports preset voices, voice design, and voice clone modes",mimoApiKey:"API Key",mimoApiKeyHint:"Get your key at platform.xiaomimimo.com",mimoApiKeyPlaceholder:"MiMo API Key",mimoAuthMode:"Authentication Mode",mimoAuthModeHint:"Header format expected by the selected MiMo endpoint",mimoAuthModeBearer:"Bearer token (Authorization)",mimoAuthModeApiKey:"API key header (api-key)",mimoAuthModeBoth:"Both headers",mimoBaseUrl:"Base URL",mimoBaseUrlHint:"MiMo API endpoint URL",mimoModel:"Model",mimoModelHint:"Select speech synthesis model",mimoModelPreset:"Preset Voices",mimoModelVoiceDesign:"Voice Design",mimoModelVoiceClone:"Voice Clone",mimoVoice:"Voice",mimoVoiceHint:"Select a preset voice",mimoVoiceDesignPrompt:"Voice Description",mimoVoiceDesignPromptHint:"Describe the voice characteristics you want",mimoVoiceDesignPromptPlaceholder:"e.g., A warm young female voice, slightly slow, with a magnetic tone",mimoCloneAudio:"Upload Audio",mimoCloneAudioHint:"Upload an audio sample for voice cloning (mp3/wav, max 10MB)",mimoCloneAudioUpload:"Choose File",mimoCloneAudioClear:"Clear",mimoStylePrompt:"Style Prompt",mimoStylePromptHint:"Optional — describe the speaking style in natural language",mimoStylePromptPlaceholder:"e.g., Bright and bouncy tone, fast pace"}},githubPreview:{title:"Version Preview",description:"Clone a selected GitHub tag into the Web UI preview workspace, install dependencies, and run it with the development ports.",refresh:"Refresh",selectTag:"Select a tag",prepare:"Prepare Code",install:"Install Dependencies",start:"Start Preview",stop:"Stop",note:"Preview code is stored under the Web UI data home. Production remains on port 8648; preview development runs on frontend 8651 and backend 8650.",path:"Preview Path",webuiHome:"Preview Data Home",currentTag:"Current Tag",repoReady:"Repository Ready",dependencies:"Dependencies Installed",running:"Running",notRunning:"Not running",open:"Open Preview",log:"Action Log Path",logOutput:"Log Output",actionLog:"Action Log",devLog:"Dev Server Log",yes:"Yes",no:"No",actionFailed:"Action failed",nodeEnvironmentMissing:"Node/npm was not detected. Please install Node.js and try again.",prepareSuccess:"Preview code is ready",installSuccess:"Dependencies installed",startSuccess:"Preview completed",stopSuccess:"Preview stopped"},codingAgents:{title:"Coding Agents",notice:"Not all providers and models are compatible.",claudeDescription:"Anthropic CLI for one-shot print mode and interactive coding sessions.",codexDescription:"OpenAI CLI and Hermes openai-codex provider flow for repository tasks.",copyCommand:"Copy",commandCopied:"Command copied",commandCopyFailed:"Copy failed",refresh:"Refresh",checking:"Checking",installStatus:"Install status",installed:"Installed",notInstalled:"Not installed",installRequired:"{agent} is not installed. Install it before creating a session.",installNow:"Install",installing:"Installing",installSuccess:"Installed",installFailed:"Install failed",installFailedHermesHint:"Installation failed. Ask Hermes to install it for you.",installFailureReason:"Reason",nodeEnvironmentMissing:"Node/npm was not detected. Please install Node.js and try again.",deleteNow:"Delete",deleting:"Deleting",deleteSuccess:"Deleted",deleteFailed:"Delete failed",configFiles:"Config files",profileScope:"Profile",providerScope:"Provider",providerPlaceholder:"e.g. custom:glm",modelScope:"Model",modelPlaceholder:"Select model",launchModeScope:"Launch mode",launchModeGlobal:"Global config",launchModeScoped:"Provider and model",protocolScope:"Protocol",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"Reload config",configFileNotCreated:"Not created",configLoadFailed:"Failed to read config file",loadFailed:"Failed to inspect coding agents",launch:"Launch",launchTitle:"Launch Coding Agent",nativeTerminal:"Native Terminal",builtInTerminal:"Built-in Terminal",launchPrepared:"Launch config prepared",launchPrepareFailed:"Failed to prepare launch config",nativeLaunchStarted:"Native terminal opened",nativeLaunchFailed:"Failed to open native terminal",terminalTitle:"Coding Agent Terminal",loadProvidersFailed:"Failed to load providers for the current profile",selectProviderModel:"Select a provider and model",launchConfigDir:"Launch config directory",launchCommand:"Launch command",table:{tool:"Tool",kind:"Step",command:"Command",note:"Note",action:"Action"},kinds:{install:"Install",auth:"Auth",health:"Health",run:"Run"},notes:{claudeInstall:"Installs the Claude Code CLI globally.",codexInstall:"Installs the Codex CLI globally.",claudeAuth:"Checks Claude Code login state; run claude once if login is missing.",codexAuth:"Adds Hermes-managed OpenAI Codex OAuth credentials.",claudeHealth:"Checks updater and local CLI health.",codexHealth:"Confirms the Codex CLI is available on PATH.",claudeRun:"Print mode is the cleanest path for API-driven one-shot tasks.",codexRun:"Codex one-shot tasks must run inside a git repository."}},platform:{requireMention:"Require {'@'}Mention",requireMentionGroup:"Require {'@'}mention in groups to respond",requireMentionChannel:"Require {'@'}mention in channels to respond",requireMentionRoom:"Require {'@'}mention in rooms to respond",reactions:"Reactions",reactionsHint:"React to messages with emoji",freeResponseChats:"Free Response Chats",freeResponseChatsHint:"Chat IDs that respond without {'@'}mention (comma-separated)",freeResponseChannels:"Free Response Channels",freeResponseChannelsHint:"Channel IDs that respond without {'@'}mention (comma-separated)",freeResponseRooms:"Free Response Rooms",freeResponseRoomsHint:"Room IDs that respond without {'@'}mention (comma-separated)",mentionPatterns:"Custom Mention Patterns",mentionPatternsHint:"Additional trigger patterns",autoThread:"Auto Thread",autoThreadHint:"Auto-create reply threads after {'@'}mention",autoThreadHintRoom:"Auto-create reply threads in rooms",dmMentionThreads:"DM Mention Threads",dmMentionThreadsHint:"Use thread replies for mentions in DMs",allowBots:"Allow Bot Messages",allowBotsHint:"Respond to messages from other bots",allowedChannels:"Allowed Channels",allowedChannelsHint:"Whitelist channel IDs (comma-separated)",ignoredChannels:"Ignored Channels",ignoredChannelsHint:"Channels where bot never responds (comma-separated)",noThreadChannels:"No-Thread Channels",noThreadChannelsHint:"Channels where bot responds without threads (comma-separated)",exclusiveTokenWarning:"This platform uses exclusive token locking. Each profile must use a different identity token to avoid conflicts with other profiles.",botToken:"Bot Token",botTokenHint:"Bot token from developer portal",proxyUrl:"Proxy URL",proxyUrlHint:"Optional platform proxy. Supports http://, https://, and socks5://",accessToken:"Access Token",accessTokenHint:"Matrix access token",homeserver:"Homeserver URL",homeserverHint:"Matrix homeserver URL",matrixUserId:"Matrix User ID",matrixUserIdHint:"Required with password login; optional with access token",matrixPassword:"Matrix Password",matrixPasswordHint:"Alternative to an access token",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",encryptKey:"Encrypt Key",encryptKeyHint:"Feishu Encrypt Key",verificationToken:"Verification Token",verificationTokenHint:"Feishu Verification Token",clientId:"Client ID",clientIdHint:"DingTalk Client ID",clientSecret:"Client Secret",clientSecretHint:"DingTalk Client Secret",cardTemplateId:"AI Card Template ID",cardTemplateIdHint:"DingTalk AI Card template ID; leave empty to disable AI Cards",allowedUsers:"Allowed Users",allowedUsersHint:"Whitelist user IDs or OpenIDs (comma-separated)",allowAllUsers:"Allow All Users",allowAllUsersHint:"Allow messages from any user; keep off to use the allowlist",botId:"Bot ID",botIdHint:"WeCom Bot ID",wecomSecretHint:"WeCom Bot Secret",waEnabled:"Enable WhatsApp",waEnabledHint:"Enable WhatsApp via QR code pairing",weixinToken:"Weixin Token",weixinTokenHint:"From weixin CLI QR login (hermes weixin)",accountId:"Account ID",accountIdHint:"Weixin account ID",qrLogin:"QR Login",qrRelogin:"Re-login",qrFetching:"Fetching QR code...",qrScanHint:"Scan with WeChat to login",qrScanedHint:"Scaned, please confirm on phone...",qqAppId:"App ID",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppSecret:"App Secret",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqMarkdown:"Markdown Support",qqMarkdownHint:"Enable Markdown formatted messages (some clients may not support)",qqSandbox:"Sandbox Mode",qqSandboxHint:"Enable sandbox environment (for testing)",qqQrScanHint:"Scan the QR code with QQ, or open the link on your phone to complete binding"},language:{label:"Language",zh:"中文",en:"English"},terminal:{sessions:"Sessions",newTab:"New Terminal",closeSession:"Close this session?",sessionExited:"Exited",processExited:"Process exited with code {code}",noSessions:"No terminal sessions",connectionFailed:"Terminal service connection failed",connectionClosed:"Terminal connection closed",connectionError:"Terminal connection error"},groupChat:{title:"Group Chat",createRoom:"Create Room",joinByCode:"Join by Code",roomName:"Room Name",roomNamePlaceholder:"Enter room name",inviteCode:"Invite Code",autoGenerate:"Auto-generate",noRooms:"No rooms yet",selectOrCreate:"Select or create a room to start chatting",agents:"Agents",addAgent:"Add Agent",selectProfile:"Select a profile",agentAdded:"Agent added",selectRoomFirst:"Please select a room first",agentAlreadyInRoom:"Agent already in this room",agentAddFailedCount:"{count} agent(s) were not added: {details}",noAgents:"No agents in this room",members:"members",roomCreated:"Room created",roomDeleted:"Room deleted",roomCloned:"Room cloned",cloneRoom:"Clone room",copyRoomLink:"Copy Room Link",deleteRoomConfirm:"Delete this room?",clearContext:"Clear context",clearContextConfirm:"Clear this room context? Messages and compression snapshots will be removed, but agents and members stay.",contextCleared:"Context cleared",you:"You",joined:"Joined room",joinFailed:"Failed to join room",inputPlaceholder:"Type a message... (Enter to send)",messageDisplayLimit:"Group chat displays up to 600 messages",enterCode:"Enter invite code",yourName:"Your Name",yourNamePlaceholder:"Enter your display name",yourDescription:"Description (optional)",yourDescriptionPlaceholder:"Tell others who you are...",agentName:"Agent Name",agentNamePlaceholder:"Custom name (leave empty to use profile name)",agentDesc:"Agent Description",agentDescPlaceholder:"Describe what this agent does...",agentReplying:"is replying...",agentCompressing:"is compressing context...",compressionSettings:"Compression Settings",triggerTokens:"Trigger Tokens",triggerTokensDesc:"Token threshold to trigger context compression",maxHistoryTokens:"Max History Tokens",maxHistoryTokensDesc:"Maximum tokens for compressed context sent to LLM",tailMessageCount:"Tail Message Count",tailMessageCountDesc:"Number of recent messages to keep verbatim after compression",compressionConfig:"Compression Config",compressionSaved:"Compression config saved",compressNow:"Compress Now",compressingInProgress:"Compression in progress, please wait"},usage:{title:"Usage Statistics",refresh:"Refresh",totalTokens:"Total Tokens",inputTokens:"Input",outputTokens:"Output",totalSessions:"Total Sessions",avgPerDay:"~{n}/day avg",estimatedCost:"Est. Cost",cacheHitRate:"Cache Hit Rate",modelBreakdown:"Model Breakdown",dailyTrend:"Daily Usage",date:"Date",tokens:"Tokens",cache:"Cache",cacheRead:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessions",cost:"Cost",noData:"No usage data"},skillsUsage:{title:"Skills Usage",subtitle:"Track skill loads and edits from Hermes sessions",refresh:"Refresh",periodSelector:"Skill usage period",periodLabel:"{days}d",summary:"Summary",totalActions:"Actions",loads:"Loads",edits:"Edits",distinctSkills:"Skills",topSkills:"Top Skills",dailyTrend:"Daily Trend",periodSummary:"Last {days} days",skill:"Skill",share:"Share",lastUsed:"Last Used",noData:"No skill usage data",loadFailed:"Failed to load skill usage",otherSkills:"Other skills"},files:{title:"Files",fileTree:"File Tree",tree:"Directory Tree",list:"File List",breadcrumbRoot:"Home",newFile:"New File",newFolder:"New Folder",upload:"Upload",refresh:"Refresh",open:"Open",edit:"Edit",preview:"Preview",download:"Download",copyPath:"Copy Path",rename:"Rename",delete:"Delete",name:"Name",size:"Size",modified:"Modified",actions:"Actions",emptyDir:"Empty directory",loading:"Loading...",confirmDelete:'Are you sure you want to delete "{name}"?',confirmDeleteDir:'Are you sure you want to delete directory "{name}" and all its contents?',deleteFailed:"Delete failed",deleted:"Deleted",renameTo:"Rename to",newFileName:"File name",newFolderName:"Folder name",created:"Created",createFailed:"Create failed",renamed:"Renamed",renameFailed:"Rename failed",uploadSuccess:"Uploaded {count} file(s)",uploadFailed:"Upload failed",saveFailed:"Save failed",saved:"Saved",unsavedChanges:"You have unsaved changes. Discard?",pathCopied:"Path copied",fileTooLarge:"File too large (max 10MB)",permissionDenied:"Cannot modify protected file",notFound:"File or directory not found",backendError:"File operation failed",dragDropHint:"Drag files here to upload",closeEditor:"Close Editor",closePreview:"Close",saveFile:"Save"},download:{downloading:"Downloading...",downloadFailed:"Download failed",fileNotFound:"File not found or deleted",fileTooLarge:"File too large (exceeds limit)",backendError:"File read failed, remote environment may be unavailable",backendTimeout:"File read timed out",unsupportedBackend:"Current terminal backend does not support file download",invalidPath:"Invalid file path",contentDisplay:"Content display",download:"Download",downloadFile:"Download file"},changelog:{new_0_6_25_1:"Fixed execute_code failures with Hermes Agent 0.18.0 by forwarding the new has_host_access guard parameter through the Agent Bridge approval memory wrapper",new_0_6_24_1:"This release covers the PRs merged after 0.6.23, focusing on chat input polish, workspace visibility, plugin management, model defaults, and workspace diff review",new_0_6_24_2:"Chat and group chat inputs now use a refreshed toolbar with compact model controls, grouped input settings, clearer context usage, mobile-friendly chrome, and restored manual single-chat input resizing",new_0_6_24_3:"Workspace run changes now appear as durable chat diff cards with a right-side diff/editor drawer, restored after session resume and tuned for mobile viewing",new_0_6_24_4:"The workspace folder picker can browse Windows drive and junction workflows more reliably and now shows dot-prefixed folders such as .hermes, .config, and .codex while keeping WORKSPACE_BASE safety checks",new_0_6_24_5:"Plugins can be enabled or disabled from Studio when they are manageable user plugins, and the Plugins page now reflects base and profile plugin state more accurately",new_0_6_24_6:"Models now support default provider and default model actions; bridge terminal error detection is less noisy, Hermes Agent runtime packaging moves to 0.18.0, and the website version manifest was refreshed",new_0_6_23_1:"This release covers the PRs merged after 0.6.22, with updates to desktop self-update, MCP cleanup, Petdex pets, MCU voice, and several settings workflows",new_0_6_23_2:"Desktop self-update is back to a blocking flow, Windows shuts services down more reliably before updating, and desktop exit now cleans up gateway, profile MCP, and related child processes more completely",new_0_6_23_3:"Desktop MCP injection and Coding Agent MCP launch paths are more stable, Windows workspaces gained a drive picker, and symlink folder display plus desktop Petdex previews were fixed",new_0_6_23_4:"Petdex pets now support web pets, a standalone desktop pet window, immediate display after adoption, a top-right close control, and a more visible initial desktop size",new_0_6_23_5:"MCU and global voice handling now include audio prompts, OTA safeguards, segmented streaming TTS, cleanup for links, code blocks, and tables before speech, plus abort handling for unfinished TTS generation",new_0_6_23_6:"Settings and workflow polish continue with profile config editing, chat input height settings, login JWT expiry configuration, Skill editing, preserved local archive state in History, clearer new-chat drawer wording, and safer built-in Provider danger text",new_0_6_22_1:"This release covers the PRs merged after 0.6.21, with front-end updates for combination models, session history, proxy settings, slash commands, and mobile layout polish",new_0_6_22_2:"The Models page now includes a Combination Models panel, and chat can show real MoA reference and aggregator progress without the old synthetic placeholder tool",new_0_6_22_3:"Chat sessions can be archived from the session list and restored from History, while local-only Claude Code and Codex sessions now appear correctly in History",new_0_6_22_4:"Settings now include a Proxy tab for gateway-wide HTTP(S), ALL_PROXY, and NO_PROXY values, with platform proxy support for Telegram, Discord, and Matrix",new_0_6_22_5:"Hermes chat gained the /learn command, Agent Bridge runs now use the selected workspace as cwd, and only the desktop /learn and MoA command features are waiting on the next Hermes Agent release",new_0_6_21_1:"This release focuses on workflow reruns, MCP workflow tools, voice settings deletion, Matrix login settings, update cleanup, and documentation polish",new_0_6_21_2:"Workflow node messages now open in a left-side resizable full chat drawer, with mobile run history restored and rerun actions for keeping the selected node output or clearing it before rerunning downstream nodes",new_0_6_21_3:"The Hermes Studio MCP use toolset can now list, create, update, delete, run, stop, delete runs, and rerun workflows from a selected node",new_0_6_21_4:"Voice provider removal now deletes the profile provider settings instead of only clearing API keys, while Browser STT and Edge TTS remain protected built-in defaults",new_0_6_21_5:"Matrix platform settings now support user ID plus password configuration and report configured status correctly when password login is used",new_0_6_21_6:"Web UI restart, update, and in-app upgrade now stop the Agent Bridge broker by default so new builds do not attach to stale Python bridge processes",new_0_6_21_7:"Chat, group chat, and workflow headers are better aligned, the Xiao Fang He page now shows sold-out status, BSL license scope is clearer, the /learn integration plan is documented, and unused Hermes proxy code was removed",new_0_6_20_1:"Workflow is now online: create agent nodes, connect them into a graph, and run the full flow directly from the Workflow page",new_0_6_20_2:"Workflow runs now persist records, graph snapshots, per-node sessions, live node status, failure reasons, and run stop/delete actions",new_0_6_20_3:"Workflow viewing and editing are more complete with run history, read-only snapshots, per-node chat session review, larger connection handles, and a create-workflow-first guard",new_0_6_20_4:"Desktop launches now let agent-browser resolve Chrome from AGENT_BROWSER_HOME instead of pinning a stale executable path, with patch integrity guards and browser stdout fixes",new_0_6_20_5:"Packaged browser runtimes now pin Chrome for Testing 149.0.7827.55 on supported desktop platforms to avoid runtime browser regressions",new_0_6_20_6:"ESP32 and Xiao Fang He details were polished with updated tutorial links, a lighter badge background, and a Windows-compatible flowing badge animation",new_0_6_19_1:"This release includes 16 PRs since 0.6.18, focused on device, voice, Coding Agent, and settings improvements visible in the UI",new_0_6_19_2:"Coding Agent sessions can switch models, and new sessions now correctly follow the global default model",new_0_6_19_3:"MCU interactions are steadier with startup Wi-Fi/boot debounce fixes, audio routed only to the target device, and better hardware double-click clear and interrupt behavior",new_0_6_19_4:"TTS settings are now saved by profile, and speed, pitch, and voice tests read from the same configuration source",new_0_6_19_5:"Coding Agent model switches no longer affect existing sessions, and custom provider keys are forwarded correctly",new_0_6_19_6:"Skills runtime filters, cron job sorting, skill-detail height limits, Windows updater recovery, backup fallbacks, and compressed logo assets round out this update",new_0_6_18_2:"Hermes Studio MCP is split into focused api, devices, and use toolsets with new session, model, chat-run, and ops actions",new_0_6_18_3:"Chat and group-chat history are more reliable with separate UI history, safer null-message handling, preserved assistant replies after run failures, and aligned reasoning replay",new_0_6_18_4:"MCU device feedback is clearer: tool calls stay visible over speech, audio no longer marks tasks done too early, active-device login is steadier, and long online/IP status text scrolls",new_0_6_18_5:"Voice and message workflows gained custom HTTP TTS/STT endpoint support, audio transcoding, fork message actions, persistent fork markers, and clearer upload errors",new_0_6_18_6:"Desktop and runtime setup are safer with Unicode-safe Windows PATH registration, Hermes Agent 0.17.0 runtime publishing support, mobile PWA metadata, and several profile/auth recovery fixes",new_0_6_18_7:"Polish and detail improvements across the app",new_0_6_17_1:"Fixed Codex and Claude Code conversation startup issues",new_0_6_16_1:"Provider settings now preserve custom API modes, cover LongCat correctly, support deleting v12 provider entries, and keep model catalogs in sync with auth and API-key image providers",new_0_6_16_2:"Chat commands gained reload-skills, web title updates, unknown slash passthrough, and a clean session-context API that omits tool calls and tool results",new_0_6_16_3:"Session navigation is steadier with global-agent search results, newest-activity ordering for fresh sessions, restored mobile sidebar controls, and a stable settings footer",new_0_6_16_4:"Files are easier to use with full workspace-name hover text and drag-and-drop uploads across one-on-one and group chat panels",new_0_6_16_5:"Platform settings now include localized Feishu webhook validation fields and cleaner localization coverage",new_0_6_16_6:"Skill discovery now follows symlinked skill directories, so shared local skills appear consistently",new_0_6_16_7:"Large static assets avoid dynamic Brotli compression, improving packaged Web UI delivery under load",new_0_6_16_8:"Outbound relay and MCU login flows are available for connector-style integrations",new_0_6_16_9:"The Web UI CLI adds a --no-open flag for scripts and headless launches",new_0_6_16_10:"Desktop Linux viewport sizing and live compression status rows were polished for cleaner layout",new_0_6_15_1:"Chat sidebars were redesigned and history loading controls were tuned for clearer navigation through long conversations",new_0_6_15_2:"The skill command picker makes it faster to discover and insert available skill commands from chat input",new_0_6_15_3:"Claude and Gemini OAuth providers are available, Gemini model IDs are normalized correctly, and model selectors can refresh config.yaml changes on demand",new_0_6_15_4:"Thinking states received a refreshed indicator and toolbar layout so reasoning progress is easier to read without disrupting the message flow",new_0_6_15_5:"Dark theme input and select borders are visible again across form controls",new_0_6_15_6:"Runtime setup now checks the local runtime before showing download-source choices and keeps the check state visible while startup continues",new_0_6_15_7:"Desktop self-updates no longer block installation on stale app processes, and Windows gateway cleanup is more complete during shutdown",new_0_6_15_8:"Managed gateways are stopped on app shutdown, while unexpectedly exited gateways can still respawn during managed runtime sessions",new_0_6_15_9:"The desktop server now shuts down more gracefully on quit to reduce orphaned backend, bridge, and gateway processes",new_0_6_15_10:"The README and website showcase now use one animated walkthrough GIF, with the website hero using a dedicated static preview image",new_0_6_13_1:"Alibaba Coding Plan now includes the qwen3.7-plus model preset",new_0_6_13_2:"File handling is safer with literal-dot path validation and malformed skill-import filename rejection",new_0_6_13_3:"Chat is more stable on mobile and in browsers without speech synthesis support",new_0_6_13_4:"Agent failures now preserve the bridge error tail, and Claude Code root-permission launches are more reliable",new_0_6_13_5:"Desktop updates are more reliable: Windows upgrades close stale Hermes Studio processes, Cloudflare is checked first, and GitHub remains the fallback feed",new_0_6_13_6:"Release automation now keeps Web UI and Docker releases out of GitHub Latest while full desktop releases are manually promoted to Latest"}},Ar={login:{title:"Hermes Web UI",description:"输入用户名和密码以继续。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",defaultCredentialsHint:"默认登录名:admin,默认密码:123456",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",lockResetHint:"如果这是你的服务器,可以执行以下命令清除登录锁定:",defaultLoginResetHint:"如需重置默认 admin 密码,可以执行:",sessionExpired:"登录已过期,请重新登录",accessDenied:"你没有权限访问该资源",passwordMismatch:"两次密码不一致",passwordTooShort:"密码长度至少 6 个字符",setupSuccess:"密码登录配置成功",passwordChanged:"密码修改成功",passwordRemoved:"密码登录已移除",setupPassword:"设置密码登录",changePassword:"修改密码",changeUsername:"修改用户名",removePasswordLogin:"移除",username:"用户名",currentPassword:"当前密码",newPassword:"新密码",confirmPassword:"确认密码",newUsername:"新用户名",usernameChanged:"用户名修改成功",usernameTooShort:"用户名至少 2 个字符",setupDescription:"管理用于登录的用户名和密码。",removeConfirm:"用户账号必须保留密码登录。",passwordLoginNotConfigured:"密码登录未配置",passwordLoginConfigured:"当前账户:{username}",defaultCredentialTitle:"请修改默认账户和密码",defaultCredentialMessage:"当前登录账户仍在使用默认用户名或默认密码。为了避免未授权访问,请尽快进入当前账户修改用户名和密码。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍后提醒"},users:{title:"账户管理",description:"创建用户、分配角色,并控制普通管理员可访问的配置。",create:"创建用户",edit:"编辑用户",username:"用户名",role:"角色",statusLabel:"状态",profiles:"可访问配置",profilesPlaceholder:"选择可访问的配置",allProfiles:"全部配置",noProfiles:"未关联配置",lastLogin:"最后登录",newPasswordOptional:"新密码(留空不修改)",loadFailed:"用户列表加载失败",deleteConfirm:"确认删除该用户?",enable:"启用",disable:"禁用",roles:{superAdmin:"超级管理员",admin:"普通管理员"},status:{active:"启用",disabled:"禁用"}},common:{loading:"加载中...",cancel:"取消",delete:"删除",retry:"重试",reset:"重置",edit:"编辑",save:"保存",saved:"已保存",saveFailed:"保存失败",deleteFailed:"删除失败",ok:"确定",copied:"已复制",copy:"复制",update:"更新",create:"创建",noData:"暂无数据",expired:"已过期",fetch:"获取",add:"添加",enable:"启用",disable:"禁用",configured:"已配置",notConfigured:"未配置",confirm:"确定",expand:"展开",collapse:"收起",start:"启动",stop:"停止"},mcp:{title:"MCP 服务器",loadFailed:"加载 MCP 服务器失败",reloadAll:"全部重载",refresh:"刷新",total:"总计",connected:"已连接",disconnected:"未连接",tools:"工具",tool:"工具",searchPlaceholder:"搜索服务器...",addServer:"+ 添加服务器",zeroTools:"0 个工具",loading:"加载中...",empty:"暂无 MCP 服务器配置",reloaded:"已重载 {server}",reloadedAll:"所有 MCP 服务器已重载",reloadFailed:"重载失败",serverAdded:'服务器 "{name}" 已添加',addFailed:"添加服务器失败",serverUpdated:'服务器 "{name}" 已更新',updateFailed:"更新服务器失败",saveFailed:"保存失败",serverRemoved:'已移除 "{name}"',enabled:"已启用 {name}",disabled:"已禁用 {name}",connectedStatus:"已连接",disconnectedStatus:"未连接",disabledStatus:"已禁用",toolList:"工具列表",count:"个",more:"更多",removeFailed:"移除服务器失败",testOk:"测试成功 — {count} 个工具可用",testEmpty:"测试未返回工具",testFailed:"测试失败",edit:"编辑",test:"测试",reload:"重载",remove:"移除",confirmRemove:'确认删除服务器 "{name}"?',cancel:"取消",add:"添加",save:"保存",addTitle:"添加 MCP 服务器",editTitle:"编辑 MCP 服务器",invalidJson:"JSON 格式错误",invalidYaml:"YAML 格式错误",invalidConfig:"配置格式错误",invalidServerConfig:"服务器配置无效",missingCommandOrUrl:"必须包含 command 或 url",manageTools:"管理工具",toolsVisibilityTitle:"工具可见性管理",fetchTools:"获取工具列表",fetchToolsFailed:"获取工具列表失败",toolsMode:"模式:",toolsModeAll:"全部",toolsModeInclude:"包含",toolsModeExclude:"排除",toolsListHeader:"工具名称",toolsEmpty:"暂无工具,请先获取工具列表",toolsSummaryAll:"共 {count} 个工具,全部启用",toolsSummaryInclude:"共 {total} 个工具,已选 {count} 个",toolsSummaryExclude:"共 {total} 个工具,已排除 {count} 个",toolsVisibilitySaved:"工具可见性已保存",toolsSelectAll:"全选",toolsClearSelection:"取消全选",toolsExcludeAll:"全部排除",toolsClearExcluded:"清空排除"},sidebar:{chat:"对话",backToChat:"返回",search:"搜索",apiRelay:"饲料",history:"历史",jobs:"任务",kanban:"看板",workflow:"工作流",models:"模型",profiles:"用户",plugins:"插件",mcp:"MCP",petdex:"宠物",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",performance:"性能监控",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",singleChat:"单聊",globalAgent:"全局",groupChat:"群聊",files:"文件",devices:"设备",groupConversation:"对话",groupConversationShort:"对话",groupPlatform:"平台",groupAgent:"助手",groupAgentShort:"助手",groupSystem:"系统",groupSystemShort:"系统",groupMonitoring:"监控",groupMonitoringShort:"监控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"编程工具",versionPreview:"版本预览",settings:"设置",connected:"已连接",disconnected:"未连接",collapse:"收起菜单",expand:"展开菜单",updateTip:'在终端运行 "hermes-web-ui update" 即可更新',updateVersion:"升级版本 v{version}",reloadClientVersion:"刷新到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,请稍后刷新页面,如长时间未启动,请手动启动",updateFailed:"更新失败",logout:"退出登录",nodeVersionWarning:"检测到 Node.js v{version},请升级到23以上版本。",changelog:"更新日志",noChangelog:"暂无更新日志",versionManagement:"版本管理"},runtimeVersions:{title:"版本管理",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"平台",currentWebUi:"当前 Web UI",activeVersion:"当前启用版本",active:"已启用",installed:"已安装",download:"下载",downloadGithub:"GitHub 下载",downloadCf:"Cloudflare 下载",github:"GitHub",cf:"Cloudflare",useVersion:"下次启动使用",deleteVersion:"删除",deleteRuntimeConfirm:"删除 Hermes Runtime {version}?",deleteWebUiConfirm:"删除 Web UI {version}?",deleteRuntimeSuccess:"Runtime 已删除",deleteWebUiSuccess:"Web UI 已删除",refresh:"刷新",noVersions:"暂无可用版本",remoteLoadFailed:"远程版本加载失败",downloadTasks:"下载任务",downloadStarted:"已开始下载",activateSuccess:"版本选择已保存,重启 Hermes Studio 后生效。",jobStatus:{queued:"排队中",running:"下载中",completed:"已完成",failed:"失败"},jobStageStatus:{queued:"排队中",resolve:"解析中",download:"下载中",verify:"校验中",extract:"解压中",install:"安装中",completed:"已完成",failed:"失败"},jobStage:{queued:"排队中",download:"下载中",resolveRuntime:"正在解析 Runtime 包",verifyRuntime:"正在校验 Runtime 压缩包",extractRuntime:"正在解压 Runtime 压缩包",installRuntime:"正在安装 Runtime",resolveWebUi:"正在解析 Web UI 包",verifyWebUi:"正在校验 Web UI 压缩包",extractWebUi:"正在解压 Web UI 压缩包",installWebUi:"正在安装 Web UI",completed:"已完成",failed:"失败"}},devices:{title:"设备",count:"{count} 台设备",lastScanned:"上次扫描:{time}",refresh:"刷新",empty:"暂无设备",computer:"电脑",endpointLabel:"端",statusLabel:"状态",online:"在线",offline:"离线",address:"地址",os:"系统",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延迟",lastSeen:"最后发现",open:"打开",never:"从未",unknown:"未知",loadFailed:"加载设备失败",scanFailed:"扫描设备失败",updateFailed:"更新设备失败",duplicateRequest:"已存在待处理的配对申请",manualPairing:"远程配对",copyPairingLink:"复制配对链接",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"请输入设备链接",manualRequestSent:"配对申请已发送",manualRequestFailed:"远程配对申请失败",pairingLinkCopied:"配对链接已复制",pairingLinkCopyFailed:"复制配对链接失败",pairingCodeTitle:"输入配对码",pairingCodePlaceholder:"配对码",pairingCodeRequired:"请输入配对码",submitPairingRequest:"提交申请",processed:"已处理",unprocessed:"未处理",deleteHistory:"删除记录",deleteHistoryConfirm:"确认删除这条申请记录并撤销该设备连接权限?",requests:"申请列表",requestsWithCount:"申请列表({count})",noRequests:"暂无申请",requestPairing:"申请配对",paired:"已配对",approve:"通过",reject:"拒绝",block:"拉黑",unblock:"解除拉黑",inboundStatus:{none:"允许申请",pending:"待处理",approved:"已通过",rejected:"已拒绝",blocked:"黑名单"},outboundStatus:{none:"未配对",pending:"已申请",approved:"已配对",rejected:"已拒绝",blocked:"被拉黑"},endpoint:{web:"Web 端",desktop:"桌面端",custom:"自定义"}},performance:{title:"性能监控",subtitle:"查看系统资源、Bridge Broker、Workers 和活跃会话",refresh:"刷新",autoRefreshOn:"自动刷新",autoRefreshOff:"手动刷新",loadFailed:"性能数据加载失败",systemCpu:"系统 CPU",systemMemory:"系统内存",activeSessions:"活跃会话",runningSessions:"运行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 总内存",processes:"进程",uptime:"运行",running:"运行中",stopped:"已停止",workerMemory:"Worker 内存",lastUpdated:"更新时间",profile:"Profile",memory:"内存",sessions:"会话",runningActiveSessions:"运行中 / 活跃",lastUsed:"最后使用",status:"状态",noWorkers:"暂无 Worker",sessionsByProfile:"按 Profile 统计会话",noActiveSessions:"暂无活跃会话"},drawer:{terminal:"终端",files:"工作区"},chat:{contextRemaining:"剩余",contextClickToEdit:"点击编辑上下文长度",contextEditTitle:"编辑上下文长度",contextEditDesc:"设置当前模型的上下文长度限制(token 数量)",contextEditPlaceholder:"请输入上下文长度",contextEditHint:"常见值:256k (Hermes 默认), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"取消",contextEditInvalid:"请输入有效的上下文长度",contextEditSuccess:"上下文长度已更新",contextEditFailed:"更新失败",emptyState:"开始与 Hermes Agent 对话",emptyStateAgent:"开始与 {agent} 对话",viewOlderInHistory:"前面的消息请到历史记录查看",scrollToBottom:"滚动到底部",forkedFrom:"Fork 来源",previousLastMessage:"上一段对话的最后一条消息",cliEmptyState:"开始 CLI 对话",outlineTitle:"会话大纲",outlineEmpty:"暂无会话内容",outlineUserQuestion:"用户问题",inputPlaceholder:"输入消息... (Enter 发送,Shift+Enter 换行)",inputHeightResizeHint:"拖拽调整聊天输入框高度,双击恢复自动高度。",slashCommandArgs:{message:"<消息>",title:"<标题>",text:"<文本>"},slashCommands:{usage:"计算当前会话用量",status:"查看会话状态和队列",abort:"停止当前 Bridge 运行",queue:"把消息加入当前运行后的队列",learn:"从描述的来源学习可复用技能",plan:"生成一份 Markdown 实施计划",moa:"用默认组合模型运行一次性提示",goal:"设置一个跨轮次持续推进的目标",goalStatus:"查看当前目标状态",goalPause:"暂停当前目标循环",goalResume:"继续已暂停的目标循环",goalDone:"完成并清除当前目标",goalClear:"清除当前目标",subgoal:"为当前目标追加验收条件",clear:"清空当前显示内容",clearHistory:"删除当前会话已入库的消息历史",title:"重命名当前会话",compress:"空闲时触发上下文压缩",fork:"将当前空闲会话 fork 成一个新的关联对话",steer:"向当前 Bridge 运行发送引导文本",destroy:"释放当前会话的 Bridge Agent",reloadMcp:"重载 MCP 服务器",reloadSkills:"重载技能命令"},attachFiles:"添加附件",reasoningEffort:{tooltip:"推理强度",defaultLabel:"默认",options:{default:"默认 (config.yaml)",none:"无",minimal:"极低",low:"低",medium:"中",high:"高",xhigh:"超高"}},autoPlaySpeech:"自动播放语音",voiceInput:{startCapture:"开始语音输入",stopCaptureAndInsert:"停止语音输入并插入到输入框",cancelCapture:"取消语音输入",statusLabel:"状态:{status}",transcriptLabel:"转写:{text}",errorLabel:"错误:{error}",recentEvents:"最近事件",status:{idle:"空闲",capturing:"正在聆听",transcribing:"正在转写",sending:"正在插入输入框",error:"错误"},browserSpeechUnsupported:"当前浏览器不支持内置语音识别。",browserSpeechFailed:"浏览器语音识别失败。",browserSpeechFailedWithReason:"浏览器语音识别失败:{error}。",microphoneUnsupported:"当前浏览器不支持麦克风录音。",microphoneRecordingFailed:"麦克风录音失败。"},showToolCalls:"显示工具调用",hideToolCalls:"隐藏工具调用",messageQueue:"消息队列",removeQueuedMessage:"移除队列消息",stop:"停止",start:"启动",stopGateway:"停止网关",send:"发送",contextUsed:"上下文已用:",sessions:"会话",webUiSessions:"会话",allProfiles:"全部配置",profileMissingModelsTip:"该会话所属配置「{profile}」没有可用的 provider 或模型",sessionScopeHint:"这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。",openHistory:"打开历史",hermesHistory:"Hermes 历史",historyScopeHint:"这里按来源只读查看当前 profile 的 Hermes 历史会话。",noSessions:"暂无会话",searchTitle:"搜索会话",searchSubtitle:"按标题或消息内容搜索",searchScope:"搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜索会话...",searchEmpty:"最近会话",searchRecent:"最近会话",searchNoResults:"没有匹配的会话",searchNoSnippet:"没有可显示的摘要",searchEnterHint:"Enter 打开 · Esc 关闭",searchFailed:"搜索会话失败",newChat:"新建对话",agent:"Agent",approvalKicker:"终端授权",approvalTitle:"运行前请确认命令",approvalAgree:"同意",approvalAllowOnce:"仅本次允许",approvalAllowSession:"本会话允许",approvalAlways:"始终允许",approvalDeny:"拒绝",clarifyKicker:"Agent 需要确认",clarifyTitle:"Agent 有一个问题需要您回答",clarifyPlaceholder:"输入你的回答...",clarifySubmit:"回复",clarifyDismiss:"忽略",newCliChat:"新建 CLI",deleteSession:"确定删除此会话?",sessionDeleted:"会话已删除",toggleBatchMode:"批量选择",selectAll:"全选",confirmBatchDelete:"确定删除选中的 {count} 个会话?",batchDeleteSuccess:"已删除 {count} 个会话",batchDeletePartial:"{failed} 个会话删除失败",batchDeleteFailed:"批量删除失败",importToWebUi:"导入到 Web UI",importSessionSuccess:"会话已导入 Web UI",importSessionAlreadyExists:"会话已存在于 Web UI",importSessionFailed:"导入会话失败",rename:"重命名",archiveSession:"归档",unarchiveSession:"取消归档",pin:"置顶",unpin:"取消置顶",pinned:"已置顶",chatMode:"聊天",liveMode:"实时",liveSessions:"实时会话",recentBadge:"最近",linkedSessions:"关联 {count} 个会话",noVisibleMessages:"没有人类可见消息。",monitorRoleUser:"用户",monitorRoleAssistant:"助手",copySessionLink:"复制会话链接",openSessionInNewTab:"在新标签页打开",sessionLinkCopied:"Session link copied",copySessionId:"复制会话 ID",export:"导出",exportFull:"全量导出 (JSON)",exportCompressed:"压缩导出 (TXT)",exportCompressing:"正在压缩上下文,请稍候...",exportSuccess:"会话已导出",exportFailed:"导出失败",renamed:"已重命名",renameFailed:"重命名失败",sessionArchived:"会话已归档",archiveSessionFailed:"归档会话失败",sessionUnarchived:"已取消归档",unarchiveSessionFailed:"取消归档失败",renameSession:"重命名会话",sessionNotFound:"会话未找到",enterNewTitle:"输入新标题",workspace:"工作区",setWorkspace:"设置工作区",setWorkspaceTitle:"设置会话工作区",workspacePlaceholder:"输入项目路径,例如 /home/user/project",folderPickerEmpty:"(空)",folderPickerNoFolders:"暂无工作区文件夹",folderPickerSelected:"已选择:",workspaceSet:"工作区已设置",workspaceSetFailed:"设置工作区失败",setModel:"设置模型",setModelTitle:"设置会话模型",modelSet:"模型已设置",modelSetFailed:"设置模型失败",other:"其他",runFailed:"运行失败",error:"错误",tool:"工具",arguments:"参数",result:"结果",workspaceChanges:"工作区变更",changedFiles:"{files} 个文件已更改",diffUnavailable:"无法显示 diff",binaryFileDiffUnavailable:"二进制文件无法显示 diff",truncated:"... (已截断)",unchangedLines:"{count} 行未修改",executionDuration:"执行时长",thinkingLabel:"思考过程",thinkingInProgress:"正在思考",thinkingShow:"展开思考过程",thinkingHide:"收起思考过程",thinkingDuration:"已观察 {duration}",thinkingChars:"{count} 字",copyBubble:"复制消息",copiedBubble:"已复制",copyFailed:"复制失败",playSpeech:"播放语音",pauseSpeech:"暂停",resumeSpeech:"继续",stopSpeech:"停止",speechNotSupported:"此浏览器不支持语音播放"},workflow:{title:"工作流",profile:"配置",namePlaceholder:"工作流名称",workspace:{title:"选择工作区",select:"选择工作区",clear:"清空工作区"},actions:{newWorkflow:"新建工作流",addNode:"添加节点",createWorkflowFirst:"请先创建工作流",reset:"重置",startExecution:"开始执行",executionPending:"工作流执行功能待接入",executionStarted:"工作流已开始执行",executionCompleted:"工作流执行完成",executionFailed:"工作流执行失败",rerunDownstreamKeepNode:"保留此节点消息向下执行",rerunDownstreamClearNode:"清除此节点消息向下运行",rerunDownstreamStarted:"已开始向下重跑",rerunFromNodeStarted:"已开始从此节点重跑",rerunFailed:"工作流重跑失败",deleteNode:"删除节点",deleteEdge:"删除连接线"},batch:{toggle:"批量选择",selectAll:"全选",confirmDelete:"确定删除选中的 {count} 个工作流?",deleteSuccess:"已删除 {count} 个工作流",deletePartial:"{failed} 个工作流删除失败",deleteFailed:"批量删除失败"},validation:{nodesRequired:"请至少添加一个节点",nodeNameRequired:"节点 {node} 需要填写名称",providerRequired:"节点 {node} 需要选择 Provider",modelRequired:"节点 {node} 需要选择模型",apiModeRequired:"节点 {node} 需要选择 API 模式",inputRequired:"节点 {node} 需要填写输入内容",invalidEdge:"连接线引用了不存在的节点",invalidConnectionDirection:"连接线只能从右侧输出连接到左侧输入",orphanNode:"节点 {node} 没有连接到流程",disconnectedFlow:"流程不能拆成多条互不连接的链路",cycle:"流程中存在循环连接,请调整后再保存"},node:{title:"节点名称",agent:"Agent",model:"模型",apiMode:"API 模式",input:"输入",promptPlaceholder:"描述这个 Agent 要做什么...",skillsPlaceholder:"技能,按 Enter 添加",uploadImages:"上传图片"},status:{idle:"空闲",queued:"排队中",running:"运行中",completed:"已完成",failed:"失败",canceled:"已取消"},runs:{title:"执行记录",refresh:"刷新",empty:"暂无执行记录",startNodes:"{count} 个起始节点",show:"显示执行记录",hide:"隐藏执行记录",nodeSessionTitle:"节点会话 - {node}",noNodeSession:"该节点暂无会话记录",loadNodeSessionFailed:"加载节点会话失败",stop:"停止执行",stopRequested:"已请求停止执行",stopFailed:"停止执行失败",delete:"删除记录",deleteSuccess:"执行记录已删除"},inspector:{selected:"选中节点",none:"未选择节点"},stats:{nodes:"节点",edges:"连线"},agents:{planner:"规划",researcher:"研究",builder:"执行",reviewer:"审查"},models:{default:"默认模型",fast:"快速模型",reasoning:"推理模型"},initialNodes:{node1:"节点 1",node2:"节点 2",node3:"节点 3",plan:"规划",execute:"执行",review:"审查"},initialPrompts:{node1:"输入这个节点的内容。",node2:"输入这个节点的内容。",node3:"输入这个节点的内容。",plan:"把需求拆成可执行步骤。",execute:"执行实现步骤并产出结果。",review:"审查产出质量并识别后续工作。"},newNodeTitle:"节点 {count}"},kanban:{title:"看板",createTask:"新建任务",noTasks:"暂无任务",allStatuses:"全部状态",allAssignees:"全部负责人",board:{create:"新建看板",archive:"归档看板",slugPlaceholder:"看板标识,例如 project-a",namePlaceholder:"显示名称(可选)",slugRequired:"看板标识不能为空",created:"看板已创建",archived:"看板已归档",archiveConfirm:"确定归档当前看板?"},columns:{triage:"待分拣",todo:"待办",scheduled:"已调度",ready:"就绪",running:"进行中",blocked:"阻塞",review:"待审查",done:"已完成",archived:"已归档"},form:{title:"标题",titlePlaceholder:"任务标题",titleRequired:"标题不能为空",body:"描述",bodyPlaceholder:"任务描述(可选)",assignee:"负责人",selectAssignee:"选择负责人...",priority:"优先级",selectPriority:"选择优先级...",tenant:"租户",tenantPlaceholder:"租户(可选)",workspace:"工作区",workspaceScratch:"临时工作区",workspaceDir:"使用目录",workspaceWorktree:"使用 worktree",workspacePath:"工作区路径",workspacePathPlaceholder:"绝对路径(可选)",branch:"分支",branchPlaceholder:"Worktree 分支",skills:"技能",skillsPlaceholder:"选择技能...",triage:"创建到分拣状态",goalMode:"目标模式",maxRuntime:"最长运行时间",maxRuntimePlaceholder:"例如 30m、2h",maxRetries:"最大重试次数",maxRetriesPlaceholder:"重试次数",goalMaxTurns:"目标最大轮次",goalMaxTurnsPlaceholder:"最大轮次"},card:{assigneeTooltip:"负责人",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"刚刚",minutes:"{count}分钟前",hours:"{count}小时前",days:"{count}天前"}},detail:{status:"状态",assignee:"负责人",priority:"优先级",tenant:"租户",createdAt:"创建时间",startedAt:"开始时间",completedAt:"完成时间",comments:"评论",events:"事件",runs:"运行记录",result:"完成结果",sessions:"关联会话",sessionMessages:"会话记录",noSessions:"未找到关联会话。",artifacts:"产出文件",sources:"数据来源",highlights:"关键信息",noLog:"未找到该任务的日志。",addComment:"添加评论",commentPlaceholder:"输入任务评论...",operations:"操作"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(可选)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"分配",assignTo:"分配给...",dispatch:"调度",recoveryReason:"恢复原因(可选)",reclaim:"回收",reassign:"重新分配",specify:"细化",loadLog:"加载日志",loadDiagnostics:"加载诊断"},message:{taskCreated:"任务已创建",taskCompleted:"任务已完成",taskBlocked:"任务已阻塞",taskUnblocked:"任务已解除阻塞",taskAssigned:"任务已分配",dispatchNudged:"已触发调度器",commentAdded:"评论已添加",taskReclaimed:"任务已回收",taskReassigned:"任务已重新分配",taskSpecified:"任务已细化",loadFailed:"加载任务失败"},stats:{total:"总计",tasks:"任务数"}},jobs:{title:"定时任务",createJob:"创建任务",editJob:"编辑任务",noJobs:"暂无定时任务,创建一个开始吧。",sortBy:"排序",sortByName:"名称排序",sortByTime:"时间排序",sortByNameHint:"点击按名称排序",sortByTimeHint:"点击按时间排序",sortAsc:"升序",sortDesc:"降序",name:"名称",namePlaceholder:"任务名称",schedule:"调度表达式 (Cron)",schedulePlaceholder:"例如 0 9 * * *",quickPresets:"快速预设",selectPreset:"选择预设...",presetEveryMinute:"每分钟",presetEvery5Min:"每 5 分钟",presetEveryHour:"每小时",presetEveryDay:"每天 00:00",presetEveryDay9:"每天 09:00",presetEveryMonday:"每周一 09:00",presetEveryMonth:"每月 1 日 09:00",prompt:"提示词",promptPlaceholder:"要执行的内容",skills:"技能",skillsPlaceholder:"选择技能...",deliverTarget:"投递目标",origin:"来源",local:"本地",repeatCount:"重复次数(可选)",modelPlaceholder:"Default model",repeatPlaceholder:"留空表示无限重复",jobCreated:"任务已创建",jobUpdated:"任务已更新",nameRequired:"名称为必填项",scheduleRequired:"调度表达式为必填项",loadFailed:"加载任务失败",jobPaused:"任务已暂停",jobResumed:"任务已恢复",jobTriggered:"任务已触发",modelUpdated:"Model updated",jobDeleted:"任务已删除",status:{running:"运行中",paused:"已暂停",disabled:"已禁用",scheduled:"已调度"},info:{model:"Model",schedule:"Schedule",lastRun:"上次运行",nextRun:"下次运行",deliver:"投递",repeat:"重复"},action:{pause:"暂停",pauseJob:"暂停任务",resume:"恢复",resumeJob:"恢复任务",runNow:"立即运行",triggerImmediately:"立即触发"},runHistory:{title:"运行历史",runs:"次运行",noRuns:"暂无运行历史。"}},skills:{title:"技能",targetFilter:"运行时",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"搜索技能...",noMatch:"没有匹配的技能",noSkills:"暂无技能",backTo:"返回",attachedFiles:"附件文件",loadFailed:"加载技能失败",fileLoadFailed:"加载文件失败",modified:"用户已修改",archived:"已归档",pinned:"已置顶",pin:"置顶技能",unpin:"取消置顶",pinFailed:"更改置顶状态失败",edit:"编辑",saving:"保存中...",editorLabel:"技能编辑器",saveSuccess:"技能已保存",saveFailed:"保存技能失败",toggleFailed:"切换技能状态失败",source:{builtin:"内置",hub:"Hub 安装",local:"本地安装",external:"外部目录"},delete:"删除",deleteConfirm:'确定要删除技能 "{name}" 吗?此操作不可撤销。',deleteSuccess:"已删除技能",deleteFailed:"删除失败",import:"导入",importTitle:"导入技能",importModeZip:"Zip 包",importModeFolder:"文件夹",importHintZip:"上传 .zip 包,应包含含 SKILL.md 的目录",importHintFolder:"选择本地技能文件夹(需含 SKILL.md)",importTargetCategory:"目标分类(可选)",importTargetCategoryPlaceholder:"留空则平铺到 misc",importSelectFile:"选择 .zip 文件",importSelectFolder:"选择文件夹",importInvalidFile:"仅支持 .zip 包",importFileCount:"个文件",importNoSelection:"请先选择文件或文件夹",importSuccess:"已导入技能",importFailed:"导入失败",path:{local:"本地",external:"外部"},externalDirs:{manage:"外部目录",title:"外部目录管理",hint:"在此管理 config.skills.external_dirs。支持 ~ 和 $VAR;不存在的路径会被标灰。",add:"添加外部目录",placeholder:"/path/to/skills 或 ~/my-skills",empty:"暂无外部目录",missing:"目录不存在",notDir:"不是目录",saveSuccess:"外部目录已保存",saveFailed:"保存失败",loadFailed:"加载外部目录失败",removeRow:"移除"},pathCopied:"路径已复制",pathCopyFailed:"复制路径失败",reloadHint:"活跃会话请执行 /reload-skills;新会话会自动加载。",writeApprovalButton:"待审核 {count}",writeApprovalTitle:"待审核写入",writeApprovalDescription:"批准或拒绝 Hermes Agent 暂存的记忆和技能写入。",writeApprovalRefresh:"刷新",writeApprovalEmpty:"暂无待审核写入。",writeApprovalUnsupported:"当前 Hermes Agent 版本不支持写入审核。请升级 Hermes Agent 后再使用。",writeApprovalMemory:"记忆",writeApprovalSkills:"技能",writeApprovalViewDiff:"查看",writeApprovalHideDiff:"收起",writeApprovalNoDiff:"没有可显示的差异。",writeApprovalLoadFailed:"待审核写入加载失败",writeApprovalDiffFailed:"写入详情加载失败",writeApprovalActionFailed:"待审核写入处理失败",writeApprovalApproved:"已批准写入",writeApprovalRejected:"已拒绝写入",writeApprovalApprove:"批准",writeApprovalReject:"拒绝",writeApprovalPendingMemoryWrite:"待审核记忆写入",writeApprovalCurrentFile:"当前 {file}",writeApprovalProposedFile:"批准后 {file}",writeApprovalDiffSection:"差异",writeApprovalPatchOldStringMissing:"当前文件 {file} 中没有找到这次补丁的 old_string,批准后的文件内容不会变化。",writeApprovalRequestedOldString:"本次请求匹配的 old_string",writeApprovalCurrentReadFailed:"当前文件 {file} 无法按 UTF-8 文本读取。",writeApprovalDeleteSkill:"这次审批会删除技能 {skill}。",writeApprovalRemoveFile:"这次审批会从技能 {skill} 中移除文件 {file}。"},plugins:{title:"插件",refresh:"刷新",notice:"展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。可在此启用或禁用 standalone 用户插件,新 Hermes 会话生效。",loadFailed:"加载插件失败",updateFailed:"更新插件失败",enableSuccess:"已启用 {name}",disableSuccess:"已禁用 {name}",commandCopied:"命令已复制",searchPlaceholder:"搜索 key、名称、描述、路径...",source:"来源",kind:"类型",statusTitle:"状态",configStatus:"配置:{status}",notAvailable:"无",copyCommand:"复制命令",managedElsewhere:"由其他位置管理",noMatch:"没有匹配当前筛选条件的插件",enabled:"已启用",disabled:"已禁用",summary:{total:"总数",active:"已启用 / 自动",inactive:"未启用",disabled:"已禁用",providerManaged:"Provider 管理"},status:{enabled:"已启用","auto-active":"自动启用",inactive:"未启用",disabled:"已禁用","provider-managed":"Provider 管理"},statusLabel:{enabled:"配置启用","auto-active":"自动启用",inactive:"未启用",disabled:"已禁用","provider-managed":"Provider 管理"},configStatuses:{enabled:"已启用",disabled:"已禁用","not-enabled":"未启用",auto:"自动","provider-managed":"Provider 管理"},table:{plugin:"插件",status:"状态",source:"来源",kind:"类型",capabilities:"能力",path:"路径 / 入口",manage:"管理"},capabilities:{tools:"{count} 个工具",hooks:"{count} 个 hook",env:"{count} 个环境变量"},metadata:{agentRoot:"Agent 根目录",python:"Python",scanCwd:"扫描 cwd",projectPlugins:"项目插件"}},petdex:{title:"Petdex 宠物",subtitle:"浏览 Hermes 桌宠使用的 petdex 公共图库。",refresh:"刷新",adopt:"领取",active:"使用中",adopted:"已领取 {name}",adoptFailed:"领取宠物失败",loadFailed:"加载 petdex 图库失败",searchPlaceholder:"按名称、slug、作者或类型搜索",kindFilter:"类型",spritesheet:"精灵图",submittedBy:"作者 {name}",empty:"没有符合当前筛选的宠物。",showMore:"再显示 {count} 个",summary:{total:"图库总数",visible:"匹配数量",kinds:"类型数",generatedAt:"生成时间"}},memory:{title:"记忆",refresh:"刷新",loadFailed:"加载记忆失败",myNotes:"我的笔记",noNotes:"暂无笔记。",notesPlaceholder:"输入笔记内容...",userProfile:"用户画像",noProfile:"暂无画像。",profilePlaceholder:"输入用户画像...",soul:"灵魂",noSoul:"暂无灵魂配置。",soulPlaceholder:"输入灵魂配置..."},models:{title:"模型",searchPlaceholder:"搜索模型...",noResults:"无结果",noModels:"无模型",addProvider:"添加 Provider",refreshModelCache:"刷新模型缓存",refreshModelCacheLoading:"正在刷新模型缓存...",refreshModelCacheSuccess:"模型缓存已刷新",refreshModelCacheFailed:"刷新模型缓存失败",providerType:"Provider 类型",preset:"预设",custom:"自定义",selectProvider:"选择 Provider",chooseProvider:"选择一个 provider...",getApiKey:"获取 API Key",name:"名称",autoGeneratedName:"根据 Base URL 自动生成",baseUrl:"Base URL",region:"区域",regionIntl:"国际版",regionCn:"中国大陆",baseUrlPlaceholder:"例如 https://api.example.com/v1",apiKey:"API Key",apiKeyPlaceholder:"sk-...",defaultModel:"默认模型",selectOrInput:"选择或输入模型名称...",selectModel:"选择模型...",providerAdded:"Provider 已添加",providerDeleted:"Provider 已删除",providerCredentialsCleared:"Provider 凭据已清除",clearProviderCredentials:"清除凭据",clearCredentialsConfirm:'确定清除 "{name}" 的已保存凭据吗?这是内置 Provider,条目会继续显示,重新配置凭据后仍可使用。',disableProvider:"禁用 Provider",disableProviderConfirm:'确定禁用内置 Provider "{name}" 吗?该 Provider 仍是内置项,之后可以重新启用。',providerDisabled:"Provider 已禁用",defaultProviderUpdated:"默认 Provider 已更新",defaultProviderUpdateFailed:"更新默认 Provider 失败",defaultModelUpdated:"默认模型已更新",defaultModelUpdateFailed:"更新默认模型失败",deleteProvider:"删除 Provider",deleteConfirm:'确定删除 "{name}" 吗?',codexLoginTitle:"OpenAI Codex 登录",codexWaiting:"在授权页面输入以下代码完成登录:",codexCopyCode:"代码已复制",codexOpenLink:"打开授权页面",codexApproved:"登录成功",codexExpired:"授权已过期,请重试。",nousLoginTitle:"Nous Portal 登录",nousWaiting:"在授权页面输入此代码完成登录:",nousCopyCode:"代码已复制",nousOpenLink:"打开授权页面",nousApproved:"登录成功",nousDenied:"授权被拒绝,请重试。",nousExpired:"授权已过期,请重试。",copilotLoginTitle:"GitHub Copilot 登录",copilotWaiting:"请前往 GitHub 输入下方设备代码完成授权。授权完成后窗口会自动关闭。",copilotCopyCode:"代码已复制",copilotOpenLink:"打开 GitHub 授权页",copilotApproved:"登录成功!",copilotDenied:"授权被拒绝。",copilotExpired:"授权链接已过期,请重试。",copilotAddDetectedTitle:"检测到 GitHub Copilot",copilotAddDetected:"已在本机检测到 GitHub Copilot OAuth 凭证,点击「添加」即可在 Hermes 中启用 Copilot。",copilotAddSourceEnv:"来源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"来源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"来源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作会清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影响其他工具。",copilotDeleteHintGhCli:"Copilot 将从 Hermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。",copilotDeleteHintAppsJson:"Copilot 将从 Hermes 列表移除。不会影响 VS Code Copilot 插件的登录。",xaiLoginTitle:"xAI Grok OAuth 登录",xaiWaiting:"请在打开的 xAI 页面完成授权。授权完成后窗口会自动关闭。",xaiOpenLink:"打开 xAI 授权页",xaiCopyLink:"复制授权链接",xaiApproved:"登录成功!",xaiExpired:"授权链接已过期,请重试。",anthropicLoginTitle:"Claude 授权登录",anthropicWaiting:"请在 Claude 授权页完成授权,然后把返回的授权代码粘贴到这里。",anthropicOpenLink:"打开 Claude 授权页",anthropicCopyLink:"复制授权链接",anthropicCodePlaceholder:"粘贴授权代码...",anthropicSubmitCode:"提交代码",anthropicApproved:"登录成功!",anthropicExpired:"授权已过期,请重试。",geminiLoginTitle:"Google Gemini OAuth 登录",geminiWaiting:"请在打开的 Google 页面完成授权。授权完成后窗口会自动关闭。",geminiOpenLink:"打开 Google 授权页",geminiCopyLink:"复制授权链接",geminiApproved:"登录成功!",geminiExpired:"授权链接已过期,请重试。",customBadge:"自定义",previewBadge:"预览",disabledBadge:"不可用",disabledTooltip:"此模型当前账号不可用",customModelPlaceholder:"未列出的模型 ID",customModelHint:"仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。",removeCustomModel:"移除这个未列出的模型",refresh:"刷新模型列表(重新加载 config.yaml)",noProviders:"暂无 Provider,添加一个开始吧。",models:"模型列表",count:"个模型",more:"个更多",aliasEdit:"重命名",aliasTitle:"模型显示名",aliasTitleFor:"{model} 的显示名",aliasPlaceholder:"留空则使用原始模型 ID",aliasHint:"仅修改 Web UI 显示名,发送给 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢复原始 ID",aliasManage:"显示名",aliasManageFor:"{provider} 的显示名",aliasSaveFailed:"保存显示名失败",manageVisibleModels:"管理可见模型",manageVisibleModelsFor:"管理 {name} 可见模型",visibilityHint:"仅影响 Web UI 的模型选择器和模型页展示,不会改写 Hermes CLI 的 provider/model 配置。实际调用仍使用原始模型 ID。",visibilitySelectOne:"至少保留一个可见模型",visibilitySaved:"可见模型已保存",visibilitySaveFailed:"保存可见模型失败",showAllModels:"显示全部模型",clearVisibleModels:"取消全选",generalTitle:"通用模型",auxiliaryTitle:"辅助模型",auxiliarySubtitle:"为压缩、视觉、审批、MCP 和后台维护等辅助任务单独指定模型。",combinationTitle:"组合模型",combinationSubtitle:"配置 MoA 预设:多个参考模型先给出视角,再由一个汇总模型负责最终回复和工具调用。",combinationPreset:"预设",combinationName:"名称",combinationAddModel:"添加组合模型",combinationEditModel:"编辑组合模型",combinationNewPreset:"新预设",combinationPresetPlaceholder:"例如 review",combinationAddPreset:"添加预设",combinationSetDefault:"设为默认",combinationEnabled:"启用参考模型",combinationReferenceModels:"参考模型",combinationReferenceModel:"参考模型",combinationAddReference:"添加参考模型",combinationAggregator:"汇总模型",combinationReferenceTemperature:"参考温度",combinationAggregatorTemperature:"汇总温度",combinationMaxTokens:"最大 Token",combinationNotSet:"未设置",combinationSaved:"组合模型已保存",combinationLoadFailed:"加载组合模型失败",combinationSaveFailed:"保存组合模型失败",combinationPresetExists:"预设已存在",combinationNameRequired:"请输入组合模型名称",combinationNameInvalid:"名称只能包含字母、数字、下划线、短横线和点",combinationReferenceRequired:"至少添加一个参考模型",combinationAggregatorRequired:"请选择汇总模型",auxiliaryRefresh:"刷新",auxiliaryTask:"任务",auxiliaryTimeout:"超时",auxiliaryDownloadTimeout:"下载超时",auxiliaryActions:"操作",auxiliaryDefault:"默认",auxiliaryCustomEndpoint:"自定义端点",auxiliaryProviderAuto:"自动",auxiliaryProviderMain:"主模型",auxiliaryProviderPlaceholder:"auto、main 或 provider key",auxiliaryDownloadShort:"下载",auxiliaryExtraBody:"Extra body JSON",auxiliaryClear:"清除",auxiliarySaved:"辅助模型已保存",auxiliaryLoadFailed:"加载辅助模型失败",auxiliarySaveFailed:"保存辅助模型失败",auxiliaryInvalidExtraBody:"Extra body 必须是 JSON 对象",auxiliaryTaskCompression:"压缩",auxiliaryTaskVision:"视觉",auxiliaryTaskWebExtract:"网页提取",auxiliaryTaskSkillsHub:"技能中心",auxiliaryTaskApproval:"审批",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"标题生成",auxiliaryTaskTriageSpecifier:"Triage 扩写",auxiliaryTaskKanbanDecomposer:"看板拆解",auxiliaryTaskProfileDescriber:"Profile 描述",auxiliaryTaskCurator:"策展",auxiliaryTaskSessionSearch:"会话搜索",auxiliaryTaskFlushMemories:"写入记忆",currentDefault:"当前默认",defaultShort:"默认",setDefaultProvider:"设为默认 Provider",setDefault:"设为默认",builtIn:"内置",customType:"自定义",provider:"Provider",contextLength:"上下文长度",contextLengthPlaceholder:"例如 256000(可选)",apiMode:"API 模式",local:"本地 ({host})",selectProviderRequired:"请选择 Provider",baseUrlRequired:"Base URL 为必填项",apiKeyRequired:"API Key 为必填项",modelRequired:"默认模型为必填项",enterBaseUrl:"请先输入 Base URL",unexpectedFormat:"响应格式异常",foundModels:"找到 {count} 个模型",fetchFailed:"获取模型失败"},profiles:{title:"配置",create:"创建配置",import:"导入",export:"导出",rename:"重命名",delete:"删除",editConfig:"编辑配置文件",switchTo:"切换 Hermes Profile",switchConfirm:"将执行 `hermes profile use {name}` 并切换 Hermes CLI 的 active profile,是否继续?",switchSuccess:'Hermes active profile 已切换为 "{name}"',switchFailed:"切换 Hermes Profile 失败,网关可能需要手动重启",createSuccess:'配置 "{name}" 已创建',createFailed:"创建配置失败",renameSuccess:"配置已重命名",renameFailed:"重命名配置失败",deleteConfirm:'确定删除配置 "{name}" 吗?',deleteSuccess:"配置已删除",deleteFailed:"删除配置失败",exportSuccess:"配置已导出",exportFailed:"导出配置失败",importSuccess:"配置已导入",importFailed:"导入配置失败",importSelectFile:"选择归档文件",importInvalidFile:"请选择有效的归档文件 (.tar.gz, .tgz, .gz, .zip)",name:"配置名称",namePlaceholder:"仅限小写字母、数字、连字符",nameValidation:"配置名称只能包含小写字母、数字、下划线和连字符",newName:"新名称",newNamePlaceholder:"小写字母、数字、连字符",cloneFromCurrent:"从当前配置克隆",cloneCleanupNotice:"克隆时会自动跳过独占型平台凭据(Weixin / Telegram / Slack 等),避免与源配置冲突",cloneStrippedCredentials:"已清理 {count} 项独占凭据:{list}",cloneDisabledPlatforms:"已禁用 {count} 个平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 项内嵌凭据:{list}",archivePath:"归档路径",archivePathPlaceholder:"归档文件的服务器路径",importName:"配置名称(可选)",importNamePlaceholder:"留空则使用归档名称",active:"活跃",model:"模型",gateway:"网关",alias:"别名",provider:"Provider",path:"路径",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"暂无配置,创建一个开始吧。",avatar:{title:"自定义头像",customize:"头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},runtime:{activeProfile:"当前:{name}",bridgeWorker:"桥接状态",gateway:"网关",active:"活跃",activeTag:"当前",idle:"空闲",checking:"检测中",running:"运行中",stopped:"已停止",restartGateway:"重启网关",restartProfile:"重启配置",switchProfile:"切换前端配置",gatewayRestarted:"网关已重启:{name}",gatewayRestartFailed:"重启网关失败",profileRestarted:"配置已重启:{name}",profileRestartFailed:"重启配置失败"}},logs:{title:"日志",all:"全部",searchPlaceholder:"搜索...",refresh:"刷新",noEntries:"暂无日志"},settings:{title:"设置",saved:"已保存",saveFailed:"保存失败",tabs:{display:"显示",account:"当前账户",users:"账户管理",agent:"网关",proxy:"代理",memory:"记忆",compression:"上下文压缩",session:"会话",privacy:"隐私",apiServer:"API 服务器",models:"模型",voice:"语音"},models:{apiKey:"API Key",apiKeyPlaceholder:"输入 API Key",save:"保存",saved:"已保存",saveFailed:"保存失败",noProviders:"暂无已配置的模型"},display:{streaming:"流式响应",streamingHint:"实时显示 AI 回复",compact:"紧凑模式",compactHint:"减少消息间距",showReasoning:"显示推理过程",showReasoningHint:"展示模型思考过程",showCost:"显示费用",showCostHint:"在回复中显示 token 使用量",inlineDiffs:"内联差异",inlineDiffsHint:"代码变更以内联方式显示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回复完成时播放提示音",notifyOnComplete:"完成弹窗通知",notifyOnCompleteHint:"AI 回复完成时显示系统通知",notifyOnCompleteMacHint:"macOS 需要在系统设置里允许浏览器通知。",notifyOnCompleteDenied:"通知权限已被拒绝",notifyOnCompleteInsecure:"浏览器通知需要 HTTPS 或 localhost",notifyOnCompleteUnsupported:"当前浏览器不支持通知",notifyOnCompleteTest:"通知已开启。",notifyOnCompleteTestButton:"测试",notifyOnCompleteTesting:"正在发送测试通知...",notifyOnCompleteTestSent:"测试通知已发送",notifyOnCompleteTestFailed:"测试通知发送失败",busyInputMode:"忙碌输入模式",busyInputModeHint:"AI 处理中仍可输入",theme:"主题",themeHint:"选择浅色、暗色或跟随系统",themeLight:"浅色",themeDark:"暗色",themeSystem:"跟随系统",chatInputHeight:"聊天输入框高度",chatInputHeightHint:"桌面端聊天输入框默认高度(像素)。移动端保持自动高度。"},agent:{maxTurns:"最大轮次",maxTurnsHint:"单次对话最大交互轮数",gatewayTimeout:"网关超时",gatewayTimeoutHint:"单次请求超时时间(秒)",restartDrainTimeout:"重启排空超时",restartDrainTimeoutHint:"重启前排空请求的超时时间(秒)",toolEnforcement:"工具执行策略",toolEnforcementHint:"控制工具调用的执行模式",auto:"自动",always:"始终",never:"从不"},gatewayAutoStart:{title:"Gateway 自动启动",description:"控制 Web UI 启动时自动拉起哪些本地 Hermes profile gateway。该项写入 Web UI 配置,不写入 profile config.yaml。",enabled:"自动启动 gateway",enabledHint:"关闭后,启动期不会自动拉起任何 profile gateway。",management:"统一 gateway",managementHint:"需要 Hermes Agent 0.17.0 及以上版本。开启后会写入 multiplex_profiles,让 default gateway 服务所有 profiles;其他 profile 不能单独配置飞书、微信、QQBot 等通讯工具入口。关闭后会移除该配置。",managementAuto:"自动",managementPerProfile:"每个 profile 一个 gateway",managementUnified:"统一 default gateway",mode:"Profile 策略",modeHint:"启动所有发现到的 profiles,或只启动白名单内的 profiles。",modeAll:"所有发现到的 profiles",modeInclude:"仅白名单 profiles",include:"白名单 profiles",includeHint:"逗号分隔 profile 名。白名单模式下留空表示不自动启动任何 profile。",exclude:"排除 profiles",excludeHint:"逗号分隔 profile 名;会在白名单/全量策略之后再排除。",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway 代理",description:"为当前 profile gateway 设置代理环境变量。保存后会重启 gateway,让通讯平台使用新的网络配置。",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"HTTPS 请求代理,通常优先配置这一项。",httpProxy:"HTTP_PROXY",httpProxyHint:"普通 HTTP 请求代理。",allProxy:"ALL_PROXY",allProxyHint:"未设置协议专用代理时使用的兜底代理。",noProxy:"NO_PROXY",noProxyHint:"不走代理的主机或域名,使用逗号分隔。",save:"保存代理设置"},memory:{enabled:"启用记忆",enabledHint:"允许 AI 记住对话上下文",userProfile:"用户画像",userProfileHint:"允许 AI 记住用户偏好信息",charLimit:"记忆字符上限",charLimitHint:"MEMORY.md 最大字符数",userCharLimit:"用户画像字符上限",userCharLimitHint:"USER.md 最大字符数"},compression:{enabled:"启用压缩",enabledHint:"长对话接近模型上下文上限前自动压缩历史",threshold:"压缩阈值",thresholdHint:"预计 token 超过上下文比例时开始压缩",targetRatio:"目标比例",targetRatioHint:"压缩后历史保留到上下文的目标比例",protectLastN:"保护最近消息",protectLastNHint:"最近多少条消息不参与压缩",protectFirstN:"保护开头消息",protectFirstNHint:"最早多少条消息不参与压缩"},session:{mode:"重置模式",modeHint:"会话重置的触发条件",modeBoth:"空闲 + 定时",modeIdle:"仅空闲",modeDaily:"仅定时",modeNone:"永不(仅手动)",idleMinutes:"空闲超时",idleMinutesHint:"无操作后自动重置的等待时间(分钟)",atHour:"定时重置时间",humanOnly:"仅显示人类会话",humanOnlyHint:"默认隐藏子代理和会话监看噪音",liveMonitorHumanOnly:"实时监看:仅显示人类会话",liveMonitorHumanOnlyHint:"在实时监看中默认隐藏子代理和会话监看噪音",atHourHint:"每天在指定小时重置会话",requireAuth:"会话授权",requireAuthHint:"修改会话操作是否授权",memoryWriteApproval:"记忆写入审核",memoryWriteApprovalHint:"Hermes Agent 写入 MEMORY.md / USER.md 前先进入待审核队列。",skillsWriteApproval:"技能写入审核",skillsWriteApprovalHint:"Hermes Agent 创建或修改技能前先进入待审核队列。",writeApprovalTitle:"待审核写入",writeApprovalDescription:"批准或拒绝 Hermes Agent 暂存的记忆和技能写入。",writeApprovalRefresh:"刷新",writeApprovalEmpty:"暂无待审核写入。",writeApprovalMemory:"记忆",writeApprovalSkills:"技能",writeApprovalViewDiff:"查看",writeApprovalHideDiff:"收起",writeApprovalNoDiff:"没有可显示的差异。",writeApprovalLoadFailed:"待审核写入加载失败",writeApprovalDiffFailed:"写入详情加载失败",writeApprovalActionFailed:"待审核写入处理失败",writeApprovalApproved:"已批准写入",writeApprovalRejected:"已拒绝写入",writeApprovalApprove:"批准",writeApprovalReject:"拒绝",writeApprovalPendingMemoryWrite:"待审核记忆写入",writeApprovalCurrentFile:"当前 {file}",writeApprovalProposedFile:"批准后 {file}",writeApprovalDiffSection:"差异",writeApprovalPatchOldStringMissing:"当前文件 {file} 中没有找到这次补丁的 old_string,批准后的文件内容不会变化。",writeApprovalRequestedOldString:"本次请求匹配的 old_string",writeApprovalCurrentReadFailed:"当前文件 {file} 无法按 UTF-8 文本读取。",writeApprovalDeleteSkill:"这次审批会删除技能 {skill}。",writeApprovalRemoveFile:"这次审批会从技能 {skill} 中移除文件 {file}。"},privacy:{redactPii:"脱敏 PII",redactPiiHint:"自动检测并隐藏敏感信息(密码、密钥等)"},apiServer:{enable:"启用",enableHint:"启用 API 服务器",host:"主机",hostHint:"监听地址",port:"端口",portHint:"监听端口",key:"密钥",keyHint:"API 访问密钥",cors:"CORS 来源",corsHint:"允许的跨域来源"},lockedIps:{title:"锁定 IP 管理",count:"{count} 个 IP 被锁定",empty:"暂无锁定 IP",unlock:"解锁",unlockAll:"全部解锁",unlockAllConfirm:"确认解锁所有锁定的 IP?",unlocked:"IP 已解锁",allUnlocked:"已解锁 {count} 个 IP",type:{password:"密码",token:"API Token",pairing:"设备配对"}},userAvatar:{title:"用户头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB,会自动压缩到 500KB 以下",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},voice:{activeTtsApi:"当前 TTS API",activeSttApi:"当前 STT API",ttsProvidersTitle:"TTS 提供方",ttsProvidersDescription:"管理用于播放助手回复和语音预览的文字转语音集成。",sttProvidersTitle:"STT 提供方",sttProvidersDescription:"管理用于麦克风和语音输入流程的语音转文字集成。",noneSelected:"未选择",keyStored:"已存储",keyMissing:"未配置",customApi:"API",localBuiltin:"本地内置",ttsCardHint:"语音合成提供方",sttCardHint:"语音转写提供方",setActive:"设为当前",testAction:"测试",connect:"连接",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Microsoft Edge 提供的免费高质量云端音色。",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"自定义 TTS",presetBrowserSttLabel:"浏览器 STT",presetBrowserSttDescription:"浏览器原生语音识别 API。",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"自定义 STT",apiCompatibility:"API 兼容性",openaiCompatible:"OpenAI 兼容",manualCustomEndpoint:"手动自定义端点",connectionStep:"连接",discoveryManualHint:"已选择手动自定义端点,无法自动发现模型;请手动输入模型名称。",discoveryCredentialHint:"输入 Base URL 和 API key 后,点击连接获取可用模型。",discoveryNoAutoProbeHint:"输入过程中不会发送请求;凭据准备好后点击连接。",apiKeyConnectPlaceholder:"粘贴 API key 后连接;已存储的 key 不会显示",connectFetchModels:"连接并获取模型",modelRecommendedSuffix:"推荐",modelConnectManualHint:"连接后自动填充,或手动输入。",modelRequiredConnectManual:"模型必填。请连接后自动填充,或手动输入。",apiKeyRequired:"API key 必填。",apiKeyRequiredForDiscovery:"获取模型需要 API key。",baseUrlRequired:"Base URL 必填。",baseUrlHttpsRequired:"请使用 http:// 或 https:// 协议。",baseUrlInvalid:"请输入有效的 Base URL,包含 https://。",discoveryFailedManualFallback:"无法获取模型。你仍可以手动输入模型名称。",completeRequiredProviderFields:"保存前请补全必填 provider 字段。",fetchingModels:"正在获取模型……",recommendedModel:"推荐:{model}。",useRecommendedModel:"使用此模型。",modelsDiscovered:"已发现 {count} 个模型。字段为空时会自动选择推荐模型。",remove:"移除",testSuccess:"测试完成",testTextRequired:"测试前请输入文本。",keyMissingForTest:"测试此提供方前请先添加 API key。",testing:"测试中……",transcribing:"转写中……",browserSttTestHint:"浏览器 STT 请在聊天输入框麦克风中测试。",sttEmptyAudio:"未录到音频,请重试。",sttTestSuccess:"转写完成",sttRecordingHint:"正在录音……点击停止后转写。",keepStoredKeyPlaceholder:"留空则保留已存储 key",apiKeyPlaceholder:"输入 API key",lastTest:"最近测试",notTested:"—",recording:"录音中",testFailedShort:"失败",testFailedSummary:"测试失败,请检查 provider 设置后重试。",showDetails:"显示详情",hideDetails:"隐藏详情",moreActions:"更多",moreActionsFor:"{provider} 的更多操作",addTtsApi:"添加 TTS API",addSttApi:"添加 STT API",active:"当前",builtin:"内置",connected:"已连接",disconnected:"未连接",source:"来源",model:"模型",voice:"音色",doubaoVoiceHint:"选择 Seed TTS 2.0 音色;资源字段会自动更新。",apiKey:"API key",confirmDeleteSecret:"确认删除这个语音 API 已存储的 API key?",ttsTitle:"文字转语音",ttsSaved:"TTS 设置已保存到服务端",ttsSaveFailed:"保存 TTS 设置失败",ttsTestSaved:"试听成功,TTS 设置已保存到服务端",ttsTestSaving:"正在保存 TTS 配置后再试听…",ttsMissingBaseUrl:"试听前需要填写基础 URL。请输入服务商 endpoint 后再测试。",ttsMissingApiKey:"试听前需要 API key。请粘贴 key,或先保存服务端已存 key。",ttsCleared:"已清除服务端 TTS 密钥",ttsClearFailed:"清除服务端 TTS 密钥失败",storedBaseUrlsTitle:"已存 Base URLs",storedBaseUrlsHint:"这里集中管理已保存的语音 provider endpoint。上方输入框只清除当前值,删除已存 URL 在这里操作。",storedBaseUrlsEmpty:"服务端还没有保存自定义语音 Base URL。",storedBaseUrlDelete:"删除 URL",storedApiKeysTitle:"已存 API keys",storedApiKeysHint:"这里列出服务端已保存的语音 API key,只显示用途和来源,不显示完整 key。",storedApiKeysEmpty:"服务端还没有保存语音 API key。",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[已存储]",storedApiKeyDelete:"删除 key",baseUrlPresetClear:"清除 URL",baseUrlPresetCleared:"已清除当前 Base URL。",baseUrlPresetDelete:"删除 URL",baseUrlPresetDeleted:"已从保存列表删除基础 URL。",baseUrlPresetDeleteFailed:"删除已保存基础 URL 失败。",ttsPendingSecret:"将保存新密钥",ttsStoredSecret:"服务端已有储密钥:{value}",ttsClearKey:"清除已存储密钥",sttTitle:"语音转文字",sttProvider:"STT 提供方",sttProviderHint:"选择语音输入的转写方式",sttProviderBrowser:"浏览器",sttProviderOpenai:"OpenAI 兼容",sttProviderCustom:"自定义",sttBrowserHint:"可用时使用浏览器内置语音识别。",sttApiKey:"API Key",sttApiKeyHint:"仅在服务端保存,用于需要鉴权的 STT 提供方。",sttStoredSecret:"服务端已存储密钥:{value}",sttPendingSecret:"服务端已存储密钥:保存后更新",sttClearKey:"清除已存储密钥",sttModel:"模型",sttModelHint:"用于语音转文字的模型。",sttLanguage:"语言",sttLanguageHint:"可选语言提示,例如 en 或 zh。",sttPrompt:"提示词",sttPromptHint:"可选转写提示词。",sttAudioTranscode:"音频转码",sttAudioTranscodeNone:"发送原始音频",sttAudioTranscodeFfmpeg:"使用 ffmpeg 转为 WAV",sttBaseUrl:"基础 URL",sttBaseUrlHint:"自定义 OpenAI 兼容语音转文字端点。",sttSave:"保存 STT 设置",sttSaved:"STT 设置已保存到服务端。",sttSaveFailed:"保存 STT 设置失败。",sttCleared:"服务端已存储的 STT 密钥已清除。",sttClearFailed:"清除服务端已存储的 STT 密钥失败。",sttActiveSaved:"当前 STT 提供方已保存到服务端。",sttSaveActive:"保存当前 STT 提供方",sttEndpointHint:"最终转写 endpoint:{endpoint}",sttTestTitle:"测试语音转文字",sttTestButton:"测试 STT API",sttTestStopButton:"停止并转写",sttTestBackendOnly:"STT API 测试仅适用于 OpenAI 兼容和自定义提供方。",sttTestRecording:"正在录制测试音频……录完后点击停止并转写。",sttTestTranscribing:"正在转写测试音频……",sttTestEmpty:"没有录到可用于 STT 测试的音频。",sttTestSucceeded:"STT 测试成功。",sttTestFailed:"STT 测试失败:{error} —— {hint}",sttFailureHintMissingConfig:"请确认已保存 provider 的 Base URL、模型和 API key 后再测试。",sttFailureHintAuth:"请检查 API key;如果页面显示已储存 key,请重新粘贴当前 key 并保存后再测。",sttFailureHintForbidden:"key 已到达供应商但没有该 STT 模型/账号权限,请检查 provider 权限、额度或 billing。",sttFailureHintEndpointModel:"请检查 Base URL 和模型。Groq 建议使用 {endpoint},模型用 whisper-large-v3-turbo 或其他 Groq STT 模型。",sttFailureHintModel:"请检查所选 STT 模型是否存在,并且当前账号有权限使用。",sttFailureHintQuota:"供应商返回额度、billing 或限流问题,请检查账号额度/billing,或稍后重试。",sttFailureHintNetworkCustom:"Web UI server 无法访问 custom STT endpoint。请确认 {endpoint} 可从服务器访问,并兼容 OpenAI audio/transcriptions。",sttFailureHintNetwork:"Web UI server 无法访问 STT provider,请检查网络、代理或防火墙后重试。",sttFailureHintAudio:"录音为空或音频格式被拒绝。请允许麦克风权限,录一段清晰短句,或换 Chrome 重试。",sttFailureHintGenericCustom:"请检查 API key、Base URL、模型,以及最终 endpoint {endpoint}。",sttFailureHintGeneric:"请检查 API key、模型和 provider 账号权限后重试。",sttTestRecordFailed:"无法开始麦克风录音:{error}",sttTestTranscript:"转写结果:{text}",ttsProvider:"TTS 提供者",ttsProviderHint:"选择消息朗读使用的语音引擎",providerWebSpeech:"WebSpeech API(浏览器内置)",providerOpenai:"OpenAI TTS",providerCustom:"自定义端点(兼容 OpenAI)",providerEdge:"Edge TTS(免费,无需 API Key)",webspeechVoice:"音色",webspeechVoiceHint:"从浏览器或系统提供的语音中选择",webspeechVoicePlaceholder:"自动(默认语音)",openaiKey:"API 密钥",openaiKeyHint:"具有 TTS 权限的 OpenAI API Key",openaiUrl:"API 基础地址",openaiUrlHint:"例如 https://api.openai.com/v1/audio/speech",openaiModel:"模型",openaiModelHint:"tts-1(快速)/ tts-1-hd(高音质)",openaiVoice:"音色",openaiVoiceHint:"用于语音合成的音色",customHint:"支持任何 OpenAI 兼容的 TTS 服务——可用于 GPT-SoVITS、CosyVoice 等自部署服务。",customUrl:"API 地址",customUrlHint:"TTS 服务的完整基础地址",customUrlPlaceholder:"本地适配器中配置的地址 如:http://127.0.0.1:9880",customApiKey:"API 密钥(可选)",customApiKeyHint:"部分自部署服务需要身份验证",customApiKeyPlaceholder:"不需要则留空",edgeHint:"由 Microsoft Edge TTS 驱动(node-edge-tts)。",edgeUrl:"适配器地址",edgeUrlHint:"Edge TTS 适配器地址,例如 http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"音色",edgeVoiceHint:"选择用于语音合成的音色",edgeRate:"语速",edgeRateHint:"调整语音速度(0.5~2.0 倍)",edgePitch:"音调",edgePitchHint:"调整语音音调(-20~+20 Hz)",testTitle:"试听测试",testText:"测试文本",testTextPlaceholder:"输入测试文本...",testTextDefault:"你好,这是一个语音测试。",testButton:"试听",testButtonPlaying:"播放中...",testFailed:"测试失败:{error}",providerMimo:"MiMo TTS",mimoHint:"小米 MiMo TTS,支持预置音色、音色设计、音色复刻三种模式",mimoApiKey:"API Key",mimoApiKeyHint:"在 platform.xiaomimimo.com 获取",mimoApiKeyPlaceholder:"MiMo API Key",mimoAuthMode:"认证方式",mimoAuthModeHint:"所选 MiMo 端点要求的鉴权请求头格式",mimoAuthModeBearer:"Bearer Token(Authorization)",mimoAuthModeApiKey:"API Key 请求头(api-key)",mimoAuthModeBoth:"同时发送两种请求头",mimoBaseUrl:"Base URL",mimoBaseUrlHint:"MiMo API 端点地址",mimoModel:"模型",mimoModelHint:"选择语音合成模型",mimoModelPreset:"预置音色",mimoModelVoiceDesign:"音色设计",mimoModelVoiceClone:"音色复刻",mimoVoice:"音色",mimoVoiceHint:"选择预置音色",mimoVoiceDesignPrompt:"音色描述",mimoVoiceDesignPromptHint:"描述你想要的音色特征",mimoVoiceDesignPromptPlaceholder:"例如:温柔的年轻女声,语速稍慢,带着磁性",mimoCloneAudio:"上传音频",mimoCloneAudioHint:"上传音频样本用于音色复刻,支持 mp3/wav,最大 10MB",mimoCloneAudioUpload:"选择文件",mimoCloneAudioClear:"清除音频",mimoStylePrompt:"风格指令",mimoStylePromptHint:"可选,用自然语言描述语音风格",mimoStylePromptPlaceholder:"例如:用轻快上扬的语调,语速稍快"}},githubPreview:{title:"版本预览",description:"将选中的 GitHub tag 克隆到 Web UI 预览工作目录,安装依赖并以开发端口运行。",refresh:"刷新",selectTag:"选择 tag",prepare:"准备代码",install:"安装依赖",start:"开启预览",stop:"停止",note:"预览代码存放在 Web UI 数据目录下。正式环境仍使用 8648,预览开发环境使用前端 8651、后端 8650。",path:"预览路径",webuiHome:"预览数据目录",currentTag:"当前 Tag",repoReady:"仓库就绪",dependencies:"依赖已安装",running:"运行状态",notRunning:"未运行",open:"打开预览",log:"操作日志路径",logOutput:"日志输出",actionLog:"操作日志",devLog:"开发服务日志",yes:"是",no:"否",actionFailed:"操作失败",nodeEnvironmentMissing:"未检测到可用的 Node/npm 环境,请先安装 Node.js 后重试。",prepareSuccess:"预览代码已准备好",installSuccess:"依赖安装完成",startSuccess:"预览已完成",stopSuccess:"预览已停止"},codingAgents:{title:"编程工具",notice:"并非所有提供商和模型都兼容。",claudeDescription:"Anthropic CLI,适合 print mode 单次任务和交互式编程会话。",codexDescription:"OpenAI CLI,以及 Hermes openai-codex provider 的仓库任务流程。",copyCommand:"复制",commandCopied:"命令已复制",commandCopyFailed:"复制失败",refresh:"刷新",checking:"检测中",installStatus:"安装情况",installed:"已安装",notInstalled:"未安装",installRequired:"{agent} 未安装,请先安装后再创建会话。",installNow:"一键安装",installing:"安装中",installSuccess:"安装完成",installFailed:"安装失败",installFailedHermesHint:"安装失败,请让 Hermes 帮你安装。",installFailureReason:"错误原因",nodeEnvironmentMissing:"未检测到可用的 Node/npm 环境,请先安装 Node.js 后重试。",deleteNow:"删除",deleting:"删除中",deleteSuccess:"删除完成",deleteFailed:"删除失败",configFiles:"配置文件",profileScope:"配置",providerScope:"提供商",providerPlaceholder:"例如 custom:glm",modelScope:"模型",modelPlaceholder:"选择模型",launchModeScope:"启动方式",launchModeGlobal:"全局默认配置",launchModeScoped:"选择提供商和模型",protocolScope:"协议",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"重新读取配置",configFileNotCreated:"未创建",configLoadFailed:"读取配置文件失败",loadFailed:"检测编程工具失败",launch:"启动",launchTitle:"启动编程工具",nativeTerminal:"原生终端",builtInTerminal:"内置终端",launchPrepared:"启动配置已生成",launchPrepareFailed:"生成启动配置失败",nativeLaunchStarted:"已打开原生终端",nativeLaunchFailed:"打开原生终端失败",terminalTitle:"编程工具终端",loadProvidersFailed:"读取当前配置的提供商失败",selectProviderModel:"请选择提供商和模型",launchConfigDir:"启动配置目录",launchCommand:"启动命令",table:{tool:"工具",kind:"步骤",command:"命令",note:"说明",action:"操作"},kinds:{install:"安装",auth:"认证",health:"检查",run:"运行"},notes:{claudeInstall:"全局安装 Claude Code CLI。",codexInstall:"全局安装 Codex CLI。",claudeAuth:"检查 Claude Code 登录状态;未登录时先运行 claude。",codexAuth:"添加 Hermes 管理的 OpenAI Codex OAuth 凭证。",claudeHealth:"检查自动更新器和本地 CLI 健康状态。",codexHealth:"确认 Codex CLI 已在 PATH 中可用。",claudeRun:"Print mode 最适合 API 驱动的单次任务。",codexRun:"Codex 单次任务需要在 git 仓库中运行。"}},platform:{requireMention:"需要 {'@'}提及",requireMentionGroup:"群组中需要 {'@'}机器人 才会响应",requireMentionChannel:"频道中需要 {'@'}机器人 才会响应",requireMentionRoom:"房间中需要 {'@'}机器人 才会响应",reactions:"表情回应",reactionsHint:"对消息添加表情回应",freeResponseChats:"自由响应聊天",freeResponseChatsHint:"不需要 {'@'}提及即响应的聊天 ID(逗号分隔)",freeResponseChannels:"自由响应频道",freeResponseChannelsHint:"不需要 {'@'}提及即响应的频道 ID(逗号分隔)",freeResponseRooms:"自由响应房间",freeResponseRoomsHint:"不需要 {'@'}提及即响应的房间 ID(逗号分隔)",mentionPatterns:"自定义提及模式",mentionPatternsHint:"额外的触发模式列表",autoThread:"自动创建线程",autoThreadHint:"{'@'}提及 后自动创建回复线程",autoThreadHintRoom:"在房间中自动创建回复线程",dmMentionThreads:"DM 提及线程",dmMentionThreadsHint:"在私聊中也使用线程回复提及",allowBots:"允许机器人消息",allowBotsHint:"响应其他机器人发送的消息",allowedChannels:"允许的频道",allowedChannelsHint:"白名单频道 ID(逗号分隔)",ignoredChannels:"忽略的频道",ignoredChannelsHint:"不响应的频道 ID(逗号分隔)",noThreadChannels:"无线程频道",noThreadChannelsHint:"不创建线程的频道 ID(逗号分隔)",exclusiveTokenWarning:"此平台使用独占 token 锁。每个 profile 必须使用不同的身份 token,否则会与其他 profile 冲突导致 gateway 启动失败。",botToken:"Bot Token",botTokenHint:"开发者门户获取的 Bot Token",proxyUrl:"代理 URL",proxyUrlHint:"可选的平台专用代理,支持 http://、https:// 和 socks5://",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 服务器地址",matrixUserId:"Matrix 用户 ID",matrixUserIdHint:"密码登录必填;Access Token 登录可选",matrixPassword:"Matrix 密码",matrixPasswordHint:"可替代 Access Token 的登录密码",appId:"App ID",appIdHint:"飞书 App ID",appSecret:"App Secret",appSecretHint:"飞书 App Secret",encryptKey:"加密密钥",encryptKeyHint:"飞书加密密钥",verificationToken:"验证令牌",verificationTokenHint:"飞书验证令牌",clientId:"Client ID",clientIdHint:"钉钉 Client ID",clientSecret:"Client Secret",clientSecretHint:"钉钉 Client Secret",cardTemplateId:"AI 卡片模板 ID",cardTemplateIdHint:"钉钉 AI 卡片模板 ID;留空则不启用 AI 卡片",allowedUsers:"允许用户",allowedUsersHint:"用户 ID 或 OpenID 白名单,多个用英文逗号分隔",allowAllUsers:"允许所有用户",allowAllUsersHint:"允许任意用户发起消息;关闭后使用白名单",botId:"Bot ID",botIdHint:"企业微信 Bot ID",wecomSecretHint:"企业微信 Bot Secret",waEnabled:"启用 WhatsApp",waEnabledHint:"通过二维码配对启用 WhatsApp",weixinToken:"微信 Token",weixinTokenHint:"通过 weixin CLI 扫码登录获取 (hermes weixin)",accountId:"Account ID",accountIdHint:"微信 Account ID",qrLogin:"扫码登录",qrRelogin:"重新登录",qrFetching:"正在获取二维码...",qrScanHint:"使用微信扫描二维码登录",qrScanedHint:"已扫描,请在手机上确认...",qqAppId:"App ID",qqAppIdHint:"QQ 开放平台机器人 App ID",qqAppSecret:"App Secret",qqAppSecretHint:"QQ 开放平台机器人 App Secret",qqMarkdown:"Markdown 支持",qqMarkdownHint:"启用 Markdown 格式消息(部分客户端可能不支持)",qqSandbox:"沙箱模式",qqSandboxHint:"启用沙箱环境(测试用)",qqQrScanHint:"使用 QQ 扫描上方二维码,或在手机上打开链接完成绑定"},gateways:{title:"网关",running:"运行中",stopped:"已停止",started:"已启动",startFailed:"启动失败",stopFailed:"停止失败"},language:{label:"语言",zh:"中文",en:"English"},terminal:{sessions:"会话",newTab:"新建终端",closeSession:"关闭此会话?",sessionExited:"已退出",processExited:"进程已退出,代码 {code}",noSessions:"暂无终端会话",connectionFailed:"终端服务连接失败",connectionClosed:"终端连接已关闭",connectionError:"终端连接错误"},groupChat:{title:"群聊",createRoom:"创建房间",joinByCode:"通过邀请码加入",roomName:"房间名称",roomNamePlaceholder:"输入房间名称",inviteCode:"邀请码",autoGenerate:"自动生成",noRooms:"暂无房间",selectOrCreate:"选择或创建一个房间开始聊天",agents:"智能体",addAgent:"添加智能体",selectProfile:"选择一个配置",agentAdded:"智能体已添加",selectRoomFirst:"请先选择一个群组",agentAlreadyInRoom:"该智能体已在房间中",agentAddFailedCount:"{count} 个智能体未添加:{details}",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",copyRoomLink:"复制房间链接",deleteRoomConfirm:"确定删除这个房间吗?",clearContext:"清理上下文",clearContextConfirm:"确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房间",joinFailed:"加入房间失败",inputPlaceholder:"输入消息... (Enter 发送)",messageDisplayLimit:"群聊最多展示 600 条消息",enterCode:"输入邀请码",yourName:"你的名称",yourNamePlaceholder:"输入你的群聊昵称",yourDescription:"自我描述(选填)",yourDescriptionPlaceholder:"介绍一下你自己...",agentName:"Agent 名称",agentNamePlaceholder:"自定义名称(留空则使用 profile 名称)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述这个 agent 的作用...",agentReplying:"正在回复...",agentCompressing:"正在压缩上下文...",compressionSettings:"压缩设置",triggerTokens:"触发压缩 Token 数",triggerTokensDesc:"消息 token 数超过此值时触发上下文压缩",maxHistoryTokens:"最大历史 Token 数",maxHistoryTokensDesc:"压缩后发送给 LLM 的最大 token 数",tailMessageCount:"保留最近消息数",tailMessageCountDesc:"压缩后保留最近的原始消息条数",compressionConfig:"压缩配置",compressionSaved:"压缩配置已保存",compressNow:"立即压缩",compressingInProgress:"正在压缩中,请稍后"},usage:{title:"用量统计",refresh:"刷新",totalTokens:"总 Token 数",inputTokens:"输入",outputTokens:"输出",totalSessions:"总会话数",avgPerDay:"日均 ~{n}",estimatedCost:"预估费用",cacheHitRate:"缓存命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"缓存",cacheRead:"缓存读取",cacheWrite:"缓存写入",sessions:"会话",cost:"费用",noData:"暂无用量数据"},skillsUsage:{title:"技能用量",subtitle:"跟踪 Hermes 会话中的技能加载和编辑",refresh:"刷新",periodSelector:"技能用量周期",periodLabel:"{days}天",summary:"概览",totalActions:"操作",loads:"加载",edits:"编辑",distinctSkills:"技能数",topSkills:"热门",dailyTrend:"趋势",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暂无技能用量数据",loadFailed:"技能用量加载失败",otherSkills:"其他技能"},files:{title:"文件",fileTree:"文件树",tree:"目录树",list:"文件列表",breadcrumbRoot:"根目录",newFile:"新建文件",newFolder:"新建文件夹",upload:"上传",refresh:"刷新",open:"打开",edit:"编辑",preview:"预览",download:"下载",copyPath:"复制路径",rename:"重命名",delete:"删除",name:"名称",size:"大小",modified:"修改时间",actions:"操作",emptyDir:"空目录",loading:"加载中...",confirmDelete:"确定要删除「{name}」吗?",confirmDeleteDir:"确定要删除目录「{name}」及其所有内容吗?",deleteFailed:"删除失败",deleted:"已删除",renameTo:"重命名为",newFileName:"文件名",newFolderName:"文件夹名",created:"已创建",createFailed:"创建失败",renamed:"已重命名",renameFailed:"重命名失败",uploadSuccess:"已上传 {count} 个文件",uploadFailed:"上传失败",saveFailed:"保存失败",saved:"已保存",unsavedChanges:"有未保存的更改,是否丢弃?",pathCopied:"路径已复制",fileTooLarge:"文件过大(最大 10MB)",permissionDenied:"无法修改受保护的文件",notFound:"文件或目录不存在",backendError:"文件操作失败",dragDropHint:"拖拽文件到此处上传",closeEditor:"关闭编辑器",closePreview:"关闭",saveFile:"保存"},download:{downloading:"正在下载...",downloadFailed:"下载失败",fileNotFound:"文件不存在或已被删除",fileTooLarge:"文件过大(超过限制)",backendError:"文件读取失败,远程环境可能不可用",backendTimeout:"文件读取超时",unsupportedBackend:"当前 terminal backend 暂不支持文件下载",invalidPath:"无效的文件路径",contentDisplay:"内容展示",download:"下载",downloadFile:"下载文件"},changelog:{new_0_6_25_1:"修复 Hermes Agent 0.18.0 下 execute_code 因 Agent Bridge 审批记忆 wrapper 未转发新的 has_host_access 参数而失败的问题",new_0_6_24_1:"本版本汇总 0.6.23 之后合并的 PR,重点改进聊天输入区、工作区可见性、插件管理、默认模型和工作区 diff 查看体验",new_0_6_24_2:"单聊和群聊输入区更新为整合式工具栏,模型选择更紧凑,输入设置集中管理,上下文用量更清晰,移动端样式更稳,并恢复单聊输入框手动拖拽高度",new_0_6_24_3:"工作区运行变更会以持久的聊天 diff 卡片展示,右侧抽屉支持查看 diff 和编辑文件,恢复会话后仍能保留,并优化了移动端查看体验",new_0_6_24_4:"工作区目录选择器更可靠地支持 Windows 磁盘和 junction 场景,并会显示 .hermes、.config、.codex 等点前缀目录,同时保留 WORKSPACE_BASE 安全边界",new_0_6_24_5:"Plugins 页面支持启用或禁用可管理的用户插件,并能更准确地合并显示 Hermes 基础配置和当前 profile 的插件状态",new_0_6_24_6:"Models 页面新增设置默认 provider 和默认模型操作;bridge 终端错误识别减少误报,Hermes Agent runtime 打包升级到 0.18.0,官网版本清单也已刷新",new_0_6_23_1:"本次版本整理 0.6.22 之后合并的 PR,重点更新桌面端升级流程、MCP 进程清理、Petdex 宠物、MCU 语音体验和多处设置入口",new_0_6_23_2:"桌面端自更新恢复为阻塞式流程,并加强 Windows 更新前的服务关闭;退出桌面端时会更完整地停止 gateway、profile MCP 和相关子进程",new_0_6_23_3:"桌面端 MCP 注入和 Coding Agent MCP 启动路径更稳定,Windows workspace 支持磁盘选择器,并修复符号链接目录展示与桌面 Petdex 预览问题",new_0_6_23_4:"新增 Petdex 宠物体验:支持 Web 宠物、桌面独立宠物窗口、领养后即时显示、右上角关闭按钮和更合适的桌面初始尺寸",new_0_6_23_5:"MCU 与全局语音体验升级:增加音频提示与 OTA 防护,支持分段流式 TTS,自动清理链接、代码块和表格等不适合朗读的内容,并能在中断时停止未完成的语音生成",new_0_6_23_6:"设置与工作流细节继续完善:新增 profile 配置编辑、聊天输入框高度设置、登录 JWT 有效期配置、Skill 编辑、History 本地归档状态保留,并优化新聊天抽屉和内置 Provider 危险操作文案",new_0_6_22_1:"本次版本整理 0.6.21 之后合并的 PR,重点更新组合模型、会话历史、代理设置、斜杠命令和移动端布局细节",new_0_6_22_2:"模型页面新增组合模型面板,聊天中可以展示真实的 MoA reference 与 aggregator 进度,不再依赖旧的前端占位工具",new_0_6_22_3:"聊天会话支持从会话列表归档,并可在历史记录中恢复;本地-only 的 Claude Code 和 Codex 会话也会正确出现在历史记录中",new_0_6_22_4:"设置页新增代理标签页,可配置 gateway 全局 HTTP(S)、ALL_PROXY 和 NO_PROXY,并支持 Telegram、Discord、Matrix 的平台代理",new_0_6_22_5:"Hermes 聊天新增 /learn 命令,Agent Bridge 运行会使用所选 workspace 作为 cwd;由于 Hermes Agent 最新版本尚未发布,只有桌面端的 /learn 和 MoA 指令能力需要等新版 Hermes Agent 发布后可用",new_0_6_21_1:"本次版本重点覆盖工作流重跑、MCP 工作流工具、语音配置删除、Matrix 登录配置、更新清理和文档维护",new_0_6_21_2:"工作流节点消息改为左侧可拖拽宽度的完整单聊抽屉,移动端执行记录可正常打开,并支持保留当前节点输出或清除当前节点后向下重跑",new_0_6_21_3:"Hermes Studio MCP 的 use 工具集新增工作流操作:列表、详情、创建、更新、删除、运行、停止、删除执行记录,以及从指定节点重跑",new_0_6_21_4:"语音 provider 移除现在会删除当前 profile 的 provider 配置,而不是只清空 API key;Browser STT 和 Edge TTS 仍作为内置默认项不可删除",new_0_6_21_5:"Matrix 平台设置支持 user ID 加 password 的登录配置,并在使用密码登录时正确判断已配置状态",new_0_6_21_6:"Web UI restart、update 和应用内升级默认会停止 Agent Bridge broker,避免新版本复用旧 Python bridge 进程",new_0_6_21_7:"单聊、群聊和工作流顶部栏对齐更一致;小方盒页面改为售罄状态;BSL 授权范围更清晰;补充 /learn 接入规划,并移除废弃 Hermes proxy 代码",new_0_6_20_1:"工作流正式上线:可以创建 Agent 节点、连成流程图,并直接在工作流页面执行完整流程",new_0_6_20_2:"工作流执行会保存执行记录、流程图快照、节点会话、实时节点状态和失败原因,并支持停止与删除执行记录",new_0_6_20_3:"工作流查看与编辑更完整:支持执行历史、只读快照、节点聊天记录查看、更大的连接点,以及未创建工作流时的添加节点提示",new_0_6_20_4:"桌面端启动时改为让 agent-browser 根据 AGENT_BROWSER_HOME 解析 Chrome,不再固定旧的可执行文件路径,并补齐补丁完整性与浏览器 stdout 修复",new_0_6_20_5:"支持浏览器 runtime 的桌面平台统一固定 Chrome for Testing 149.0.7827.55,避免 runtime 浏览器版本回退问题",new_0_6_20_6:"ESP32 和小方盒细节优化:更新教程链接,调整浅色背景下的小方盒徽标,并修复 Windows 上流动效果不显示的问题",new_0_6_19_1:"本次版本包含 0.6.18 之后合并的 16 个 PR,重点改进前端可见的设备、语音、Coding Agent 和设置体验",new_0_6_19_2:"Coding Agent 支持在会话中切换模型,新建会话也会正确跟随全局默认模型",new_0_6_19_3:"MCU 交互更稳定:修复开机 Wi-Fi/boot 状态闪动、音频只发送到目标设备,并优化实体按键双击清空与打断体验",new_0_6_19_4:"TTS 配置改为按 profile 保存,音速、音调和测试语音会读取同一套配置来源",new_0_6_19_5:"Coding Agent 的模型切换不会影响既有会话,并修复自定义 provider key 透传",new_0_6_19_6:"补齐 skills runtime 过滤、定时任务排序、技能详情高度限制、Windows 更新恢复、配置备份兜底和 logo 资源压缩",new_0_6_18_2:"Hermes Studio MCP 拆分为 api、devices 和 use 工具集,新增 session、model、chat-run 与 ops 相关操作",new_0_6_18_3:"聊天和群聊历史更可靠:UI 历史与模型上下文分离,空消息处理更安全,run failed 不再覆盖已有助手回复,reasoning 回放也更一致",new_0_6_18_4:"MCU 设备反馈更清楚:工具调用会优先显示在语音之上,音频不会过早标记任务完成,活跃设备登录更稳定,ONLINE/IP 长文本支持滚动",new_0_6_18_5:"语音和消息工作流新增自定义 HTTP TTS/STT 端点、音频转码、fork 消息操作、持久化 fork 标记,以及更清晰的上传错误",new_0_6_18_6:"桌面与 runtime 设置更安全:Windows PATH 注册支持 Unicode,支持发布 Hermes Agent 0.17.0 runtime,并补齐移动端 PWA 元数据和多项 profile/auth 恢复修复",new_0_6_18_7:"各项细节的优化",new_0_6_17_1:"修复 Codex 和 Claude Code 的对话启动问题",new_0_6_16_1:"Provider 设置会正确保存自定义 API mode,补齐 LongCat 预设,支持删除 v12 Provider,并让模型目录同步认证和 API-key 图像 Provider",new_0_6_16_2:"聊天命令新增 reload-skills、网页标题更新、未知斜杠命令透传,以及去掉 tool call 和 tool result 的干净 session context 接口",new_0_6_16_3:"会话导航更稳定:搜索包含 Global Agent 会话,新会话按最新活动时间排序,移动端侧栏控制恢复,底部设置入口也保持稳定",new_0_6_16_4:"文件体验更顺手:workspace 全名可悬停查看,单聊和群聊都支持把文件拖到整个聊天区域上传",new_0_6_16_5:"平台设置补齐飞书 Webhook 校验字段,并完善对应国际化覆盖",new_0_6_16_6:"技能发现支持 symlink 目录,共享的本地 skills 现在能稳定显示",new_0_6_16_7:"大型静态资源不再走动态 Brotli 压缩,打包 Web UI 在高负载下交付更稳",new_0_6_16_8:"新增 outbound relay 和 MCU 登录流程,方便连接器类集成接入",new_0_6_16_9:"Web UI CLI 新增 --no-open 参数,更适合脚本和无头启动场景",new_0_6_16_10:"Linux 桌面视口尺寸和实时压缩状态行完成布局打磨,界面更稳定",new_0_6_15_1:"聊天侧栏完成重设计,并优化历史加载控制,长对话里的导航更清晰",new_0_6_15_2:"新增技能命令选择器,可以更快发现并从输入框插入可用的 skill 命令",new_0_6_15_3:"新增 Claude 和 Gemini OAuth Provider,修正 Gemini 模型 ID 规范化,并支持在模型选择器里手动刷新 config.yaml 变更",new_0_6_15_4:"Thinking 状态更新了指示器和工具栏布局,reasoning 进度更容易阅读,也不会打断消息流",new_0_6_15_5:"深色主题下 input 和 select 等表单控件的边框恢复可见",new_0_6_15_6:"Runtime 启动流程会先检查本地 runtime,再展示下载源选择,并在启动继续时保持检查状态可见",new_0_6_15_7:"桌面端自更新不再被残留应用进程阻塞,Windows 退出时的 gateway 清理也更完整",new_0_6_15_8:"应用退出时会停止托管的 gateways;在托管运行期间,异常退出的 gateway 仍会自动拉起",new_0_6_15_9:"桌面端退出时会更平滑地关闭 server,减少 backend、bridge 和 gateway 孤儿进程残留",new_0_6_15_10:"README 和官网展示改为一张动图 walkthrough,官网顶部 Hero 使用单独的静态预览图",new_0_6_13_1:"Alibaba Coding Plan 新增 qwen3.7-plus 模型预设",new_0_6_13_2:"文件处理更安全:路径校验支持字面量点号,并拒绝异常编码的技能导入文件名",new_0_6_13_3:"聊天在移动端和不支持 speech synthesis 的浏览器中更稳定",new_0_6_13_4:"Agent 失败时会保留 bridge 错误尾部信息,Claude Code root 权限启动也更可靠",new_0_6_13_5:"桌面更新更可靠:Windows 升级会关闭残留 Hermes Studio 进程,优先检查 Cloudflare,并保留 GitHub 更新源兜底",new_0_6_13_6:"发布自动化调整:Web UI 和 Docker release 不再标记为 GitHub Latest,完整桌面 release 手动构建成功后才提升为 Latest"}},kr={login:{title:"Hermes Web UI",description:"輸入使用者名稱和密碼以繼續。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",defaultCredentialsHint:"預設登入名:admin,預設密碼:123456",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",lockResetHint:"如果這是你的伺服器,可以執行以下命令清除登入鎖定:",defaultLoginResetHint:"如需重置預設 admin 密碼,可以執行:",sessionExpired:"登入已過期,請重新登入",accessDenied:"你沒有權限存取此資源",passwordMismatch:"兩次密碼不一致",passwordTooShort:"密碼長度至少 6 個字元",setupSuccess:"密碼登入設定成功",passwordChanged:"密碼修改成功",passwordRemoved:"密碼登入已移除",setupPassword:"設定密碼登入",changePassword:"修改密碼",changeUsername:"修改使用者名稱",removePasswordLogin:"移除",username:"使用者名稱",currentPassword:"目前密碼",newPassword:"新密碼",confirmPassword:"確認密碼",newUsername:"新使用者名稱",usernameChanged:"使用者名稱修改成功",usernameTooShort:"使用者名稱至少 2 個字元",setupDescription:"管理用於登入的使用者名稱和密碼。",removeConfirm:"使用者帳號必須保留密碼登入。",passwordLoginNotConfigured:"密碼登入未設定",passwordLoginConfigured:"目前帳號:{username}",defaultCredentialTitle:"請修改預設帳號和密碼",defaultCredentialMessage:"目前登入帳號仍在使用預設使用者名稱或預設密碼。為避免未授權存取,請盡快進入目前帳號修改使用者名稱和密碼。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍後提醒"},users:{title:"帳號管理",description:"建立使用者、分配角色,並控制一般管理員可存取的設定檔。",create:"建立使用者",edit:"編輯使用者",username:"使用者名稱",role:"角色",statusLabel:"狀態",profiles:"可存取設定檔",profilesPlaceholder:"選擇可存取的設定檔",allProfiles:"全部設定檔",noProfiles:"未關聯設定檔",lastLogin:"最後登入",newPasswordOptional:"新密碼(留空不修改)",loadFailed:"使用者列表載入失敗",deleteConfirm:"確認刪除此使用者?",enable:"啟用",disable:"停用",roles:{superAdmin:"超級管理員",admin:"一般管理員"},status:{active:"啟用",disabled:"停用"}},common:{loading:"載入中...",cancel:"取消",delete:"刪除",retry:"重試",reset:"重置",edit:"編輯",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",deleteFailed:"刪除失敗",ok:"確定",copied:"已複製",copy:"複製",update:"更新",create:"建立",noData:"目前無資料",expired:"已過期",fetch:"取得",add:"新增",enable:"啟用",disable:"停用",configured:"已設定",notConfigured:"未設定",confirm:"確定",expand:"展開",collapse:"收起",start:"啟動",stop:"停止"},mcp:{title:"MCP 伺服器",loadFailed:"載入 MCP 伺服器失敗",reloadAll:"全部重載",refresh:"重新整理",total:"總計",connected:"已連線",disconnected:"未連線",tools:"工具",tool:"工具",searchPlaceholder:"搜尋伺服器...",addServer:"+ 新增伺服器",zeroTools:"0 個工具",loading:"載入中...",empty:"暫無 MCP 伺服器設定",reloaded:"已重載 {server}",reloadedAll:"所有 MCP 伺服器已重載",reloadFailed:"重載失敗",serverAdded:'伺服器 "{name}" 已新增',addFailed:"新增伺服器失敗",serverUpdated:'伺服器 "{name}" 已更新',updateFailed:"更新伺服器失敗",saveFailed:"儲存失敗",serverRemoved:'已移除 "{name}"',enabled:"已啟用 {name}",disabled:"已禁用 {name}",connectedStatus:"已連線",disconnectedStatus:"未連線",disabledStatus:"已停用",toolList:"工具列表",count:"個",more:"更多",removeFailed:"移除伺服器失敗",testOk:"測試成功 — {count} 個工具可用",testEmpty:"測試未回傳工具",testFailed:"測試失敗",edit:"編輯",test:"測試",reload:"重載",remove:"移除",confirmRemove:'確認刪除伺服器 "{name}"?',cancel:"取消",add:"新增",save:"儲存",addTitle:"新增 MCP 伺服器",editTitle:"編輯 MCP 伺服器",invalidJson:"JSON 格式錯誤",invalidYaml:"YAML 格式錯誤",invalidConfig:"配置格式錯誤",invalidServerConfig:"伺服器配置無效",missingCommandOrUrl:"必須包含 command 或 url",manageTools:"管理工具",toolsVisibilityTitle:"工具可見性管理",fetchTools:"獲取工具列表",fetchToolsFailed:"獲取工具列表失敗",toolsMode:"模式:",toolsModeAll:"全部",toolsModeInclude:"包含",toolsModeExclude:"排除",toolsListHeader:"工具名稱",toolsEmpty:"暫無工具,請先獲取工具列表",toolsSummaryAll:"共 {count} 個工具,全部啟用",toolsSummaryInclude:"共 {total} 個工具,已選 {count} 個",toolsSummaryExclude:"共 {total} 個工具,已排除 {count} 個",toolsVisibilitySaved:"工具可見性已儲存",toolsSelectAll:"全選",toolsClearSelection:"取消全選",toolsExcludeAll:"全部排除",toolsClearExcluded:"清空排除"},sidebar:{chat:"對話",backToChat:"返回",search:"搜尋",apiRelay:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",workflow:"工作流",models:"模型",profiles:"使用者",plugins:"插件",mcp:"MCP",petdex:"寵物",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",performance:"效能監控",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",singleChat:"單聊",globalAgent:"全局",groupChat:"群聊",files:"檔案",devices:"裝置",groupConversation:"對話",groupConversationShort:"對話",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系統",groupSystemShort:"系統",groupMonitoring:"監控",groupMonitoringShort:"監控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"編程工具",versionPreview:"版本預覽",settings:"設定",connected:"已連線",disconnected:"未連線",collapse:"收起選單",expand:"展開選單",updateTip:'在終端機執行 "hermes-web-ui update" 即可更新',updateVersion:"升級版本 v{version}",reloadClientVersion:"重新整理到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,請稍後重新整理頁面,如長時間未啟動,請手動啟動",updateFailed:"更新失敗",logout:"登出",nodeVersionWarning:"偵測到 Node.js v{version},請升級至 23 以上版本。",changelog:"更新日誌",noChangelog:"目前無更新日誌",versionManagement:"版本管理"},runtimeVersions:{title:"版本管理",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"平台",currentWebUi:"目前 Web UI",activeVersion:"目前啟用版本",active:"已啟用",installed:"已安裝",download:"下載",downloadGithub:"GitHub 下載",downloadCf:"Cloudflare 下載",github:"GitHub",cf:"Cloudflare",useVersion:"下次啟動使用",deleteVersion:"刪除",deleteRuntimeConfirm:"刪除 Hermes Runtime {version}?",deleteWebUiConfirm:"刪除 Web UI {version}?",deleteRuntimeSuccess:"Runtime 已刪除",deleteWebUiSuccess:"Web UI 已刪除",refresh:"重新整理",noVersions:"暫無可用版本",remoteLoadFailed:"遠端版本載入失敗",downloadTasks:"下載任務",downloadStarted:"已開始下載",activateSuccess:"版本選擇已儲存,重啟 Hermes Studio 後生效。",jobStatus:{queued:"排隊中",running:"下載中",completed:"已完成",failed:"失敗"},jobStageStatus:{queued:"排隊中",resolve:"解析中",download:"下載中",verify:"校驗中",extract:"解壓中",install:"安裝中",completed:"已完成",failed:"失敗"},jobStage:{queued:"排隊中",download:"下載中",resolveRuntime:"正在解析 Runtime 包",verifyRuntime:"正在校驗 Runtime 壓縮包",extractRuntime:"正在解壓 Runtime 壓縮包",installRuntime:"正在安裝 Runtime",resolveWebUi:"正在解析 Web UI 包",verifyWebUi:"正在校驗 Web UI 壓縮包",extractWebUi:"正在解壓 Web UI 壓縮包",installWebUi:"正在安裝 Web UI",completed:"已完成",failed:"失敗"}},devices:{title:"裝置",count:"{count} 台裝置",lastScanned:"上次掃描:{time}",refresh:"重新整理",empty:"暫無裝置",computer:"電腦",endpointLabel:"端",statusLabel:"狀態",online:"線上",offline:"離線",address:"位址",os:"系統",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延遲",lastSeen:"最後發現",open:"開啟",never:"從未",unknown:"未知",loadFailed:"載入裝置失敗",scanFailed:"掃描裝置失敗",updateFailed:"更新裝置失敗",duplicateRequest:"已存在待處理的配對申請",manualPairing:"遠端配對",copyPairingLink:"複製配對連結",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"請輸入裝置連結",manualRequestSent:"配對申請已送出",manualRequestFailed:"遠端配對申請失敗",pairingLinkCopied:"配對連結已複製",pairingLinkCopyFailed:"複製配對連結失敗",pairingCodeTitle:"輸入配對碼",pairingCodePlaceholder:"配對碼",pairingCodeRequired:"請輸入配對碼",submitPairingRequest:"提交申請",processed:"已處理",unprocessed:"未處理",deleteHistory:"刪除記錄",deleteHistoryConfirm:"確認刪除這條申請記錄並撤銷該裝置連線權限?",requests:"申請列表",requestsWithCount:"申請列表({count})",noRequests:"暫無申請",requestPairing:"申請配對",paired:"已配對",approve:"通過",reject:"拒絕",block:"拉黑",unblock:"解除拉黑",inboundStatus:{none:"允許申請",pending:"待處理",approved:"已通過",rejected:"已拒絕",blocked:"黑名單"},outboundStatus:{none:"未配對",pending:"已申請",approved:"已配對",rejected:"已拒絕",blocked:"被拉黑"},endpoint:{web:"Web 端",desktop:"桌面端",custom:"自訂"}},performance:{title:"效能監控",subtitle:"查看系統資源、Bridge Broker、Workers 和活躍會話",refresh:"重新整理",autoRefreshOn:"自動重新整理",autoRefreshOff:"手動重新整理",loadFailed:"效能資料載入失敗",systemCpu:"系統 CPU",systemMemory:"系統記憶體",activeSessions:"活躍會話",runningSessions:"執行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 總記憶體",processes:"程序",uptime:"執行",running:"執行中",stopped:"已停止",workerMemory:"Worker 記憶體",lastUpdated:"更新時間",profile:"Profile",memory:"記憶體",sessions:"會話",runningActiveSessions:"執行中 / 活躍",lastUsed:"最後使用",status:"狀態",noWorkers:"暫無 Worker",sessionsByProfile:"按 Profile 統計會話",noActiveSessions:"暫無活躍會話"},drawer:{terminal:"終端機",files:"工作區"},chat:{contextRemaining:"剩餘",contextClickToEdit:"點擊編輯上下文長度",contextEditTitle:"編輯上下文長度",contextEditDesc:"設定目前模型的上下文長度限制(token 數量)",contextEditPlaceholder:"請輸入上下文長度",contextEditHint:"常見值:256k (Hermes 預設), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"儲存",contextEditCancel:"取消",contextEditInvalid:"請輸入有效的上下文長度",contextEditSuccess:"上下文長度已更新",contextEditFailed:"更新失敗",emptyState:"開始與 Hermes Agent 對話",emptyStateAgent:"開始與 {agent} 對話",viewOlderInHistory:"更早的訊息請到歷史記錄查看",scrollToBottom:"捲動到底部",forkedFrom:"Fork 來源",previousLastMessage:"上一段對話的最後一則訊息",outlineTitle:"會話大綱",outlineEmpty:"暫無會話內容",outlineUserQuestion:"使用者問題",inputPlaceholder:"輸入訊息... (Enter 發送,Shift+Enter 換行)",inputHeightResizeHint:"拖曳調整聊天輸入框高度,雙擊可恢復自動高度。",slashCommandArgs:{message:"<訊息>",title:"<標題>",text:"<文字>"},slashCommands:{usage:"計算目前會話用量",status:"查看會話狀態和佇列",abort:"停止目前 Bridge 執行",queue:"將訊息加入目前執行後的佇列",learn:"從描述的來源學習可重用技能",plan:"產生一份 Markdown 實作計畫",goal:"設定一個跨輪次持續推進的目標",goalStatus:"查看目前目標狀態",goalPause:"暫停目前目標循環",goalResume:"繼續已暫停的目標循環",goalDone:"完成並清除目前目標",goalClear:"清除目前目標",subgoal:"為目前目標追加驗收條件",clear:"清空目前顯示內容",clearHistory:"刪除目前會話已儲存的訊息歷史",title:"重新命名目前會話",compress:"空閒時觸發上下文壓縮",fork:"將目前空閒會話 fork 成一個新的關聯對話",steer:"向目前 Bridge 執行傳送引導文字",destroy:"釋放目前會話的 Bridge Agent",reloadMcp:"重載 MCP 伺服器",reloadSkills:"重載技能命令"},attachFiles:"新增附件",reasoningEffort:{tooltip:"推理強度",defaultLabel:"預設",options:{default:"預設 (config.yaml)",none:"無",minimal:"極低",low:"低",medium:"中",high:"高",xhigh:"超高"}},autoPlaySpeech:"自動播放語音",voiceInput:{startCapture:"開始語音輸入",stopCaptureAndInsert:"停止語音輸入並插入到輸入框",cancelCapture:"取消語音輸入",statusLabel:"狀態:{status}",transcriptLabel:"轉寫:{text}",errorLabel:"錯誤:{error}",recentEvents:"最近事件",status:{idle:"閒置",capturing:"正在聆聽",transcribing:"正在轉寫",sending:"正在插入輸入框",error:"錯誤"},browserSpeechUnsupported:"目前瀏覽器不支援內建語音辨識。",browserSpeechFailed:"瀏覽器語音辨識失敗。",browserSpeechFailedWithReason:"瀏覽器語音辨識失敗:{error}。",microphoneUnsupported:"目前瀏覽器不支援麥克風錄音。",microphoneRecordingFailed:"麥克風錄音失敗。"},showToolCalls:"顯示工具呼叫",hideToolCalls:"隱藏工具呼叫",messageQueue:"訊息佇列",removeQueuedMessage:"移除佇列訊息",stop:"停止",start:"啟動",stopGateway:"停止閘道",send:"發送",contextUsed:"上下文已用:",sessions:"工作階段",webUiSessions:"工作階段",allProfiles:"全部設定",profileMissingModelsTip:"此工作階段所屬設定「{profile}」沒有可用的 provider 或模型",sessionScopeHint:"這裡只顯示目前工作階段;CLI、Telegram、Discord、Cron 等頻道工作階段在歷史中以唯讀方式查看。",openHistory:"開啟歷史",hermesHistory:"Hermes 歷史",historyScopeHint:"這裡按來源以唯讀方式查看目前 profile 的 Hermes 歷史工作階段。",noSessions:"目前無工作階段",searchTitle:"搜尋工作階段",searchSubtitle:"依標題或訊息內容搜尋",searchScope:"搜尋範圍:僅 Web UI 本地工作階段資料庫;不包含唯讀 Hermes 歷史工作階段。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜尋工作階段...",searchEmpty:"最近工作階段",searchRecent:"最近工作階段",searchNoResults:"沒有符合的工作階段",searchNoSnippet:"沒有可顯示的摘要",searchEnterHint:"Enter 開啟 · Esc 關閉",searchFailed:"搜尋工作階段失敗",newChat:"新增對話",agent:"Agent",approvalKicker:"終端授權",approvalTitle:"執行前請確認命令",approvalAgree:"同意",approvalAllowOnce:"僅本次允許",approvalAllowSession:"本工作階段允許",approvalAlways:"永遠允許",approvalDeny:"拒絕",clarifyKicker:"Agent 需要確認",clarifyTitle:"Agent 有一個問題需要您回答",clarifyPlaceholder:"輸入你的回答...",clarifySubmit:"回覆",clarifyDismiss:"忽略",deleteSession:"確定刪除此工作階段?",sessionDeleted:"工作階段已刪除",toggleBatchMode:"批次選取",selectAll:"全選",confirmBatchDelete:"確定刪除選取的 {count} 個工作階段?",batchDeleteSuccess:"已刪除 {count} 個工作階段",batchDeletePartial:"{failed} 個工作階段刪除失敗",batchDeleteFailed:"批次刪除失敗",importToWebUi:"匯入到 Web UI",importSessionSuccess:"工作階段已匯入 Web UI",importSessionAlreadyExists:"工作階段已存在於 Web UI",importSessionFailed:"匯入工作階段失敗",rename:"重新命名",archiveSession:"封存",unarchiveSession:"取消封存",pin:"釘選",unpin:"取消釘選",pinned:"已釘選",chatMode:"聊天",liveMode:"即時",liveSessions:"即時工作階段",recentBadge:"最近",linkedSessions:"關聯 {count} 個工作階段",noVisibleMessages:"沒有人類可見訊息。",monitorRoleUser:"使用者",monitorRoleAssistant:"助手",copySessionLink:"複製工作階段連結",openSessionInNewTab:"在新分頁開啟",sessionLinkCopied:"Session link copied",copySessionId:"複製工作階段 ID",export:"匯出",editConfig:"編輯設定檔",exportFull:"完整匯出 (JSON)",exportCompressed:"壓縮匯出 (TXT)",exportCompressing:"正在壓縮上下文,請稍候...",exportSuccess:"工作階段已匯出",exportFailed:"匯出失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",sessionArchived:"工作階段已封存",archiveSessionFailed:"封存工作階段失敗",sessionUnarchived:"工作階段已取消封存",unarchiveSessionFailed:"取消封存工作階段失敗",renameSession:"重新命名工作階段",sessionNotFound:"找不到工作階段",enterNewTitle:"輸入新標題",workspace:"工作區",setWorkspace:"設定工作區",setWorkspaceTitle:"設定工作階段工作區",workspacePlaceholder:"輸入專案路徑,例如 /home/user/project",folderPickerEmpty:"(空)",folderPickerNoFolders:"暫無工作區資料夾",folderPickerSelected:"已選擇:",workspaceSet:"工作區已設定",workspaceSetFailed:"設定工作區失敗",other:"其他",runFailed:"執行失敗",error:"錯誤",tool:"工具",arguments:"參數",result:"結果",workspaceChanges:"工作區變更",changedFiles:"{files} 個檔案已更改",diffUnavailable:"無法顯示 diff",binaryFileDiffUnavailable:"二進位檔案無法顯示 diff",truncated:"... (已截斷)",unchangedLines:"{count} 行未修改",executionDuration:"執行時長",thinkingLabel:"思考過程",thinkingInProgress:"正在思考",thinkingShow:"展開思考過程",thinkingHide:"收起思考過程",thinkingDuration:"已觀察 {duration}",thinkingChars:"{count} 字",copyBubble:"複製訊息",copiedBubble:"已複製",copyFailed:"複製失敗",playSpeech:"播放語音",pauseSpeech:"暫停",resumeSpeech:"繼續",stopSpeech:"停止",speechNotSupported:"此瀏覽器不支援語音播放",modelSetFailed:"設定模型失敗",modelSet:"模型已設定",setModelTitle:"設定工作階段模型",setModel:"設定模型",newCliChat:"新增 CLI",cliEmptyState:"開始 CLI 對話"},workflow:{title:"工作流",profile:"設定檔",namePlaceholder:"工作流名稱",workspace:{title:"選擇工作區",select:"選擇工作區",clear:"清空工作區"},actions:{newWorkflow:"新增工作流",addNode:"新增節點",createWorkflowFirst:"請先建立工作流",reset:"重置",startExecution:"開始執行",executionPending:"工作流執行功能待接入",executionStarted:"工作流已開始執行",executionCompleted:"工作流執行完成",executionFailed:"工作流執行失敗",rerunDownstreamKeepNode:"保留此節點訊息向下執行",rerunDownstreamClearNode:"清除此節點訊息向下執行",rerunDownstreamStarted:"已開始向下重跑",rerunFromNodeStarted:"已開始從此節點重跑",rerunFailed:"工作流重跑失敗",deleteNode:"刪除節點",deleteEdge:"刪除連接線"},batch:{toggle:"批次選擇",selectAll:"全選",confirmDelete:"確定刪除選中的 {count} 個工作流?",deleteSuccess:"已刪除 {count} 個工作流",deletePartial:"{failed} 個工作流刪除失敗",deleteFailed:"批次刪除失敗"},validation:{nodesRequired:"請至少新增一個節點",nodeNameRequired:"節點 {node} 需要填寫名稱",providerRequired:"節點 {node} 需要選擇 Provider",modelRequired:"節點 {node} 需要選擇模型",apiModeRequired:"節點 {node} 需要選擇 API 模式",inputRequired:"節點 {node} 需要填寫輸入內容",invalidEdge:"連接線引用了不存在的節點",invalidConnectionDirection:"連接線只能從右側輸出連接到左側輸入",orphanNode:"節點 {node} 沒有連接到流程",disconnectedFlow:"流程不能拆成多條互不連接的鏈路",cycle:"流程中存在循環連接,請調整後再保存"},node:{title:"節點名稱",agent:"Agent",model:"模型",apiMode:"API 模式",input:"輸入",promptPlaceholder:"描述這個 Agent 要做什麼...",skillsPlaceholder:"技能,按 Enter 新增",uploadImages:"上傳圖片"},status:{idle:"空閒",queued:"排隊中",running:"執行中",completed:"已完成",failed:"失敗",canceled:"已取消"},runs:{title:"執行記錄",refresh:"重新整理",empty:"暫無執行記錄",startNodes:"{count} 個起始節點",show:"顯示執行記錄",hide:"隱藏執行記錄",nodeSessionTitle:"節點會話 - {node}",noNodeSession:"該節點暫無會話記錄",loadNodeSessionFailed:"載入節點會話失敗",stop:"停止執行",stopRequested:"已請求停止執行",stopFailed:"停止執行失敗",delete:"刪除記錄",deleteSuccess:"執行記錄已刪除"},inspector:{selected:"選中節點",none:"未選擇節點"},stats:{nodes:"節點",edges:"連線"},agents:{planner:"規劃",researcher:"研究",builder:"執行",reviewer:"審查"},models:{default:"預設模型",fast:"快速模型",reasoning:"推理模型"},initialNodes:{node1:"節點 1",node2:"節點 2",node3:"節點 3",plan:"規劃",execute:"執行",review:"審查"},initialPrompts:{node1:"輸入這個節點的內容。",node2:"輸入這個節點的內容。",node3:"輸入這個節點的內容。",plan:"把需求拆成可執行步驟。",execute:"執行實作步驟並產出結果。",review:"審查產出品質並識別後續工作。"},newNodeTitle:"節點 {count}"},kanban:{title:"看板",createTask:"新增任務",noTasks:"目前無任務",allStatuses:"所有狀態",allAssignees:"所有負責人",board:{create:"新增看板",archive:"封存看板",slugPlaceholder:"看板識別碼,例如 project-a",namePlaceholder:"顯示名稱(選填)",slugRequired:"看板識別碼不能為空",created:"看板已建立",archived:"看板已封存",archiveConfirm:"確定封存目前看板?"},columns:{triage:"待分類",todo:"待辦",scheduled:"已排程",ready:"就緒",running:"進行中",blocked:"阻塞",review:"待審查",done:"已完成",archived:"已封存"},form:{title:"標題",titlePlaceholder:"任務標題",titleRequired:"標題不能為空",body:"描述",bodyPlaceholder:"任務描述(選填)",assignee:"負責人",selectAssignee:"選擇負責人...",priority:"優先級",selectPriority:"選擇優先級...",tenant:"租戶",tenantPlaceholder:"租戶(選填)",workspace:"工作區",workspaceScratch:"臨時工作區",workspaceDir:"使用目錄",workspaceWorktree:"使用 worktree",workspacePath:"工作區路徑",workspacePathPlaceholder:"絕對路徑(選填)",branch:"分支",branchPlaceholder:"Worktree 分支",skills:"技能",skillsPlaceholder:"選擇技能...",triage:"建立到分類狀態",goalMode:"目標模式",maxRuntime:"最長執行時間",maxRuntimePlaceholder:"例如 30m、2h",maxRetries:"最大重試次數",maxRetriesPlaceholder:"重試次數",goalMaxTurns:"目標最大輪次",goalMaxTurnsPlaceholder:"最大輪次"},card:{assigneeTooltip:"負責人",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"剛剛",minutes:"{count} 分鐘前",hours:"{count} 小時前",days:"{count} 天前"}},detail:{status:"狀態",assignee:"負責人",priority:"優先級",tenant:"租戶",createdAt:"建立時間",startedAt:"開始時間",completedAt:"完成時間",comments:"評論",events:"事件",runs:"執行記錄",result:"完成結果",sessions:"關聯工作階段",sessionMessages:"工作階段記錄",noSessions:"找不到關聯工作階段。",artifacts:"產出檔案",sources:"資料來源",highlights:"關鍵資訊",noLog:"找不到此任務的日誌。",addComment:"新增評論",commentPlaceholder:"輸入任務評論...",operations:"操作"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(選填)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"指派",assignTo:"指派給...",dispatch:"調度",recoveryReason:"恢復原因(選填)",reclaim:"回收",reassign:"重新指派",specify:"細化",loadLog:"載入日誌",loadDiagnostics:"載入診斷"},message:{taskCreated:"任務已建立",taskCompleted:"任務已完成",taskBlocked:"任務已阻塞",taskUnblocked:"任務已解除阻塞",taskAssigned:"任務已指派",dispatchNudged:"已觸發調度器",commentAdded:"評論已新增",taskReclaimed:"任務已回收",taskReassigned:"任務已重新指派",taskSpecified:"任務已細化",loadFailed:"載入任務失敗"},stats:{total:"總計",tasks:"任務數"}},jobs:{title:"排程任務",createJob:"建立任務",editJob:"編輯任務",noJobs:"目前無排程任務,建立一個開始吧。",sortBy:"排序",sortByName:"名稱排序",sortByTime:"時間排序",sortByNameHint:"點擊依名稱排序",sortByTimeHint:"點擊依時間排序",sortAsc:"升序",sortDesc:"降序",name:"名稱",namePlaceholder:"任務名稱",schedule:"排程運算式 (Cron)",schedulePlaceholder:"例如 0 9 * * *",quickPresets:"快速預設",selectPreset:"選擇預設...",presetEveryMinute:"每分鐘",presetEvery5Min:"每 5 分鐘",presetEveryHour:"每小時",presetEveryDay:"每天 00:00",presetEveryDay9:"每天 09:00",presetEveryMonday:"每週一 09:00",presetEveryMonth:"每月 1 日 09:00",prompt:"提示詞",promptPlaceholder:"要執行的內容",skills:"技能",skillsPlaceholder:"選擇技能...",deliverTarget:"投遞目標",origin:"來源",local:"本地",repeatCount:"重複次數(選填)",modelPlaceholder:"預設模型",repeatPlaceholder:"留空表示無限重複",jobCreated:"任務已建立",jobUpdated:"任務已更新",nameRequired:"名稱為必填項",scheduleRequired:"排程運算式為必填項",loadFailed:"載入任務失敗",jobPaused:"任務已暫停",jobResumed:"任務已恢復",jobTriggered:"任務已觸發",modelUpdated:"模型已更新",jobDeleted:"任務已刪除",status:{running:"執行中",paused:"已暫停",disabled:"已停用",scheduled:"已排程"},info:{model:"模型",schedule:"排程",lastRun:"上次執行",nextRun:"下次執行",deliver:"投遞",repeat:"重複"},action:{pause:"暫停",pauseJob:"暫停任務",resume:"恢復",resumeJob:"恢復任務",runNow:"立即執行",triggerImmediately:"立即觸發"},runHistory:{title:"執行歷史",runs:"次執行",noRuns:"目前無執行歷史。"}},skills:{title:"技能",targetFilter:"執行環境",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"搜尋技能...",noMatch:"沒有符合的技能",noSkills:"目前無技能",backTo:"返回",attachedFiles:"附件檔案",loadFailed:"載入技能失敗",fileLoadFailed:"載入檔案失敗",modified:"使用者已修改",archived:"已封存",pinned:"已釘選",pin:"釘選技能",unpin:"取消釘選",pinFailed:"變更釘選狀態失敗",edit:"編輯",saving:"儲存中...",editorLabel:"技能編輯器",saveSuccess:"技能已儲存",saveFailed:"儲存技能失敗",toggleFailed:"切換技能狀態失敗",source:{builtin:"內建",hub:"Hub 安裝",local:"本地安裝",external:"外部目錄"},delete:"刪除",deleteConfirm:'確定要刪除技能 "{name}" 嗎?此操作無法撤銷。',deleteSuccess:"已刪除技能",deleteFailed:"刪除失敗",import:"匯入",importTitle:"匯入技能",importModeZip:"Zip 包",importModeFolder:"資料夾",importHintZip:"上傳 .zip 包,應包含含 SKILL.md 的目錄",importHintFolder:"選擇本地技能資料夾(需含 SKILL.md)",importTargetCategory:"目標分類(選填)",importTargetCategoryPlaceholder:"留空則平鋪到 misc",importSelectFile:"選擇 .zip 檔案",importSelectFolder:"選擇資料夾",importInvalidFile:"僅支援 .zip 包",importFileCount:"個檔案",importNoSelection:"請先選擇檔案或資料夾",importSuccess:"已匯入技能",importFailed:"匯入失敗",path:{local:"本地",external:"外部"},externalDirs:{manage:"外部目錄",title:"外部目錄管理",hint:"在此管理 config.skills.external_dirs。支援 ~ 與 $VAR;不存在的路徑會被標灰。",add:"新增外部目錄",placeholder:"/path/to/skills 或 ~/my-skills",empty:"尚無外部目錄",missing:"目錄不存在",notDir:"不是目錄",saveSuccess:"外部目錄已儲存",saveFailed:"儲存失敗",loadFailed:"載入外部目錄失敗",removeRow:"移除"},pathCopied:"路徑已複製",pathCopyFailed:"複製路徑失敗",reloadHint:"活躍會話請執行 /reload-skills;新會話會自動載入。",writeApprovalButton:"待審核 {count}",writeApprovalTitle:"待審核寫入",writeApprovalDescription:"批准或拒絕 Hermes Agent 暫存的記憶和技能寫入。",writeApprovalRefresh:"重新整理",writeApprovalEmpty:"暫無待審核寫入。",writeApprovalUnsupported:"目前 Hermes Agent 版本不支援寫入審核。請升級 Hermes Agent 後再使用。",writeApprovalMemory:"記憶",writeApprovalSkills:"技能",writeApprovalViewDiff:"查看",writeApprovalHideDiff:"收合",writeApprovalNoDiff:"沒有可顯示的差異。",writeApprovalLoadFailed:"待審核寫入載入失敗",writeApprovalDiffFailed:"寫入詳情載入失敗",writeApprovalActionFailed:"待審核寫入處理失敗",writeApprovalApproved:"已批准寫入",writeApprovalRejected:"已拒絕寫入",writeApprovalApprove:"批准",writeApprovalReject:"拒絕",writeApprovalPendingMemoryWrite:"待審核記憶寫入",writeApprovalCurrentFile:"目前 {file}",writeApprovalProposedFile:"批准後 {file}",writeApprovalDiffSection:"差異",writeApprovalPatchOldStringMissing:"目前檔案 {file} 中找不到這次補丁的 old_string,批准後檔案內容不會變更。",writeApprovalRequestedOldString:"本次請求匹配的 old_string",writeApprovalCurrentReadFailed:"目前檔案 {file} 無法以 UTF-8 文字讀取。",writeApprovalDeleteSkill:"這次審核會刪除技能 {skill}。",writeApprovalRemoveFile:"這次審核會從技能 {skill} 中移除檔案 {file}。"},plugins:{title:"插件",refresh:"重新整理",notice:"顯示可發現的 Hermes 插件 manifest。發現元資料讀取不會載入插件程式碼。可在此啟用或停用 standalone 使用者插件,新 Hermes 工作階段生效。",loadFailed:"載入插件失敗",updateFailed:"更新插件失敗",enableSuccess:"已啟用 {name}",disableSuccess:"已停用 {name}",commandCopied:"指令已複製",searchPlaceholder:"搜尋 key、名稱、描述、路徑...",source:"來源",kind:"類型",statusTitle:"狀態",configStatus:"設定:{status}",notAvailable:"無",copyCommand:"複製指令",managedElsewhere:"由其他位置管理",noMatch:"沒有符合目前篩選條件的插件",enabled:"已啟用",disabled:"已停用",summary:{total:"總數",active:"已啟用 / 自動",inactive:"未啟用",disabled:"已停用",providerManaged:"Provider 管理"},status:{enabled:"已啟用","auto-active":"自動啟用",inactive:"未啟用",disabled:"已停用","provider-managed":"Provider 管理"},statusLabel:{enabled:"設定啟用","auto-active":"自動啟用",inactive:"未啟用",disabled:"已停用","provider-managed":"Provider 管理"},configStatuses:{enabled:"已啟用",disabled:"已停用","not-enabled":"未啟用",auto:"自動","provider-managed":"Provider 管理"},table:{plugin:"插件",status:"狀態",source:"來源",kind:"類型",capabilities:"能力",path:"路徑 / 入口",manage:"管理"},capabilities:{tools:"{count} 個工具",hooks:"{count} 個 hook",env:"{count} 個環境變數"},metadata:{agentRoot:"Agent 根目錄",python:"Python",scanCwd:"掃描 cwd",projectPlugins:"專案插件"}},petdex:{title:"Petdex 寵物",subtitle:"瀏覽 Hermes 桌寵使用的 petdex 公共圖庫。",refresh:"重新整理",adopt:"領取",active:"使用中",adopted:"已領取 {name}",adoptFailed:"領取寵物失敗",loadFailed:"載入 petdex 圖庫失敗",searchPlaceholder:"依名稱、slug、作者或類型搜尋",kindFilter:"類型",spritesheet:"精靈圖",submittedBy:"作者 {name}",empty:"沒有符合目前篩選的寵物。",showMore:"再顯示 {count} 個",summary:{total:"圖庫總數",visible:"符合數量",kinds:"類型數",generatedAt:"產生時間"}},memory:{title:"記憶",refresh:"重新整理",loadFailed:"載入記憶失敗",myNotes:"我的筆記",noNotes:"目前無筆記。",notesPlaceholder:"輸入筆記內容...",userProfile:"使用者畫像",noProfile:"目前無畫像。",profilePlaceholder:"輸入使用者畫像...",soul:"靈魂",noSoul:"目前無靈魂設定。",soulPlaceholder:"輸入靈魂設定..."},models:{title:"模型",searchPlaceholder:"搜尋模型...",noResults:"無結果",noModels:"無模型",addProvider:"新增 Provider",refreshModelCache:"刷新模型快取",refreshModelCacheLoading:"正在刷新模型快取...",refreshModelCacheSuccess:"模型快取已刷新",refreshModelCacheFailed:"刷新模型快取失敗",providerType:"Provider 類型",preset:"預設",custom:"自訂",selectProvider:"選擇 Provider",chooseProvider:"選擇一個 provider...",getApiKey:"取得 API Key",name:"名稱",autoGeneratedName:"依 Base URL 自動產生",baseUrl:"Base URL",region:"區域",regionIntl:"國際版",regionCn:"中國大陸",baseUrlPlaceholder:"例如 https://api.example.com/v1",apiKey:"API Key",apiKeyPlaceholder:"sk-...",defaultModel:"預設模型",selectOrInput:"選擇或輸入模型名稱...",selectModel:"選擇模型...",providerAdded:"Provider 已新增",providerDeleted:"Provider 已刪除",providerCredentialsCleared:"Provider 憑據已清除",clearProviderCredentials:"清除憑據",clearCredentialsConfirm:"確定清除「{name}」的已儲存憑據嗎?這是內建 Provider,項目會繼續顯示,重新設定憑據後仍可使用。",disableProvider:"停用 Provider",disableProviderConfirm:"確定停用內建 Provider「{name}」嗎?該 Provider 仍是內建項目,之後可以重新啟用。",providerDisabled:"Provider 已停用",defaultProviderUpdated:"預設 Provider 已更新",defaultProviderUpdateFailed:"更新預設 Provider 失敗",defaultModelUpdated:"預設模型已更新",defaultModelUpdateFailed:"更新預設模型失敗",deleteProvider:"刪除 Provider",deleteConfirm:"確定刪除「{name}」嗎?",codexLoginTitle:"OpenAI Codex 登入",codexWaiting:"在授權頁面輸入以下代碼完成登入:",codexCopyCode:"代碼已複製",codexOpenLink:"開啟授權頁面",codexApproved:"登入成功",codexExpired:"授權已過期,請重試。",nousLoginTitle:"Nous Portal 登入",nousWaiting:"在授權頁面輸入此代碼完成登入:",nousCopyCode:"代碼已複製",nousOpenLink:"開啟授權頁面",nousApproved:"登入成功",nousDenied:"授權被拒絕,請重試。",nousExpired:"授權已過期,請重試。",copilotLoginTitle:"GitHub Copilot 登入",copilotWaiting:"請前往 GitHub 輸入下方裝置代碼完成授權。授權完成後視窗會自動關閉。",copilotCopyCode:"代碼已複製",copilotOpenLink:"開啟 GitHub 授權頁",copilotApproved:"登入成功!",copilotDenied:"授權被拒絕。",copilotExpired:"授權連結已過期,請重試。",copilotAddDetectedTitle:"偵測到 GitHub Copilot",copilotAddDetected:"已在本機偵測到 GitHub Copilot OAuth 憑證,點擊「新增」即可在 Hermes 中啟用 Copilot。",copilotAddSourceEnv:"來源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"來源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"來源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作會清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影響其他工具。",copilotDeleteHintGhCli:"Copilot 將從 Hermes 清單移除。不會影響 gh CLI —— `gh auth status` 仍顯示已登入。",copilotDeleteHintAppsJson:"Copilot 將從 Hermes 清單移除。不會影響 VS Code Copilot 插件的登入。",customBadge:"自訂",previewBadge:"預覽",disabledBadge:"不可用",disabledTooltip:"此模型目前帳號不可用",customModelPlaceholder:"自訂模型名稱",customModelHint:"按 Enter 載入",removeCustomModel:"移除這個未列出的模型",refresh:"重新整理模型列表(重新載入 config.yaml)",noProviders:"目前無 Provider,新增一個開始吧。",models:"模型清單",count:"個模型",more:"個更多",builtIn:"內建",customType:"自訂",provider:"Provider",contextLength:"上下文長度",contextLengthPlaceholder:"例如 256000(選填)",apiMode:"API 模式",local:"本地 ({host})",selectProviderRequired:"請選擇 Provider",baseUrlRequired:"Base URL 為必填項",apiKeyRequired:"API Key 為必填項",modelRequired:"預設模型為必填項",enterBaseUrl:"請先輸入 Base URL",unexpectedFormat:"回應格式異常",foundModels:"找到 {count} 個模型",fetchFailed:"取得模型失敗",manageVisibleModels:"管理可見模型",manageVisibleModelsFor:"管理 {name} 可見模型",visibilityHint:"僅影響 Web UI 的模型選擇器和模型頁展示,不會改寫 Hermes CLI 的 provider/model 配置。實際呼叫仍使用原始模型 ID。",visibilitySaved:"可見模型已儲存",visibilitySaveFailed:"儲存可見模型失敗",showAllModels:"顯示全部模型",clearVisibleModels:"取消全選",generalTitle:"通用模型",combinationTitle:"組合模型",combinationSubtitle:"設定 MoA 預設:多個參考模型先提供觀點,再由一個彙總模型負責最終回覆和工具呼叫。",combinationPreset:"預設",combinationName:"名稱",combinationAddModel:"新增組合模型",combinationEditModel:"編輯組合模型",combinationNewPreset:"新預設",combinationPresetPlaceholder:"例如 review",combinationAddPreset:"新增預設",combinationSetDefault:"設為預設",combinationEnabled:"啟用參考模型",combinationReferenceModels:"參考模型",combinationReferenceModel:"參考模型",combinationAddReference:"新增參考模型",combinationAggregator:"彙總模型",combinationReferenceTemperature:"參考溫度",combinationAggregatorTemperature:"彙總溫度",combinationMaxTokens:"最大 Token",combinationNotSet:"未設定",combinationSaved:"組合模型已儲存",combinationLoadFailed:"載入組合模型失敗",combinationSaveFailed:"儲存組合模型失敗",combinationPresetExists:"預設已存在",combinationNameRequired:"請輸入組合模型名稱",combinationNameInvalid:"名稱只能包含字母、數字、底線、短橫線和點",combinationReferenceRequired:"至少新增一個參考模型",combinationAggregatorRequired:"請選擇彙總模型",auxiliaryTitle:"輔助模型",auxiliarySubtitle:"為壓縮、視覺、審批、MCP 和後台維護等輔助任務單獨指定模型。",auxiliaryRefresh:"刷新",auxiliaryTask:"任務",auxiliaryTimeout:"逾時",auxiliaryDownloadTimeout:"下載逾時",auxiliaryActions:"操作",auxiliaryDefault:"預設",auxiliaryCustomEndpoint:"自訂端點",auxiliaryProviderAuto:"自動",auxiliaryProviderMain:"主模型",auxiliaryProviderPlaceholder:"auto、main 或 provider key",auxiliaryDownloadShort:"下載",auxiliaryExtraBody:"Extra body JSON",auxiliaryClear:"清除",auxiliarySaved:"輔助模型已儲存",auxiliaryLoadFailed:"載入輔助模型失敗",auxiliarySaveFailed:"儲存輔助模型失敗",auxiliaryInvalidExtraBody:"Extra body 必須是 JSON 物件",auxiliaryTaskCompression:"壓縮",auxiliaryTaskVision:"視覺",auxiliaryTaskWebExtract:"網頁擷取",auxiliaryTaskSkillsHub:"技能中心",auxiliaryTaskApproval:"審批",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"標題產生",auxiliaryTaskTriageSpecifier:"Triage 擴寫",auxiliaryTaskKanbanDecomposer:"看板拆解",auxiliaryTaskProfileDescriber:"Profile 描述",auxiliaryTaskCurator:"策展",auxiliaryTaskSessionSearch:"會話搜尋",auxiliaryTaskFlushMemories:"寫入記憶",currentDefault:"目前預設",defaultShort:"預設",setDefaultProvider:"設為預設 Provider",setDefault:"設為預設",aliasEdit:"重新命名",aliasTitle:"模型顯示名",aliasTitleFor:"{model} 的顯示名",aliasPlaceholder:"留空則使用原始模型 ID",aliasHint:"僅修改 Web UI 顯示名,傳送給 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢復原始 ID",aliasManage:"顯示名",aliasManageFor:"{provider} 的顯示名",aliasSaveFailed:"儲存顯示名失敗",visibilitySelectOne:"至少保留一個可見模型",xaiWaiting:"請在開啟的 xAI 頁面完成授權。授權完成後視窗會自動關閉。",xaiOpenLink:"開啟 xAI 授權頁",xaiLoginTitle:"xAI Grok OAuth 登入",xaiExpired:"授權連結已過期,請重試。",xaiCopyLink:"複製授權連結",xaiApproved:"登入成功!",anthropicLoginTitle:"Claude 授權登入",anthropicWaiting:"請在 Claude 授權頁完成授權,然後將返回的授權代碼貼到這裡。",anthropicOpenLink:"開啟 Claude 授權頁",anthropicCopyLink:"複製授權連結",anthropicCodePlaceholder:"貼上授權代碼...",anthropicSubmitCode:"提交代碼",anthropicApproved:"登入成功!",anthropicExpired:"授權已過期,請重試。",geminiLoginTitle:"Google Gemini OAuth 登入",geminiWaiting:"請在開啟的 Google 頁面完成授權。授權完成後視窗會自動關閉。",geminiOpenLink:"開啟 Google 授權頁",geminiCopyLink:"複製授權連結",geminiApproved:"登入成功!",geminiExpired:"授權連結已過期,請重試。"},profiles:{title:"設定檔",create:"建立設定檔",import:"匯入",export:"匯出",rename:"重新命名",delete:"刪除",switchTo:"切換 Hermes Profile",switchConfirm:"將執行 `hermes profile use {name}` 並切換 Hermes CLI 的 active profile,是否繼續?",switchSuccess:"Hermes active profile 已切換為「{name}」",switchFailed:"切換 Hermes Profile 失敗,閘道可能需要手動重新啟動",createSuccess:"設定檔「{name}」已建立",createFailed:"建立設定檔失敗",renameSuccess:"設定檔已重新命名",renameFailed:"重新命名設定檔失敗",deleteConfirm:"確定刪除設定檔「{name}」嗎?",deleteSuccess:"設定檔已刪除",deleteFailed:"刪除設定檔失敗",exportSuccess:"設定檔已匯出",exportFailed:"匯出設定檔失敗",importSuccess:"設定檔已匯入",importFailed:"匯入設定檔失敗",importSelectFile:"選擇封存檔案",importInvalidFile:"請選擇有效的封存檔案 (.tar.gz, .tgz, .gz, .zip)",name:"設定檔名稱",namePlaceholder:"僅限小寫字母、數字、連字號",nameValidation:"設定檔名稱只能包含小寫字母、數字、底線和連字號",newName:"新名稱",newNamePlaceholder:"小寫字母、數字、連字號",cloneFromCurrent:"從目前設定檔複製",cloneCleanupNotice:"複製時會自動略過獨占型平台憑證(Weixin / Telegram / Slack 等),避免與來源設定檔衝突",cloneStrippedCredentials:"已清理 {count} 項獨占憑證:{list}",cloneDisabledPlatforms:"已停用 {count} 個平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 項嵌入憑證:{list}",archivePath:"封存路徑",archivePathPlaceholder:"封存檔案的伺服器路徑",importName:"設定檔名稱(選填)",importNamePlaceholder:"留空則使用封存名稱",active:"使用中",model:"模型",gateway:"閘道",alias:"別名",provider:"Provider",path:"路徑",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"目前無設定檔,建立一個開始吧。",avatar:{title:"自訂頭像",customize:"頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},runtime:{activeProfile:"目前:{name}",bridgeWorker:"橋接狀態",gateway:"閘道",active:"使用中",activeTag:"目前",idle:"閒置",checking:"檢測中",running:"執行中",stopped:"已停止",restartGateway:"重啟閘道",restartProfile:"重啟設定檔",switchProfile:"切換前端設定檔",gatewayRestarted:"閘道已重啟:{name}",gatewayRestartFailed:"重啟閘道失敗",profileRestarted:"設定檔已重啟:{name}",profileRestartFailed:"重啟設定檔失敗"}},logs:{title:"日誌",all:"全部",searchPlaceholder:"搜尋...",refresh:"重新整理",noEntries:"目前無日誌"},settings:{title:"設定",saved:"已儲存",saveFailed:"儲存失敗",tabs:{display:"顯示",account:"目前帳號",users:"帳號管理",agent:"網關",proxy:"代理",memory:"記憶",compression:"上下文壓縮",session:"工作階段",privacy:"隱私",apiServer:"API 伺服器",models:"模型",voice:"語音"},models:{apiKey:"API Key",apiKeyPlaceholder:"輸入 API Key",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",noProviders:"目前無已設定的模型"},display:{streaming:"串流回應",streamingHint:"即時顯示 AI 回覆",compact:"緊湊模式",compactHint:"減少訊息間距",showReasoning:"顯示推理過程",showReasoningHint:"展示模型思考過程",showCost:"顯示費用",showCostHint:"在回覆中顯示 token 使用量",inlineDiffs:"內嵌差異",inlineDiffsHint:"程式碼變更以內嵌方式顯示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回覆完成時播放提示音",notifyOnComplete:"完成彈窗通知",notifyOnCompleteHint:"AI 回覆完成時顯示系統通知",notifyOnCompleteMacHint:"macOS 需要在系統設定中允許瀏覽器通知。",notifyOnCompleteDenied:"通知權限已被拒絕",notifyOnCompleteInsecure:"瀏覽器通知需要 HTTPS 或 localhost",notifyOnCompleteUnsupported:"目前瀏覽器不支援通知",notifyOnCompleteTest:"通知已開啟。",notifyOnCompleteTestButton:"測試",notifyOnCompleteTesting:"正在發送測試通知...",notifyOnCompleteTestSent:"測試通知已送出",notifyOnCompleteTestFailed:"測試通知傳送失敗",busyInputMode:"忙碌輸入模式",busyInputModeHint:"AI 處理中仍可輸入",theme:"主題",themeHint:"選擇淺色、暗色或跟隨系統",themeLight:"淺色",themeDark:"暗色",themeSystem:"跟隨系統",chatInputHeight:"聊天輸入框高度",chatInputHeightHint:"桌面端聊天輸入框預設高度(像素)。行動端保持自動高度。"},agent:{maxTurns:"最大輪次",maxTurnsHint:"單次對話最大互動輪數",gatewayTimeout:"閘道逾時",gatewayTimeoutHint:"單次請求逾時時間(秒)",restartDrainTimeout:"重啟排空逾時",restartDrainTimeoutHint:"重啟前排空請求的逾時時間(秒)",toolEnforcement:"工具執行策略",toolEnforcementHint:"控制工具呼叫的執行模式",auto:"自動",always:"始終",never:"從不"},gatewayAutoStart:{title:"Gateway 自動啟動",description:"控制 Web UI 啟動時自動拉起哪些本機 Hermes profile gateway。此項寫入 Web UI 設定,不寫入 profile config.yaml。",enabled:"自動啟動 gateway",enabledHint:"關閉後,啟動期不會自動拉起任何 profile gateway。",management:"統一 gateway",managementHint:"需要 Hermes Agent 0.17.0 及以上版本。開啟後會寫入 multiplex_profiles,讓 default gateway 服務所有 profiles;其他 profile 不能單獨設定飛書、微信、QQBot 等通訊工具入口。關閉後會移除此設定。",managementAuto:"自動",managementPerProfile:"每個 profile 一個 gateway",managementUnified:"統一 default gateway",mode:"Profile 策略",modeHint:"啟動所有發現到的 profiles,或只啟動白名單內的 profiles。",modeAll:"所有發現到的 profiles",modeInclude:"僅白名單 profiles",include:"白名單 profiles",includeHint:"逗號分隔 profile 名。白名單模式下留空表示不自動啟動任何 profile。",exclude:"排除 profiles",excludeHint:"逗號分隔 profile 名;會在白名單/全量策略之後再排除。",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway 代理",description:"為目前 profile gateway 設定代理環境變數。儲存後會重啟 gateway,讓通訊平台使用新的網路設定。",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"HTTPS 請求代理,通常優先設定此項。",httpProxy:"HTTP_PROXY",httpProxyHint:"一般 HTTP 請求代理。",allProxy:"ALL_PROXY",allProxyHint:"未設定協定專用代理時使用的備用代理。",noProxy:"NO_PROXY",noProxyHint:"不走代理的主機或網域,使用逗號分隔。",save:"儲存代理設定"},memory:{enabled:"啟用記憶",enabledHint:"允許 AI 記住對話上下文",userProfile:"使用者畫像",userProfileHint:"允許 AI 記住使用者偏好資訊",charLimit:"記憶字元上限",charLimitHint:"MEMORY.md 最大字元數",userCharLimit:"使用者畫像字元上限",userCharLimitHint:"USER.md 最大字元數"},compression:{enabled:"啟用壓縮",enabledHint:"長對話接近模型上下文上限前自動壓縮歷史",threshold:"壓縮閾值",thresholdHint:"預估 token 超過上下文比例時開始壓縮",targetRatio:"目標比例",targetRatioHint:"壓縮後歷史保留到上下文的目標比例",protectLastN:"保護最近訊息",protectLastNHint:"最近多少則訊息不參與壓縮",protectFirstN:"保護開頭訊息",protectFirstNHint:"最早多少則訊息不參與壓縮"},session:{mode:"重設模式",modeHint:"工作階段重設的觸發條件",modeBoth:"閒置 + 定時",modeIdle:"僅閒置",modeDaily:"僅定時",modeNone:"永不(僅手動)",idleMinutes:"閒置逾時",idleMinutesHint:"無操作後自動重設的等待時間(分鐘)",atHour:"定時重設時間",humanOnly:"僅顯示人類工作階段",humanOnlyHint:"預設隱藏子代理和工作階段監看雜訊",liveMonitorHumanOnly:"即時監看:僅顯示人類工作階段",liveMonitorHumanOnlyHint:"在即時監看中預設隱藏子代理和工作階段監看雜訊",atHourHint:"每天在指定小時重設工作階段",requireAuth:"工作階段授權",requireAuthHint:"修改工作階段操作是否授權",memoryWriteApproval:"記憶寫入審核",memoryWriteApprovalHint:"Hermes Agent 寫入 MEMORY.md / USER.md 前先進入待審核佇列。",skillsWriteApproval:"技能寫入審核",skillsWriteApprovalHint:"Hermes Agent 建立或修改技能前先進入待審核佇列。",writeApprovalTitle:"待審核寫入",writeApprovalDescription:"批准或拒絕 Hermes Agent 暫存的記憶和技能寫入。",writeApprovalRefresh:"重新整理",writeApprovalEmpty:"暫無待審核寫入。",writeApprovalMemory:"記憶",writeApprovalSkills:"技能",writeApprovalViewDiff:"查看",writeApprovalHideDiff:"收起",writeApprovalNoDiff:"沒有可顯示的差異。",writeApprovalLoadFailed:"待審核寫入載入失敗",writeApprovalDiffFailed:"寫入詳情載入失敗",writeApprovalActionFailed:"待審核寫入處理失敗",writeApprovalApproved:"已批准寫入",writeApprovalRejected:"已拒絕寫入",writeApprovalApprove:"批准",writeApprovalReject:"拒絕",writeApprovalPendingMemoryWrite:"待審核記憶寫入",writeApprovalCurrentFile:"目前 {file}",writeApprovalProposedFile:"批准後 {file}",writeApprovalDiffSection:"差異",writeApprovalPatchOldStringMissing:"目前檔案 {file} 中找不到這次補丁的 old_string,批准後檔案內容不會變更。",writeApprovalRequestedOldString:"本次請求匹配的 old_string",writeApprovalCurrentReadFailed:"目前檔案 {file} 無法以 UTF-8 文字讀取。",writeApprovalDeleteSkill:"這次審核會刪除技能 {skill}。",writeApprovalRemoveFile:"這次審核會從技能 {skill} 中移除檔案 {file}。"},privacy:{redactPii:"遮蔽 PII",redactPiiHint:"自動偵測並隱藏敏感資訊(密碼、金鑰等)"},apiServer:{enable:"啟用",enableHint:"啟用 API 伺服器",host:"主機",hostHint:"監聽位址",port:"連接埠",portHint:"監聽連接埠",key:"金鑰",keyHint:"API 存取金鑰",cors:"CORS 來源",corsHint:"允許的跨域來源"},lockedIps:{title:"鎖定 IP 管理",count:"{count} 個 IP 被鎖定",empty:"目前無鎖定 IP",unlock:"解鎖",unlockAll:"全部解鎖",unlockAllConfirm:"確認解鎖所有鎖定的 IP?",unlocked:"IP 已解鎖",allUnlocked:"已解鎖 {count} 個 IP",type:{password:"密碼",token:"API Token",pairing:"裝置配對"}},userAvatar:{title:"使用者頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB,會自動壓縮到 500KB 以下",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},voice:{activeTtsApi:"目前 TTS API",activeSttApi:"目前 STT API",ttsProvidersTitle:"TTS 提供方",ttsProvidersDescription:"管理用於播放助理回覆和語音預覽的文字轉語音整合。",sttProvidersTitle:"STT 提供方",sttProvidersDescription:"管理用於麥克風和語音輸入流程的語音轉文字整合。",noneSelected:"未選擇",keyStored:"已儲存",keyMissing:"未設定",customApi:"API",localBuiltin:"本機內建",ttsCardHint:"語音合成提供方",sttCardHint:"語音轉寫提供方",setActive:"設為目前使用",testAction:"測試",connect:"連線",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Microsoft Edge 提供的免費高品質雲端音色。",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"自訂 TTS",presetBrowserSttLabel:"瀏覽器 STT",presetBrowserSttDescription:"瀏覽器原生語音辨識 API。",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"自訂 STT",apiCompatibility:"API 相容性",openaiCompatible:"OpenAI 相容",manualCustomEndpoint:"手動自訂端點",connectionStep:"連線",discoveryManualHint:"已選擇手動自訂端點,無法自動探索模型;請手動輸入模型名稱。",discoveryCredentialHint:"輸入 Base URL 和 API key 後,點擊連線取得可用模型。",discoveryNoAutoProbeHint:"輸入過程中不會送出請求;憑證準備好後點擊連線。",apiKeyConnectPlaceholder:"貼上 API key 後連線;已儲存的 key 不會顯示",connectFetchModels:"連線並取得模型",modelRecommendedSuffix:"推薦",modelConnectManualHint:"連線後自動填入,或手動輸入。",modelRequiredConnectManual:"模型為必填。請連線後自動填入,或手動輸入。",apiKeyRequired:"API key 為必填。",apiKeyRequiredForDiscovery:"取得模型需要 API key。",baseUrlRequired:"Base URL 為必填。",baseUrlHttpsRequired:"請使用 http:// 或 https:// 協定。",baseUrlInvalid:"請輸入有效的 Base URL,包含 https://。",discoveryFailedManualFallback:"無法取得模型。你仍可以手動輸入模型名稱。",completeRequiredProviderFields:"儲存前請補齊必填 provider 欄位。",fetchingModels:"正在取得模型……",recommendedModel:"推薦:{model}。",useRecommendedModel:"使用此模型。",modelsDiscovered:"已發現 {count} 個模型。欄位為空時會自動選擇推薦模型。",remove:"移除",testSuccess:"測試完成",testTextRequired:"測試前請輸入文字。",keyMissingForTest:"測試此提供方前請先新增 API key。",testing:"測試中……",transcribing:"轉寫中……",browserSttTestHint:"瀏覽器 STT 請在聊天輸入框麥克風中測試。",sttEmptyAudio:"未錄到音訊,請重試。",sttTestSuccess:"轉寫完成",sttRecordingHint:"正在錄音……點擊停止後轉寫。",keepStoredKeyPlaceholder:"留空則保留已儲存 key",apiKeyPlaceholder:"輸入 API key",lastTest:"最近測試",notTested:"—",recording:"錄音中",testFailedShort:"失敗",testFailedSummary:"測試失敗,請檢查 provider 設定後重試。",showDetails:"顯示詳情",hideDetails:"隱藏詳情",moreActions:"更多",moreActionsFor:"{provider} 的更多操作",addTtsApi:"新增 TTS API",addSttApi:"新增 STT API",active:"目前使用",builtin:"內建",connected:"已連線",disconnected:"未連線",source:"來源",model:"模型",voice:"音色",doubaoVoiceHint:"選擇 Seed TTS 2.0 音色;資源欄位會自動更新。",apiKey:"API key",confirmDeleteSecret:"確認刪除這個語音 API 已儲存的 API key?",ttsTitle:"文字轉語音",ttsSaved:"TTS 設定已儲存到伺服端",ttsSaveFailed:"儲存 TTS 設定失敗",ttsTestSaved:"試聽成功,TTS 設定已儲存到伺服端",ttsTestSaving:"正在儲存 TTS 設定後再試聽…",ttsMissingBaseUrl:"試聽前需要填寫基礎 URL。請輸入服務商 endpoint 後再測試。",ttsMissingApiKey:"試聽前需要 API key。請貼上 key,或先儲存服務端已存 key。",ttsCleared:"已清除伺服端 TTS 金鑰",ttsClearFailed:"清除伺服端 TTS 金鑰失敗",storedBaseUrlsTitle:"已存 Base URLs",storedBaseUrlsHint:"這裡集中管理已保存的語音 provider endpoint。上方輸入框只清除目前值,刪除已存 URL 在這裡操作。",storedBaseUrlsEmpty:"服務端還沒有保存自訂語音 Base URL。",storedBaseUrlDelete:"刪除 URL",storedApiKeysTitle:"已存 API keys",storedApiKeysHint:"這裡列出服務端已保存的語音 API key,只顯示用途和來源,不顯示完整 key。",storedApiKeysEmpty:"服務端還沒有保存語音 API key。",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[已儲存]",storedApiKeyDelete:"刪除 key",baseUrlPresetClear:"清除 URL",baseUrlPresetCleared:"已清除目前 Base URL。",baseUrlPresetDelete:"刪除 URL",baseUrlPresetDeleted:"已從儲存列表刪除基礎 URL。",baseUrlPresetDeleteFailed:"刪除已儲存基礎 URL 失敗。",ttsPendingSecret:"將儲存新金鑰",ttsStoredSecret:"伺服端已有儲存金鑰:{value}",ttsClearKey:"清除已儲存金鑰",sttTitle:"語音轉文字",sttProvider:"STT 提供方",sttProviderHint:"選擇語音輸入的轉寫方式",sttProviderBrowser:"瀏覽器",sttProviderOpenai:"OpenAI 相容",sttProviderCustom:"自訂",sttBrowserHint:"可用時使用瀏覽器內建語音辨識。",sttApiKey:"API Key",sttApiKeyHint:"僅在伺服器端保存,用於需要驗證的 STT 提供方。",sttStoredSecret:"伺服器端已儲存金鑰:{value}",sttPendingSecret:"伺服器端已儲存金鑰:儲存後更新",sttClearKey:"清除已儲存金鑰",sttModel:"模型",sttModelHint:"用於語音轉文字的模型。",sttLanguage:"語言",sttLanguageHint:"可選語言提示,例如 en 或 zh。",sttPrompt:"提示詞",sttPromptHint:"可選轉寫提示詞。",sttAudioTranscode:"音訊轉碼",sttAudioTranscodeNone:"傳送原始音訊",sttAudioTranscodeFfmpeg:"使用 ffmpeg 轉為 WAV",sttBaseUrl:"基礎 URL",sttBaseUrlHint:"自訂 OpenAI 相容語音轉文字端點。",sttSave:"儲存 STT 設定",sttSaved:"STT 設定已儲存到伺服器。",sttSaveFailed:"儲存 STT 設定失敗。",sttCleared:"伺服器端已儲存的 STT 金鑰已清除。",sttClearFailed:"清除伺服器端已儲存的 STT 金鑰失敗。",sttActiveSaved:"目前 STT 提供方已儲存到伺服器。",sttSaveActive:"儲存目前 STT 提供方",sttEndpointHint:"最終轉寫 endpoint:{endpoint}",sttTestTitle:"測試語音轉文字",sttTestButton:"測試 STT API",sttTestStopButton:"停止並轉寫",sttTestBackendOnly:"STT API 測試僅適用於 OpenAI 相容和自訂提供方。",sttTestRecording:"正在錄製測試音訊……錄完後點擊停止並轉寫。",sttTestTranscribing:"正在轉寫測試音訊……",sttTestEmpty:"沒有錄到可用於 STT 測試的音訊。",sttTestSucceeded:"STT 測試成功。",sttTestFailed:"STT 測試失敗:{error} —— {hint}",sttFailureHintMissingConfig:"請確認已儲存 provider 的 Base URL、模型和 API key 後再測試。",sttFailureHintAuth:"請檢查 API key;如果頁面顯示已儲存 key,請重新貼上目前 key 並儲存後再測。",sttFailureHintForbidden:"key 已到達供應商但沒有該 STT 模型/帳號權限,請檢查 provider 權限、額度或 billing。",sttFailureHintEndpointModel:"請檢查 Base URL 和模型。Groq 建議使用 {endpoint},模型用 whisper-large-v3-turbo 或其他 Groq STT 模型。",sttFailureHintModel:"請檢查所選 STT 模型是否存在,且目前帳號有權限使用。",sttFailureHintQuota:"供應商返回額度、billing 或限流問題,請檢查帳號額度/billing,或稍後重試。",sttFailureHintNetworkCustom:"Web UI server 無法存取 custom STT endpoint。請確認 {endpoint} 可從伺服器存取,並相容 OpenAI audio/transcriptions。",sttFailureHintNetwork:"Web UI server 無法存取 STT provider,請檢查網路、代理或防火牆後重試。",sttFailureHintAudio:"錄音為空或音訊格式被拒絕。請允許麥克風權限,錄一段清晰短句,或換 Chrome 重試。",sttFailureHintGenericCustom:"請檢查 API key、Base URL、模型,以及最終 endpoint {endpoint}。",sttFailureHintGeneric:"請檢查 API key、模型和 provider 帳號權限後重試。",sttTestRecordFailed:"無法開始麥克風錄音:{error}",sttTestTranscript:"轉寫結果:{text}",ttsProvider:"TTS 提供者",ttsProviderHint:"選擇訊息朗讀使用的語音引擎",providerWebSpeech:"WebSpeech API(瀏覽器內建)",providerOpenai:"OpenAI TTS",providerCustom:"自訂端點(相容 OpenAI)",providerEdge:"Edge TTS(免費,無需 API Key)",webspeechVoice:"音色",webspeechVoiceHint:"從瀏覽器或系統提供的語音中選擇",webspeechVoicePlaceholder:"自動(預設語音)",openaiKey:"API 金鑰",openaiKeyHint:"具有 TTS 權限的 OpenAI API Key",openaiUrl:"API 基礎位址",openaiUrlHint:"例如 https://api.openai.com/v1/audio/speech",openaiModel:"模型",openaiModelHint:"tts-1(快速)/ tts-1-hd(高音質)",openaiVoice:"音色",openaiVoiceHint:"用於語音合成的音色",customHint:"支援任何 OpenAI 相容的 TTS 服務——可用於 GPT-SoVITS、CosyVoice 等自部署服務。",customUrl:"API 位址",customUrlHint:"TTS 服務的完整基礎位址",customUrlPlaceholder:"本地適配器中設定的位址,如:http://127.0.0.1:9880",customApiKey:"API 金鑰(選填)",customApiKeyHint:"部分自部署服務需要身份驗證",customApiKeyPlaceholder:"不需要則留空",edgeHint:"由 Microsoft Edge TTS 驅動(node-edge-tts)。",edgeUrl:"適配器位址",edgeUrlHint:"Edge TTS 適配器位址,例如 http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"音色",edgeVoiceHint:"選擇用於語音合成的音色",edgeRate:"語速",edgeRateHint:"調整語音速度(0.5~2.0 倍)",edgePitch:"音調",edgePitchHint:"調整語音音調(-20~+20 Hz)",testTitle:"試聽測試",testText:"測試文字",testTextPlaceholder:"輸入測試文字...",testTextDefault:"你好,這是一個語音測試。",testButton:"試聽",testButtonPlaying:"播放中...",testFailed:"測試失敗:{error}",providerMimo:"MiMo TTS",mimoHint:"小米 MiMo TTS,支援預設音色、音色設計、音色複製三種模式",mimoApiKey:"API Key",mimoApiKeyHint:"在 platform.xiaomimimo.com 取得",mimoApiKeyPlaceholder:"MiMo API Key",mimoAuthMode:"認證方式",mimoAuthModeHint:"所選 MiMo 端點要求的鑑權請求標頭格式",mimoAuthModeBearer:"Bearer Token(Authorization)",mimoAuthModeApiKey:"API Key 標頭(api-key)",mimoAuthModeBoth:"同時傳送兩種標頭",mimoBaseUrl:"Base URL",mimoBaseUrlHint:"MiMo API 端點位址",mimoModel:"模型",mimoModelHint:"選擇語音合成模型",mimoModelPreset:"預設音色",mimoModelVoiceDesign:"音色設計",mimoModelVoiceClone:"音色複製",mimoVoice:"音色",mimoVoiceHint:"選擇預設音色",mimoVoiceDesignPrompt:"音色描述",mimoVoiceDesignPromptHint:"描述你想要的音色特徵",mimoVoiceDesignPromptPlaceholder:"例如:溫柔的年輕女聲,語速稍慢,帶著磁性",mimoCloneAudio:"上傳音訊",mimoCloneAudioHint:"上傳音訊樣本用於音色複製,支援 mp3/wav,最大 10MB",mimoCloneAudioUpload:"選擇檔案",mimoCloneAudioClear:"清除音訊",mimoStylePrompt:"風格指令",mimoStylePromptHint:"可選,用自然語言描述語音風格",mimoStylePromptPlaceholder:"例如:用輕快上揚的語調,語速稍快"}},githubPreview:{title:"版本預覽",description:"將選取的 GitHub tag 複製到 Web UI 預覽工作目錄,安裝依賴並以開發連接埠執行。",refresh:"重新整理",selectTag:"選擇 tag",prepare:"準備程式碼",install:"安裝依賴",start:"開啟預覽",stop:"停止",note:"預覽程式碼存放在 Web UI 資料目錄下。正式環境仍使用 8648,預覽開發環境使用前端 8651、後端 8650。",path:"預覽路徑",webuiHome:"預覽資料目錄",currentTag:"目前 Tag",repoReady:"倉庫就緒",dependencies:"依賴已安裝",running:"執行狀態",notRunning:"未執行",open:"開啟預覽",log:"操作日誌路徑",logOutput:"日誌輸出",actionLog:"操作日誌",devLog:"開發服務日誌",yes:"是",no:"否",actionFailed:"操作失敗",nodeEnvironmentMissing:"未偵測到可用的 Node/npm 環境,請先安裝 Node.js 後重試。",prepareSuccess:"預覽程式碼已準備好",installSuccess:"依賴安裝完成",startSuccess:"預覽已完成",stopSuccess:"預覽已停止"},codingAgents:{title:"編程工具",notice:"並非所有提供商和模型都相容。",claudeDescription:"Anthropic CLI,適合 print mode 單次任務和互動式編程工作階段。",codexDescription:"OpenAI CLI,以及 Hermes openai-codex 提供商的倉庫任務流程。",copyCommand:"複製",commandCopied:"命令已複製",commandCopyFailed:"複製失敗",refresh:"重新整理",checking:"偵測中",installStatus:"安裝狀態",installed:"已安裝",notInstalled:"未安裝",installRequired:"{agent} 未安裝,請先安裝後再建立會話。",installNow:"安裝",installing:"安裝中",installSuccess:"安裝完成",installFailed:"安裝失敗",installFailedHermesHint:"安裝失敗,請讓 Hermes 幫你安裝。",installFailureReason:"錯誤原因",nodeEnvironmentMissing:"未偵測到可用的 Node/npm 環境,請先安裝 Node.js 後重試。",deleteNow:"刪除",deleting:"刪除中",deleteSuccess:"刪除完成",deleteFailed:"刪除失敗",configFiles:"設定檔",profileScope:"設定",providerScope:"提供商",providerPlaceholder:"例如 custom:glm",modelScope:"模型",modelPlaceholder:"選擇模型",launchModeScope:"啟動方式",launchModeGlobal:"全域預設設定",launchModeScoped:"選擇提供商和模型",protocolScope:"協議",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"重新讀取設定",configFileNotCreated:"未建立",configLoadFailed:"讀取設定檔失敗",loadFailed:"偵測編程工具失敗",launch:"啟動",launchTitle:"啟動編程工具",nativeTerminal:"原生終端機",builtInTerminal:"內建終端機",launchPrepared:"啟動設定已產生",launchPrepareFailed:"產生啟動設定失敗",nativeLaunchStarted:"已開啟原生終端機",nativeLaunchFailed:"開啟原生終端機失敗",terminalTitle:"編程工具終端機",loadProvidersFailed:"讀取目前設定的提供商失敗",selectProviderModel:"請選擇提供商和模型",launchConfigDir:"啟動設定目錄",launchCommand:"啟動命令",table:{tool:"工具",kind:"步驟",command:"命令",note:"說明",action:"操作"},kinds:{install:"安裝",auth:"認證",health:"檢查",run:"執行"},notes:{claudeInstall:"全域安裝 Claude Code CLI。",codexInstall:"全域安裝 Codex CLI。",claudeAuth:"檢查 Claude Code 登入狀態;未登入時先執行 claude。",codexAuth:"新增 Hermes 管理的 OpenAI Codex OAuth 憑證。",claudeHealth:"檢查自動更新器和本機 CLI 健康狀態。",codexHealth:"確認 Codex CLI 已在 PATH 中可用。",claudeRun:"Print mode 最適合 API 驅動的單次任務。",codexRun:"Codex 單次任務需要在 git 倉庫中執行。"}},platform:{requireMention:"需要 {'@'}提及",requireMentionGroup:"群組中需要 {'@'}機器人 才會回應",requireMentionChannel:"頻道中需要 {'@'}機器人 才會回應",requireMentionRoom:"房間中需要 {'@'}機器人 才會回應",reactions:"表情回應",reactionsHint:"對訊息新增表情回應",freeResponseChats:"自由回應聊天",freeResponseChatsHint:"不需要 {'@'}提及即回應的聊天 ID(逗號分隔)",freeResponseChannels:"自由回應頻道",freeResponseChannelsHint:"不需要 {'@'}提及即回應的頻道 ID(逗號分隔)",freeResponseRooms:"自由回應房間",freeResponseRoomsHint:"不需要 {'@'}提及即回應的房間 ID(逗號分隔)",mentionPatterns:"自訂提及模式",mentionPatternsHint:"額外的觸發模式清單",autoThread:"自動建立討論串",autoThreadHint:"{'@'}提及後自動建立回覆討論串",autoThreadHintRoom:"在房間中自動建立回覆討論串",dmMentionThreads:"DM 提及討論串",dmMentionThreadsHint:"在私聊中也使用討論串回覆提及",allowBots:"允許機器人訊息",allowBotsHint:"回應其他機器人傳送的訊息",allowedChannels:"允許的頻道",allowedChannelsHint:"白名單頻道 ID(逗號分隔)",ignoredChannels:"忽略的頻道",ignoredChannelsHint:"不回應的頻道 ID(逗號分隔)",noThreadChannels:"無討論串頻道",noThreadChannelsHint:"不建立討論串的頻道 ID(逗號分隔)",exclusiveTokenWarning:"此平台使用獨占 token 鎖。每個 profile 必須使用不同的身份 token,否則會與其他 profile 衝突導致 gateway 啟動失敗。",botToken:"Bot Token",botTokenHint:"開發者入口網站取得的 Bot Token",proxyUrl:"代理 URL",proxyUrlHint:"可選的平台專用代理,支援 http://、https:// 和 socks5://",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 伺服器位址",matrixUserId:"Matrix 使用者 ID",matrixUserIdHint:"密碼登入必填;Access Token 登入可選",matrixPassword:"Matrix 密碼",matrixPasswordHint:"可替代 Access Token 的登入密碼",appId:"App ID",appIdHint:"飛書 App ID",appSecret:"App Secret",appSecretHint:"飛書 App Secret",encryptKey:"加密金鑰",encryptKeyHint:"飛書加密金鑰",verificationToken:"驗證權杖",verificationTokenHint:"飛書驗證權杖",clientId:"Client ID",clientIdHint:"釘釘 Client ID",clientSecret:"Client Secret",clientSecretHint:"釘釘 Client Secret",cardTemplateId:"AI 卡片範本 ID",cardTemplateIdHint:"釘釘 AI 卡片範本 ID;留空則不啟用 AI 卡片",allowedUsers:"允許使用者",allowedUsersHint:"使用者 ID 或 OpenID 白名單,多個請用英文逗號分隔",allowAllUsers:"允許所有使用者",allowAllUsersHint:"允許任意使用者發起訊息;關閉後使用白名單",botId:"Bot ID",botIdHint:"企業微信 Bot ID",wecomSecretHint:"企業微信 Bot Secret",waEnabled:"啟用 WhatsApp",waEnabledHint:"透過 QR Code 配對啟用 WhatsApp",weixinToken:"微信 Token",weixinTokenHint:"透過 weixin CLI 掃碼登入取得 (hermes weixin)",accountId:"Account ID",accountIdHint:"微信 Account ID",qrLogin:"掃碼登入",qrRelogin:"重新登入",qrFetching:"正在取得 QR Code...",qrScanHint:"使用微信掃描 QR Code 登入",qrScanedHint:"已掃描,請在手機上確認...",qqAppId:"App ID",qqAppIdHint:"QQ 開放平台機器人 App ID",qqAppSecret:"App Secret",qqAppSecretHint:"QQ 開放平台機器人 App Secret",qqMarkdown:"Markdown 支援",qqMarkdownHint:"啟用 Markdown 格式訊息(部分客戶端可能不支援)",qqSandbox:"沙箱模式",qqSandboxHint:"啟用沙箱環境(測試用)",qqQrScanHint:"使用 QQ 掃描上方 QR Code,或在手機上開啟連結完成綁定"},gateways:{title:"閘道",running:"執行中",stopped:"已停止",started:"已啟動",startFailed:"啟動失敗",stopFailed:"停止失敗"},language:{label:"語言",zh:"中文(簡體)","zh-TW":"繁體中文",en:"English"},terminal:{sessions:"工作階段",newTab:"新增終端機",closeSession:"關閉此工作階段?",sessionExited:"已退出",processExited:"程序已退出,代碼 {code}",noSessions:"目前無終端機工作階段",connectionFailed:"終端機服務連線失敗",connectionClosed:"終端機連線已關閉",connectionError:"終端機連線錯誤"},groupChat:{title:"群聊",createRoom:"建立房間",joinByCode:"透過邀請碼加入",roomName:"房間名稱",roomNamePlaceholder:"輸入房間名稱",inviteCode:"邀請碼",autoGenerate:"自動產生",noRooms:"目前無房間",selectOrCreate:"選擇或建立一個房間開始聊天",agents:"智慧代理",addAgent:"新增智慧代理",selectProfile:"選擇一個設定檔",agentAdded:"智慧代理已新增",selectRoomFirst:"請先選擇一個群組",agentAlreadyInRoom:"該智慧代理已在房間中",agentAddFailedCount:"{count} 個智慧代理未新增:{details}",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",copyRoomLink:"複製房間連結",deleteRoomConfirm:"確定刪除這個房間嗎?",clearContext:"清理上下文",clearContextConfirm:"確定清理目前房間上下文嗎?訊息和壓縮快照會被刪除,智慧代理和成員會保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房間",joinFailed:"加入房間失敗",inputPlaceholder:"輸入訊息... (Enter 發送)",messageDisplayLimit:"群聊最多顯示 600 則訊息",enterCode:"輸入邀請碼",yourName:"你的名稱",yourNamePlaceholder:"輸入你的群聊暱稱",yourDescription:"自我介紹(選填)",yourDescriptionPlaceholder:"介紹一下你自己...",agentName:"Agent 名稱",agentNamePlaceholder:"自訂名稱(留空則使用 profile 名稱)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述這個 agent 的作用...",agentReplying:"正在回覆...",agentCompressing:"正在壓縮上下文...",compressionSettings:"壓縮設定",triggerTokens:"觸發壓縮 Token 數",triggerTokensDesc:"訊息 token 數超過此值時觸發上下文壓縮",maxHistoryTokens:"最大歷史 Token 數",maxHistoryTokensDesc:"壓縮後傳送給 LLM 的最大 token 數",tailMessageCount:"保留最近訊息數",tailMessageCountDesc:"壓縮後保留最近的原始訊息條數",compressionConfig:"壓縮設定",compressionSaved:"壓縮設定已儲存",compressNow:"立即壓縮",compressingInProgress:"正在壓縮中,請稍後"},usage:{title:"用量統計",refresh:"重新整理",totalTokens:"總 Token 數",inputTokens:"輸入",outputTokens:"輸出",totalSessions:"總工作階段數",avgPerDay:"日均 ~{n}",estimatedCost:"預估費用",cacheHitRate:"快取命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"快取",cacheRead:"快取讀取",cacheWrite:"快取寫入",sessions:"工作階段",cost:"費用",noData:"目前無用量資料"},skillsUsage:{title:"技能用量",subtitle:"追蹤 Hermes 工作階段中的技能載入與編輯",refresh:"重新整理",periodSelector:"技能用量期間",periodLabel:"{days}天",summary:"總覽",totalActions:"操作",loads:"載入",edits:"編輯",distinctSkills:"技能數",topSkills:"熱門",dailyTrend:"趨勢",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暫無技能用量資料",loadFailed:"技能用量載入失敗",otherSkills:"其他技能"},files:{title:"檔案",fileTree:"檔案樹",tree:"目錄樹",list:"檔案清單",breadcrumbRoot:"根目錄",newFile:"新增檔案",newFolder:"新增資料夾",upload:"上傳",refresh:"重新整理",open:"開啟",edit:"編輯",preview:"預覽",download:"下載",copyPath:"複製路徑",rename:"重新命名",delete:"刪除",name:"名稱",size:"大小",modified:"修改時間",actions:"操作",emptyDir:"空目錄",loading:"載入中...",confirmDelete:"確定要刪除「{name}」嗎?",confirmDeleteDir:"確定要刪除目錄「{name}」及其所有內容嗎?",deleteFailed:"刪除失敗",deleted:"已刪除",renameTo:"重新命名為",newFileName:"檔案名稱",newFolderName:"資料夾名稱",created:"已建立",createFailed:"建立失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",uploadSuccess:"已上傳 {count} 個檔案",uploadFailed:"上傳失敗",saveFailed:"儲存失敗",saved:"已儲存",unsavedChanges:"有未儲存的變更,是否捨棄?",pathCopied:"路徑已複製",fileTooLarge:"檔案過大(最大 10MB)",permissionDenied:"無法修改受保護的檔案",notFound:"檔案或目錄不存在",backendError:"檔案操作失敗",dragDropHint:"拖曳檔案至此處上傳",closeEditor:"關閉編輯器",closePreview:"關閉",saveFile:"儲存"},download:{downloading:"正在下載...",downloadFailed:"下載失敗",fileNotFound:"檔案不存在或已被刪除",fileTooLarge:"檔案過大(超過限制)",backendError:"檔案讀取失敗,遠端環境可能不可用",backendTimeout:"檔案讀取逾時",unsupportedBackend:"目前 terminal backend 暫不支援檔案下載",invalidPath:"無效的檔案路徑",contentDisplay:"內容展示",download:"下載",downloadFile:"下載檔案"},changelog:{new_0_6_25_1:"修復 Hermes Agent 0.18.0 下 execute_code 因 Agent Bridge 審批記憶 wrapper 未轉發新的 has_host_access 參數而失敗的問題",new_0_6_24_1:"本版本彙整 0.6.23 之後合併的 PR,重點改進聊天輸入區、工作區可見性、外掛管理、預設模型和工作區 diff 查看體驗",new_0_6_24_2:"單聊和群聊輸入區更新為整合式工具列,模型選擇更精簡,輸入設定集中管理,上下文用量更清楚,行動端樣式更穩,並恢復單聊輸入框手動拖曳高度",new_0_6_24_3:"工作區執行變更會以持久的聊天 diff 卡片展示,右側抽屜支援查看 diff 和編輯檔案,恢復會話後仍能保留,並優化行動端查看體驗",new_0_6_24_4:"工作區目錄選擇器更可靠地支援 Windows 磁碟和 junction 場景,並會顯示 .hermes、.config、.codex 等點前綴目錄,同時保留 WORKSPACE_BASE 安全邊界",new_0_6_24_5:"Plugins 頁面支援啟用或停用可管理的使用者外掛,並能更準確地合併顯示 Hermes 基礎設定和目前 profile 的外掛狀態",new_0_6_24_6:"Models 頁面新增設定預設 provider 和預設模型操作;bridge 終端錯誤識別減少誤報,Hermes Agent runtime 打包升級到 0.18.0,官網版本清單也已更新",new_0_6_23_1:"本次版本整理 0.6.22 之後合併的 PR,重點更新桌面端升級流程、MCP 行程清理、Petdex 寵物、MCU 語音體驗和多處設定入口",new_0_6_23_2:"桌面端自動更新恢復為阻塞式流程,並強化 Windows 更新前的服務關閉;退出桌面端時會更完整地停止 gateway、profile MCP 和相關子行程",new_0_6_23_3:"桌面端 MCP 注入和 Coding Agent MCP 啟動路徑更穩定,Windows workspace 支援磁碟選擇器,並修復符號連結目錄顯示與桌面 Petdex 預覽問題",new_0_6_23_4:"新增 Petdex 寵物體驗:支援 Web 寵物、桌面獨立寵物視窗、領養後即時顯示、右上角關閉按鈕和更合適的桌面初始尺寸",new_0_6_23_5:"MCU 與全域語音體驗升級:增加音訊提示與 OTA 防護,支援分段串流 TTS,自動清理連結、程式碼區塊和表格等不適合朗讀的內容,並能在中斷時停止未完成的語音生成",new_0_6_23_6:"設定與工作流程細節繼續完善:新增 profile 設定編輯、聊天輸入框高度設定、登入 JWT 有效期設定、Skill 編輯、History 本機封存狀態保留,並優化新聊天抽屜和內建 Provider 危險操作文案",new_0_6_22_1:"本次版本整理 0.6.21 之後合併的 PR,重點更新組合模型、會話歷史、代理設定、斜線命令和行動端布局細節",new_0_6_22_2:"模型頁面新增組合模型面板,聊天中可以顯示真實的 MoA reference 與 aggregator 進度,不再依賴舊的前端占位工具",new_0_6_22_3:"聊天會話支援從會話列表封存,並可在歷史記錄中還原;本機-only 的 Claude Code 和 Codex 會話也會正確出現在歷史記錄中",new_0_6_22_4:"設定頁新增代理標籤頁,可設定 gateway 全域 HTTP(S)、ALL_PROXY 和 NO_PROXY,並支援 Telegram、Discord、Matrix 的平台代理",new_0_6_22_5:"Hermes 聊天新增 /learn 命令,Agent Bridge 執行會使用所選 workspace 作為 cwd;由於 Hermes Agent 最新版本尚未發布,只有桌面端的 /learn 和 MoA 指令能力需要等新版 Hermes Agent 發布後可用",new_0_6_21_1:"本次版本重點涵蓋工作流重跑、MCP 工作流工具、語音設定刪除、Matrix 登入設定、更新清理與文件維護",new_0_6_21_2:"工作流節點訊息改為左側可拖曳寬度的完整單聊抽屜,行動端執行記錄可正常開啟,並支援保留目前節點輸出或清除目前節點後向下重跑",new_0_6_21_3:"Hermes Studio MCP 的 use 工具集新增工作流操作:列表、詳情、建立、更新、刪除、執行、停止、刪除執行記錄,以及從指定節點重跑",new_0_6_21_4:"語音 provider 移除現在會刪除目前 profile 的 provider 設定,而不是只清空 API key;Browser STT 和 Edge TTS 仍作為內建預設項不可刪除",new_0_6_21_5:"Matrix 平台設定支援 user ID 加 password 的登入配置,並在使用密碼登入時正確判斷已設定狀態",new_0_6_21_6:"Web UI restart、update 和應用內升級預設會停止 Agent Bridge broker,避免新版本復用舊 Python bridge 行程",new_0_6_21_7:"單聊、群聊和工作流頂部列對齊更一致;小方盒頁面改為售罄狀態;BSL 授權範圍更清楚;補充 /learn 接入規劃,並移除廢棄 Hermes proxy 程式碼",new_0_6_20_1:"工作流正式上線:可以建立 Agent 節點、連成流程圖,並直接在工作流頁面執行完整流程",new_0_6_20_2:"工作流執行會儲存執行記錄、流程圖快照、節點會話、即時節點狀態和失敗原因,並支援停止與刪除執行記錄",new_0_6_20_3:"工作流查看與編輯更完整:支援執行歷史、唯讀快照、節點聊天記錄查看、更大的連接點,以及未建立工作流時的新增節點提示",new_0_6_20_4:"桌面端啟動時改為讓 agent-browser 根據 AGENT_BROWSER_HOME 解析 Chrome,不再固定舊的可執行檔路徑,並補齊補丁完整性與瀏覽器 stdout 修復",new_0_6_20_5:"支援瀏覽器 runtime 的桌面平台統一固定 Chrome for Testing 149.0.7827.55,避免 runtime 瀏覽器版本回退問題",new_0_6_20_6:"ESP32 和小方盒細節最佳化:更新教學連結,調整淺色背景下的小方盒徽章,並修復 Windows 上流動效果不顯示的問題",new_0_6_19_1:"本次版本包含 0.6.18 之後合併的 16 個 PR,重點改進前端可見的裝置、語音、Coding Agent 和設定體驗",new_0_6_19_2:"Coding Agent 支援在會話中切換模型,新建會話也會正確跟隨全域預設模型",new_0_6_19_3:"MCU 互動更穩定:修復開機 Wi-Fi/boot 狀態閃動、音訊只送到目標裝置,並最佳化實體按鍵雙擊清空與打斷體驗",new_0_6_19_4:"TTS 設定改為依 profile 儲存,語速、音調和測試語音會讀取同一套設定來源",new_0_6_19_5:"Coding Agent 的模型切換不會影響既有會話,並修復自訂 provider key 透傳",new_0_6_19_6:"補齊 skills runtime 過濾、定時任務排序、技能詳情高度限制、Windows 更新恢復、設定備份兜底和 logo 資源壓縮",new_0_6_18_2:"Hermes Studio MCP 拆分為 api、devices 和 use 工具集,新增 session、model、chat-run 與 ops 相關操作",new_0_6_18_3:"聊天和群聊歷史更可靠:UI 歷史與模型上下文分離,空訊息處理更安全,run failed 不再覆蓋既有助手回覆,reasoning 回放也更一致",new_0_6_18_4:"MCU 裝置回饋更清楚:工具呼叫會優先顯示在語音之上,音訊不會過早標記任務完成,活躍裝置登入更穩定,ONLINE/IP 長文字支援捲動",new_0_6_18_5:"語音和訊息工作流新增自訂 HTTP TTS/STT 端點、音訊轉碼、fork 訊息操作、持久化 fork 標記,以及更清楚的上傳錯誤",new_0_6_18_6:"桌面與 runtime 設定更安全:Windows PATH 註冊支援 Unicode,支援發布 Hermes Agent 0.17.0 runtime,並補齊行動端 PWA metadata 和多項 profile/auth 恢復修復",new_0_6_18_7:"各項細節最佳化",new_0_6_17_1:"修復 Codex 和 Claude Code 的對話啟動問題",new_0_6_16_1:"Provider 設定現在會保留自訂 API mode,正確涵蓋 LongCat,支援刪除 v12 Provider,並讓模型目錄同步 auth 和 API-key 圖像 Provider",new_0_6_16_2:"聊天命令新增 reload-skills、網頁標題更新、未知斜線命令透傳,以及排除 tool call 和 tool result 的乾淨 session context API",new_0_6_16_3:"會話導覽更穩定:搜尋包含 Global Agent 會話,新會話依最新活動時間排序,行動端側欄控制恢復,設定 footer 也更穩",new_0_6_16_4:"檔案使用更順手:workspace 全名可懸停查看,單聊和群聊都支援把檔案拖到整個聊天區域上傳",new_0_6_16_5:"平台設定補齊飛書 Webhook 驗證欄位,並完善對應國際化覆蓋",new_0_6_16_6:"skill discovery 支援 symlink 目錄,共享的本地 skills 現在能穩定顯示",new_0_6_16_7:"大型靜態資源不再走動態 Brotli 壓縮,打包 Web UI 在高負載下交付更穩",new_0_6_16_8:"新增 outbound relay 和 MCU 登入流程,方便 connector 類整合接入",new_0_6_16_9:"Web UI CLI 新增 --no-open 參數,更適合 scripts 和 headless 啟動場景",new_0_6_16_10:"Linux 桌面 viewport 尺寸和即時壓縮狀態列完成布局打磨,介面更穩定",new_0_6_15_1:"聊天側欄完成重新設計,並最佳化歷史載入控制,長對話中的導覽更清晰",new_0_6_15_2:"新增技能命令選擇器,可以更快發現並從輸入框插入可用的 skill 命令",new_0_6_15_3:"新增 Claude 和 Gemini OAuth Provider,修正 Gemini 模型 ID 正規化,並支援在模型選擇器中手動刷新 config.yaml 變更",new_0_6_15_4:"Thinking 狀態更新了指示器和工具列布局,reasoning 進度更容易閱讀,也不會打斷訊息流",new_0_6_15_5:"深色主題下 input 和 select 等表單控制項的邊框恢復可見",new_0_6_15_6:"Runtime 啟動流程會先檢查本機 runtime,再展示下載來源選擇,並在啟動繼續時保持檢查狀態可見",new_0_6_15_7:"桌面端自動更新不再被殘留應用程式行程阻塞,Windows 退出時的 gateway 清理也更完整",new_0_6_15_8:"應用退出時會停止託管的 gateways;在託管運行期間,異常退出的 gateway 仍會自動拉起",new_0_6_15_9:"桌面端退出時會更平滑地關閉 server,減少 backend、bridge 和 gateway 孤兒行程殘留",new_0_6_15_10:"README 和官網展示改為一張動圖 walkthrough,官網頂部 Hero 使用單獨的靜態預覽圖",new_0_6_13_1:"Alibaba Coding Plan 新增 qwen3.7-plus 模型預設",new_0_6_13_2:"檔案處理更安全:路徑校驗支援字面量點號,並拒絕異常編碼的技能匯入檔名",new_0_6_13_3:"聊天在行動端和不支援 speech synthesis 的瀏覽器中更穩定",new_0_6_13_4:"Agent 失敗時會保留 bridge 錯誤尾部資訊,Claude Code root 權限啟動也更可靠",new_0_6_13_5:"桌面更新更可靠:Windows 升級會關閉殘留 Hermes Studio 行程,優先檢查 Cloudflare,並保留 GitHub 更新源兜底",new_0_6_13_6:"發佈自動化調整:Web UI 和 Docker release 不再標記為 GitHub Latest,完整桌面 release 手動建置成功後才提升為 Latest"}},Pr={login:{title:"Hermes Web UI",description:"ユーザー名とパスワードを入力して続行してください。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",defaultCredentialsHint:"既定のユーザー名:admin、既定のパスワード:123456",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",lockResetHint:"自分のサーバーの場合は、次のコマンドでログインロックを解除できます:",defaultLoginResetHint:"既定の admin パスワードをリセットするには、次を実行してください:",sessionExpired:"ログインの有効期限が切れました。再度ログインしてください。",accessDenied:"このリソースにアクセスする権限がありません。",passwordMismatch:"パスワードが一致しません",passwordTooShort:"パスワードは6文字以上必要です",setupSuccess:"パスワードログインが設定されました",passwordChanged:"パスワードが変更されました",passwordRemoved:"パスワードログインが削除されました",setupPassword:"パスワードログインを設定",changePassword:"パスワードを変更",changeUsername:"ユーザー名を変更",removePasswordLogin:"削除",username:"ユーザー名",currentPassword:"現在のパスワード",newPassword:"新しいパスワード",confirmPassword:"パスワード確認",newUsername:"新しいユーザー名",usernameChanged:"ユーザー名が変更されました",usernameTooShort:"ユーザー名は2文字以上必要です",setupDescription:"ログインに使用するユーザー名とパスワードを管理します。",removeConfirm:"ユーザーアカウントにはパスワードログインが必要です。",passwordLoginNotConfigured:"パスワードログイン未設定",passwordLoginConfigured:"現在のアカウント:{username}",defaultCredentialTitle:"既定のアカウント情報を変更してください",defaultCredentialMessage:"現在のログインアカウントは、既定のユーザー名または既定のパスワードをまだ使用しています。不正アクセスを防ぐため、できるだけ早く現在のアカウントでユーザー名とパスワードを変更してください。",defaultCredentialAction:"変更する",defaultCredentialLater:"後で通知"},users:{title:"アカウント管理",description:"ユーザーを作成し、ロールを割り当て、通常管理者がアクセスできるプロファイルを制御します。",create:"ユーザー作成",edit:"ユーザー編集",username:"ユーザー名",role:"ロール",statusLabel:"ステータス",profiles:"アクセス可能なプロファイル",profilesPlaceholder:"アクセス可能なプロファイルを選択",allProfiles:"すべてのプロファイル",noProfiles:"プロファイル未割り当て",lastLogin:"最終ログイン",newPasswordOptional:"新しいパスワード(空欄なら変更なし)",loadFailed:"ユーザー一覧の読み込みに失敗しました",deleteConfirm:"このユーザーを削除しますか?",enable:"有効化",disable:"無効化",roles:{superAdmin:"スーパー管理者",admin:"管理者"},status:{active:"有効",disabled:"無効"}},common:{loading:"読み込み中...",cancel:"キャンセル",retry:"再試行",reset:"リセット",delete:"削除",edit:"編集",save:"保存",saved:"保存しました",update:"更新",create:"作成",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",ok:"OK",copied:"コピーしました",copy:"コピー",noData:"データがありません",fetch:"取得",add:"追加",enable:"有効化",disable:"無効化",configured:"設定済み",notConfigured:"未設定",confirm:"確認",expand:"展開",collapse:"折りたたむ",stop:"停止",start:"開始",expired:"期限切れ"},mcp:{title:"MCP サーバー",loadFailed:"MCP サーバーの読み込みに失敗しました",reloadAll:"すべて再読み込み",refresh:"更新",total:"合計",connected:"接続済み",disconnected:"未接続",tools:"ツール",tool:"ツール",searchPlaceholder:"サーバーを検索...",addServer:"+ サーバーを追加",zeroTools:"0 個のツール",loading:"読み込み中...",empty:"MCP サーバーが設定されていません",reloaded:"{server} を再読み込みしました",reloadedAll:"すべての MCP サーバーを再読み込みしました",reloadFailed:"再読み込みに失敗しました",serverAdded:'サーバー "{name}" を追加しました',addFailed:"サーバーの追加に失敗しました",serverUpdated:'サーバー "{name}" を更新しました',updateFailed:"サーバーの更新に失敗しました",saveFailed:"保存に失敗しました",serverRemoved:'"{name}" を削除しました',enabled:"有効化: {name}",disabled:"無効化: {name}",connectedStatus:"接続済み",disconnectedStatus:"未接続",disabledStatus:"無効",toolList:"ツール一覧",count:" ",more:"件",removeFailed:"サーバーの削除に失敗しました",testOk:"テスト成功 — {count} 個のツールが利用可能",testEmpty:"テスト結果にツールがありません",testFailed:"テストに失敗しました",edit:"編集",test:"テスト",reload:"再読み込み",remove:"削除",confirmRemove:'サーバー "{name}" を削除しますか?',cancel:"キャンセル",add:"追加",save:"保存",addTitle:"MCP サーバーを追加",editTitle:"MCP サーバーを編集",invalidJson:"JSON形式エラー",invalidYaml:"YAML 形式が無効です",invalidConfig:"設定形式が無効です",invalidServerConfig:"サーバー設定が無効です",missingCommandOrUrl:"command または url が必要です",manageTools:"ツール管理",toolsVisibilityTitle:"ツール可視性管理",fetchTools:"ツールリスト取得",fetchToolsFailed:"ツールリストの取得に失敗しました",toolsMode:"モード:",toolsModeAll:"すべて",toolsModeInclude:"含める",toolsModeExclude:"除外",toolsListHeader:"ツール名",toolsEmpty:"ツールがありません。まずツールリストを取得してください",toolsSummaryAll:"合計 {count} ツール、すべて有効",toolsSummaryInclude:"合計 {total} ツール、{count} 選択済み",toolsSummaryExclude:"合計 {total} ツール、{count} 除外済み",toolsVisibilitySaved:"ツール可視性が保存されました",toolsSelectAll:"すべて選択",toolsClearSelection:"選択をクリア",toolsExcludeAll:"すべて除外",toolsClearExcluded:"除外をクリア"},sidebar:{chat:"チャット",backToChat:"戻る",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",mcp:"MCP",petdex:"Pets",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",performance:"パフォーマンス",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",singleChat:"チャット",globalAgent:"Global Agent",files:"ファイル",devices:"デバイス",groupChat:"グループチャット",groupConversation:"会話",groupConversationShort:"会話",groupAgent:"エージェント",groupAgentShort:"エージェント",groupSystem:"システム",groupSystemShort:"シス",groupMonitoring:"監視",groupMonitoringShort:"監視",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:'ターミナルで "hermes-web-ui update" を実行して更新してください',updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません",versionManagement:"バージョン管理",kanban:"カンバン",workflow:"ワークフロー",groupTools:"ツール",groupToolsShort:"ツール",codingAgents:"コーディングエージェント",versionPreview:"バージョンプレビュー",groupPlatform:"プラットフォーム",gateways:"ゲートウェイ",expand:"メニューを展開",collapse:"メニューを折りたたむ"},runtimeVersions:{title:"バージョン管理",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"プラットフォーム",currentWebUi:"現在の Web UI",activeVersion:"有効なバージョン",active:"有効",installed:"インストール済み",download:"ダウンロード",downloadGithub:"GitHub からダウンロード",downloadCf:"Cloudflare からダウンロード",github:"GitHub",cf:"Cloudflare",useVersion:"次回起動時に使用",deleteVersion:"削除",deleteRuntimeConfirm:"Hermes Runtime {version} を削除しますか?",deleteWebUiConfirm:"Web UI {version} を削除しますか?",deleteRuntimeSuccess:"Runtime を削除しました",deleteWebUiSuccess:"Web UI を削除しました",refresh:"更新",noVersions:"利用可能なバージョンはありません",remoteLoadFailed:"リモートバージョンの読み込みに失敗しました",downloadTasks:"ダウンロードタスク",downloadStarted:"ダウンロードを開始しました",activateSuccess:"バージョン選択を保存しました。Hermes Studio を再起動すると反映されます。",jobStatus:{queued:"待機中",running:"実行中",completed:"完了",failed:"失敗"},jobStageStatus:{queued:"待機中",resolve:"解決中",download:"ダウンロード中",verify:"検証中",extract:"展開中",install:"インストール中",completed:"完了",failed:"失敗"},jobStage:{queued:"待機中",download:"ダウンロード中",resolveRuntime:"Runtime パッケージを解決中",verifyRuntime:"Runtime アーカイブを検証中",extractRuntime:"Runtime アーカイブを展開中",installRuntime:"Runtime をインストール中",resolveWebUi:"Web UI パッケージを解決中",verifyWebUi:"Web UI アーカイブを検証中",extractWebUi:"Web UI アーカイブを展開中",installWebUi:"Web UI をインストール中",completed:"完了",failed:"失敗"}},devices:{title:"デバイス",count:"{count} 台のデバイス",lastScanned:"最終スキャン: {time}",refresh:"更新",empty:"デバイスが見つかりません",computer:"コンピューター",endpointLabel:"エンドポイント",statusLabel:"ステータス",online:"オンライン",offline:"オフライン",address:"アドレス",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"レイテンシ",lastSeen:"最終検出",open:"開く",never:"なし",unknown:"不明",loadFailed:"デバイスの読み込みに失敗しました",scanFailed:"デバイスのスキャンに失敗しました",updateFailed:"デバイスの更新に失敗しました",duplicateRequest:"保留中のペアリング申請がすでにあります",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"処理済み",unprocessed:"未処理",deleteHistory:"記録を削除",deleteHistoryConfirm:"この申請記録を削除し、このデバイスの接続権限を取り消しますか?",requests:"申請一覧",requestsWithCount:"申請一覧 ({count})",noRequests:"申請はありません",requestPairing:"ペアリングを申請",paired:"ペアリング済み",approve:"承認",reject:"拒否",block:"ブロック",unblock:"ブロック解除",inboundStatus:{none:"申請可能",pending:"保留中",approved:"承認済み",rejected:"拒否済み",blocked:"ブロック中"},outboundStatus:{none:"未ペアリング",pending:"申請済み",approved:"ペアリング済み",rejected:"拒否済み",blocked:"ブロックされています"},endpoint:{web:"Web",desktop:"デスクトップ",custom:"カスタム"}},performance:{title:"パフォーマンス",subtitle:"システムリソース、Bridge Broker、Workers、アクティブセッションを確認",refresh:"更新",autoRefreshOn:"自動更新",autoRefreshOff:"手動更新",loadFailed:"パフォーマンスデータの読み込みに失敗しました",systemCpu:"システム CPU",systemMemory:"システムメモリ",activeSessions:"アクティブセッション",runningSessions:"実行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 合計メモリ",processes:"プロセス",uptime:"稼働時間",running:"実行中",stopped:"停止",workerMemory:"Worker メモリ",lastUpdated:"更新時刻",profile:"Profile",memory:"メモリ",sessions:"セッション",runningActiveSessions:"実行中 / アクティブ",lastUsed:"最終使用",status:"状態",noWorkers:"Worker はありません",sessionsByProfile:"Profile 別セッション",noActiveSessions:"アクティブセッションはありません"},drawer:{terminal:"ターミナル",files:"ワークスペース"},chat:{contextRemaining:"残り",contextClickToEdit:"クリックしてコンテキスト長を編集",contextEditTitle:"コンテキスト長を編集",contextEditDesc:"現在のモデルのコンテキスト長制限を設定(トークン数)",contextEditPlaceholder:"コンテキスト長を入力",contextEditHint:"一般的な値:256k (Hermes 既定), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"キャンセル",contextEditInvalid:"有効なコンテキスト長を入力してください",contextEditSuccess:"コンテキスト長を更新しました",contextEditFailed:"更新に失敗しました",emptyState:"Hermes Agent と会話を開始しましょう",emptyStateAgent:"{agent} と会話を開始しましょう",viewOlderInHistory:"以前のメッセージは履歴で表示",scrollToBottom:"一番下へ移動",outlineTitle:"会話アウトライン",outlineEmpty:"会話内容はありません",outlineUserQuestion:"ユーザーの質問",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",inputHeightResizeHint:"ドラッグして入力欄の高さを変更。ダブルクリックでリセット。",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",learn:"説明されたソースから再利用可能なスキルを学習",plan:"Markdown の実装計画を作成",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"現在の表示をクリア",clearHistory:"このセッションの保存済みメッセージ履歴を削除",title:"このセッション名を変更",compress:"アイドル時にコンテキスト圧縮を実行",steer:"実行中の Bridge に誘導テキストを送信",destroy:"このセッションの Bridge Agent を解放",reloadMcp:"MCP サーバーを再読み込み",reloadSkills:"スキルコマンドを再読み込み"},attachFiles:"ファイルを添付",reasoningEffort:{tooltip:"推論の労力",defaultLabel:"既定",options:{default:"既定 (config.yaml)",none:"なし",minimal:"最小",low:"低",medium:"中",high:"高",xhigh:"最高"}},showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",allProfiles:"すべてのプロファイル",profileMissingModelsTip:"このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"Hermes 履歴",historyScopeHint:"現在の profile の Hermes 履歴セッションをソース別に読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",agent:"Agent",approvalKicker:"ターミナル権限",approvalTitle:"実行前にコマンドを確認",approvalAgree:"同意",approvalAllowOnce:"一度だけ許可",approvalAllowSession:"セッション中は許可",approvalAlways:"常に許可",approvalDeny:"拒否",clarifyKicker:"エージェントの確認が必要",clarifyTitle:"エージェントが質問があります",clarifyPlaceholder:"回答を入力...",clarifySubmit:"返信",clarifyDismiss:"閉じる",deleteSession:"このセッションを削除しますか?",toggleBatchMode:"一括選択",selectAll:"すべて選択",confirmBatchDelete:"{count}件のセッションを削除しますか?",batchDeleteSuccess:"{count}件のセッションを削除しました",batchDeletePartial:"{failed}件の削除に失敗しました",batchDeleteFailed:"一括削除に失敗しました",importToWebUi:"Web UI にインポート",importSessionSuccess:"セッションを Web UI にインポートしました",importSessionAlreadyExists:"セッションは既に Web UI に存在します",importSessionFailed:"セッションのインポートに失敗しました",sessionDeleted:"セッションを削除しました",rename:"名前変更",archiveSession:"アーカイブ",unarchiveSession:"アーカイブ解除",pin:"ピン留め",unpin:"ピン留め解除",pinned:"ピン留め",chatMode:"チャット",liveMode:"ライブ",liveSessions:"ライブセッション",recentBadge:"最近",linkedSessions:"{count} 件の関連",noVisibleMessages:"人間向けに表示できるメッセージはありません。",monitorRoleUser:"ユーザー",monitorRoleAssistant:"アシスタント",copySessionLink:"セッションリンクをコピー",openSessionInNewTab:"新しいタブで開く",sessionLinkCopied:"Session link copied",copySessionId:"セッション ID をコピー",export:"エクスポート",editConfig:"設定を編集",exportFull:"フルエクスポート (JSON)",exportCompressed:"圧縮エクスポート (TXT)",exportCompressing:"コンテキストを圧縮中、お待ちください...",exportSuccess:"セッションをエクスポートしました",exportFailed:"エクスポートに失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",sessionArchived:"セッションをアーカイブしました",archiveSessionFailed:"セッションのアーカイブに失敗しました",sessionUnarchived:"セッションのアーカイブを解除しました",unarchiveSessionFailed:"セッションのアーカイブ解除に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",workspaceChanges:"ワークスペース変更",changedFiles:"{files} ファイルを変更",diffUnavailable:"diff を表示できません",binaryFileDiffUnavailable:"バイナリファイルの diff は表示できません",truncated:"... (省略)",unchangedLines:"変更なし {count} 行",executionDuration:"実行時間",thinkingLabel:"思考過程",thinkingInProgress:"思考中",thinkingShow:"思考過程を表示",thinkingHide:"思考過程を隠す",thinkingDuration:"観測 {duration}",thinkingChars:"{count} 文字",copyBubble:"メッセージをコピー",copiedBubble:"コピーしました",copyFailed:"コピーに失敗しました",playSpeech:"音声を読み上げ",pauseSpeech:"一時停止",resumeSpeech:"再開",stopSpeech:"停止",speechNotSupported:"このブラウザは音声読み上げをサポートしていません",searchEnterHint:"Enter で開く · Esc で閉じる",searchHint:"Cmd/Ctrl+K",searchScope:"検索範囲: Web UI のローカルセッション DB のみ。読み取り専用の Hermes 履歴セッションは含まれません。",searchFailed:"セッション検索に失敗しました",searchNoSnippet:"表示できる要約がありません",searchNoResults:"一致するセッションがありません",searchRecent:"最近のセッション",searchEmpty:"最近のセッション",searchPlaceholder:"セッションを検索...",searchSubtitle:"タイトルまたはメッセージ内容で検索",searchTitle:"セッション検索",stopGateway:"Gateway を停止",start:"開始",workspaceSetFailed:"Workspace の設定に失敗しました",workspaceSet:"Workspace を設定しました",workspacePlaceholder:"プロジェクトパスを入力 例: /home/user/project",folderPickerEmpty:"(空)",folderPickerNoFolders:"Workspace フォルダがありません",folderPickerSelected:"選択済み:",workspace:"ワークスペース",setWorkspaceTitle:"セッション Workspace を設定",setWorkspace:"Workspace を設定",modelSetFailed:"モデルの設定に失敗しました",modelSet:"モデルを設定しました",setModelTitle:"セッションモデルを設定",setModel:"モデルを設定",newCliChat:"新規 CLI",cliEmptyState:"CLI チャットを開始",autoPlaySpeech:"音声を自動再生",voiceInput:{startCapture:"音声入力を開始",stopCaptureAndInsert:"音声入力を停止して入力欄に挿入",cancelCapture:"音声入力をキャンセル",statusLabel:"状態: {status}",transcriptLabel:"文字起こし: {text}",errorLabel:"エラー: {error}",recentEvents:"最近のイベント",status:{idle:"待機中",capturing:"聞き取り中",transcribing:"文字起こし中",sending:"入力欄へ挿入中",error:"エラー"},browserSpeechUnsupported:"このブラウザは内蔵音声認識に対応していません。",browserSpeechFailed:"ブラウザ音声認識に失敗しました。",browserSpeechFailedWithReason:"ブラウザ音声認識に失敗しました: {error}。",microphoneUnsupported:"このブラウザはマイク録音に対応していません。",microphoneRecordingFailed:"マイク録音に失敗しました。"}},jobs:{title:"スケジュールジョブ",createJob:"ジョブを作成",editJob:"ジョブを編集",noJobs:"スケジュールジョブがありません。作成して始めましょう。",sortBy:"並べ替え",sortByName:"名前順",sortByTime:"日付順",sortByNameHint:"名前で並べ替え",sortByTimeHint:"日付で並べ替え",sortAsc:"昇順",sortDesc:"降順",name:"名前",namePlaceholder:"ジョブ名",schedule:"スケジュール (Cron 式)",schedulePlaceholder:"例: 0 9 * * *",quickPresets:"クイックプリセット",selectPreset:"プリセットを選択...",presetEveryMinute:"毎分",presetEvery5Min:"5分ごと",presetEveryHour:"毎時",presetEveryDay:"毎日 00:00",presetEveryDay9:"毎日 09:00",presetEveryMonday:"毎週月曜 09:00",presetEveryMonth:"毎月1日 09:00",prompt:"プロンプト",promptPlaceholder:"実行するプロンプト",skills:"スキル",skillsPlaceholder:"スキルを選択...",deliverTarget:"配信先",origin:"配信元",local:"ローカル",repeatCount:"繰り返し回数(任意)",modelPlaceholder:"デフォルトモデル",repeatPlaceholder:"空白の場合は無制限",jobCreated:"ジョブを作成しました",jobUpdated:"ジョブを更新しました",nameRequired:"名前は必須です",scheduleRequired:"スケジュールは必須です",loadFailed:"ジョブの読み込みに失敗しました",jobPaused:"ジョブを一時停止しました",jobResumed:"ジョブを再開しました",jobTriggered:"ジョブをトリガーしました",modelUpdated:"モデルを更新しました",jobDeleted:"ジョブを削除しました",status:{running:"実行中",paused:"一時停止",disabled:"無効",scheduled:"スケジュール済み"},info:{model:"モデル",schedule:"スケジュール",lastRun:"前回実行",nextRun:"次回実行",deliver:"配信",repeat:"繰り返し"},action:{pause:"一時停止",pauseJob:"ジョブを一時停止",resume:"再開",resumeJob:"ジョブを再開",runNow:"今すぐ実行",triggerImmediately:"すぐにトリガー"},runHistory:{title:"実行履歴",runs:"件",noRuns:"実行履歴がありません。"}},skills:{title:"スキル",targetFilter:"ランタイム",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"スキルを検索...",noMatch:"検索に一致するスキルがありません",noSkills:"スキルがありません",backTo:"戻る",attachedFiles:"添付ファイル",loadFailed:"スキルの読み込みに失敗しました",fileLoadFailed:"ファイルの読み込みに失敗しました",modified:"ユーザー変更あり",archived:"アーカイブ済み",pinned:"ピン留め",pin:"スキルをピン留め",unpin:"ピン留めを解除",pinFailed:"ピン留め状態の変更に失敗しました",edit:"編集",saving:"保存中...",editorLabel:"スキルエディター",saveSuccess:"スキルを保存しました",saveFailed:"スキルの保存に失敗しました",toggleFailed:"スキルの切り替えに失敗しました",source:{builtin:"組み込み",hub:"Hub",local:"ローカル",external:"外部"},delete:"削除",deleteConfirm:'スキル "{name}" を削除しますか?この操作は取り消せません。',deleteSuccess:"スキルを削除しました",deleteFailed:"削除に失敗しました",import:"インポート",importTitle:"スキルをインポート",importModeZip:"Zip",importModeFolder:"フォルダ",importHintZip:"SKILL.md を含むディレクトリの .zip を選択",importHintFolder:"ローカルのスキルフォルダを選択(SKILL.md が必要)",importTargetCategory:"対象カテゴリ(任意)",importTargetCategoryPlaceholder:"空欄なら misc に配置",importSelectFile:".zip ファイルを選択",importSelectFolder:"フォルダを選択",importInvalidFile:".zip ファイルのみサポート",importFileCount:"ファイル",importNoSelection:"ファイルまたはフォルダを選択してください",importSuccess:"スキルをインポートしました",importFailed:"インポートに失敗しました",path:{local:"ローカル",external:"外部"},externalDirs:{manage:"外部ディレクトリ",title:"外部ディレクトリの管理",hint:"config.skills.external_dirs を管理します。~ と $VAR をサポート。存在しないパスはグレー表示されます。",add:"外部ディレクトリを追加",placeholder:"/path/to/skills または ~/my-skills",empty:"外部ディレクトリはありません",missing:"パスが見つかりません",notDir:"ディレクトリではありません",saveSuccess:"外部ディレクトリを保存しました",saveFailed:"保存に失敗しました",loadFailed:"外部ディレクトリの読み込みに失敗しました",removeRow:"削除"},pathCopied:"パスをコピーしました",pathCopyFailed:"パスのコピーに失敗しました",reloadHint:"アクティブなセッションは /reload-skills を実行してください。新規セッションは自動で読み込みます。",writeApprovalButton:"保留中 {count}",writeApprovalTitle:"書き込み承認待ち",writeApprovalDescription:"Hermes Agent が保留したメモリとスキルの書き込みを承認または拒否します。",writeApprovalRefresh:"更新",writeApprovalEmpty:"承認待ちの書き込みはありません。",writeApprovalUnsupported:"この Hermes Agent バージョンは書き込み承認に対応していません。この機能を使うには Hermes Agent を更新してください。",writeApprovalMemory:"メモリ",writeApprovalSkills:"スキル",writeApprovalViewDiff:"確認",writeApprovalHideDiff:"隠す",writeApprovalNoDiff:"表示できる差分はありません。",writeApprovalLoadFailed:"承認待ちの書き込みを読み込めませんでした",writeApprovalDiffFailed:"書き込み詳細を読み込めませんでした",writeApprovalActionFailed:"承認待ちの書き込みを処理できませんでした",writeApprovalApproved:"書き込みを承認しました",writeApprovalRejected:"書き込みを拒否しました",writeApprovalApprove:"承認",writeApprovalReject:"拒否",writeApprovalPendingMemoryWrite:"承認待ちのメモリ書き込み",writeApprovalCurrentFile:"現在の {file}",writeApprovalProposedFile:"提案された {file}",writeApprovalDiffSection:"差分",writeApprovalPatchOldStringMissing:"パッチの old_string が現在の {file} に見つからないため、承認してもファイルは変更されません。",writeApprovalRequestedOldString:"要求された old_string",writeApprovalCurrentReadFailed:"現在の {file} を UTF-8 テキストとして読み取れませんでした。",writeApprovalDeleteSkill:"この承認によりスキル {skill} が削除されます。",writeApprovalRemoveFile:"この承認によりスキル {skill} から {file} が削除されます。"},plugins:{title:"プラグイン",refresh:"更新",notice:"検出可能な Hermes プラグイン manifest のインベントリです。検出メタデータはプラグインコードを読み込まずに取得します。standalone ユーザープラグインはここで有効化または無効化でき、変更は新しい Hermes セッションで有効になります。",loadFailed:"プラグインの読み込みに失敗しました",updateFailed:"プラグインの更新に失敗しました",enableSuccess:"{name} を有効化しました",disableSuccess:"{name} を無効化しました",commandCopied:"コマンドをコピーしました",searchPlaceholder:"key、名前、説明、パスを検索...",source:"ソース",kind:"種類",statusTitle:"ステータス",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"コマンドをコピー",managedElsewhere:"他で管理されています",noMatch:"現在のフィルターに一致するプラグインはありません",enabled:"有効",disabled:"無効",summary:{total:"合計",active:"有効 / 自動",inactive:"非アクティブ",disabled:"無効",providerManaged:"プロバイダー管理"},status:{enabled:"有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},statusLabel:{enabled:"設定で有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},configStatuses:{enabled:"有効",disabled:"無効","not-enabled":"未有効",auto:"自動","provider-managed":"プロバイダー管理"},table:{plugin:"プラグイン",status:"ステータス",source:"ソース",kind:"種類",capabilities:"機能",path:"パス / entrypoint",manage:"管理"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"エージェントルート",python:"Python",scanCwd:"cwd をスキャン",projectPlugins:"プロジェクトプラグイン"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"メモリ",refresh:"更新",loadFailed:"メモリの読み込みに失敗しました",myNotes:"メモ",noNotes:"メモはまだありません。",notesPlaceholder:"メモを入力...",userProfile:"ユーザープロファイル",noProfile:"プロファイルはまだありません。",profilePlaceholder:"プロファイルを入力...",soul:"ソウル",noSoul:"ソウル設定はまだありません。",soulPlaceholder:"ソウル設定を入力..."},models:{title:"モデル",addProvider:"プロバイダーを追加",refreshModelCache:"モデルキャッシュを更新",refreshModelCacheLoading:"モデルキャッシュを更新中...",refreshModelCacheSuccess:"モデルキャッシュを更新しました",refreshModelCacheFailed:"モデルキャッシュの更新に失敗しました",providerType:"プロバイダー種別",preset:"プリセット",custom:"カスタム",selectProvider:"プロバイダーを選択",chooseProvider:"プロバイダーを選択...",name:"名前",autoGeneratedName:"ベース URL から自動生成",baseUrl:"ベース URL",region:"リージョン",regionIntl:"インターナショナル",regionCn:"中国本土",baseUrlPlaceholder:"例: https://api.example.com/v1",apiKey:"API キー",apiKeyPlaceholder:"sk-...",defaultModel:"デフォルトモデル",selectOrInput:"モデルを選択または入力...",selectModel:"モデルを選択...",providerAdded:"プロバイダーを追加しました",providerDeleted:"プロバイダーを削除しました",providerCredentialsCleared:"プロバイダーの認証情報をクリアしました",clearProviderCredentials:"認証情報をクリア",clearCredentialsConfirm:"「{name}」の保存済み認証情報をクリアしますか?この組み込みプロバイダーは一覧に残り、認証情報を設定すると再び使用できます。",disableProvider:"プロバイダーを無効化",disableProviderConfirm:"組み込みプロバイダー「{name}」を無効化しますか?このプロバイダーは組み込みのままで、後から再度有効化できます。",providerDisabled:"プロバイダーを無効化しました",defaultProviderUpdated:"デフォルトプロバイダーを更新しました",defaultProviderUpdateFailed:"デフォルトプロバイダーの更新に失敗しました",defaultModelUpdated:"デフォルトモデルを更新しました",defaultModelUpdateFailed:"デフォルトモデルの更新に失敗しました",deleteProvider:"プロバイダーを削除",deleteConfirm:"「{name}」を削除しますか?",codexLoginTitle:"OpenAI Codex ログイン",codexWaiting:"認証ページで以下のコードを入力してログインしてください:",codexCopyCode:"コードをコピーしました",codexOpenLink:"認証ページを開く",codexApproved:"ログイン成功",codexExpired:"認証の有効期限が切れました。もう一度お試しください。",nousLoginTitle:"Nous Portal ログイン",nousWaiting:"認証ページでこのコードを入力してください:",nousCopyCode:"コードをコピーしました",nousOpenLink:"認証ページを開く",nousApproved:"ログイン成功",nousDenied:"認証が拒否されました",nousExpired:"認証の有効期限が切れました",copilotLoginTitle:"GitHub Copilot ログイン",copilotWaiting:"GitHub を開き、以下のデバイスコードを入力して認証してください。承認後、ウィンドウは自動的に閉じます。",copilotCopyCode:"コードをコピーしました",copilotOpenLink:"GitHub 認証ページを開く",copilotApproved:"ログインに成功しました!",copilotDenied:"認証が拒否されました。",copilotExpired:"認証リンクの有効期限が切れました。もう一度お試しください。",copilotAddDetectedTitle:"GitHub Copilot を検出しました",copilotAddDetected:"このマシンで GitHub Copilot OAuth トークンを検出しました。「追加」をクリックして Hermes で Copilot を有効化します。",copilotAddSourceEnv:"ソース: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"ソース: gh CLI (gh auth token)",copilotAddSourceAppsJson:"ソース: VS Code Copilot 拡張機能 (apps.json)",copilotDeleteHintEnv:"この操作で ~/.hermes/.env の COPILOT_GITHUB_TOKEN を消去します。他のツールには影響しません。",copilotDeleteHintGhCli:"Copilot は Hermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。",copilotDeleteHintAppsJson:"Copilot は Hermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。",customBadge:"カスタム",previewBadge:"プレビュー",disabledBadge:"利用不可",disabledTooltip:"このモデルは現在のアカウントでは利用できません。",customModelPlaceholder:"未掲載のモデル ID",customModelHint:"プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。",noProviders:"プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。",clearVisibleModels:"選択をクリア",generalTitle:"一般モデル",combinationTitle:"モデルアンサンブル",combinationSubtitle:"MoA プリセットを設定します。参照モデルが先に視点を提示し、その後 1 つの集約モデルが最終回答とツール呼び出しを担当します。",combinationPreset:"プリセット",combinationName:"名前",combinationAddModel:"モデルアンサンブルを追加",combinationEditModel:"モデルアンサンブルを編集",combinationNewPreset:"新しいプリセット",combinationPresetPlaceholder:"例: review",combinationAddPreset:"プリセットを追加",combinationSetDefault:"デフォルトに設定",combinationEnabled:"参照モデルを有効化",combinationReferenceModels:"参照モデル",combinationReferenceModel:"参照モデル",combinationAddReference:"参照モデルを追加",combinationAggregator:"集約モデル",combinationReferenceTemperature:"参照温度",combinationAggregatorTemperature:"集約温度",combinationMaxTokens:"最大トークン",combinationNotSet:"未設定",combinationSaved:"モデルアンサンブルを保存しました",combinationLoadFailed:"モデルアンサンブルの読み込みに失敗しました",combinationSaveFailed:"モデルアンサンブルの保存に失敗しました",combinationPresetExists:"プリセットは既に存在します",combinationNameRequired:"モデルアンサンブル名を入力してください",combinationNameInvalid:"名前に使用できるのは英字、数字、アンダースコア、ハイフン、ドットのみです",combinationReferenceRequired:"少なくとも 1 つの参照モデルを追加してください",combinationAggregatorRequired:"集約モデルを選択してください",auxiliaryTitle:"補助モデル",auxiliarySubtitle:"圧縮、ビジョン、承認、MCP、バックグラウンド保守などの補助タスクごとにモデルを上書きします。",auxiliaryRefresh:"更新",auxiliaryTask:"タスク",auxiliaryTimeout:"タイムアウト",auxiliaryDownloadTimeout:"ダウンロードタイムアウト",auxiliaryActions:"操作",auxiliaryDefault:"デフォルト",auxiliaryCustomEndpoint:"カスタムエンドポイント",auxiliaryProviderAuto:"自動",auxiliaryProviderMain:"メインモデル",auxiliaryProviderPlaceholder:"auto、main、またはプロバイダーキー",auxiliaryDownloadShort:"ダウンロード",auxiliaryExtraBody:"追加 body JSON",auxiliaryClear:"リセット",auxiliarySaved:"補助モデルを保存しました",auxiliaryLoadFailed:"補助モデルの読み込みに失敗しました",auxiliarySaveFailed:"補助モデルの保存に失敗しました",auxiliaryInvalidExtraBody:"追加 body は JSON オブジェクトである必要があります",auxiliaryTaskCompression:"圧縮",auxiliaryTaskVision:"ビジョン",auxiliaryTaskWebExtract:"Web 抽出",auxiliaryTaskSkillsHub:"スキルハブ",auxiliaryTaskApproval:"承認",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"タイトル生成",auxiliaryTaskTriageSpecifier:"トリアージ指定",auxiliaryTaskKanbanDecomposer:"Kanban 分解",auxiliaryTaskProfileDescriber:"プロフィール説明",auxiliaryTaskCurator:"キュレーター",auxiliaryTaskSessionSearch:"セッション検索",auxiliaryTaskFlushMemories:"メモリ書き込み",currentDefault:"現在のデフォルト",defaultShort:"デフォルト",setDefaultProvider:"デフォルトプロバイダーに設定",setDefault:"デフォルトに設定",builtIn:"組み込み",customType:"カスタム",provider:"プロバイダー",contextLength:"コンテキスト長",contextLengthPlaceholder:"例: 256000(任意)",apiMode:"API モード",local:"ローカル ({host})",selectProviderRequired:"プロバイダーを選択してください",baseUrlRequired:"ベース URL は必須です",apiKeyRequired:"API キーは必須です",modelRequired:"デフォルトモデルは必須です",enterBaseUrl:"ベース URL を先に入力してください",unexpectedFormat:"予期しないレスポンス形式です",foundModels:"{count} 個のモデルが見つかりました",fetchFailed:"モデルの取得に失敗しました",xaiWaiting:"開いた xAI ページで認可を完了してください。承認後、このウィンドウは自動で閉じます。",xaiOpenLink:"xAI 認可ページを開く",xaiLoginTitle:"xAI Grok OAuth ログイン",xaiExpired:"認可リンクの期限が切れました。再試行してください。",xaiCopyLink:"認可リンクをコピー",xaiApproved:"ログイン成功!",anthropicLoginTitle:"Claude OAuth ログイン",anthropicWaiting:"Claude の認可ページで認可を完了し、返されたコードをここに貼り付けてください。",anthropicOpenLink:"Claude 認可ページを開く",anthropicCopyLink:"認可リンクをコピー",anthropicCodePlaceholder:"認可コードを貼り付け...",anthropicSubmitCode:"コードを送信",anthropicApproved:"ログイン成功!",anthropicExpired:"認可の有効期限が切れました。再試行してください。",geminiLoginTitle:"Google Gemini OAuth ログイン",geminiWaiting:"開いた Google ページで認可を完了してください。承認後、このウィンドウは自動で閉じます。",geminiOpenLink:"Google 認可ページを開く",geminiCopyLink:"認可リンクをコピー",geminiApproved:"ログイン成功!",geminiExpired:"認可リンクの期限が切れました。再試行してください。",visibilitySelectOne:"少なくとも 1 つの表示モデルを残してください",visibilitySaved:"表示モデルを保存しました",visibilitySaveFailed:"表示モデルの保存に失敗しました",visibilityHint:"Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。",showAllModels:"すべてのモデルを表示",searchPlaceholder:"モデルを検索...",noResults:"結果なし",noModels:"モデルなし",removeCustomModel:"この一覧外モデルを削除",refresh:"モデルリストを更新(config.yaml を再読み込み)",more:"件追加",models:"モデル一覧",manageVisibleModelsFor:"{name} の表示モデルを管理",manageVisibleModels:"表示モデルを管理",getApiKey:"API Key を取得",count:"個のモデル",aliasUseOriginal:"元の ID に戻す",aliasTitleFor:"{model} の表示名",aliasTitle:"モデル表示名",aliasSaveFailed:"表示名の保存に失敗しました",aliasPlaceholder:"空欄の場合は元のモデル ID を使用",aliasManageFor:"{provider} の表示名",aliasManage:"表示名",aliasHint:"Web UI の表示名だけを変更します。Hermes には元のモデル ID が送信されます。",aliasEdit:"名前変更",aliasCanonical:"元の ID: {model}"},profiles:{title:"プロファイル",create:"プロファイルを作成",import:"インポート",export:"エクスポート",rename:"名前変更",delete:"削除",switchTo:"Hermes Profile を切り替え",switchConfirm:"`hermes profile use {name}` を実行し、Hermes CLI の active profile を切り替えます。続行しますか?",switchSuccess:"Hermes active profile を「{name}」に切り替えました",switchFailed:"Hermes Profile の切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。",createSuccess:"プロファイル「{name}」を作成しました",createFailed:"プロファイルの作成に失敗しました",renameSuccess:"プロファイル名を変更しました",renameFailed:"プロファイル名の変更に失敗しました",deleteConfirm:"プロファイル「{name}」を削除しますか?",deleteSuccess:"プロファイルを削除しました",deleteFailed:"プロファイルの削除に失敗しました",exportSuccess:"プロファイルをエクスポートしました",exportFailed:"プロファイルのエクスポートに失敗しました",importSuccess:"プロファイルをインポートしました",importFailed:"プロファイルのインポートに失敗しました",importSelectFile:"アーカイブファイルを選択",importInvalidFile:"有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)",name:"プロファイル名",namePlaceholder:"英数字、ハイフンのみ",nameValidation:"プロファイル名には小文字、数字、アンダースコア、ハイフンのみ使用できます",newName:"新しい名前",newNamePlaceholder:"新しい名前を入力",cloneFromCurrent:"現在のプロファイルから複製",cloneCleanupNotice:"複製時、独占型プラットフォーム認証情報(Weixin / Telegram / Slack など)は自動的にスキップされ、ソースプロファイルとの競合を回避します",cloneStrippedCredentials:"{count} 件の独占認証情報を削除しました:{list}",cloneDisabledPlatforms:"{count} 個のプラットフォームを無効化しました:{list}",cloneStrippedConfigCredentials:"config.yaml から {count} 件の埋め込み認証情報を削除しました:{list}",archivePath:"アーカイブパス",archivePathPlaceholder:"アーカイブファイルのサーバーパス",importName:"プロファイル名(任意)",importNamePlaceholder:"空白の場合はアーカイブ名を使用",active:"アクティブ",model:"モデル",gateway:"ゲートウェイ",alias:"エイリアス",provider:"プロバイダー",path:"パス",skills:"スキル",hasEnv:".env あり",hasSoulMd:"soul.md あり",noProfiles:"プロファイルがありません。作成して始めましょう。",avatar:{title:"カスタムアバター",customize:"アバター",upload:"画像をアップロード",random:"ランダム生成",reset:"デフォルトに戻す",hint:"PNG、JPEG、WebP 対応、最大 1MB",invalidType:"PNG、JPEG、WebP 画像を選択してください",tooLarge:"アバター画像は 1MB 以下にしてください",saveSuccess:"アバターを保存しました",saveFailed:"アバターの保存に失敗しました",resetSuccess:"デフォルトアバターに戻しました",resetFailed:"デフォルトアバターへの復元に失敗しました"},runtime:{activeProfile:"現在: {name}",bridgeWorker:"Bridge 状態",gateway:"ゲートウェイ",active:"アクティブ",activeTag:"現在",idle:"待機中",checking:"確認中",running:"実行中",stopped:"停止中",restartGateway:"Gateway を再起動",restartProfile:"プロファイルを再起動",switchProfile:"フロントエンドプロファイルを切り替え",gatewayRestarted:"Gateway を再起動しました: {name}",gatewayRestartFailed:"Gateway の再起動に失敗しました",profileRestarted:"プロファイルを再起動しました: {name}",profileRestartFailed:"プロファイルの再起動に失敗しました"}},logs:{title:"ログ",all:"すべて",searchPlaceholder:"検索...",refresh:"更新",noEntries:"ログエントリがありません"},settings:{title:"設定",saved:"保存しました",saveFailed:"保存に失敗しました",tabs:{display:"表示",account:"現在のアカウント",users:"アカウント管理",agent:"エージェント",proxy:"プロキシ",memory:"メモリ",compression:"圧縮",session:"セッション",privacy:"プライバシー",apiServer:"API サーバー",models:"モデル",voice:"音声"},display:{streaming:"ストリームレスポンス",streamingHint:"AI の返信をリアルタイムで表示",compact:"コンパクトモード",compactHint:"メッセージの間隔を狭める",showReasoning:"推論過程を表示",showReasoningHint:"モデルの思考プロセスを表示",showCost:"コストを表示",showCostHint:"返信にトークン使用量を表示",inlineDiffs:"インライン差分",inlineDiffsHint:"コード変更をインラインで表示",bellOnComplete:"完了通知音",bellOnCompleteHint:"AI の応答完了時に通知音を再生",notifyOnComplete:"完了通知",notifyOnCompleteHint:"AI の応答完了時にシステム通知を表示",notifyOnCompleteMacHint:"macOS ではシステム設定でブラウザ通知を許可してください。",notifyOnCompleteDenied:"通知権限が拒否されました",notifyOnCompleteInsecure:"ブラウザ通知には HTTPS または localhost が必要です",notifyOnCompleteUnsupported:"このブラウザは通知をサポートしていません",notifyOnCompleteTest:"通知が有効になりました。",notifyOnCompleteTestButton:"テスト",notifyOnCompleteTesting:"テスト通知を送信中...",notifyOnCompleteTestSent:"テスト通知を送信しました",notifyOnCompleteTestFailed:"テスト通知の送信に失敗しました",busyInputMode:"処理中入力モード",busyInputModeHint:"AI 処理中でも入力を許可",theme:"テーマ",themeHint:"ライト、ダーク、またはシステム設定に従う",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム",chatInputHeight:"チャット入力欄の高さ",chatInputHeightHint:"デスクトップでの既定の入力欄高さ(px)。モバイルでは自動高さを維持します。"},agent:{maxTurns:"最大ターン数",maxTurnsHint:"1回の会話の最大インタラクション回数",gatewayTimeout:"ゲートウェイタイムアウト",gatewayTimeoutHint:"リクエストタイムアウト(秒)",restartDrainTimeout:"再起動ドレインタイムアウト",restartDrainTimeoutHint:"再起動前のドレインタイムアウト(秒)",toolEnforcement:"ツール実行ポリシー",toolEnforcementHint:"ツール呼び出しの実行モードを制御",auto:"自動",always:"常に",never:"しない"},gatewayAutoStart:{title:"Gateway 自動起動",description:"Web UI 起動時に自動起動するローカル Hermes profile gateway を制御します。この設定は Web UI 設定に保存され、profile config.yaml には保存されません。",enabled:"Gateway を自動起動",enabledHint:"無効にすると、起動時に profile gateway を自動起動しません。",management:"統一 gateway",managementHint:"Hermes Agent 0.17.0 以降が必要です。有効にすると Web UI が multiplex_profiles を書き込み、default gateway がすべての profiles を処理します。他の profile では Feishu、Weixin、QQBot などのメッセージング入口を個別設定できません。無効にするとその設定を削除します。",managementAuto:"自動",managementPerProfile:"Profile ごとに 1 gateway",managementUnified:"統一 default gateway",mode:"Profile ポリシー",modeHint:"検出されたすべての profiles を起動するか、明示的な許可リストだけを起動します。",modeAll:"検出されたすべての profiles",modeInclude:"含めた profiles のみ",include:"含める profiles",includeHint:"カンマ区切りの profile 名。include モードで空リストの場合は何も起動しません。",exclude:"除外する profiles",excludeHint:"include/all ポリシー適用後にスキップする profile 名をカンマ区切りで指定します。",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway プロキシ",description:"選択中の profile gateway に設定するプロキシ環境変数です。保存すると gateway を再起動し、メッセージングプラットフォームが新しいネットワーク設定を使用します。",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"HTTPS リクエスト用プロキシ。通常はこの値を優先して設定します。",httpProxy:"HTTP_PROXY",httpProxyHint:"通常の HTTP リクエスト用プロキシ。",allProxy:"ALL_PROXY",allProxyHint:"プロトコル別プロキシがない場合のフォールバックプロキシ。",noProxy:"NO_PROXY",noProxyHint:"プロキシを迂回するホストまたはドメインをカンマ区切りで指定します。",save:"プロキシ設定を保存"},memory:{enabled:"メモリを有効化",enabledHint:"AI に会話コンテキストを記憶させる",userProfile:"ユーザープロファイル",userProfileHint:"AI にユーザーの設定を記憶させる",charLimit:"メモリ文字数上限",charLimitHint:"MEMORY.md の最大文字数",userCharLimit:"ユーザープロファイル文字数上限",userCharLimitHint:"USER.md の最大文字数"},compression:{enabled:"圧縮を有効化",enabledHint:"長いチャット履歴がモデルコンテキストを超える前に自動圧縮",threshold:"圧縮しきい値",thresholdHint:"推定トークンがこのコンテキスト比率を超えたら圧縮を開始",targetRatio:"目標比率",targetRatioHint:"圧縮後の履歴サイズをコンテキスト比率で指定",protectLastN:"直近メッセージを保護",protectLastNHint:"この数の最新メッセージは圧縮しない",protectFirstN:"先頭メッセージを保護",protectFirstNHint:"この数の最初のメッセージは圧縮しない"},session:{mode:"リセットモード",modeHint:"セッションリセットのトリガー条件",modeBoth:"アイドル + スケジュール",modeIdle:"アイドルのみ",modeDaily:"スケジュールのみ",modeNone:"無し(手動のみ)",idleMinutes:"アイドルタイムアウト",idleMinutesHint:"自動リセットまでの待機時間(分)",atHour:"スケジュールリセット時刻",humanOnly:"人間のセッションのみ表示",humanOnlyHint:"サブエージェントやセッション監視ノイズを既定で隠します",liveMonitorHumanOnly:"ライブモニター: 人間のセッションのみ表示",liveMonitorHumanOnlyHint:"ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します",atHourHint:"毎日指定時刻にセッションをリセット",requireAuth:"セッション認可",requireAuthHint:"セッション操作に認可を要求します",memoryWriteApproval:"メモリ書き込みを確認",memoryWriteApprovalHint:"Hermes Agent のメモリ書き込みを保存前に承認待ちにします。",skillsWriteApproval:"スキル書き込みを確認",skillsWriteApprovalHint:"Hermes Agent のスキル変更を保存前に承認待ちにします。",writeApprovalTitle:"書き込み承認待ち",writeApprovalDescription:"Hermes Agent が保留したメモリとスキルの書き込みを承認または拒否します。",writeApprovalRefresh:"更新",writeApprovalEmpty:"承認待ちの書き込みはありません。",writeApprovalMemory:"メモリ",writeApprovalSkills:"スキル",writeApprovalViewDiff:"確認",writeApprovalHideDiff:"隠す",writeApprovalNoDiff:"表示できる差分はありません。",writeApprovalLoadFailed:"承認待ちの書き込みを読み込めませんでした",writeApprovalDiffFailed:"書き込み詳細を読み込めませんでした",writeApprovalActionFailed:"承認待ちの書き込みを処理できませんでした",writeApprovalApproved:"書き込みを承認しました",writeApprovalRejected:"書き込みを拒否しました",writeApprovalApprove:"承認",writeApprovalReject:"拒否",writeApprovalPendingMemoryWrite:"承認待ちのメモリ書き込み",writeApprovalCurrentFile:"現在の {file}",writeApprovalProposedFile:"提案された {file}",writeApprovalDiffSection:"差分",writeApprovalPatchOldStringMissing:"パッチの old_string が現在の {file} に見つからないため、承認してもファイルは変更されません。",writeApprovalRequestedOldString:"要求された old_string",writeApprovalCurrentReadFailed:"現在の {file} を UTF-8 テキストとして読み取れませんでした。",writeApprovalDeleteSkill:"この承認によりスキル {skill} が削除されます。",writeApprovalRemoveFile:"この承認によりスキル {skill} から {file} が削除されます。"},privacy:{redactPii:"個人情報のマスキング",redactPiiHint:"機密情報を自動検出して隠す(パスワード、キーなど)"},apiServer:{enable:"有効化",enableHint:"API サーバーを有効にする",host:"ホスト",hostHint:"リッスンアドレス",port:"ポート",portHint:"リッスンポート",key:"キー",keyHint:"API アクセスキー",cors:"CORS 許可元",corsHint:"許可するクロスオリジン"},voice:{activeTtsApi:"有効な TTS API",activeSttApi:"有効な STT API",ttsProvidersTitle:"TTS プロバイダー",ttsProvidersDescription:"アシスタント応答の再生と音声プレビューに使うテキスト読み上げ連携を管理します。",sttProvidersTitle:"STT プロバイダー",sttProvidersDescription:"マイクと音声入力フローで使う音声認識連携を管理します。",noneSelected:"未選択",keyStored:"保存済み",keyMissing:"未設定",customApi:"API",localBuiltin:"ローカル内蔵",ttsCardHint:"音声合成プロバイダー",sttCardHint:"音声文字起こしプロバイダー",setActive:"有効化",testAction:"テスト",connect:"接続",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Microsoft Edge の無料高品質クラウド音声です。",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"カスタム TTS",presetBrowserSttLabel:"ブラウザー STT",presetBrowserSttDescription:"ブラウザー標準の音声認識 API です。",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"カスタム STT",apiCompatibility:"API 互換性",openaiCompatible:"OpenAI 互換",manualCustomEndpoint:"手動カスタムエンドポイント",connectionStep:"接続",discoveryManualHint:"手動カスタムエンドポイントが選択されています。モデル検出は利用できないため、モデル名を手動で入力してください。",discoveryCredentialHint:"Base URL と API key を入力し、接続して利用可能なモデルを取得します。",discoveryNoAutoProbeHint:"入力中にリクエストは送信されません。認証情報の準備ができたら Connect を使用してください。",apiKeyConnectPlaceholder:"接続用の API key を貼り付けます。保存済み key は表示されません",connectFetchModels:"接続してモデルを取得",modelRecommendedSuffix:"推奨",modelConnectManualHint:"接続して自動入力するか、手動で入力してください。",modelRequiredConnectManual:"モデルは必須です。接続して自動入力するか、手動で入力してください。",apiKeyRequired:"API key は必須です。",apiKeyRequiredForDiscovery:"モデル取得には API key が必要です。",baseUrlRequired:"Base URL は必須です。",baseUrlHttpsRequired:"http:// または https:// を使用してください。",baseUrlInvalid:"https:// を含む有効な Base URL を入力してください。",discoveryFailedManualFallback:"モデルを取得できませんでした。モデル名は手動で入力できます。",completeRequiredProviderFields:"保存前に必須の provider フィールドを入力してください。",fetchingModels:"モデルを取得中...",recommendedModel:"推奨: {model}。",useRecommendedModel:"これを使用",modelsDiscovered:"{count} 個のモデルが見つかりました。フィールドが空の場合は推奨モデルが選択されます。",remove:"削除",testSuccess:"テスト完了",testTextRequired:"テスト前にテキストを入力してください。",keyMissingForTest:"このプロバイダーをテストする前に API キーを追加してください。",testing:"テスト中...",transcribing:"文字起こし中...",browserSttTestHint:"ブラウザー STT はチャットのマイクからテストします。",sttEmptyAudio:"音声が録音されませんでした。もう一度試してください。",sttTestSuccess:"文字起こしが完了しました",sttRecordingHint:"録音中... 停止をクリックして文字起こしします。",keepStoredKeyPlaceholder:"保存済みキーを維持するには空欄のままにします",apiKeyPlaceholder:"API キーを入力",lastTest:"前回のテスト",notTested:"—",recording:"録音中",testFailedShort:"失敗",testFailedSummary:"テストに失敗しました。プロバイダー設定を確認して再試行してください。",showDetails:"詳細を表示",hideDetails:"詳細を非表示",moreActions:"その他",moreActionsFor:"{provider} のその他の操作",addTtsApi:"TTS API を追加",addSttApi:"STT API を追加",active:"有効",builtin:"内蔵",connected:"接続済み",disconnected:"未接続",source:"ソース",model:"モデル",voice:"音声",doubaoVoiceHint:"Seed TTS 2.0 の音色を選択します。リソース欄は自動更新されます。",apiKey:"API キー",confirmDeleteSecret:"この音声 API の保存済み API キーを削除しますか?",ttsTitle:"テキスト読み上げ",ttsSaved:"TTS 設定をサーバーに保存しました",ttsSaveFailed:"TTS 設定の保存に失敗しました",ttsTestSaved:"試聴に成功しました。TTS 設定をサーバーに保存しました",ttsTestSaving:"試聴前に TTS 設定を保存しています...",ttsMissingBaseUrl:"テスト前に Base URL が必要です。プロバイダーのエンドポイントを入力してから再度テストしてください。",ttsMissingApiKey:"テスト前に API キーが必要です。キーを貼り付けるか、先にサーバー保存キーを保存してください。",ttsCleared:"保存済み TTS キーを削除しました",ttsClearFailed:"保存済み TTS キーの削除に失敗しました",storedBaseUrlsTitle:"保存済み Base URLs",storedBaseUrlsHint:"保存済みの音声 provider endpoint をここで管理します。上の入力欄は現在値のクリアのみ、保存済み URL の削除はここで行います。",storedBaseUrlsEmpty:"サーバーに保存されたカスタム音声 Base URL はありません。",storedBaseUrlDelete:"URL を削除",storedApiKeysTitle:"保存済み API keys",storedApiKeysHint:"サーバーに保存された音声 API key の一覧です。用途とソースのみ表示し、完全な key は表示しません。",storedApiKeysEmpty:"サーバーに保存された音声 API key はありません。",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"key を削除",baseUrlPresetClear:"URL をクリア",baseUrlPresetCleared:"現在の Base URL をクリアしました。",baseUrlPresetDelete:"URL を削除",baseUrlPresetDeleted:"保存済みリストから Base URL を削除しました。",baseUrlPresetDeleteFailed:"保存済み Base URL の削除に失敗しました。",ttsPendingSecret:"新しいキーを保存します",ttsStoredSecret:"サーバーに保存済みキーがあります: {value}",ttsClearKey:"保存済みキーを削除",sttTitle:"音声文字起こし",sttProvider:"STT プロバイダー",sttProviderHint:"音声入力の文字起こし方法を選択します",sttProviderBrowser:"ブラウザー",sttProviderOpenai:"OpenAI 互換",sttProviderCustom:"カスタム",sttBrowserHint:"利用可能な場合はブラウザー内蔵の音声認識を使用します。",sttApiKey:"API キー",sttApiKeyHint:"認証が必要な STT プロバイダー向けにサーバー側で保存します。",sttStoredSecret:"保存済みサーバーキー: {value}",sttPendingSecret:"保存済みサーバーキー: 保存時に更新されます",sttClearKey:"保存済みキーを削除",sttModel:"モデル",sttModelHint:"使用する音声文字起こしモデル。",sttLanguage:"言語",sttLanguageHint:"en や zh などの任意の言語ヒント。",sttPrompt:"プロンプト",sttPromptHint:"任意の文字起こしプロンプト。",sttAudioTranscode:"音声のトランスコード",sttAudioTranscodeNone:"元の音声を送信",sttAudioTranscodeFfmpeg:"ffmpeg で WAV に変換",sttBaseUrl:"Base URL",sttBaseUrlHint:"OpenAI 互換のカスタム音声文字起こしエンドポイント。",sttSave:"STT 設定を保存",sttSaved:"STT 設定をサーバーに保存しました。",sttSaveFailed:"STT 設定の保存に失敗しました。",sttCleared:"保存済み STT シークレットをサーバーから削除しました。",sttClearFailed:"保存済み STT シークレットの削除に失敗しました。",sttActiveSaved:"有効な STT プロバイダーをサーバーに保存しました。",sttSaveActive:"有効な STT プロバイダーを保存",sttEndpointHint:"最終文字起こしエンドポイント: {endpoint}",sttTestTitle:"音声文字起こしをテスト",sttTestButton:"STT API をテスト",sttTestStopButton:"停止して文字起こし",sttTestBackendOnly:"STT API テストは OpenAI 互換およびカスタムプロバイダーで利用できます。",sttTestRecording:"テスト音声を録音中... 完了したら「停止して文字起こし」をクリックします。",sttTestTranscribing:"テスト音声を文字起こし中...",sttTestEmpty:"STT テスト用の音声が録音されませんでした。",sttTestSucceeded:"STT テストに成功しました。",sttTestFailed:"STT テストに失敗しました: {error} — {hint}",sttFailureHintMissingConfig:"テスト前にプロバイダーが Base URL/モデル/API キー付きで保存されているか確認してください。",sttFailureHintAuth:"API キーを確認してください。キーが既に保存されている場合は、現在のキーを再度貼り付けて保存してからテストしてください。",sttFailureHintForbidden:"キーはプロバイダーに届きましたが、この STT モデルまたはアカウントの権限がありません。プロバイダーのアクセス権/請求を確認してください。",sttFailureHintEndpointModel:"Base URL とモデルを確認してください。Groq では {endpoint} と whisper-large-v3-turbo または別の Groq STT モデルを使用してください。",sttFailureHintModel:"選択した STT モデルが存在し、このアカウントで有効になっているか確認してください。",sttFailureHintQuota:"プロバイダーがクォータ、請求、またはレート制限の問題を報告しています。クォータ/請求を確認するか、後で再試行してください。",sttFailureHintNetworkCustom:"サーバーがカスタム STT エンドポイントに到達できませんでした。{endpoint} が Web UI サーバーから到達可能で OpenAI 互換か確認してください。",sttFailureHintNetwork:"Web UI サーバーが STT プロバイダーに到達できませんでした。ネットワーク/プロキシ/ファイアウォールを確認して再試行してください。",sttFailureHintAudio:"録音音声が空、または拒否されました。短く明瞭なサンプルを試し、マイクアクセスを許可するか Chrome で再試行してください。",sttFailureHintGenericCustom:"API キー、Base URL、モデル、最終エンドポイント {endpoint} を確認してください。",sttFailureHintGeneric:"API キー、モデル、プロバイダーアカウントのアクセス権を確認してから再試行してください。",sttTestRecordFailed:"マイク録音を開始できませんでした: {error}",sttTestTranscript:"文字起こし: {text}",ttsProvider:"TTS プロバイダー",ttsProviderHint:"メッセージ読み上げに使用する音声合成エンジンを選択",providerWebSpeech:"WebSpeech API(ブラウザ)",providerOpenai:"OpenAI TTS",providerCustom:"カスタムエンドポイント(OpenAI 互換)",providerEdge:"Edge TTS(無料、API Key 不要)",webspeechVoice:"音声",webspeechVoiceHint:"ブラウザまたは OS から音声を選択",webspeechVoicePlaceholder:"自動(デフォルト音声)",openaiKey:"API キー",openaiKeyHint:"TTS アクセス権のある OpenAI API キー",openaiUrl:"API ベース URL",openaiUrlHint:"例: https://api.openai.com/v1/audio/speech",openaiModel:"モデル",openaiModelHint:"tts-1(高速)/ tts-1-hd(高音質)",openaiVoice:"音声",openaiVoiceHint:"合成に使用する音色",customHint:"OpenAI 互換の TTS API を使用可能 — GPT-SoVITS、CosyVoice などに対応",customUrl:"API URL",customUrlHint:"TTS サービスのベース URL",customUrlPlaceholder:"ローカルアダプターで設定したアドレス(例:http://127.0.0.1:9880)",customApiKey:"API キー(オプション)",customApiKeyHint:"一部のカスタムエンドポイントは認証が必要",customApiKeyPlaceholder:"不要な場合は空欄",edgeHint:"Microsoft Edge TTS を搭載(node-edge-tts)。",edgeUrl:"アダプター URL",edgeUrlHint:"Edge TTS アダプターのアドレス(例:http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"音声",edgeVoiceHint:"音声合成に使用する音色を選択",edgeRate:"速度",edgeRateHint:"音声の速度を調整(0.5~2.0倍)",edgePitch:"ピッチ",edgePitchHint:"音声のピッチを調整(-20~+20 Hz)",testTitle:"音声テスト",testText:"テストテキスト",testTextPlaceholder:"テストするテキストを入力...",testTextDefault:"こんにちは、これは音声テストです。",testButton:"テスト",testButtonPlaying:"再生中...",testFailed:"テスト失敗:{error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — プリセット音声、音声デザイン、音声クローンの3つのモードをサポート",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com で取得",mimoApiKeyPlaceholder:"MiMo API Key",mimoAuthMode:"認証モード",mimoAuthModeHint:"選択した MiMo エンドポイントが要求するヘッダー形式",mimoAuthModeBearer:"Bearer トークン (Authorization)",mimoAuthModeApiKey:"API key ヘッダー (api-key)",mimoAuthModeBoth:"両方のヘッダー",mimoBaseUrl:"Base URL",mimoBaseUrlHint:"MiMo API エンドポイントURL",mimoModel:"モデル",mimoModelHint:"音声合成モデルを選択",mimoModelPreset:"プリセット音声",mimoModelVoiceDesign:"音声デザイン",mimoModelVoiceClone:"音声クローン",mimoVoice:"音声",mimoVoiceHint:"プリセット音声を選択",mimoVoiceDesignPrompt:"音声の説明",mimoVoiceDesignPromptHint:"希望する音声の特徴を説明してください",mimoVoiceDesignPromptPlaceholder:"例:温かみのある若い女性の声、少しゆっくり、磁力的なトーン",mimoCloneAudio:"音声アップロード",mimoCloneAudioHint:"音声クローン用の音声サンプルをアップロード(mp3/wav、最大10MB)",mimoCloneAudioUpload:"ファイルを選択",mimoCloneAudioClear:"クリア",mimoStylePrompt:"スタイルプロンプト",mimoStylePromptHint:"オプション — 自然言語で話すスタイルを説明",mimoStylePromptPlaceholder:"例:明るく弾むようなトーン、速めのテンポ"},lockedIps:{title:"ロック済みIP管理",count:"{count}件ロック中",empty:"ロック済みIPなし",unlock:"ロック解除",unlockAll:"全て解除",unlockAllConfirm:"全てのロック済みIPを解除しますか?",unlocked:"IPをロック解除しました",allUnlocked:"{count}件のIPをロック解除しました",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"ユーザーアバター",upload:"画像をアップロード",random:"ランダム生成",reset:"デフォルトに戻す",hint:"PNG、JPEG、WebP(最大1MB)に対応し、500KB未満へ自動圧縮します。",invalidType:"PNG、JPEG、WebP の画像を選択してください",tooLarge:"アバター画像は1MB以下にしてください",saveSuccess:"アバターを保存しました",saveFailed:"アバターの保存に失敗しました",resetSuccess:"アバターをリセットしました",resetFailed:"アバターのリセットに失敗しました"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key を入力",noProviders:"設定済みプロバイダーがありません",save:"保存",saveFailed:"保存に失敗しました",saved:"保存しました"}},githubPreview:{title:"バージョンプレビュー",description:"選択した GitHub tag を Web UI のプレビュー作業ディレクトリへクローンし、依存関係をインストールして開発ポートで起動します。",refresh:"更新",selectTag:"tag を選択",prepare:"コードを準備",install:"依存関係をインストール",start:"プレビューを開始",stop:"停止",note:"プレビューコードは Web UI データホーム配下に保存されます。本番は 8648 のまま、プレビュー開発環境はフロントエンド 8651、バックエンド 8650 で実行されます。",path:"プレビューパス",webuiHome:"プレビューデータホーム",currentTag:"現在の Tag",repoReady:"リポジトリ準備済み",dependencies:"依存関係インストール済み",running:"実行状態",notRunning:"未実行",open:"プレビューを開く",log:"操作ログパス",logOutput:"ログ出力",actionLog:"操作ログ",devLog:"開発サーバーログ",yes:"はい",no:"いいえ",actionFailed:"操作に失敗しました",nodeEnvironmentMissing:"Node/npm が検出されませんでした。Node.js をインストールしてから再試行してください。",prepareSuccess:"プレビューコードの準備が完了しました",installSuccess:"依存関係をインストールしました",startSuccess:"プレビューが完了しました",stopSuccess:"プレビューを停止しました"},codingAgents:{title:"コーディングエージェント",notice:"すべてのプロバイダーとモデルが互換性を持つわけではありません。",claudeDescription:"print mode の単発タスクと対話型コーディングセッション向けの Anthropic CLI です。",codexDescription:"リポジトリ作業向けの OpenAI CLI と Hermes openai-codex プロバイダーフローです。",copyCommand:"コピー",commandCopied:"コマンドをコピーしました",commandCopyFailed:"コピーに失敗しました",refresh:"更新",checking:"確認中",installStatus:"インストール状態",installed:"インストール済み",notInstalled:"未インストール",installRequired:"{agent} はインストールされていません。セッション作成前にインストールしてください。",installNow:"インストール",installing:"インストール中",installSuccess:"インストールしました",installFailed:"インストールに失敗しました",installFailedHermesHint:"インストールに失敗しました。Hermes にインストールを依頼してください。",installFailureReason:"理由",nodeEnvironmentMissing:"Node/npm が検出されませんでした。Node.js をインストールしてから再試行してください。",deleteNow:"削除",deleting:"削除中",deleteSuccess:"削除しました",deleteFailed:"削除に失敗しました",configFiles:"設定ファイル",profileScope:"プロファイル",providerScope:"プロバイダー",providerPlaceholder:"例: custom:glm",modelScope:"モデル",modelPlaceholder:"モデルを選択",launchModeScope:"起動モード",launchModeGlobal:"グローバル設定",launchModeScoped:"プロバイダーとモデル",protocolScope:"プロトコル",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"設定を再読み込み",configFileNotCreated:"未作成",configLoadFailed:"設定ファイルの読み込みに失敗しました",loadFailed:"コーディングエージェントの確認に失敗しました",launch:"起動",launchTitle:"コーディングエージェントを起動",nativeTerminal:"ネイティブターミナル",builtInTerminal:"内蔵ターミナル",launchPrepared:"起動設定を準備しました",launchPrepareFailed:"起動設定の準備に失敗しました",nativeLaunchStarted:"ネイティブターミナルを開きました",nativeLaunchFailed:"ネイティブターミナルを開けませんでした",terminalTitle:"コーディングエージェントターミナル",loadProvidersFailed:"現在のプロファイルのプロバイダーを読み込めませんでした",selectProviderModel:"プロバイダーとモデルを選択してください",launchConfigDir:"起動設定ディレクトリ",launchCommand:"起動コマンド",table:{tool:"ツール",kind:"ステップ",command:"コマンド",note:"説明",action:"操作"},kinds:{install:"インストール",auth:"認証",health:"確認",run:"実行"},notes:{claudeInstall:"Claude Code CLI をグローバルにインストールします。",codexInstall:"Codex CLI をグローバルにインストールします。",claudeAuth:"Claude Code のログイン状態を確認します。未ログインの場合は一度 claude を実行してください。",codexAuth:"Hermes 管理の OpenAI Codex OAuth 認証情報を追加します。",claudeHealth:"アップデーターとローカル CLI の状態を確認します。",codexHealth:"Codex CLI が PATH で利用可能か確認します。",claudeRun:"API 駆動の単発タスクには print mode が最も素直な経路です。",codexRun:"Codex の単発タスクは git リポジトリ内で実行する必要があります。"}},platform:{requireMention:"メンションが必要",requireMentionGroup:"グループで応答するには {'@'}メンションが必要",requireMentionChannel:"チャンネルで応答するには {'@'}メンションが必要",requireMentionRoom:"ルームで応答するには {'@'}メンションが必要",reactions:"リアクション",reactionsHint:"メッセージに絵文字でリアクションする",freeResponseChats:"自由応答チャット",freeResponseChatsHint:"{'@'}メンションなしで応答するチャット ID(カンマ区切り)",freeResponseChannels:"自由応答チャンネル",freeResponseChannelsHint:"{'@'}メンションなしで応答するチャンネル ID(カンマ区切り)",freeResponseRooms:"自由応答ルーム",freeResponseRoomsHint:"{'@'}メンションなしで応答するルーム ID(カンマ区切り)",mentionPatterns:"カスタムメンションパターン",mentionPatternsHint:"追加のトリガーパターン",autoThread:"自動スレッド",autoThreadHint:"{'@'}メンション後に自動で返信スレッドを作成",autoThreadHintRoom:"ルームで自動的に返信スレッドを作成",dmMentionThreads:"DM メンションスレッド",dmMentionThreadsHint:"DM 内のメンションにスレッド返信を使用",allowBots:"ボットメッセージを許可",allowBotsHint:"他のボットからのメッセージに応答する",allowedChannels:"許可チャンネル",allowedChannelsHint:"ホワイトリストのチャンネル ID(カンマ区切り)",ignoredChannels:"除外チャンネル",ignoredChannelsHint:"ボットが応答しないチャンネル ID(カンマ区切り)",noThreadChannels:"スレッドなしチャンネル",noThreadChannelsHint:"スレッドなしで応答するチャンネル ID(カンマ区切り)",exclusiveTokenWarning:"このプラットフォームは排他的トークンロックを使用します。各プロファイルは他のプロファイルと競合しないように、異なる ID トークンを使用する必要があります。",botToken:"ボットトークン",botTokenHint:"開発者ポータルから取得したボットトークン",proxyUrl:"プロキシ URL",proxyUrlHint:"任意のプラットフォーム専用プロキシ。http://、https://、socks5:// に対応",accessToken:"アクセストークン",accessTokenHint:"Matrix アクセストークン",homeserver:"ホームサーバー URL",homeserverHint:"Matrix ホームサーバー URL",matrixUserId:"Matrix ユーザー ID",matrixUserIdHint:"パスワードログインでは必須、アクセストークンでは任意",matrixPassword:"Matrix パスワード",matrixPasswordHint:"アクセストークンの代替認証情報",appId:"App ID",appIdHint:"Feishu の App ID",appSecret:"App Secret",appSecretHint:"Feishu の App Secret",encryptKey:"暗号化キー",encryptKeyHint:"Feishu 暗号化キー",verificationToken:"検証トークン",verificationTokenHint:"Feishu 検証トークン",clientId:"Client ID",clientIdHint:"DingTalk の Client ID",clientSecret:"Client Secret",clientSecretHint:"DingTalk の Client Secret",cardTemplateId:"AI カードテンプレート ID",cardTemplateIdHint:"DingTalk AI カードテンプレート ID。空欄の場合は AI カードを無効化",botId:"Bot ID",botIdHint:"WeCom の Bot ID",wecomSecretHint:"WeCom の Bot Secret",waEnabled:"WhatsApp を有効化",waEnabledHint:"QR コードペアリングで WhatsApp を有効にする",weixinToken:"Weixin トークン",weixinTokenHint:"weixin CLI の QR ログインから取得 (hermes weixin)",accountId:"アカウント ID",accountIdHint:"Weixin アカウント ID",qrLogin:"QR ログイン",qrRelogin:"再ログイン",qrFetching:"QR コードを取得中...",qrScanHint:"WeChat でスキャンしてログイン",qrScanedHint:"スキャン済み、スマートフォンで確認してください...",qqSandboxHint:"サンドボックス環境を有効化(テスト用)",qqSandbox:"サンドボックスモード",qqQrScanHint:"QQ で上の QR コードをスキャンするか、スマホでリンクを開いて連携を完了します",qqMarkdownHint:"Markdown 形式メッセージを有効化(一部クライアントでは未対応の場合があります)",qqMarkdown:"Markdown サポート",qqAppSecretHint:"QQ Open Platform Bot の App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot の App ID",qqAppId:"App ID",allowedUsersHint:"ユーザー ID または OpenID の許可リスト。カンマ区切り",allowedUsers:"許可ユーザー",allowAllUsersHint:"任意のユーザーからのメッセージを許可します。オフの場合は許可リストを使用します",allowAllUsers:"すべてのユーザーを許可"},language:{label:"言語",zh:"中文",en:"English",ja:"日本語"},terminal:{sessions:"セッション",newTab:"新しいターミナル",closeSession:"このセッションを閉じますか?",sessionExited:"終了しました",processExited:"プロセスが終了しました(コード {code})",noSessions:"ターミナルセッションがありません",connectionFailed:"ターミナルに接続できませんでした",connectionError:"接続エラー",connectionClosed:"接続が閉じられました"},usage:{title:"使用統計",refresh:"更新",totalTokens:"総トークン数",inputTokens:"入力",outputTokens:"出力",totalSessions:"総セッション数",avgPerDay:"1日平均 ~{n}",estimatedCost:"推定コスト",cacheHitRate:"キャッシュヒット率",modelBreakdown:"モデル別内訳",dailyTrend:"日別使用量",date:"日付",tokens:"トークン",cache:"キャッシュ",cacheRead:"キャッシュ読み取り",cacheWrite:"キャッシュ書き込み",sessions:"セッション",cost:"コスト",noData:"使用データがありません"},skillsUsage:{title:"スキル使用状況",subtitle:"Hermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_6_25_1:"Hermes Agent 0.18.0 で Agent Bridge の approval memory wrapper が新しい has_host_access パラメータを転送せず execute_code が失敗する問題を修正しました",new_0_6_24_1:"このリリースは 0.6.23 以降にマージされた PR を反映し、チャット入力、workspace 表示、plugin 管理、default model、workspace diff 確認を改善しました",new_0_6_24_2:"単独チャットとグループチャットの入力欄は統合ツールバー、コンパクトな model 操作、まとまった入力設定、見やすい context 使用量、mobile chrome、単独チャットの手動リサイズ復旧に対応しました",new_0_6_24_3:"Workspace run の変更は永続的な chat diff card として表示され、右側 drawer で diff 表示と file 編集ができ、session resume 後も復元され、mobile 表示も調整されました",new_0_6_24_4:"Workspace folder picker は Windows drive と junction workflow をより安定して扱い、.hermes、.config、.codex などの dot-prefixed folder を WORKSPACE_BASE の安全境界内で表示します",new_0_6_24_5:"Plugins ページから管理可能な user plugin を enable / disable でき、Hermes base config と現在の profile config の plugin state をより正確に表示します",new_0_6_24_6:"Models ページに default provider と default model の操作を追加し、bridge terminal error の誤検知を減らし、Hermes Agent runtime packaging を 0.18.0 に更新し、website version manifest も更新しました",new_0_6_23_1:"このリリースでは 0.6.22 以降にマージされた PR を反映し、デスクトップ更新、MCP クリーンアップ、Petdex ペット、MCU 音声、設定ワークフローを改善しました",new_0_6_23_2:"デスクトップの自動更新はブロッキング方式に戻り、Windows 更新前のサービス停止がより確実になり、終了時には gateway、profile MCP、関連子プロセスをより完全に停止します",new_0_6_23_3:"デスクトップ MCP 注入と Coding Agent MCP の起動パスが安定し、Windows workspace にドライブ選択を追加し、シンボリックリンクフォルダ表示とデスクトップ Petdex プレビューを修正しました",new_0_6_23_4:"Petdex ペットは Web ペット、独立したデスクトップペットウィンドウ、採用後の即時表示、右上の閉じるボタン、見やすいデスクトップ初期サイズに対応しました",new_0_6_23_5:"MCU とグローバル音声は、音声プロンプト、OTA 保護、分割ストリーミング TTS、読み上げ前のリンク・コードブロック・表の整理、未完了 TTS の中断処理に対応しました",new_0_6_23_6:"profile 設定編集、チャット入力欄の高さ設定、ログイン JWT 有効期限設定、Skill 編集、History のローカルアーカイブ状態保持、新規チャットドロワー文言、組み込み Provider の危険操作文言を改善しました",new_0_6_22_1:"このリリースでは 0.6.21 以降にマージされた PR を反映し、組み合わせモデル、セッション履歴、プロキシ設定、スラッシュコマンド、モバイルレイアウトを改善しました",new_0_6_22_2:"モデルページに組み合わせモデルパネルを追加し、チャットでは古い合成プレースホルダーツールなしで実際の MoA reference と aggregator の進行状況を表示できます",new_0_6_22_3:"チャットセッションを一覧からアーカイブし、履歴から復元できるようになりました。ローカルのみの Claude Code と Codex セッションも履歴に正しく表示されます",new_0_6_22_4:"設定に Proxy タブを追加し、gateway 全体の HTTP(S)、ALL_PROXY、NO_PROXY と、Telegram、Discord、Matrix のプラットフォーム別プロキシを設定できます",new_0_6_22_5:"Hermes チャットに /learn コマンドを追加し、Agent Bridge 実行は選択した workspace を cwd として使います。次の Hermes Agent リリース待ちなのは、デスクトップ版の /learn と MoA コマンド機能だけです",new_0_6_21_1:"This release focuses on workflow reruns, MCP workflow tools, voice settings deletion, Matrix login settings, update cleanup, and docs polish",new_0_6_21_2:"Workflow node messages now open in a left-side resizable full chat drawer, mobile run history opens correctly, and rerun actions can keep the selected node output or clear it before rerunning downstream nodes",new_0_6_21_3:"Hermes Studio MCP use toolset can now list, create, update, delete, run, stop, delete runs, and rerun workflows from a selected node",new_0_6_21_4:"Voice provider removal now deletes the profile provider settings instead of only clearing API keys, while Browser STT and Edge TTS remain protected built-in defaults",new_0_6_21_5:"Matrix platform settings support user ID plus password configuration and report configured status correctly when password login is used",new_0_6_21_6:"Web UI restart, update, and in-app upgrade now stop the Agent Bridge broker by default so new builds do not attach to stale Python bridge processes",new_0_6_21_7:"Chat, group chat, and workflow headers are better aligned; Xiao Fang He shows sold-out status; BSL scope is clearer; /learn planning docs were added; unused Hermes proxy code was removed",new_0_6_20_1:"Workflow が正式に利用可能になりました: Agent node を作成し、graph として接続し、Workflow ページから flow 全体を実行できます",new_0_6_20_2:"Workflow run は run record、graph snapshot、node session、live node status、failure reason、run stop/delete action を保存します",new_0_6_20_3:"Workflow の表示と編集は、run history、read-only snapshot、node chat session review、大きい connection handle、create-workflow-first guard でより完成しました",new_0_6_20_4:"Desktop は古い executable path を固定せず、AGENT_BROWSER_HOME から agent-browser が Chrome を解決します。Patch integrity guard と browser stdout fix も追加しました",new_0_6_20_5:"対応 desktop platform の packaged browser runtime は Chrome for Testing 149.0.7827.55 に固定され、runtime browser regression を避けます",new_0_6_20_6:"ESP32 と Xiao Fang He は tutorial link 更新、light background 用 badge 表示、Windows 互換の flow animation を改善しました",new_0_6_19_1:"このリリースは 0.6.18 以降の 16 件の PR を含み、UI 上で見える device、voice、Coding Agent、settings 体験を改善します",new_0_6_19_2:"Coding Agent session は model を切り替えられ、新しい session は global default model に正しく従います",new_0_6_19_3:"MCU 操作は起動時 Wi-Fi/boot debounce、対象 device のみへの audio 送信、hardware double-click の clear と interrupt 改善で安定しました",new_0_6_19_4:"TTS settings は profile ごとに保存され、speed、pitch、voice test は同じ設定ソースを参照します",new_0_6_19_5:"Coding Agent の model switch は既存 session に影響せず、custom provider key も正しく渡されます",new_0_6_19_6:"Skills runtime filter、cron job sort、skill detail height limit、Windows updater recovery、backup fallback、logo asset compression も含まれます",new_0_6_18_2:"Hermes Studio MCP を api、devices、use の toolset に分割し、session、model、chat-run、ops 操作を追加しました",new_0_6_18_3:"チャットとグループチャット履歴は、UI 履歴の分離、安全な null message 処理、run failure 後の assistant reply 保持、reasoning replay の整合でより信頼できます",new_0_6_18_4:"MCU デバイス表示が明確になり、tool call が speech より優先表示され、audio が早すぎる DONE を出さず、active device login が安定し、長い ONLINE/IP テキストはスクロールします",new_0_6_18_5:"音声とメッセージの workflow にカスタム HTTP TTS/STT endpoint、audio transcoding、fork message action、永続 fork marker、より明確な upload error を追加しました",new_0_6_18_6:"Desktop と runtime setup は、Unicode-safe な Windows PATH 登録、Hermes Agent 0.17.0 runtime publish 対応、mobile PWA metadata、profile/auth recovery 修正で安全になりました",new_0_6_18_7:"各所の細部を改善しました",new_0_6_17_1:"Codex と Claude Code の会話起動問題を修正しました",new_0_6_16_1:"Provider 設定でカスタム API mode を保持し、LongCat プリセットを正しく扱い、v12 Provider の削除と auth/API-key 画像 Provider を含むモデルカタログ同期に対応しました",new_0_6_16_2:"チャットコマンドに reload-skills、Web タイトル更新、未知のスラッシュコマンド透過、tool call と tool result を除いたクリーンな session context API を追加しました",new_0_6_16_3:"セッションナビゲーションは Global Agent セッションの検索、新規セッションの最新アクティビティ順、復元したモバイルサイドバー操作、安定した設定フッターでより安定しました",new_0_6_16_4:"workspace 名の全文をホバーで確認でき、1対1 とグループチャット全体でファイルのドラッグ&ドロップアップロードが使えます",new_0_6_16_5:"プラットフォーム設定に Feishu Webhook 検証フィールドのローカライズを追加し、ローカライズ範囲を整えました",new_0_6_16_6:"symlink された skill ディレクトリを検出できるようになり、共有ローカル skills が安定して表示されます",new_0_6_16_7:"大きな静的 assets は動的 Brotli 圧縮を避け、負荷下で packaged Web UI の配信が安定します",new_0_6_16_8:"connector 系連携向けに outbound relay と MCU login flow を追加しました",new_0_6_16_9:"Web UI CLI に scripts や headless 起動向けの --no-open フラグを追加しました",new_0_6_16_10:"Linux desktop の viewport サイズとライブ圧縮ステータス行のレイアウトを調整しました",new_0_6_15_1:"チャットサイドバーを再設計し、履歴読み込み操作を調整して、長い会話をより追いやすくしました",new_0_6_15_2:"スキルコマンドピッカーにより、チャット入力から利用可能な skill コマンドをより素早く探して挿入できます",new_0_6_15_3:"Claude と Gemini の OAuth Provider を追加し、Gemini モデル ID の正規化を修正し、モデル選択から config.yaml の変更を手動更新できるようにしました",new_0_6_15_4:"Thinking 状態のインジケーターとツールバー配置を更新し、reasoning の進行をメッセージの流れを妨げずに読みやすくしました",new_0_6_15_5:"ダークテーマで input と select などのフォーム枠線が再び見えるようになりました",new_0_6_15_6:"Runtime セットアップはダウンロード元選択の前にローカル runtime を確認し、起動中も確認状態を表示し続けます",new_0_6_15_7:"デスクトップの自己更新は古いアプリプロセスでブロックされにくくなり、Windows 終了時の gateway cleanup もより完全になりました",new_0_6_15_8:"アプリ終了時に管理対象 gateways を停止し、管理 runtime セッション中に予期せず終了した gateway は引き続き再起動できます",new_0_6_15_9:"デスクトップサーバーは quit 時により丁寧に終了し、backend、bridge、gateway の孤立プロセスを減らします",new_0_6_15_10:"README と Web サイトの showcase は 1 つのアニメーション GIF に統合され、Web サイト hero には専用の静止プレビュー画像を使います",new_0_6_13_1:"Alibaba Coding Plan に qwen3.7-plus モデルプリセットを追加しました",new_0_6_13_2:"ファイル処理をより安全にし、リテラルのドットを含むパス検証と、不正なエンコードのスキルインポートファイル名の拒否に対応しました",new_0_6_13_3:"モバイル環境と speech synthesis 非対応ブラウザでのチャットがより安定しました",new_0_6_13_4:"Agent 失敗時に bridge のエラー末尾を保持し、Claude Code の root 権限起動をより安定させました",new_0_6_13_5:"デスクトップ更新の信頼性を改善しました。Windows アップグレード時に残留 Hermes Studio プロセスを閉じ、Cloudflare を先に確認し、GitHub をフォールバック更新元として保持します",new_0_6_13_6:"リリース自動化を調整し、Web UI と Docker の release は GitHub Latest にせず、完全なデスクトップ release だけを手動ビルド成功後に Latest へ昇格します"},files:{title:"ファイル",tree:"ディレクトリツリー",list:"ファイル一覧",breadcrumbRoot:"ホーム",newFile:"新規ファイル",newFolder:"新規フォルダ",upload:"アップロード",refresh:"更新",open:"開く",edit:"編集",preview:"プレビュー",download:"ダウンロード",copyPath:"パスをコピー",rename:"名前の変更",delete:"削除",name:"名前",size:"サイズ",modified:"更新日時",actions:"操作",emptyDir:"空のディレクトリ",loading:"読み込み中...",confirmDelete:"「{name}」を削除してもよろしいですか?",confirmDeleteDir:"ディレクトリ「{name}」とそのすべての内容を削除してもよろしいですか?",deleteFailed:"削除に失敗しました",deleted:"削除しました",renameTo:"名前を変更",newFileName:"ファイル名",newFolderName:"フォルダ名",created:"作成しました",createFailed:"作成に失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",uploadSuccess:"{count} 個のファイルをアップロードしました",uploadFailed:"アップロードに失敗しました",saveFailed:"保存に失敗しました",saved:"保存しました",unsavedChanges:"未保存の変更があります。破棄しますか?",pathCopied:"パスをコピーしました",fileTooLarge:"ファイルが大きすぎます(最大10MB)",permissionDenied:"保護されたファイルは変更できません",notFound:"ファイルまたはディレクトリが見つかりません",backendError:"ファイル操作に失敗しました",dragDropHint:"ここにファイルをドラッグしてアップロード",closeEditor:"エディタを閉じる",closePreview:"閉じる",saveFile:"保存",fileTree:"ファイルツリー"},groupChat:{title:"グループチャット",createRoom:"ルームを作成",joinByCode:"コードで参加",roomName:"ルーム名",roomNamePlaceholder:"ルーム名を入力",inviteCode:"招待コード",autoGenerate:"自動生成",noRooms:"ルームがありません",selectOrCreate:"ルームを選択または作成してチャットを開始",agents:"エージェント",addAgent:"エージェントを追加",selectProfile:"プロファイルを選択",agentAdded:"エージェントが追加されました",selectRoomFirst:"最初にルームを選択してください",agentAlreadyInRoom:"このエージェントは既にルームにいます",agentAddFailedCount:"{count} 件のエージェントを追加できませんでした: {details}",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",copyRoomLink:"ルームリンクをコピー",deleteRoomConfirm:"このルームを削除しますか?",clearContext:"コンテキストを削除",clearContextConfirm:"このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。",contextCleared:"コンテキストを削除しました",you:"あなた",joined:"ルームに参加しました",joinFailed:"ルームへの参加に失敗しました",inputPlaceholder:"メッセージを入力... (Enterで送信)",messageDisplayLimit:"グループチャットは最大 600 件まで表示します",enterCode:"招待コードを入力",yourName:"あなたの名前",yourNamePlaceholder:"表示名を入力",yourDescription:"自己紹介(任意)",yourDescriptionPlaceholder:"自分について教えてください...",agentName:"エージェント名",agentNamePlaceholder:"カスタム名(空欄ならプロファイル名)",agentDesc:"エージェントの説明",agentDescPlaceholder:"このエージェントの役割を説明...",agentReplying:"が返信中...",agentCompressing:"がコンテキストを圧縮中...",compressionSettings:"圧縮設定",triggerTokens:"圧縮トリガートークン数",triggerTokensDesc:"このトークン数を超えるとコンテキスト圧縮がトリガーされます",maxHistoryTokens:"最大履歴トークン数",maxHistoryTokensDesc:"圧縮後のLLM送信最大トークン数",tailMessageCount:"末尾メッセージ数",tailMessageCountDesc:"圧縮後にそのまま保持する最近のメッセージ数",compressionConfig:"圧縮設定",compressNow:"今すぐ圧縮",compressingInProgress:"圧縮中です、お待ちください",compressionSaved:"圧縮設定を保存しました"},download:{downloading:"ダウンロード中...",downloadFailed:"ダウンロードに失敗しました",fileNotFound:"ファイルが見つからないか削除されています",fileTooLarge:"ファイルが大きすぎます(制限超過)",backendError:"ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります",backendTimeout:"ファイルの読み取りがタイムアウトしました",unsupportedBackend:"現在のターミナルバックエンドはファイルのダウンロードに対応していません",invalidPath:"無効なファイルパス",contentDisplay:"内容表示",download:"ダウンロード",downloadFile:"ファイルをダウンロード"},gateways:{title:"ゲートウェイ",running:"実行中",stopped:"停止中",started:"開始しました",startFailed:"Gateway の起動に失敗しました",stopFailed:"Gateway の停止に失敗しました"},workflow:{title:"ワークフロー",profile:"プロファイル",namePlaceholder:"ワークフロー名",workspace:{title:"ワークスペースを選択",select:"ワークスペースを選択",clear:"ワークスペースをクリア"},actions:{newWorkflow:"新規ワークフロー",addNode:"ノードを追加",createWorkflowFirst:"先にワークフローを作成してください",reset:"リセット",startExecution:"実行開始",executionPending:"ワークフロー実行機能はまだ接続されていません",executionStarted:"ワークフロー実行を開始しました",executionCompleted:"ワークフロー実行が完了しました",executionFailed:"ワークフロー実行に失敗しました",rerunDownstreamKeepNode:"このノードのメッセージを残して下流を実行",rerunDownstreamClearNode:"このノードのメッセージを消して下流を実行",rerunDownstreamStarted:"下流の再実行を開始しました",rerunFromNodeStarted:"このノードから再実行を開始しました",rerunFailed:"ワークフローの再実行に失敗しました",deleteNode:"ノードを削除",deleteEdge:"接続を削除"},batch:{toggle:"一括選択",selectAll:"すべて選択",confirmDelete:"選択した {count} 件のワークフローを削除しますか?",deleteSuccess:"{count} 件のワークフローを削除しました",deletePartial:"{failed} 件のワークフローを削除できませんでした",deleteFailed:"一括削除に失敗しました"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"ノード名",agent:"Agent",model:"モデル",apiMode:"API モード",input:"入力",promptPlaceholder:"このAgentが行うことを記述...",skillsPlaceholder:"スキル、Enter で追加",uploadImages:"画像をアップロード"},status:{idle:"待機中",queued:"キュー中",running:"実行中",completed:"完了",failed:"失敗",canceled:"キャンセル済み"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"選択中のノード",none:"ノード未選択"},stats:{nodes:"ノード",edges:"リンク"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"デフォルトモデル",fast:"高速モデル",reasoning:"推論モデル"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"このノードの入力を記入します。",node2:"このノードの入力を記入します。",node3:"このノードの入力を記入します。",plan:"リクエストを実行可能な手順に分解します。",execute:"実装手順を実行して成果物を作成します。",review:"出力品質を確認し、後続作業を特定します。"},newNodeTitle:"Node {count}"},kanban:{title:"Kanban ボード",createTask:"新規タスク",noTasks:"タスクはありません",allStatuses:"すべての状態",allAssignees:"すべての担当者",columns:{triage:"振り分け待ち",todo:"未着手",scheduled:"スケジュール済み",ready:"準備完了",running:"進行中",blocked:"ブロック中",review:"レビュー",done:"完了",archived:"アーカイブ済み"},card:{assigneeTooltip:"担当者",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"たった今",minutes:"{count}分前",hours:"{count}時間前",days:"{count}日前"}},board:{create:"新規ボード",archive:"ボードをアーカイブ",archiveConfirm:"現在のボードをアーカイブしますか?",archived:"ボードをアーカイブしました",created:"ボードを作成しました",slugPlaceholder:"ボード識別子 例: project-a",namePlaceholder:"表示名(任意)",slugRequired:"ボード識別子は必須です"},form:{title:"タイトル",titlePlaceholder:"タスクタイトル",titleRequired:"タイトルは必須です",body:"説明",bodyPlaceholder:"タスク説明(任意)",assignee:"担当者",selectAssignee:"担当者を選択...",priority:"優先度",selectPriority:"優先度を選択...",tenant:"テナント",tenantPlaceholder:"テナント(任意)",workspace:"ワークスペース",workspaceScratch:"一時ワークスペース",workspaceDir:"ディレクトリを使用",workspaceWorktree:"worktree を使用",workspacePath:"ワークスペースパス",workspacePathPlaceholder:"絶対パス(任意)",branch:"ブランチ",branchPlaceholder:"Worktree ブランチ",skills:"スキル",skillsPlaceholder:"スキルを選択...",triage:"振り分け状態で作成",goalMode:"ゴールモード",maxRuntime:"最大実行時間",maxRuntimePlaceholder:"例: 30m, 2h",maxRetries:"最大リトライ回数",maxRetriesPlaceholder:"リトライ回数",goalMaxTurns:"ゴール最大ターン数",goalMaxTurnsPlaceholder:"最大ターン数"},detail:{status:"状態",priority:"優先度",assignee:"担当者",tenant:"テナント",createdAt:"作成時刻",startedAt:"開始時刻",completedAt:"完了時刻",comments:"コメント",events:"イベント",runs:"実行履歴",artifacts:"成果物",result:"完了結果",highlights:"重要情報",sources:"データソース",sessions:"関連セッション",sessionMessages:"セッション記録",noSessions:"関連セッションが見つかりません。",noLog:"このタスクのログが見つかりません。",addComment:"コメントを追加",commentPlaceholder:"タスクコメントを入力...",operations:"操作"},action:{title:"操作",assign:"割り当て",assignTo:"割り当て先...",block:"ブロック",blockReason:"ブロック理由",unblock:"ブロック解除",complete:"完了",completeSummary:"完了サマリー(任意)",dispatch:"ディスパッチ",recoveryReason:"復旧理由(任意)",reclaim:"回収",reassign:"再割り当て",specify:"詳細化",loadLog:"ログを読み込み",loadDiagnostics:"診断を読み込み"},message:{loadFailed:"タスクの読み込みに失敗しました",taskCreated:"タスクを作成しました",taskAssigned:"タスクを割り当てました",taskBlocked:"タスクをブロックしました",taskUnblocked:"タスクのブロックを解除しました",taskCompleted:"タスクを完了しました",dispatchNudged:"ディスパッチャーを起動しました",commentAdded:"コメントを追加しました",taskReclaimed:"タスクを回収しました",taskReassigned:"タスクを再割り当てしました",taskSpecified:"タスクを詳細化しました"},stats:{total:"合計",tasks:"タスク数"}}},Tr={login:{title:"Hermes Web UI",description:"계속하려면 사용자 이름과 비밀번호를 입력하세요.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",defaultCredentialsHint:"기본 로그인 이름: admin, 기본 비밀번호: 123456",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",lockResetHint:"본인 서버라면 다음 명령으로 로그인 잠금을 해제할 수 있습니다:",defaultLoginResetHint:"기본 admin 비밀번호를 재설정하려면 다음을 실행하세요:",sessionExpired:"로그인이 만료되었습니다. 다시 로그인해 주세요.",accessDenied:"이 리소스에 접근할 권한이 없습니다.",passwordMismatch:"비밀번호가 일치하지 않습니다",passwordTooShort:"비밀번호는 6자 이상이어야 합니다",setupSuccess:"비밀번호 로그인이 설정되었습니다",passwordChanged:"비밀번호가 변경되었습니다",passwordRemoved:"비밀번호 로그인이 제거되었습니다",setupPassword:"비밀번호 로그인 설정",changePassword:"비밀번호 변경",changeUsername:"사용자 이름 변경",removePasswordLogin:"제거",username:"사용자 이름",currentPassword:"현재 비밀번호",newPassword:"새 비밀번호",confirmPassword:"비밀번호 확인",newUsername:"새 사용자 이름",usernameChanged:"사용자 이름이 변경되었습니다",usernameTooShort:"사용자 이름은 2자 이상이어야 합니다",setupDescription:"로그인에 사용할 사용자 이름과 비밀번호를 관리합니다.",removeConfirm:"사용자 계정에는 비밀번호 로그인이 필요합니다.",passwordLoginNotConfigured:"비밀번호 로그인 미설정",passwordLoginConfigured:"현재 계정: {username}",defaultCredentialTitle:"기본 계정과 비밀번호를 변경하세요",defaultCredentialMessage:"현재 로그인 계정이 아직 기본 사용자 이름 또는 기본 비밀번호를 사용하고 있습니다. 무단 접근을 방지하려면 현재 계정에서 사용자 이름과 비밀번호를 가능한 한 빨리 변경하세요.",defaultCredentialAction:"변경하기",defaultCredentialLater:"나중에 알림"},users:{title:"계정 관리",description:"사용자를 만들고 역할을 할당하며 일반 관리자가 접근할 수 있는 프로필을 제어합니다.",create:"사용자 만들기",edit:"사용자 편집",username:"사용자 이름",role:"역할",statusLabel:"상태",profiles:"접근 가능한 프로필",profilesPlaceholder:"접근 가능한 프로필 선택",allProfiles:"모든 프로필",noProfiles:"할당된 프로필 없음",lastLogin:"마지막 로그인",newPasswordOptional:"새 비밀번호 (비워두면 유지)",loadFailed:"사용자 목록을 불러오지 못했습니다",deleteConfirm:"이 사용자를 삭제하시겠습니까?",enable:"활성화",disable:"비활성화",roles:{superAdmin:"슈퍼 관리자",admin:"관리자"},status:{active:"활성",disabled:"비활성"}},common:{loading:"로딩 중...",cancel:"취소",retry:"재시도",reset:"초기화",delete:"삭제",edit:"편집",save:"저장",saved:"저장됨",update:"업데이트",create:"생성",saveFailed:"저장 실패",deleteFailed:"삭제 실패",ok:"확인",copied:"복사됨",copy:"복사",noData:"데이터 없음",fetch:"가져오기",add:"추가",enable:"활성화",disable:"비활성화",configured:"구성됨",notConfigured:"미구성",confirm:"확인",expand:"펼치기",collapse:"접기",stop:"중지",start:"시작",expired:"만료됨"},mcp:{title:"MCP 서버",loadFailed:"MCP 서버를 불러오지 못했습니다",reloadAll:"모두 다시 로드",refresh:"새로고침",total:"합계",connected:"연결됨",disconnected:"연결 끊김",tools:"도구",tool:"도구",searchPlaceholder:"서버 검색...",addServer:"+ 서버 추가",zeroTools:"0개 도구",loading:"로딩...",empty:"MCP 서버가 설정되지 않았습니다",reloaded:"{server} 다시 로드됨",reloadedAll:"모든 MCP 서버가 다시 로드되었습니다",reloadFailed:"다시 로드 실패",serverAdded:'서버 "{name}" 추가됨',addFailed:"서버 추가 실패",serverUpdated:'서버 "{name}" 업데이트됨',updateFailed:"서버 업데이트 실패",saveFailed:"저장 실패",serverRemoved:'"{name}" 제거됨',enabled:"{name} 활성화됨",disabled:"{name} 비활성화됨",connectedStatus:"연결됨",disconnectedStatus:"연결 끊김",disabledStatus:"비활성화됨",toolList:"도구 목록",count:" ",more:"개 더보기",removeFailed:"서버 제거 실패",testOk:"테스트 성공 — {count}개 도구 사용 가능",testEmpty:"테스트에서 도구가 반환되지 않았습니다",testFailed:"테스트 실패",edit:"편집",test:"테스트",reload:"다시 로드",remove:"제거",confirmRemove:'서버 "{name}"을(를) 제거하시겠습니까?',cancel:"취소",add:"추가",save:"저장",addTitle:"MCP 서버 추가",editTitle:"MCP 서버 편집",invalidJson:"JSON 형식 오류",invalidYaml:"YAML 형식이 올바르지 않습니다",invalidConfig:"올바르지 않은 설정",invalidServerConfig:"서버 설정이 올바르지 않습니다",missingCommandOrUrl:"command 또는 url이 필요합니다",manageTools:"도구 관리",toolsVisibilityTitle:"도구 가시성 관리",fetchTools:"도구 목록 가져오기",fetchToolsFailed:"도구 목록을 가져오지 못했습니다",toolsMode:"모드:",toolsModeAll:"전체",toolsModeInclude:"포함",toolsModeExclude:"제외",toolsListHeader:"도구 이름",toolsEmpty:"도구가 없습니다. 먼저 도구 목록을 가져오세요",toolsSummaryAll:"총 {count}개 도구, 모두 활성화",toolsSummaryInclude:"총 {total}개 도구, {count}개 선택됨",toolsSummaryExclude:"총 {total}개 도구, {count}개 제외됨",toolsVisibilitySaved:"도구 가시성이 저장되었습니다",toolsSelectAll:"모두 선택",toolsClearSelection:"선택 지우기",toolsExcludeAll:"모두 제외",toolsClearExcluded:"제외 항목 지우기"},sidebar:{chat:"채팅",backToChat:"뒤로",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",mcp:"MCP",petdex:"Pets",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",performance:"성능 모니터링",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",singleChat:"채팅",globalAgent:"Global Agent",files:"파일",devices:"기기",groupChat:"그룹 채팅",groupConversation:"대화",groupConversationShort:"대화",groupAgent:"에이전트",groupAgentShort:"에전",groupSystem:"시스템",groupSystemShort:"시스템",groupMonitoring:"모니터링",groupMonitoringShort:"모니터",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:'터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트 실패",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다",versionManagement:"버전 관리",kanban:"칸반",workflow:"워크플로",groupTools:"도구",groupToolsShort:"도구",codingAgents:"코딩 에이전트",versionPreview:"버전 미리보기",groupPlatform:"플랫폼",gateways:"게이트웨이",expand:"메뉴 펼치기",collapse:"메뉴 접기"},runtimeVersions:{title:"버전 관리",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"플랫폼",currentWebUi:"현재 Web UI",activeVersion:"활성 버전",active:"활성",installed:"설치됨",download:"다운로드",downloadGithub:"GitHub 다운로드",downloadCf:"Cloudflare 다운로드",github:"GitHub",cf:"Cloudflare",useVersion:"다음 시작 시 사용",deleteVersion:"삭제",deleteRuntimeConfirm:"Hermes Runtime {version}을 삭제할까요?",deleteWebUiConfirm:"Web UI {version}을 삭제할까요?",deleteRuntimeSuccess:"Runtime이 삭제되었습니다",deleteWebUiSuccess:"Web UI가 삭제되었습니다",refresh:"새로고침",noVersions:"사용 가능한 버전이 없습니다",remoteLoadFailed:"원격 버전을 불러오지 못했습니다",downloadTasks:"다운로드 작업",downloadStarted:"다운로드를 시작했습니다",activateSuccess:"버전 선택이 저장되었습니다. Hermes Studio를 다시 시작하면 적용됩니다.",jobStatus:{queued:"대기 중",running:"실행 중",completed:"완료",failed:"실패"},jobStageStatus:{queued:"대기 중",resolve:"확인 중",download:"다운로드 중",verify:"검증 중",extract:"압축 해제 중",install:"설치 중",completed:"완료",failed:"실패"},jobStage:{queued:"대기 중",download:"다운로드 중",resolveRuntime:"Runtime 패키지 확인 중",verifyRuntime:"Runtime 압축 파일 검증 중",extractRuntime:"Runtime 압축 파일 해제 중",installRuntime:"Runtime 설치 중",resolveWebUi:"Web UI 패키지 확인 중",verifyWebUi:"Web UI 압축 파일 검증 중",extractWebUi:"Web UI 압축 파일 해제 중",installWebUi:"Web UI 설치 중",completed:"완료",failed:"실패"}},devices:{title:"기기",count:"기기 {count}개",lastScanned:"마지막 스캔: {time}",refresh:"새로고침",empty:"기기를 찾을 수 없습니다",computer:"컴퓨터",endpointLabel:"엔드포인트",statusLabel:"상태",online:"온라인",offline:"오프라인",address:"주소",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"지연 시간",lastSeen:"마지막 발견",open:"열기",never:"없음",unknown:"알 수 없음",loadFailed:"기기를 불러오지 못했습니다",scanFailed:"기기 스캔에 실패했습니다",updateFailed:"기기를 업데이트하지 못했습니다",duplicateRequest:"대기 중인 페어링 요청이 이미 있습니다",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"처리됨",unprocessed:"미처리",deleteHistory:"기록 삭제",deleteHistoryConfirm:"이 요청 기록을 삭제하고 이 기기의 연결 권한을 취소할까요?",requests:"요청 목록",requestsWithCount:"요청 목록 ({count})",noRequests:"요청 없음",requestPairing:"페어링 요청",paired:"페어링됨",approve:"승인",reject:"거절",block:"차단",unblock:"차단 해제",inboundStatus:{none:"요청 허용",pending:"대기 중",approved:"승인됨",rejected:"거절됨",blocked:"차단됨"},outboundStatus:{none:"미페어링",pending:"요청됨",approved:"페어링됨",rejected:"거절됨",blocked:"차단됨"},endpoint:{web:"Web",desktop:"데스크톱",custom:"사용자 지정"}},performance:{title:"성능 모니터링",subtitle:"시스템 리소스, Bridge Broker, Workers, 활성 세션 확인",refresh:"새로고침",autoRefreshOn:"자동 새로고침",autoRefreshOff:"수동 새로고침",loadFailed:"성능 데이터를 불러오지 못했습니다",systemCpu:"시스템 CPU",systemMemory:"시스템 메모리",activeSessions:"활성 세션",runningSessions:"실행 중 {count}",workers:"Workers",totalWorkerMemory:"Worker 총 메모리",processes:"프로세스",uptime:"실행 시간",running:"실행 중",stopped:"중지됨",workerMemory:"Worker 메모리",lastUpdated:"업데이트 시간",profile:"Profile",memory:"메모리",sessions:"세션",runningActiveSessions:"실행 중 / 활성",lastUsed:"마지막 사용",status:"상태",noWorkers:"Worker 없음",sessionsByProfile:"Profile별 세션",noActiveSessions:"활성 세션 없음"},drawer:{terminal:"터미널",files:"작업 공간"},chat:{contextRemaining:"남음",contextClickToEdit:"클릭하여 컨텍스트 길이 편집",contextEditTitle:"컨텍스트 길이 편집",contextEditDesc:"현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)",contextEditPlaceholder:"컨텍스트 길이 입력",contextEditHint:"일반적인 값: 256k (Hermes 기본값), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"저장",contextEditCancel:"취소",contextEditInvalid:"유효한 컨텍스트 길이를 입력하세요",contextEditSuccess:"컨텍스트 길이가 업데이트되었습니다",contextEditFailed:"업데이트 실패",emptyState:"Hermes Agent와 대화를 시작하세요",emptyStateAgent:"{agent}와 대화를 시작하세요",viewOlderInHistory:"이전 메시지는 기록에서 보기",scrollToBottom:"맨 아래로 이동",outlineTitle:"대화 개요",outlineEmpty:"대화 내용이 없습니다",outlineUserQuestion:"사용자 질문",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",inputHeightResizeHint:"드래그해서 채팅 입력창 높이를 바꾸고, 더블클릭하면 자동 높이로 돌아갑니다.",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",learn:"설명한 소스에서 재사용 가능한 스킬 학습",plan:"Markdown 구현 계획 작성",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"현재 표시 내용 지우기",clearHistory:"이 세션의 저장된 메시지 기록 삭제",title:"이 세션 이름 변경",compress:"유휴 상태에서 컨텍스트 압축 실행",steer:"활성 Bridge 실행에 지시 텍스트 보내기",destroy:"이 세션의 Bridge Agent 해제",reloadMcp:"MCP 서버 다시 로드",reloadSkills:"스킬 명령 다시 로드"},attachFiles:"파일 첨부",reasoningEffort:{tooltip:"추론 노력",defaultLabel:"기본값",options:{default:"기본값 (config.yaml)",none:"없음",minimal:"최소",low:"낮음",medium:"중간",high:"높음",xhigh:"매우 높음"}},showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",allProfiles:"모든 프로필",profileMissingModelsTip:'이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"Hermes 기록",historyScopeHint:"현재 profile의 Hermes 기록 세션을 소스별로 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",agent:"Agent",approvalKicker:"터미널 권한",approvalTitle:"실행 전에 명령 확인",approvalAgree:"동의",approvalAllowOnce:"한 번만 허용",approvalAllowSession:"이 세션에서 허용",approvalAlways:"항상 허용",approvalDeny:"거부",clarifyKicker:"에이전트 확인 필요",clarifyTitle:"에이전트가 질문이 있습니다",clarifyPlaceholder:"답변 입력...",clarifySubmit:"답장",clarifyDismiss:"무시",deleteSession:"이 세션을 삭제하시겠습니까?",toggleBatchMode:"일괄 선택",selectAll:"모두 선택",confirmBatchDelete:"선택한 {count}개의 세션을 삭제하시겠습니까?",batchDeleteSuccess:"{count}개의 세션을 삭제했습니다",batchDeletePartial:"{failed}개의 세션 삭제 실패",batchDeleteFailed:"일괄 삭제 실패",importToWebUi:"Web UI로 가져오기",importSessionSuccess:"세션을 Web UI로 가져왔습니다",importSessionAlreadyExists:"세션이 이미 Web UI에 있습니다",importSessionFailed:"세션 가져오기 실패",sessionDeleted:"세션이 삭제되었습니다",rename:"이름 변경",archiveSession:"보관",unarchiveSession:"보관 해제",pin:"고정",unpin:"고정 해제",pinned:"고정됨",chatMode:"채팅",liveMode:"라이브",liveSessions:"라이브 세션",recentBadge:"최근",linkedSessions:"{count}개 연결됨",noVisibleMessages:"사람이 볼 수 있는 메시지가 없습니다.",monitorRoleUser:"사용자",monitorRoleAssistant:"어시스턴트",copySessionLink:"세션 링크 복사",openSessionInNewTab:"새 탭에서 열기",sessionLinkCopied:"Session link copied",copySessionId:"세션 ID 복사",export:"내보내기",editConfig:"구성 편집",exportFull:"전체 내보내기 (JSON)",exportCompressed:"압축 내보내기 (TXT)",exportCompressing:"컨텍스트 압축 중, 잠시 기다려주세요...",exportSuccess:"세션을 내보냈습니다",exportFailed:"내보내기 실패",renamed:"이름이 변경되었습니다",renameFailed:"이름 변경 실패",sessionArchived:"세션을 보관했습니다",archiveSessionFailed:"세션 보관 실패",sessionUnarchived:"세션 보관을 해제했습니다",unarchiveSessionFailed:"세션 보관 해제 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",workspaceChanges:"작업공간 변경",changedFiles:"{files}개 파일 변경됨",diffUnavailable:"diff를 표시할 수 없습니다",binaryFileDiffUnavailable:"바이너리 파일 diff를 표시할 수 없습니다",truncated:"... (잘림)",unchangedLines:"변경 없음 {count}줄",executionDuration:"실행 시간",thinkingLabel:"사고 과정",thinkingInProgress:"사고 중",thinkingShow:"사고 과정 펼치기",thinkingHide:"사고 과정 접기",thinkingDuration:"관측 {duration}",thinkingChars:"{count}자",copyBubble:"메시지 복사",copiedBubble:"복사됨",copyFailed:"복사 실패",playSpeech:"음성 재생",pauseSpeech:"일시정지",resumeSpeech:"재개",stopSpeech:"중지",speechNotSupported:"이 브라우저는 음성 재생을 지원하지 않습니다",searchEnterHint:"Enter로 열기 · Esc로 닫기",searchHint:"Cmd/Ctrl+K",searchScope:"검색 범위: Web UI 로컬 세션 DB만 포함하며 읽기 전용 Hermes 기록 세션은 포함하지 않습니다.",searchFailed:"세션 검색 실패",searchNoSnippet:"표시할 요약이 없습니다",searchNoResults:"일치하는 세션이 없습니다",searchRecent:"최근 세션",searchEmpty:"최근 세션",searchPlaceholder:"세션 검색...",searchSubtitle:"제목 또는 메시지 내용으로 검색",searchTitle:"세션 검색",stopGateway:"Gateway 중지",start:"시작",workspaceSetFailed:"Workspace 설정 실패",workspaceSet:"Workspace가 설정되었습니다",workspacePlaceholder:"프로젝트 경로 입력, 예: /home/user/project",folderPickerEmpty:"(비어 있음)",folderPickerNoFolders:"Workspace 폴더가 없습니다",folderPickerSelected:"선택됨:",workspace:"작업 공간",setWorkspaceTitle:"세션 Workspace 설정",setWorkspace:"Workspace 설정",modelSetFailed:"모델 설정 실패",modelSet:"모델이 설정되었습니다",setModelTitle:"세션 모델 설정",setModel:"모델 설정",newCliChat:"새 CLI",cliEmptyState:"CLI 채팅 시작",autoPlaySpeech:"음성 자동 재생",voiceInput:{startCapture:"음성 입력 시작",stopCaptureAndInsert:"음성 입력을 중지하고 입력창에 삽입",cancelCapture:"음성 입력 취소",statusLabel:"상태: {status}",transcriptLabel:"전사: {text}",errorLabel:"오류: {error}",recentEvents:"최근 이벤트",status:{idle:"대기",capturing:"듣는 중",transcribing:"전사 중",sending:"입력창에 삽입 중",error:"오류"},browserSpeechUnsupported:"이 브라우저는 내장 음성 인식을 지원하지 않습니다.",browserSpeechFailed:"브라우저 음성 인식에 실패했습니다.",browserSpeechFailedWithReason:"브라우저 음성 인식에 실패했습니다: {error}.",microphoneUnsupported:"이 브라우저는 마이크 녹음을 지원하지 않습니다.",microphoneRecordingFailed:"마이크 녹음에 실패했습니다."}},jobs:{title:"예약 작업",createJob:"작업 생성",editJob:"작업 편집",noJobs:"예약된 작업이 없습니다. 새로 만들어 시작하세요.",sortBy:"정렬",sortByName:"이름순",sortByTime:"날짜순",sortByNameHint:"이름으로 정렬",sortByTimeHint:"날짜로 정렬",sortAsc:"오름차순",sortDesc:"내림차순",name:"이름",namePlaceholder:"작업 이름",schedule:"스케줄 (Cron 표현식)",schedulePlaceholder:"예: 0 9 * * *",quickPresets:"빠른 프리셋",selectPreset:"프리셋 선택...",presetEveryMinute:"매 분",presetEvery5Min:"매 5분",presetEveryHour:"매 시간",presetEveryDay:"매일 00:00",presetEveryDay9:"매일 09:00",presetEveryMonday:"매주 월요일 09:00",presetEveryMonth:"매월 1일 09:00",prompt:"프롬프트",promptPlaceholder:"실행할 프롬프트",skills:"스킬",skillsPlaceholder:"스킬 선택...",deliverTarget:"전송 대상",origin:"출처",local:"로컬",repeatCount:"반복 횟수 (선택)",modelPlaceholder:"기본 모델",repeatPlaceholder:"비워두면 무한 반복",jobCreated:"작업이 생성되었습니다",jobUpdated:"작업이 업데이트되었습니다",nameRequired:"이름을 입력해 주세요",scheduleRequired:"스케줄을 입력해 주세요",loadFailed:"작업을 불러오지 못했습니다",jobPaused:"작업이 일시 정지되었습니다",jobResumed:"작업이 재개되었습니다",jobTriggered:"작업이 실행되었습니다",modelUpdated:"모델이 업데이트되었습니다",jobDeleted:"작업이 삭제되었습니다",status:{running:"실행 중",paused:"일시 정지",disabled:"비활성화",scheduled:"예약됨"},info:{model:"모델",schedule:"일정",lastRun:"마지막 실행",nextRun:"다음 실행",deliver:"전송",repeat:"반복"},action:{pause:"일시 정지",pauseJob:"작업 일시 정지",resume:"재개",resumeJob:"작업 재개",runNow:"즉시 실행",triggerImmediately:"즉시 실행"},runHistory:{title:"실행 기록",runs:"회 실행",noRuns:"실행 기록이 없습니다."}},skills:{title:"스킬",targetFilter:"런타임",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"스킬 검색...",noMatch:"검색과 일치하는 스킬이 없습니다",noSkills:"스킬을 찾을 수 없습니다",backTo:"돌아가기",attachedFiles:"첨부 파일",loadFailed:"스킬을 불러오지 못했습니다",fileLoadFailed:"파일을 불러오지 못했습니다",modified:"사용자 수정됨",archived:"보관됨",pinned:"고정됨",pin:"스킬 고정",unpin:"고정 해제",pinFailed:"고정 상태 변경 실패",edit:"편집",saving:"저장 중...",editorLabel:"스킬 편집기",saveSuccess:"스킬 저장됨",saveFailed:"스킬 저장 실패",toggleFailed:"스킬 상태를 전환하지 못했습니다",source:{builtin:"내장",hub:"Hub",local:"로컬",external:"외부"},delete:"삭제",deleteConfirm:'스킬 "{name}"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.',deleteSuccess:"스킬이 삭제되었습니다",deleteFailed:"삭제 실패",import:"가져오기",importTitle:"스킬 가져오기",importModeZip:"Zip",importModeFolder:"폴더",importHintZip:"SKILL.md를 포함한 디렉터리의 .zip 파일 업로드",importHintFolder:"로컬 스킬 폴더 선택 (SKILL.md 필요)",importTargetCategory:"대상 카테고리 (선택)",importTargetCategoryPlaceholder:"비워두면 misc에 배치",importSelectFile:".zip 파일 선택",importSelectFolder:"폴더 선택",importInvalidFile:".zip 파일만 지원됩니다",importFileCount:"개 파일",importNoSelection:"먼저 파일 또는 폴더를 선택하세요",importSuccess:"스킬이 가져와졌습니다",importFailed:"가져오기 실패",path:{local:"로컬",external:"외부"},externalDirs:{manage:"외부 디렉터리",title:"외부 디렉터리 관리",hint:"config.skills.external_dirs 를 관리합니다. ~ 과 $VAR 지원. 존재하지 않는 경로는 흐리게 표시됩니다.",add:"외부 디렉터리 추가",placeholder:"/path/to/skills 또는 ~/my-skills",empty:"외부 디렉터리가 없습니다",missing:"경로를 찾을 수 없음",notDir:"디렉터리가 아님",saveSuccess:"외부 디렉터리 저장됨",saveFailed:"저장 실패",loadFailed:"외부 디렉터리 로드 실패",removeRow:"제거"},pathCopied:"경로 복사됨",pathCopyFailed:"경로 복사 실패",reloadHint:"활성 세션에서는 /reload-skills 실행. 새 세션은 자동 로드됩니다.",writeApprovalButton:"대기 {count}",writeApprovalTitle:"쓰기 승인 대기",writeApprovalDescription:"Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.",writeApprovalRefresh:"새로고침",writeApprovalEmpty:"승인 대기 중인 쓰기가 없습니다.",writeApprovalUnsupported:"이 Hermes Agent 버전은 쓰기 승인을 지원하지 않습니다. 이 기능을 사용하려면 Hermes Agent를 업그레이드하세요.",writeApprovalMemory:"메모리",writeApprovalSkills:"스킬",writeApprovalViewDiff:"검토",writeApprovalHideDiff:"숨기기",writeApprovalNoDiff:"표시할 차이가 없습니다.",writeApprovalLoadFailed:"승인 대기 쓰기를 불러오지 못했습니다",writeApprovalDiffFailed:"쓰기 세부 정보를 불러오지 못했습니다",writeApprovalActionFailed:"승인 대기 쓰기를 처리하지 못했습니다",writeApprovalApproved:"쓰기가 승인되었습니다",writeApprovalRejected:"쓰기가 거부되었습니다",writeApprovalApprove:"승인",writeApprovalReject:"거부",writeApprovalPendingMemoryWrite:"승인 대기 메모리 쓰기",writeApprovalCurrentFile:"현재 {file}",writeApprovalProposedFile:"제안된 {file}",writeApprovalDiffSection:"차이",writeApprovalPatchOldStringMissing:"패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.",writeApprovalRequestedOldString:"요청된 old_string",writeApprovalCurrentReadFailed:"현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.",writeApprovalDeleteSkill:"이 승인은 스킬 {skill}을 삭제합니다.",writeApprovalRemoveFile:"이 승인은 스킬 {skill}에서 {file}을 제거합니다."},plugins:{title:"플러그인",refresh:"새로고침",notice:"탐색 가능한 Hermes 플러그인 manifest 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. standalone 사용자 플러그인은 여기에서 활성화하거나 비활성화할 수 있으며, 변경 사항은 새 Hermes 세션에서 적용됩니다.",loadFailed:"플러그인을 불러오지 못했습니다",updateFailed:"플러그인을 업데이트하지 못했습니다",enableSuccess:"{name} 활성화됨",disableSuccess:"{name} 비활성화됨",commandCopied:"명령을 복사했습니다",searchPlaceholder:"key, 이름, 설명, 경로 검색...",source:"소스",kind:"종류",statusTitle:"상태",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"명령 복사",managedElsewhere:"다른 곳에서 관리됨",noMatch:"현재 필터와 일치하는 플러그인이 없습니다",enabled:"활성화됨",disabled:"비활성화됨",summary:{total:"전체",active:"활성 / 자동",inactive:"비활성",disabled:"비활성화됨",providerManaged:"Provider 관리"},status:{enabled:"활성화됨","auto-active":"자동 활성",inactive:"비활성",disabled:"비활성화됨","provider-managed":"Provider 관리"},statusLabel:{enabled:"설정으로 활성화됨","auto-active":"자동 활성",inactive:"비활성",disabled:"비활성화됨","provider-managed":"Provider 관리"},configStatuses:{enabled:"활성화됨",disabled:"비활성화됨","not-enabled":"활성화되지 않음",auto:"자동","provider-managed":"Provider 관리"},table:{plugin:"플러그인",status:"상태",source:"소스",kind:"종류",capabilities:"기능",path:"경로 / entrypoint",manage:"관리"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"에이전트 루트",python:"Python",scanCwd:"cwd 스캔",projectPlugins:"프로젝트 플러그인"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"메모리",refresh:"새로고침",loadFailed:"메모리를 불러오지 못했습니다",myNotes:"내 메모",noNotes:"메모가 없습니다.",notesPlaceholder:"메모를 작성하세요...",userProfile:"사용자 프로필",noProfile:"프로필이 없습니다.",profilePlaceholder:"프로필을 작성하세요...",soul:"소울",noSoul:"소울 설정이 없습니다.",soulPlaceholder:"소울 설정을 작성하세요..."},models:{title:"모델",addProvider:"Provider 추가",refreshModelCache:"모델 캐시 새로고침",refreshModelCacheLoading:"모델 캐시를 새로고침하는 중...",refreshModelCacheSuccess:"모델 캐시를 새로고침했습니다",refreshModelCacheFailed:"모델 캐시 새로고침 실패",providerType:"Provider 유형",preset:"프리셋",custom:"사용자 지정",selectProvider:"Provider 선택",chooseProvider:"Provider를 선택하세요...",name:"이름",autoGeneratedName:"Base URL에서 자동 생성",baseUrl:"Base URL",region:"지역",regionIntl:"국제판",regionCn:"중국 본토",baseUrlPlaceholder:"예: https://api.example.com/v1",apiKey:"API Key",apiKeyPlaceholder:"sk-...",defaultModel:"기본 모델",selectOrInput:"모델 선택 또는 직접 입력...",selectModel:"모델 선택...",providerAdded:"Provider가 추가되었습니다",providerDeleted:"Provider가 삭제되었습니다",providerCredentialsCleared:"Provider 자격 증명이 삭제되었습니다",clearProviderCredentials:"자격 증명 삭제",clearCredentialsConfirm:'"{name}"의 저장된 자격 증명을 삭제하시겠습니까? 이 기본 제공 Provider는 목록에 남으며, 자격 증명을 다시 설정하면 사용할 수 있습니다.',disableProvider:"Provider 비활성화",disableProviderConfirm:'기본 제공 Provider "{name}"을(를) 비활성화하시겠습니까? 이 Provider는 기본 제공 항목으로 남으며 나중에 다시 활성화할 수 있습니다.',providerDisabled:"Provider가 비활성화되었습니다",defaultProviderUpdated:"기본 Provider가 업데이트되었습니다",defaultProviderUpdateFailed:"기본 Provider 업데이트에 실패했습니다",defaultModelUpdated:"기본 모델이 업데이트되었습니다",defaultModelUpdateFailed:"기본 모델 업데이트에 실패했습니다",deleteProvider:"Provider 삭제",deleteConfirm:'"{name}"을(를) 삭제하시겠습니까?',codexLoginTitle:"OpenAI Codex 로그인",codexWaiting:"인증 페이지에서 아래 코드를 입력하여 로그인하세요:",codexCopyCode:"코드가 복사되었습니다",codexOpenLink:"인증 페이지 열기",codexApproved:"로그인 성공",codexExpired:"인증이 만료되었습니다. 다시 시도해주세요.",nousLoginTitle:"Nous Portal 로그인",nousWaiting:"인증 페이지에서 이 코드를 입력하세요:",nousCopyCode:"코드 복사됨",nousOpenLink:"인증 페이지 열기",nousApproved:"로그인 성공",nousDenied:"인증이 거부되었습니다",nousExpired:"인증이 만료되었습니다",copilotLoginTitle:"GitHub Copilot 로그인",copilotWaiting:"GitHub을 열고 아래의 디바이스 코드를 입력하여 인증하세요. 승인 후 창이 자동으로 닫힙니다.",copilotCopyCode:"코드가 복사되었습니다",copilotOpenLink:"GitHub 인증 페이지 열기",copilotApproved:"로그인 성공!",copilotDenied:"인증이 거부되었습니다.",copilotExpired:"인증 링크가 만료되었습니다. 다시 시도하세요.",copilotAddDetectedTitle:"GitHub Copilot 감지됨",copilotAddDetected:"이 컴퓨터에서 GitHub Copilot OAuth 토큰이 감지되었습니다. 추가를 클릭하여 Hermes에서 Copilot을 활성화하세요.",copilotAddSourceEnv:"출처: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"출처: gh CLI (gh auth token)",copilotAddSourceAppsJson:"출처: VS Code Copilot 확장 (apps.json)",copilotDeleteHintEnv:"이 작업은 ~/.hermes/.env의 COPILOT_GITHUB_TOKEN을 지웁니다. 다른 도구에는 영향이 없습니다.",copilotDeleteHintGhCli:"Copilot이 Hermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.",copilotDeleteHintAppsJson:"Copilot이 Hermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.",customBadge:"커스텀",previewBadge:"프리뷰",disabledBadge:"사용 불가",disabledTooltip:"이 모델은 현재 계정에서 사용할 수 없습니다.",customModelPlaceholder:"목록에 없는 모델 ID",customModelHint:"제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.",noProviders:"Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.",clearVisibleModels:"선택 지우기",generalTitle:"일반 모델",combinationTitle:"모델 앙상블",combinationSubtitle:"MoA 프리셋을 설정합니다. 참조 모델이 먼저 관점을 제공하고, 이후 하나의 집계 모델이 최종 응답과 도구 호출을 처리합니다.",combinationPreset:"프리셋",combinationName:"이름",combinationAddModel:"모델 앙상블 추가",combinationEditModel:"모델 앙상블 편집",combinationNewPreset:"새 프리셋",combinationPresetPlaceholder:"예: review",combinationAddPreset:"프리셋 추가",combinationSetDefault:"기본값으로 설정",combinationEnabled:"참조 모델 활성화",combinationReferenceModels:"참조 모델",combinationReferenceModel:"참조 모델",combinationAddReference:"참조 모델 추가",combinationAggregator:"집계 모델",combinationReferenceTemperature:"참조 온도",combinationAggregatorTemperature:"집계 온도",combinationMaxTokens:"최대 토큰",combinationNotSet:"설정 안 됨",combinationSaved:"모델 앙상블 저장됨",combinationLoadFailed:"모델 앙상블을 불러오지 못했습니다",combinationSaveFailed:"모델 앙상블을 저장하지 못했습니다",combinationPresetExists:"프리셋이 이미 존재합니다",combinationNameRequired:"모델 앙상블 이름을 입력하세요",combinationNameInvalid:"이름에는 문자, 숫자, 밑줄, 하이픈, 점만 사용할 수 있습니다",combinationReferenceRequired:"참조 모델을 하나 이상 추가하세요",combinationAggregatorRequired:"집계 모델을 선택하세요",auxiliaryTitle:"보조 모델",auxiliarySubtitle:"압축, 비전, 승인, MCP, 백그라운드 유지 관리 같은 보조 작업별 모델 재정의입니다.",auxiliaryRefresh:"새로고침",auxiliaryTask:"작업",auxiliaryTimeout:"시간 제한",auxiliaryDownloadTimeout:"다운로드 시간 제한",auxiliaryActions:"작업",auxiliaryDefault:"기본값",auxiliaryCustomEndpoint:"사용자 지정 엔드포인트",auxiliaryProviderAuto:"자동",auxiliaryProviderMain:"메인 모델",auxiliaryProviderPlaceholder:"auto, main 또는 provider key",auxiliaryDownloadShort:"다운로드",auxiliaryExtraBody:"Extra body JSON",auxiliaryClear:"초기화",auxiliarySaved:"보조 모델을 저장했습니다",auxiliaryLoadFailed:"보조 모델을 불러오지 못했습니다",auxiliarySaveFailed:"보조 모델을 저장하지 못했습니다",auxiliaryInvalidExtraBody:"Extra body는 JSON 객체여야 합니다",auxiliaryTaskCompression:"압축",auxiliaryTaskVision:"비전",auxiliaryTaskWebExtract:"웹 추출",auxiliaryTaskSkillsHub:"스킬 허브",auxiliaryTaskApproval:"승인",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"제목 생성",auxiliaryTaskTriageSpecifier:"트리아지 지정",auxiliaryTaskKanbanDecomposer:"Kanban 분해",auxiliaryTaskProfileDescriber:"프로필 설명",auxiliaryTaskCurator:"큐레이터",auxiliaryTaskSessionSearch:"세션 검색",auxiliaryTaskFlushMemories:"메모리 쓰기",currentDefault:"현재 기본값",defaultShort:"기본값",setDefaultProvider:"기본 Provider로 설정",setDefault:"기본값으로 설정",builtIn:"내장",customType:"사용자 지정",provider:"공급자",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 256000 (선택사항)",apiMode:"API 모드",local:"로컬 ({host})",selectProviderRequired:"Provider를 선택해 주세요",baseUrlRequired:"Base URL을 입력해 주세요",apiKeyRequired:"API Key를 입력해 주세요",modelRequired:"기본 모델을 선택해 주세요",enterBaseUrl:"먼저 Base URL을 입력해 주세요",unexpectedFormat:"예상치 못한 응답 형식입니다",foundModels:"{count}개의 모델을 찾았습니다",fetchFailed:"모델을 가져오지 못했습니다",xaiWaiting:"열린 xAI 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.",xaiOpenLink:"xAI 인증 페이지 열기",xaiLoginTitle:"xAI Grok OAuth 로그인",xaiExpired:"인증 링크가 만료되었습니다. 다시 시도하세요.",xaiCopyLink:"인증 링크 복사",xaiApproved:"로그인 성공!",anthropicLoginTitle:"Claude OAuth 로그인",anthropicWaiting:"Claude 인증 페이지에서 인증을 완료한 뒤 반환된 코드를 여기에 붙여넣으세요.",anthropicOpenLink:"Claude 인증 페이지 열기",anthropicCopyLink:"인증 링크 복사",anthropicCodePlaceholder:"인증 코드 붙여넣기...",anthropicSubmitCode:"코드 제출",anthropicApproved:"로그인 성공!",anthropicExpired:"인증이 만료되었습니다. 다시 시도하세요.",geminiLoginTitle:"Google Gemini OAuth 로그인",geminiWaiting:"열린 Google 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.",geminiOpenLink:"Google 인증 페이지 열기",geminiCopyLink:"인증 링크 복사",geminiApproved:"로그인 성공!",geminiExpired:"인증 링크가 만료되었습니다. 다시 시도하세요.",visibilitySelectOne:"최소 하나의 표시 모델을 유지하세요",visibilitySaved:"표시 모델이 저장되었습니다",visibilitySaveFailed:"표시 모델 저장 실패",visibilityHint:"Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.",showAllModels:"모든 모델 표시",searchPlaceholder:"모델 검색...",noResults:"결과 없음",noModels:"모델 없음",removeCustomModel:"목록에 없는 이 모델 제거",refresh:"모델 목록 새로고침 (config.yaml 다시 불러오기)",more:"개 더",models:"모델 목록",manageVisibleModelsFor:"{name} 표시 모델 관리",manageVisibleModels:"표시 모델 관리",getApiKey:"API Key 가져오기",count:"개 모델",aliasUseOriginal:"원본 ID로 복원",aliasTitleFor:"{model}의 표시 이름",aliasTitle:"모델 표시 이름",aliasSaveFailed:"표시 이름 저장 실패",aliasPlaceholder:"비워두면 원본 모델 ID 사용",aliasManageFor:"{provider}의 표시 이름",aliasManage:"표시 이름",aliasHint:"Web UI 표시 이름만 변경합니다. Hermes에는 여전히 원본 모델 ID가 전달됩니다.",aliasEdit:"이름 변경",aliasCanonical:"원본 ID: {model}"},profiles:{title:"프로필",create:"프로필 생성",import:"가져오기",export:"내보내기",rename:"이름 변경",delete:"삭제",switchTo:"Hermes Profile 전환",switchConfirm:"`hermes profile use {name}`를 실행하고 Hermes CLI active profile을 변경합니다. 계속하시겠습니까?",switchSuccess:'Hermes active profile이 "{name}"(으)로 전환되었습니다',switchFailed:"Hermes Profile 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.",createSuccess:'프로필 "{name}"이(가) 생성되었습니다',createFailed:"프로필 생성 실패",renameSuccess:"프로필 이름이 변경되었습니다",renameFailed:"프로필 이름 변경 실패",deleteConfirm:'프로필 "{name}"을(를) 삭제하시겠습니까?',deleteSuccess:"프로필이 삭제되었습니다",deleteFailed:"프로필 삭제 실패",exportSuccess:"프로필이 내보내기되었습니다",exportFailed:"프로필 내보내기 실패",importSuccess:"프로필이 가져오기되었습니다",importFailed:"프로필 가져오기 실패",importSelectFile:"아카이브 파일 선택",importInvalidFile:"유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)",name:"프로필 이름",namePlaceholder:"영문, 숫자, 하이픈만 사용 가능",nameValidation:"프로필 이름에는 소문자, 숫자, 밑줄, 하이픈만 사용할 수 있습니다",newName:"새 이름",newNamePlaceholder:"새 이름을 입력하세요",cloneFromCurrent:"현재 프로필에서 복제",cloneCleanupNotice:"복제 시 독점형 플랫폼 자격 증명(Weixin / Telegram / Slack 등)은 자동으로 건너뛰어 원본 프로필과의 충돌을 방지합니다",cloneStrippedCredentials:"독점 자격 증명 {count}개 제거됨: {list}",cloneDisabledPlatforms:"플랫폼 {count}개 비활성화됨: {list}",cloneStrippedConfigCredentials:"config.yaml에서 임베디드 자격 증명 {count}개 제거됨: {list}",archivePath:"아카이브 경로",archivePathPlaceholder:"아카이브 파일의 서버 경로",importName:"프로필 이름 (선택)",importNamePlaceholder:"비워두면 아카이브 이름을 사용합니다",active:"활성",model:"모델",gateway:"게이트웨이",alias:"별칭",provider:"공급자",path:"경로",skills:"스킬",hasEnv:".env 있음",hasSoulMd:"soul.md 있음",noProfiles:"프로필이 없습니다. 새로 만들어 시작하세요.",avatar:{title:"사용자 지정 아바타",customize:"아바타",upload:"이미지 업로드",random:"무작위 생성",reset:"기본값 복원",hint:"PNG, JPEG, WebP 지원, 최대 1MB",invalidType:"PNG, JPEG 또는 WebP 이미지를 선택하세요",tooLarge:"아바타 이미지는 1MB를 초과할 수 없습니다",saveSuccess:"아바타가 저장되었습니다",saveFailed:"아바타 저장 실패",resetSuccess:"기본 아바타로 복원되었습니다",resetFailed:"기본 아바타 복원 실패"},runtime:{activeProfile:"현재: {name}",bridgeWorker:"Bridge 상태",gateway:"게이트웨이",active:"활성",activeTag:"현재",idle:"대기 중",checking:"확인 중",running:"실행 중",stopped:"중지됨",restartGateway:"Gateway 재시작",restartProfile:"프로필 재시작",switchProfile:"프론트엔드 프로필 전환",gatewayRestarted:"Gateway가 재시작되었습니다: {name}",gatewayRestartFailed:"Gateway 재시작 실패",profileRestarted:"프로필이 재시작되었습니다: {name}",profileRestartFailed:"프로필 재시작 실패"}},logs:{title:"로그",all:"전체",searchPlaceholder:"검색...",refresh:"새로고침",noEntries:"로그 항목 없음"},settings:{title:"설정",saved:"저장됨",saveFailed:"저장 실패",tabs:{display:"표시",account:"현재 계정",users:"계정 관리",agent:"에이전트",proxy:"프록시",memory:"메모리",compression:"압축",session:"세션",privacy:"개인정보",apiServer:"API 서버",models:"모델",voice:"음성"},display:{streaming:"스트리밍 응답",streamingHint:"AI 응답을 실시간으로 표시",compact:"컴팩트 모드",compactHint:"메시지 간격 줄이기",showReasoning:"추론 과정 표시",showReasoningHint:"모델의 생각 과정 표시",showCost:"비용 표시",showCostHint:"응답에 토큰 사용량 표시",inlineDiffs:"인라인 변경사항",inlineDiffsHint:"코드 변경사항을 인라인으로 표시",bellOnComplete:"완료 알림음",bellOnCompleteHint:"AI 응답 완료 시 알림음 재생",notifyOnComplete:"완료 알림",notifyOnCompleteHint:"AI 응답 완료 시 시스템 알림 표시",notifyOnCompleteMacHint:"macOS 에서는 시스템 설정에서 브라우저 알림을 허용해야 합니다.",notifyOnCompleteDenied:"알림 권한이 거부되었습니다",notifyOnCompleteInsecure:"브라우저 알림은 HTTPS 또는 localhost 가 필요합니다",notifyOnCompleteUnsupported:"이 브라우저는 알림을 지원하지 않습니다",notifyOnCompleteTest:"알림이 활성화되었습니다.",notifyOnCompleteTestButton:"테스트",notifyOnCompleteTesting:"테스트 알림을 보내는 중...",notifyOnCompleteTestSent:"테스트 알림을 보냈습니다",notifyOnCompleteTestFailed:"테스트 알림 전송 실패",busyInputMode:"바쁨 입력 모드",busyInputModeHint:"AI 처리 중에도 입력 허용",theme:"테마",themeHint:"라이트, 다크 또는 시스템 설정 따르기",themeLight:"라이트",themeDark:"다크",themeSystem:"시스템",chatInputHeight:"채팅 입력 높이",chatInputHeightHint:"데스크톱 채팅 입력창 기본 높이(px). 모바일은 자동 높이를 유지합니다."},agent:{maxTurns:"최대 턴 수",maxTurnsHint:"대화당 최대 상호작용 라운드 수",gatewayTimeout:"게이트웨이 시간초과",gatewayTimeoutHint:"요청 시간초과 (초)",restartDrainTimeout:"재시작 드레인 시간초과",restartDrainTimeoutHint:"재시작 전 드레인 시간초과 (초)",toolEnforcement:"도구 실행 정책",toolEnforcementHint:"도구 호출 실행 모드 제어",auto:"자동",always:"항상",never:"사용 안 함"},gatewayAutoStart:{title:"Gateway 자동 시작",description:"Web UI 시작 시 자동으로 실행할 로컬 Hermes profile gateway를 제어합니다. 이 값은 profile config.yaml이 아니라 Web UI 설정에 저장됩니다.",enabled:"Gateway 자동 시작",enabledHint:"끄면 시작 시 어떤 profile gateway도 자동으로 실행하지 않습니다.",management:"통합 gateway",managementHint:"Hermes Agent 0.17.0 이상이 필요합니다. 켜면 Web UI가 multiplex_profiles를 기록해 default gateway가 모든 profiles를 처리합니다. 다른 profile은 Feishu, Weixin, QQBot 같은 메시징 진입점을 별도로 설정할 수 없습니다. 끄면 해당 설정을 제거합니다.",managementAuto:"자동",managementPerProfile:"Profile별 gateway 하나",managementUnified:"통합 default gateway",mode:"Profile 정책",modeHint:"발견된 모든 profiles를 시작하거나 명시적으로 포함한 목록만 시작합니다.",modeAll:"발견된 모든 profiles",modeInclude:"포함된 profiles만",include:"포함할 profiles",includeHint:"쉼표로 구분한 profile 이름입니다. 포함 모드에서 빈 목록은 아무것도 시작하지 않습니다.",exclude:"제외할 profiles",excludeHint:"include/all 정책 적용 후 건너뛸 profile 이름을 쉼표로 구분해 입력합니다.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway 프록시",description:"선택한 profile gateway의 프록시 환경 변수를 설정합니다. 변경 사항을 저장하면 gateway가 재시작되어 메시징 플랫폼이 새 네트워크 설정을 사용합니다.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"HTTPS 요청용 프록시입니다. 보통 가장 먼저 설정하는 값입니다.",httpProxy:"HTTP_PROXY",httpProxyHint:"일반 HTTP 요청용 프록시입니다.",allProxy:"ALL_PROXY",allProxyHint:"프로토콜별 프록시가 없을 때 사용하는 대체 프록시입니다.",noProxy:"NO_PROXY",noProxyHint:"프록시를 우회할 호스트 또는 도메인을 쉼표로 구분합니다.",save:"프록시 설정 저장"},memory:{enabled:"메모리 활성화",enabledHint:"AI가 대화 컨텍스트를 기억하도록 허용",userProfile:"사용자 프로필",userProfileHint:"AI가 사용자 선호를 기억하도록 허용",charLimit:"메모리 문자 제한",charLimitHint:"MEMORY.md 최대 문자 수",userCharLimit:"사용자 프로필 문자 제한",userCharLimitHint:"USER.md 최대 문자 수"},compression:{enabled:"압축 활성화",enabledHint:"긴 채팅 기록이 모델 컨텍스트를 넘기 전에 자동 압축",threshold:"압축 임계값",thresholdHint:"추정 토큰이 이 컨텍스트 비율을 넘으면 압축 시작",targetRatio:"목표 비율",targetRatioHint:"압축 후 기록 크기를 컨텍스트 비율로 지정",protectLastN:"최근 메시지 보호",protectLastNHint:"이 수만큼 최신 메시지는 압축하지 않음",protectFirstN:"처음 메시지 보호",protectFirstNHint:"이 수만큼 처음 메시지는 압축하지 않음"},session:{mode:"초기화 모드",modeHint:"세션 초기화 트리거 조건",modeBoth:"유휴 + 예약",modeIdle:"유휴만",modeDaily:"예약만",modeNone:"안함 (수동만)",idleMinutes:"유휴 시간초과",idleMinutesHint:"자동 초기화 대기 시간 (분)",atHour:"예약 초기화 시간",humanOnly:"사람 세션만 표시",humanOnlyHint:"하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",liveMonitorHumanOnly:"라이브 모니터: 사람 세션만 표시",liveMonitorHumanOnlyHint:"라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",atHourHint:"매일 지정한 시간에 세션 초기화",requireAuth:"세션 승인",requireAuthHint:"세션 작업에 승인을 요구합니다",memoryWriteApproval:"메모리 쓰기 검토",memoryWriteApprovalHint:"Hermes Agent의 메모리 쓰기를 저장하기 전에 승인 대기 상태로 둡니다.",skillsWriteApproval:"스킬 쓰기 검토",skillsWriteApprovalHint:"Hermes Agent의 스킬 변경을 저장하기 전에 승인 대기 상태로 둡니다.",writeApprovalTitle:"쓰기 승인 대기",writeApprovalDescription:"Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.",writeApprovalRefresh:"새로고침",writeApprovalEmpty:"승인 대기 중인 쓰기가 없습니다.",writeApprovalMemory:"메모리",writeApprovalSkills:"스킬",writeApprovalViewDiff:"검토",writeApprovalHideDiff:"숨기기",writeApprovalNoDiff:"표시할 차이가 없습니다.",writeApprovalLoadFailed:"승인 대기 쓰기를 불러오지 못했습니다",writeApprovalDiffFailed:"쓰기 세부 정보를 불러오지 못했습니다",writeApprovalActionFailed:"승인 대기 쓰기를 처리하지 못했습니다",writeApprovalApproved:"쓰기가 승인되었습니다",writeApprovalRejected:"쓰기가 거부되었습니다",writeApprovalApprove:"승인",writeApprovalReject:"거부",writeApprovalPendingMemoryWrite:"승인 대기 메모리 쓰기",writeApprovalCurrentFile:"현재 {file}",writeApprovalProposedFile:"제안된 {file}",writeApprovalDiffSection:"차이",writeApprovalPatchOldStringMissing:"패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.",writeApprovalRequestedOldString:"요청된 old_string",writeApprovalCurrentReadFailed:"현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.",writeApprovalDeleteSkill:"이 승인은 스킬 {skill}을 삭제합니다.",writeApprovalRemoveFile:"이 승인은 스킬 {skill}에서 {file}을 제거합니다."},privacy:{redactPii:"개인정보 마스킹",redactPiiHint:"민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)"},apiServer:{enable:"활성화",enableHint:"API 서버 활성화",host:"호스트",hostHint:"수신 주소",port:"포트",portHint:"수신 포트",key:"키",keyHint:"API 접근 키",cors:"CORS 출처",corsHint:"허용된 교차 출처"},voice:{activeTtsApi:"활성 TTS API",activeSttApi:"활성 STT API",ttsProvidersTitle:"TTS 제공자",ttsProvidersDescription:"어시스턴트 응답 재생과 음성 미리듣기에 사용하는 텍스트 음성 변환 연동을 관리합니다.",sttProvidersTitle:"STT 제공자",sttProvidersDescription:"마이크와 음성 입력 흐름에서 사용하는 음성 텍스트 변환 연동을 관리합니다.",noneSelected:"선택 없음",keyStored:"저장됨",keyMissing:"없음",customApi:"API",localBuiltin:"로컬 내장",ttsCardHint:"음성 합성 제공자",sttCardHint:"음성 전사 제공자",setActive:"활성화",testAction:"테스트",connect:"연결",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Microsoft Edge의 무료 고품질 클라우드 음성입니다.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"사용자 지정 TTS",presetBrowserSttLabel:"브라우저 STT",presetBrowserSttDescription:"브라우저 기본 음성 인식 API입니다.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"사용자 지정 STT",apiCompatibility:"API 호환성",openaiCompatible:"OpenAI 호환",manualCustomEndpoint:"수동 사용자 지정 엔드포인트",connectionStep:"연결",discoveryManualHint:"수동 사용자 지정 엔드포인트가 선택되었습니다. 모델 검색을 사용할 수 없으므로 모델 이름을 직접 입력하세요.",discoveryCredentialHint:"Base URL과 API key를 입력한 뒤 연결하여 사용 가능한 모델을 가져오세요.",discoveryNoAutoProbeHint:"입력 중에는 요청을 보내지 않습니다. 자격 증명이 준비되면 Connect를 사용하세요.",apiKeyConnectPlaceholder:"연결할 API key를 붙여넣으세요. 저장된 key는 표시되지 않습니다",connectFetchModels:"연결 및 모델 가져오기",modelRecommendedSuffix:"추천",modelConnectManualHint:"연결하여 자동 입력하거나 직접 입력하세요.",modelRequiredConnectManual:"모델은 필수입니다. 연결하여 자동 입력하거나 직접 입력하세요.",apiKeyRequired:"API key는 필수입니다.",apiKeyRequiredForDiscovery:"모델을 가져오려면 API key가 필요합니다.",baseUrlRequired:"Base URL은 필수입니다.",baseUrlHttpsRequired:"http:// 또는 https:// 프로토콜을 사용하세요.",baseUrlInvalid:"https://를 포함한 올바른 Base URL을 입력하세요.",discoveryFailedManualFallback:"모델을 가져올 수 없습니다. 모델 이름은 직접 입력할 수 있습니다.",completeRequiredProviderFields:"저장하기 전에 필수 provider 필드를 완료하세요.",fetchingModels:"모델 가져오는 중...",recommendedModel:"추천: {model}.",useRecommendedModel:"이 모델 사용",modelsDiscovered:"{count}개 모델을 발견했습니다. 필드가 비어 있으면 추천 모델이 선택됩니다.",remove:"제거",testSuccess:"테스트 완료",testTextRequired:"테스트하기 전에 텍스트를 입력하세요.",keyMissingForTest:"이 제공자를 테스트하기 전에 API 키를 추가하세요.",testing:"테스트 중...",transcribing:"전사 중...",browserSttTestHint:"브라우저 STT는 채팅 마이크에서 테스트합니다.",sttEmptyAudio:"녹음된 오디오가 없습니다. 다시 시도하세요.",sttTestSuccess:"전사가 완료되었습니다",sttRecordingHint:"녹음 중... 전사하려면 중지를 클릭하세요.",keepStoredKeyPlaceholder:"저장된 키를 유지하려면 비워 두세요",apiKeyPlaceholder:"API 키 입력",lastTest:"마지막 테스트",notTested:"—",recording:"녹음 중",testFailedShort:"실패",testFailedSummary:"테스트에 실패했습니다. 제공자 설정을 확인하고 다시 시도하세요.",showDetails:"세부 정보 표시",hideDetails:"세부 정보 숨기기",moreActions:"더보기",moreActionsFor:"{provider} 추가 작업",addTtsApi:"TTS API 추가",addSttApi:"STT API 추가",active:"활성",builtin:"내장",connected:"연결됨",disconnected:"연결 끊김",source:"소스",model:"모델",voice:"음성",doubaoVoiceHint:"Seed TTS 2.0 음색을 선택하면 리소스 필드가 자동으로 업데이트됩니다.",apiKey:"API 키",confirmDeleteSecret:"이 음성 API의 저장된 API 키를 삭제할까요?",ttsTitle:"텍스트 음성 변환",ttsSaved:"TTS 설정이 서버에 저장되었습니다",ttsSaveFailed:"TTS 설정 저장에 실패했습니다",ttsTestSaved:"미리듣기에 성공했습니다. TTS 설정이 서버에 저장되었습니다",ttsTestSaving:"미리듣기 전에 TTS 설정을 저장하는 중...",ttsMissingBaseUrl:"테스트 전에 Base URL이 필요합니다. 제공자 엔드포인트를 입력한 뒤 다시 테스트하세요.",ttsMissingApiKey:"테스트 전에 API 키가 필요합니다. 키를 붙여넣거나 먼저 서버 저장 키를 저장하세요.",ttsCleared:"저장된 TTS 키를 삭제했습니다",ttsClearFailed:"저장된 TTS 키 삭제에 실패했습니다",storedBaseUrlsTitle:"저장된 Base URLs",storedBaseUrlsHint:"저장된 음성 provider endpoint를 여기서 관리합니다. 위 입력란은 현재 값만 지우고, 저장된 URL 삭제는 여기서 합니다.",storedBaseUrlsEmpty:"서버에 저장된 사용자 지정 음성 Base URL이 없습니다.",storedBaseUrlDelete:"URL 삭제",storedApiKeysTitle:"저장된 API keys",storedApiKeysHint:"서버에 저장된 음성 API key 목록입니다. 용도와 출처만 표시하고 전체 key는 표시하지 않습니다.",storedApiKeysEmpty:"서버에 저장된 음성 API key가 없습니다.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"key 삭제",baseUrlPresetClear:"URL 지우기",baseUrlPresetCleared:"현재 Base URL을 지웠습니다.",baseUrlPresetDelete:"URL 삭제",baseUrlPresetDeleted:"저장 목록에서 Base URL을 제거했습니다.",baseUrlPresetDeleteFailed:"저장된 Base URL 제거에 실패했습니다.",ttsPendingSecret:"새 키가 저장됩니다",ttsStoredSecret:"서버에 저장된 키가 있습니다: {value}",ttsClearKey:"저장된 키 삭제",sttTitle:"음성 텍스트 변환",sttProvider:"STT 제공자",sttProviderHint:"음성 입력을 전사하는 방식을 선택하세요",sttProviderBrowser:"브라우저",sttProviderOpenai:"OpenAI 호환",sttProviderCustom:"사용자 지정",sttBrowserHint:"사용 가능한 경우 브라우저 내장 음성 인식을 사용합니다.",sttApiKey:"API 키",sttApiKeyHint:"인증이 필요한 STT 제공자를 위해 서버 측에 저장됩니다.",sttStoredSecret:"저장된 서버 키: {value}",sttPendingSecret:"저장된 서버 키: 저장 시 업데이트됩니다",sttClearKey:"저장된 키 삭제",sttModel:"모델",sttModelHint:"사용할 음성 텍스트 변환 모델입니다.",sttLanguage:"언어",sttLanguageHint:"en 또는 zh 같은 선택적 언어 힌트입니다.",sttPrompt:"프롬프트",sttPromptHint:"선택적 전사 프롬프트입니다.",sttAudioTranscode:"오디오 트랜스코딩",sttAudioTranscodeNone:"원본 오디오 전송",sttAudioTranscodeFfmpeg:"ffmpeg로 WAV 변환",sttBaseUrl:"Base URL",sttBaseUrlHint:"OpenAI 호환 사용자 지정 음성 텍스트 변환 엔드포인트입니다.",sttSave:"STT 설정 저장",sttSaved:"STT 설정이 서버에 저장되었습니다.",sttSaveFailed:"STT 설정 저장에 실패했습니다.",sttCleared:"저장된 STT 비밀 값이 서버에서 삭제되었습니다.",sttClearFailed:"저장된 STT 비밀 값 삭제에 실패했습니다.",sttActiveSaved:"활성 STT 제공자가 서버에 저장되었습니다.",sttSaveActive:"활성 STT 제공자 저장",sttEndpointHint:"최종 전사 엔드포인트: {endpoint}",sttTestTitle:"음성 텍스트 변환 테스트",sttTestButton:"STT API 테스트",sttTestStopButton:"중지하고 전사",sttTestBackendOnly:"STT API 테스트는 OpenAI 호환 및 사용자 지정 제공자에서 사용할 수 있습니다.",sttTestRecording:"테스트 샘플 녹음 중... 완료되면 중지하고 전사를 클릭하세요.",sttTestTranscribing:"테스트 샘플 전사 중...",sttTestEmpty:"STT 테스트용 오디오가 녹음되지 않았습니다.",sttTestSucceeded:"STT 테스트가 성공했습니다.",sttTestFailed:"STT 테스트 실패: {error} — {hint}",sttFailureHintMissingConfig:"테스트 전에 제공자가 Base URL/모델 및 API 키와 함께 저장되었는지 확인하세요.",sttFailureHintAuth:"API 키를 확인하세요. 키가 이미 저장되어 있었다면 현재 키를 다시 붙여넣고 저장한 뒤 테스트하세요.",sttFailureHintForbidden:"키가 제공자에 도달했지만 이 STT 모델 또는 계정에 대한 권한이 없습니다. 제공자 접근 권한/결제를 확인하세요.",sttFailureHintEndpointModel:"Base URL과 모델을 확인하세요. Groq의 경우 {endpoint}에 whisper-large-v3-turbo 또는 다른 Groq STT 모델을 사용하세요.",sttFailureHintModel:"선택한 STT 모델이 존재하며 이 계정에서 활성화되어 있는지 확인하세요.",sttFailureHintQuota:"제공자가 할당량, 결제 또는 속도 제한 문제를 보고했습니다. 계정 할당량/결제를 확인하거나 나중에 다시 시도하세요.",sttFailureHintNetworkCustom:"서버가 사용자 지정 STT 엔드포인트에 연결할 수 없습니다. {endpoint}가 Web UI 서버에서 접근 가능하고 OpenAI 호환인지 확인하세요.",sttFailureHintNetwork:"Web UI 서버가 STT 제공자에 연결할 수 없습니다. 네트워크/프록시/방화벽을 확인하고 다시 시도하세요.",sttFailureHintAudio:"녹음된 오디오가 비어 있거나 거부되었습니다. 짧고 명확한 샘플을 시도하고, 마이크 접근을 허용하거나 Chrome에서 다시 시도하세요.",sttFailureHintGenericCustom:"API 키, Base URL, 모델, 최종 엔드포인트 {endpoint}를 확인하세요.",sttFailureHintGeneric:"API 키, 모델, 제공자 계정 접근 권한을 확인한 뒤 다시 시도하세요.",sttTestRecordFailed:"마이크 녹음을 시작할 수 없습니다: {error}",sttTestTranscript:"전사 결과: {text}",ttsProvider:"TTS 제공자",ttsProviderHint:"메시지 재생에 사용할 텍스트 음성 변환 엔진 선택",providerWebSpeech:"WebSpeech API (브라우저)",providerOpenai:"OpenAI TTS",providerCustom:"사용자 정의 엔드포인트 (OpenAI 호환)",providerEdge:"Edge TTS (무료, API Key 불필요)",webspeechVoice:"음성",webspeechVoiceHint:"브라우저 또는 OS에서 음성 선택",webspeechVoicePlaceholder:"자동 (기본 음성)",openaiKey:"API 키",openaiKeyHint:"TTS 접근 권한이 있는 OpenAI API 키",openaiUrl:"API 기본 URL",openaiUrlHint:"예: https://api.openai.com/v1/audio/speech",openaiModel:"모델",openaiModelHint:"tts-1 (빠름) / tts-1-hd (고음질)",openaiVoice:"음색",openaiVoiceHint:"합성에 사용할 음색",customHint:"모든 OpenAI 호환 TTS API 사용 가능 — GPT-SoVITS, CosyVoice 등 지원",customUrl:"API URL",customUrlHint:"TTS 서비스의 기본 URL",customUrlPlaceholder:"로컬 어댑터에 설정된 주소 (예: http://127.0.0.1:9880)",customApiKey:"API 키 (선택사항)",customApiKeyHint:"일부 사용자 정의 엔드포인트는 인증 필요",customApiKeyPlaceholder:"필요하지 않으면 비워둠",edgeHint:"Microsoft Edge TTS 기반 (node-edge-tts).",edgeUrl:"어댑터 URL",edgeUrlHint:"Edge TTS 어댑터 주소 (예: http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"음색",edgeVoiceHint:"음성 합성에 사용할 음색 선택",edgeRate:"속도",edgeRateHint:"음성 속도 조절 (0.5~2.0배)",edgePitch:"음높이",edgePitchHint:"음성 음높이 조절 (-20~+20 Hz)",testTitle:"음성 테스트",testText:"테스트 텍스트",testTextPlaceholder:"테스트할 텍스트 입력...",testTextDefault:"안녕하세요, 음성 테스트입니다.",testButton:"테스트",testButtonPlaying:"재생 중...",testFailed:"테스트 실패: {error}",providerMimo:"MiMo TTS",mimoHint:"샤오미 MiMo TTS — 프리셋 음성, 음성 디자인, 음성 클론 세 가지 모드 지원",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com에서 발급",mimoApiKeyPlaceholder:"MiMo API Key",mimoAuthMode:"인증 모드",mimoAuthModeHint:"선택한 MiMo 엔드포인트가 요구하는 헤더 형식",mimoAuthModeBearer:"Bearer 토큰 (Authorization)",mimoAuthModeApiKey:"API key 헤더 (api-key)",mimoAuthModeBoth:"두 헤더 모두",mimoBaseUrl:"Base URL",mimoBaseUrlHint:"MiMo API 엔드포인트 URL",mimoModel:"모델",mimoModelHint:"음성 합성 모델 선택",mimoModelPreset:"프리셋 음성",mimoModelVoiceDesign:"음성 디자인",mimoModelVoiceClone:"음성 클론",mimoVoice:"음성",mimoVoiceHint:"프리셋 음성 선택",mimoVoiceDesignPrompt:"음성 설명",mimoVoiceDesignPromptHint:"원하는 음성 특징을 설명하세요",mimoVoiceDesignPromptPlaceholder:"예: 따뜻한 젊은 여성 목소리, 약간 느린 속도, 마그네틱한 톤",mimoCloneAudio:"오디오 업로드",mimoCloneAudioHint:"음성 클론용 오디오 샘플 업로드 (mp3/wav, 최대 10MB)",mimoCloneAudioUpload:"파일 선택",mimoCloneAudioClear:"지우기",mimoStylePrompt:"스타일 프롬프트",mimoStylePromptHint:"선택사항 — 자연어로 말하기 스타일 설명",mimoStylePromptPlaceholder:"예: 밝고 경쾌한 톤, 빠른 속도"},lockedIps:{title:"잠긴 IP 관리",count:"{count}개 잠김",empty:"잠긴 IP 없음",unlock:"잠금 해제",unlockAll:"전체 해제",unlockAllConfirm:"모든 잠긴 IP를 해제하시겠습니까?",unlocked:"IP 잠금 해제됨",allUnlocked:"{count}개 IP 잠금 해제됨",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"사용자 아바타",upload:"이미지 업로드",random:"무작위 생성",reset:"기본값으로 재설정",hint:"PNG, JPEG, WebP를 최대 1MB까지 지원하며 500KB 미만으로 자동 압축됩니다.",invalidType:"PNG, JPEG 또는 WebP 이미지를 선택하세요",tooLarge:"아바타 이미지는 1MB 이하여야 합니다",saveSuccess:"아바타 저장됨",saveFailed:"아바타 저장 실패",resetSuccess:"아바타 재설정됨",resetFailed:"아바타 재설정 실패"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key 입력",noProviders:"구성된 공급자가 없습니다",save:"저장",saveFailed:"저장 실패",saved:"저장됨"}},githubPreview:{title:"버전 미리보기",description:"선택한 GitHub tag 를 Web UI 미리보기 작업 디렉터리에 클론하고, 의존성을 설치한 뒤 개발 포트로 실행합니다.",refresh:"새로고침",selectTag:"tag 선택",prepare:"코드 준비",install:"의존성 설치",start:"미리보기 시작",stop:"중지",note:"미리보기 코드는 Web UI 데이터 홈 아래에 저장됩니다. 프로덕션은 8648을 유지하고, 미리보기 개발 환경은 프론트엔드 8651, 백엔드 8650에서 실행됩니다.",path:"미리보기 경로",webuiHome:"미리보기 데이터 홈",currentTag:"현재 Tag",repoReady:"저장소 준비됨",dependencies:"의존성 설치됨",running:"실행 상태",notRunning:"실행 중 아님",open:"미리보기 열기",log:"작업 로그 경로",logOutput:"로그 출력",actionLog:"작업 로그",devLog:"개발 서버 로그",yes:"예",no:"아니요",actionFailed:"작업 실패",nodeEnvironmentMissing:"Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.",prepareSuccess:"미리보기 코드가 준비되었습니다",installSuccess:"의존성이 설치되었습니다",startSuccess:"미리보기가 완료되었습니다",stopSuccess:"미리보기가 중지되었습니다"},codingAgents:{title:"코딩 에이전트",notice:"모든 제공업체와 모델이 호환되는 것은 아닙니다.",claudeDescription:"print mode 단발 작업과 대화형 코딩 세션을 위한 Anthropic CLI입니다.",codexDescription:"저장소 작업을 위한 OpenAI CLI 및 Hermes openai-codex 제공업체 흐름입니다.",copyCommand:"복사",commandCopied:"명령이 복사되었습니다",commandCopyFailed:"복사 실패",refresh:"새로고침",checking:"확인 중",installStatus:"설치 상태",installed:"설치됨",notInstalled:"설치되지 않음",installRequired:"{agent}이(가) 설치되어 있지 않습니다. 세션을 만들기 전에 설치하세요.",installNow:"설치",installing:"설치 중",installSuccess:"설치됨",installFailed:"설치 실패",installFailedHermesHint:"설치에 실패했습니다. Hermes에게 설치를 요청하세요.",installFailureReason:"오류 원인",nodeEnvironmentMissing:"Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.",deleteNow:"삭제",deleting:"삭제 중",deleteSuccess:"삭제됨",deleteFailed:"삭제 실패",configFiles:"설정 파일",profileScope:"프로필",providerScope:"제공업체",providerPlaceholder:"예: custom:glm",modelScope:"모델",modelPlaceholder:"모델 선택",launchModeScope:"시작 모드",launchModeGlobal:"전역 설정",launchModeScoped:"제공업체와 모델",protocolScope:"프로토콜",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"설정 다시 읽기",configFileNotCreated:"생성되지 않음",configLoadFailed:"설정 파일을 읽지 못했습니다",loadFailed:"코딩 에이전트를 확인하지 못했습니다",launch:"시작",launchTitle:"코딩 에이전트 시작",nativeTerminal:"네이티브 터미널",builtInTerminal:"내장 터미널",launchPrepared:"시작 설정이 준비되었습니다",launchPrepareFailed:"시작 설정 준비 실패",nativeLaunchStarted:"네이티브 터미널을 열었습니다",nativeLaunchFailed:"네이티브 터미널을 열지 못했습니다",terminalTitle:"코딩 에이전트 터미널",loadProvidersFailed:"현재 프로필의 제공업체를 불러오지 못했습니다",selectProviderModel:"제공업체와 모델을 선택하세요",launchConfigDir:"시작 설정 디렉터리",launchCommand:"시작 명령",table:{tool:"도구",kind:"단계",command:"명령",note:"설명",action:"작업"},kinds:{install:"설치",auth:"인증",health:"상태",run:"실행"},notes:{claudeInstall:"Claude Code CLI를 전역으로 설치합니다.",codexInstall:"Codex CLI를 전역으로 설치합니다.",claudeAuth:"Claude Code 로그인 상태를 확인합니다. 로그인이 없으면 claude를 한 번 실행하세요.",codexAuth:"Hermes가 관리하는 OpenAI Codex OAuth 자격 증명을 추가합니다.",claudeHealth:"업데이터와 로컬 CLI 상태를 확인합니다.",codexHealth:"Codex CLI가 PATH에서 사용 가능한지 확인합니다.",claudeRun:"API 기반 단발 작업에는 print mode가 가장 깔끔한 경로입니다.",codexRun:"Codex 단발 작업은 git 저장소 안에서 실행해야 합니다."}},platform:{requireMention:"{'@'}멘션 필요",requireMentionGroup:"그룹에서 {'@'}멘션 시에만 응답",requireMentionChannel:"채널에서 {'@'}멘션 시에만 응답",requireMentionRoom:"방에서 {'@'}멘션 시에만 응답",reactions:"반응",reactionsHint:"메시지에 이모지 반응",freeResponseChats:"자유 응답 채팅",freeResponseChatsHint:"{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)",freeResponseChannels:"자유 응답 채널",freeResponseChannelsHint:"{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)",freeResponseRooms:"자유 응답 방",freeResponseRoomsHint:"{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)",mentionPatterns:"사용자 지정 멘션 패턴",mentionPatternsHint:"추가 트리거 패턴",autoThread:"자동 스레드",autoThreadHint:"{'@'}멘션 후 자동으로 스레드 생성",autoThreadHintRoom:"방에서 자동으로 스레드 생성",dmMentionThreads:"DM 멘션 스레드",dmMentionThreadsHint:"DM에서 멘션 시 스레드로 응답",allowBots:"봇 메시지 허용",allowBotsHint:"다른 봇의 메시지에 응답",allowedChannels:"허용된 채널",allowedChannelsHint:"채널 ID 허용 목록 (쉼표로 구분)",ignoredChannels:"무시할 채널",ignoredChannelsHint:"봇이 응답하지 않는 채널 ID (쉼표로 구분)",noThreadChannels:"스레드 없는 채널",noThreadChannelsHint:"스레드 없이 응답할 채널 ID (쉼표로 구분)",exclusiveTokenWarning:"이 플랫폼은 독점 토큰 잠금을 사용합니다. 각 프로필은 다른 프로필과 충돌하지 않도록 서로 다른 ID 토큰을 사용해야 합니다.",botToken:"봇 토큰",botTokenHint:"개발자 포털에서 발급받은 봇 토큰",proxyUrl:"프록시 URL",proxyUrlHint:"선택 사항인 플랫폼 전용 프록시입니다. http://, https://, socks5:// 지원",accessToken:"액세스 토큰",accessTokenHint:"Matrix 액세스 토큰",homeserver:"홈서버 URL",homeserverHint:"Matrix 홈서버 URL",matrixUserId:"Matrix 사용자 ID",matrixUserIdHint:"비밀번호 로그인에는 필수, 액세스 토큰에는 선택 사항",matrixPassword:"Matrix 비밀번호",matrixPasswordHint:"액세스 토큰 대신 사용할 로그인 비밀번호",appId:"App ID",appIdHint:"Feishu의 App ID",appSecret:"App Secret",appSecretHint:"Feishu의 App Secret",encryptKey:"암호화 키",encryptKeyHint:"Feishu 암호화 키",verificationToken:"검증 토큰",verificationTokenHint:"Feishu 검증 토큰",clientId:"Client ID",clientIdHint:"DingTalk의 Client ID",clientSecret:"Client Secret",clientSecretHint:"DingTalk의 Client Secret",cardTemplateId:"AI 카드 템플릿 ID",cardTemplateIdHint:"DingTalk AI 카드 템플릿 ID; 비워 두면 AI 카드를 사용하지 않음",botId:"Bot ID",botIdHint:"WeCom 봇 ID",wecomSecretHint:"WeCom 봇 Secret",waEnabled:"WhatsApp 활성화",waEnabledHint:"QR 코드 페어링으로 WhatsApp 활성화",weixinToken:"Weixin 토큰",weixinTokenHint:"weixin CLI QR 로그인에서 가져오기 (hermes weixin)",accountId:"계정 ID",accountIdHint:"Weixin 계정 ID",qrLogin:"QR 로그인",qrRelogin:"다시 로그인",qrFetching:"QR 코드를 가져오는 중...",qrScanHint:"WeChat으로 QR 코드를 스캔하여 로그인",qrScanedHint:"스캔됨, 휴대폰에서 확인해 주세요...",qqSandboxHint:"샌드박스 환경 활성화(테스트용)",qqSandbox:"샌드박스 모드",qqQrScanHint:"QQ로 위 QR 코드를 스캔하거나 휴대폰에서 링크를 열어 바인딩을 완료하세요",qqMarkdownHint:"Markdown 형식 메시지 활성화(일부 클라이언트는 지원하지 않을 수 있음)",qqMarkdown:"Markdown 지원",qqAppSecretHint:"QQ Open Platform Bot의 App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot의 App ID",qqAppId:"App ID",allowedUsersHint:"사용자 ID 또는 OpenID 허용 목록, 쉼표로 구분",allowedUsers:"허용 사용자",allowAllUsersHint:"모든 사용자의 메시지를 허용합니다. 끄면 허용 목록을 사용합니다",allowAllUsers:"모든 사용자 허용"},language:{label:"언어",zh:"中文",en:"English",ko:"한국어"},terminal:{sessions:"세션",newTab:"새 터미널",closeSession:"이 세션을 닫으시겠습니까?",sessionExited:"종료됨",processExited:"프로세스가 종료되었습니다 (코드 {code})",noSessions:"터미널 세션이 없습니다",connectionFailed:"터미널에 연결하지 못했습니다",connectionError:"연결 오류",connectionClosed:"연결이 닫혔습니다"},usage:{title:"사용량 통계",refresh:"새로고침",totalTokens:"총 토큰 수",inputTokens:"입력",outputTokens:"출력",totalSessions:"총 세션 수",avgPerDay:"일평균 ~{n}",estimatedCost:"예상 비용",cacheHitRate:"캐시 적중률",modelBreakdown:"모델별 분포",dailyTrend:"일별 사용량",date:"날짜",tokens:"토큰",cache:"캐시",cacheRead:"캐시 읽기",cacheWrite:"캐시 쓰기",sessions:"세션",cost:"비용",noData:"사용량 데이터 없음"},skillsUsage:{title:"스킬 사용량",subtitle:"Hermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_6_25_1:"Hermes Agent 0.18.0에서 Agent Bridge 승인 메모리 wrapper가 새 has_host_access 매개변수를 전달하지 않아 execute_code가 실패하던 문제를 수정했습니다",new_0_6_24_1:"이번 릴리스는 0.6.23 이후 병합된 PR을 반영하며 채팅 입력, workspace 표시, 플러그인 관리, 기본 모델, workspace diff 확인을 개선합니다",new_0_6_24_2:"단일 채팅과 그룹 채팅 입력 영역은 통합 툴바, 간결한 모델 컨트롤, 모아진 입력 설정, 더 명확한 context 사용량, 모바일 chrome, 단일 채팅 수동 높이 조절 복구를 포함합니다",new_0_6_24_3:"Workspace run 변경 사항은 지속되는 chat diff 카드로 표시되며 오른쪽 drawer에서 diff 보기와 파일 편집을 지원하고 session resume 후에도 복원되며 모바일 보기도 조정되었습니다",new_0_6_24_4:"Workspace folder picker는 Windows drive와 junction workflow를 더 안정적으로 탐색하고 .hermes, .config, .codex 같은 dot-prefixed folder를 WORKSPACE_BASE 안전 경계 안에서 표시합니다",new_0_6_24_5:"Plugins 페이지에서 관리 가능한 user plugin을 enable / disable할 수 있으며 Hermes base config와 현재 profile config의 plugin state를 더 정확히 표시합니다",new_0_6_24_6:"Models 페이지에 default provider와 default model 작업을 추가했고 bridge terminal error 오탐을 줄였으며 Hermes Agent runtime packaging을 0.18.0으로 올리고 website version manifest도 갱신했습니다",new_0_6_23_1:"이번 릴리스는 0.6.22 이후 병합된 PR을 반영하며, 데스크톱 업데이트, MCP 정리, Petdex 펫, MCU 음성, 여러 설정 흐름을 개선했습니다",new_0_6_23_2:"데스크톱 자체 업데이트는 다시 블로킹 방식으로 동작하고, Windows 업데이트 전 서비스 종료가 더 안정적이며, 종료 시 gateway, profile MCP 및 관련 하위 프로세스를 더 완전하게 정리합니다",new_0_6_23_3:"데스크톱 MCP 주입과 Coding Agent MCP 실행 경로가 더 안정적이며, Windows workspace에 드라이브 선택기가 추가되었고 심볼릭 링크 폴더 표시와 데스크톱 Petdex 미리보기가 수정되었습니다",new_0_6_23_4:"Petdex 펫은 Web 펫, 독립 데스크톱 펫 창, 입양 후 즉시 표시, 오른쪽 위 닫기 버튼, 더 잘 보이는 데스크톱 초기 크기를 지원합니다",new_0_6_23_5:"MCU 및 전역 음성 처리는 오디오 프롬프트, OTA 보호, 분할 스트리밍 TTS, 음성 전 링크/코드 블록/표 정리, 완료되지 않은 TTS 생성 중단 처리를 지원합니다",new_0_6_23_6:"profile 설정 편집, 채팅 입력 높이 설정, 로그인 JWT 만료 시간 설정, Skill 편집, History의 로컬 보관 상태 유지, 새 채팅 드로어 문구, 내장 Provider 위험 작업 문구를 개선했습니다",new_0_6_22_1:"이번 릴리스는 0.6.21 이후 병합된 PR을 반영하며, 조합 모델, 세션 기록, 프록시 설정, 슬래시 명령, 모바일 레이아웃을 개선했습니다",new_0_6_22_2:"모델 페이지에 조합 모델 패널이 추가되었고, 채팅에서는 이전의 합성 플레이스홀더 도구 없이 실제 MoA reference와 aggregator 진행 상황을 표시할 수 있습니다",new_0_6_22_3:"채팅 세션을 세션 목록에서 보관하고 기록에서 복원할 수 있으며, 로컬 전용 Claude Code 및 Codex 세션도 기록에 올바르게 표시됩니다",new_0_6_22_4:"설정에 Proxy 탭이 추가되어 gateway 전체 HTTP(S), ALL_PROXY, NO_PROXY 값을 설정하고 Telegram, Discord, Matrix 플랫폼 프록시를 사용할 수 있습니다",new_0_6_22_5:"Hermes 채팅에 /learn 명령이 추가되었고, Agent Bridge 실행은 선택한 workspace를 cwd로 사용하며, 다음 Hermes Agent 릴리스를 기다리는 것은 데스크톱의 /learn 및 MoA 명령 기능뿐입니다",new_0_6_21_1:"This release focuses on workflow reruns, MCP workflow tools, voice settings deletion, Matrix login settings, update cleanup, and docs polish",new_0_6_21_2:"Workflow node messages now open in a left-side resizable full chat drawer, mobile run history opens correctly, and rerun actions can keep the selected node output or clear it before rerunning downstream nodes",new_0_6_21_3:"Hermes Studio MCP use toolset can now list, create, update, delete, run, stop, delete runs, and rerun workflows from a selected node",new_0_6_21_4:"Voice provider removal now deletes the profile provider settings instead of only clearing API keys, while Browser STT and Edge TTS remain protected built-in defaults",new_0_6_21_5:"Matrix platform settings support user ID plus password configuration and report configured status correctly when password login is used",new_0_6_21_6:"Web UI restart, update, and in-app upgrade now stop the Agent Bridge broker by default so new builds do not attach to stale Python bridge processes",new_0_6_21_7:"Chat, group chat, and workflow headers are better aligned; Xiao Fang He shows sold-out status; BSL scope is clearer; /learn planning docs were added; unused Hermes proxy code was removed",new_0_6_20_1:"Workflow가 정식으로 제공됩니다: Agent node를 만들고 graph로 연결한 뒤 Workflow 페이지에서 전체 flow를 실행할 수 있습니다",new_0_6_20_2:"Workflow run은 run record, graph snapshot, node session, live node status, failure reason, run stop/delete action을 저장합니다",new_0_6_20_3:"Workflow 보기와 편집은 run history, read-only snapshot, node chat session review, 더 큰 connection handle, create-workflow-first guard로 더 완성되었습니다",new_0_6_20_4:"Desktop은 오래된 executable path를 고정하지 않고 AGENT_BROWSER_HOME에서 agent-browser가 Chrome을 찾도록 하며 patch integrity guard와 browser stdout fix도 포함합니다",new_0_6_20_5:"지원되는 desktop platform의 packaged browser runtime은 Chrome for Testing 149.0.7827.55로 고정되어 runtime browser regression을 피합니다",new_0_6_20_6:"ESP32와 Xiao Fang He는 tutorial link 업데이트, 밝은 배경 badge 표시, Windows 호환 flow animation을 개선했습니다",new_0_6_19_1:"이번 릴리스는 0.6.18 이후 병합된 16개 PR을 포함하며 UI에서 보이는 디바이스, 음성, Coding Agent, 설정 경험을 개선합니다",new_0_6_19_2:"Coding Agent session에서 model을 전환할 수 있으며 새 session은 global default model을 올바르게 따릅니다",new_0_6_19_3:"MCU 상호작용은 시작 시 Wi-Fi/boot debounce, 대상 디바이스로만 audio 전송, hardware double-click clear 및 interrupt 개선으로 더 안정적입니다",new_0_6_19_4:"TTS 설정은 이제 profile별로 저장되며 speed, pitch, voice test가 같은 설정 소스를 읽습니다",new_0_6_19_5:"Coding Agent의 model switch는 기존 session에 영향을 주지 않으며 custom provider key가 올바르게 전달됩니다",new_0_6_19_6:"Skills runtime filter, cron job sort, skill detail height limit, Windows updater recovery, backup fallback, logo asset compression도 포함됩니다",new_0_6_18_2:"Hermes Studio MCP가 api, devices, use toolset으로 나뉘고 session, model, chat-run, ops 작업이 추가되었습니다",new_0_6_18_3:"채팅과 그룹 채팅 기록은 UI 기록 분리, 안전한 null message 처리, run failure 후 assistant reply 보존, 정렬된 reasoning replay로 더 안정적입니다",new_0_6_18_4:"MCU 디바이스 피드백이 더 명확해져 tool call이 speech보다 우선 표시되고, audio가 작업을 너무 일찍 DONE으로 표시하지 않으며, active device login이 안정화되고 긴 ONLINE/IP 텍스트가 스크롤됩니다",new_0_6_18_5:"음성 및 메시지 workflow에 custom HTTP TTS/STT endpoint, audio transcoding, fork message action, 지속되는 fork marker, 더 명확한 upload error가 추가되었습니다",new_0_6_18_6:"Desktop 및 runtime setup은 Unicode-safe Windows PATH 등록, Hermes Agent 0.17.0 runtime publish 지원, mobile PWA metadata, 여러 profile/auth recovery 수정으로 더 안전해졌습니다",new_0_6_18_7:"여러 세부 사항을 개선했습니다",new_0_6_17_1:"Codex와 Claude Code 대화 시작 문제를 수정했습니다",new_0_6_16_1:"Provider 설정이 사용자 API mode를 보존하고 LongCat preset을 올바르게 처리하며 v12 Provider 삭제와 auth/API-key 이미지 Provider가 포함된 모델 카탈로그 동기화를 지원합니다",new_0_6_16_2:"채팅 명령에 reload-skills, 웹 제목 업데이트, 알 수 없는 slash 명령 전달, tool call과 tool result를 제외한 깨끗한 session context API를 추가했습니다",new_0_6_16_3:"세션 탐색은 Global Agent 세션 검색, 새 세션의 최신 활동순 정렬, 복원된 모바일 사이드바 컨트롤, 안정적인 설정 footer로 더 안정적입니다",new_0_6_16_4:"workspace 전체 이름을 hover로 볼 수 있고 1:1 및 그룹 채팅 영역 전체에서 파일 drag-and-drop 업로드를 사용할 수 있습니다",new_0_6_16_5:"플랫폼 설정에 Feishu Webhook 검증 필드 현지화와 더 넓은 i18n 커버리지를 추가했습니다",new_0_6_16_6:"symlink된 skill 디렉터리 탐색을 지원해 공유 로컬 skills가 안정적으로 표시됩니다",new_0_6_16_7:"큰 정적 assets는 동적 Brotli 압축을 피해서 부하 상황에서 packaged Web UI 전달이 더 안정적입니다",new_0_6_16_8:"connector 형태의 연동을 위해 outbound relay와 MCU login flow를 추가했습니다",new_0_6_16_9:"Web UI CLI에 scripts와 headless 실행용 --no-open flag를 추가했습니다",new_0_6_16_10:"Linux desktop viewport 크기와 실시간 압축 상태 행 레이아웃을 다듬었습니다",new_0_6_15_1:"채팅 사이드바를 다시 디자인하고 기록 로딩 컨트롤을 조정해 긴 대화를 더 쉽게 탐색할 수 있습니다",new_0_6_15_2:"스킬 명령 선택기로 채팅 입력에서 사용 가능한 skill 명령을 더 빠르게 찾고 삽입할 수 있습니다",new_0_6_15_3:"Claude와 Gemini OAuth Provider를 추가하고, Gemini 모델 ID 정규화를 수정했으며, 모델 선택기에서 config.yaml 변경을 수동으로 새로고침할 수 있습니다",new_0_6_15_4:"Thinking 상태의 표시기와 도구 모음 레이아웃을 새로 다듬어 reasoning 진행 상황을 메시지 흐름을 방해하지 않고 읽기 쉽게 했습니다",new_0_6_15_5:"다크 테마에서 input과 select 같은 폼 컨트롤의 테두리가 다시 보입니다",new_0_6_15_6:"Runtime 설정은 다운로드 소스 선택 전에 로컬 runtime을 먼저 확인하고, 시작이 계속되는 동안 확인 상태를 계속 표시합니다",new_0_6_15_7:"데스크톱 자체 업데이트가 오래된 앱 프로세스에 의해 막히지 않으며, Windows 종료 시 gateway 정리가 더 완전해졌습니다",new_0_6_15_8:"앱 종료 시 관리되는 gateways를 중지하고, 관리 runtime 세션 중 예기치 않게 종료된 gateway는 계속 자동 재시작될 수 있습니다",new_0_6_15_9:"데스크톱 서버가 종료 시 더 깔끔하게 내려가 backend, bridge, gateway 고아 프로세스를 줄입니다",new_0_6_15_10:"README와 웹사이트 showcase는 하나의 애니메이션 GIF를 사용하고, 웹사이트 hero는 별도의 정적 미리보기 이미지를 사용합니다",new_0_6_13_1:"Alibaba Coding Plan에 qwen3.7-plus 모델 프리셋을 추가했습니다",new_0_6_13_2:"파일 처리가 더 안전해져 리터럴 점이 포함된 경로 검증과 잘못 인코딩된 skill import 파일명 거부를 지원합니다",new_0_6_13_3:"모바일과 speech synthesis를 지원하지 않는 브라우저에서 채팅이 더 안정적입니다",new_0_6_13_4:"Agent 실패 시 bridge 오류 꼬리 로그를 보존하고 Claude Code root 권한 실행이 더 안정적입니다",new_0_6_13_5:"데스크톱 업데이트 안정성을 개선했습니다. Windows 업그레이드는 남아 있는 Hermes Studio 프로세스를 닫고, Cloudflare를 먼저 확인하며, GitHub 업데이트 피드를 fallback으로 유지합니다",new_0_6_13_6:"릴리스 자동화를 조정해 Web UI와 Docker release는 GitHub Latest로 표시하지 않고, 전체 데스크톱 release만 수동 빌드 성공 후 Latest로 승격합니다"},files:{title:"파일",tree:"디렉터리 트리",list:"파일 목록",breadcrumbRoot:"홈",newFile:"새 파일",newFolder:"새 폴더",upload:"업로드",refresh:"새로고침",open:"열기",edit:"편집",preview:"미리보기",download:"다운로드",copyPath:"경로 복사",rename:"이름 변경",delete:"삭제",name:"이름",size:"크기",modified:"수정일",actions:"작업",emptyDir:"빈 디렉터리",loading:"불러오는 중...",confirmDelete:'"{name}"을(를) 삭제하시겠습니까?',confirmDeleteDir:'디렉터리 "{name}"과 그 내부 항목을 모두 삭제하시겠습니까?',deleteFailed:"삭제 실패",deleted:"삭제됨",renameTo:"새 이름",newFileName:"파일 이름",newFolderName:"폴더 이름",created:"생성됨",createFailed:"생성 실패",renamed:"이름이 변경됨",renameFailed:"이름 변경 실패",uploadSuccess:"{count}개 파일이 업로드되었습니다",uploadFailed:"업로드 실패",saveFailed:"저장 실패",saved:"저장됨",unsavedChanges:"저장하지 않은 변경 사항이 있습니다. 취소하시겠습니까?",pathCopied:"경로가 복사되었습니다",fileTooLarge:"파일이 너무 큽니다 (최대 10MB)",permissionDenied:"보호된 파일은 수정할 수 없습니다",notFound:"파일 또는 디렉터리를 찾을 수 없습니다",backendError:"파일 작업 실패",dragDropHint:"여기로 파일을 드래그하여 업로드",closeEditor:"편집기 닫기",closePreview:"닫기",saveFile:"저장",fileTree:"파일 트리"},groupChat:{title:"그룹 채팅",createRoom:"방 만들기",joinByCode:"코드로 참여",roomName:"방 이름",roomNamePlaceholder:"방 이름을 입력하세요",inviteCode:"초대 코드",autoGenerate:"자동 생성",noRooms:"아직 방이 없습니다",selectOrCreate:"방을 선택하거나 만들어 채팅을 시작하세요",agents:"에이전트",addAgent:"에이전트 추가",selectProfile:"프로필 선택",agentAdded:"에이전트가 추가되었습니다",selectRoomFirst:"먼저 방을 선택하세요",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",agentAddFailedCount:"{count}개의 에이전트를 추가하지 못했습니다: {details}",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",copyRoomLink:"방 링크 복사",deleteRoomConfirm:"이 방을 삭제하시겠습니까?",clearContext:"컨텍스트 지우기",clearContextConfirm:"이 방의 컨텍스트를 지우시겠습니까? 메시지와 압축 스냅샷은 삭제되고 에이전트와 멤버는 유지됩니다.",contextCleared:"컨텍스트가 지워졌습니다",you:"나",joined:"방에 참여했습니다",joinFailed:"방 참여에 실패했습니다",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송)",messageDisplayLimit:"그룹 채팅은 최대 600개 메시지만 표시합니다",enterCode:"초대 코드를 입력하세요",yourName:"이름",yourNamePlaceholder:"표시 이름을 입력하세요",yourDescription:"설명 (선택)",yourDescriptionPlaceholder:"자신을 소개해 주세요...",agentName:"에이전트 이름",agentNamePlaceholder:"사용자 지정 이름 (빈칸=프로필 이름)",agentDesc:"에이전트 설명",agentDescPlaceholder:"이 에이전트가 하는 일을 설명...",agentReplying:"이(가) 응답 중...",agentCompressing:"이(가) 컨텍스트 압축 중...",compressionSettings:"압축 설정",triggerTokens:"압축 트리거 토큰",triggerTokensDesc:"이 토큰 수를 초과하면 컨텍스트 압축이 시작됩니다",maxHistoryTokens:"최대 기록 토큰",maxHistoryTokensDesc:"압축된 컨텍스트의 최대 토큰 수",tailMessageCount:"최근 메시지 수",tailMessageCountDesc:"압축 후 그대로 유지할 최근 메시지 수",compressionConfig:"압축 설정",compressNow:"지금 압축",compressingInProgress:"압축 진행 중",compressionSaved:"압축 설정이 저장되었습니다"},download:{downloading:"다운로드 중...",downloadFailed:"다운로드 실패",fileNotFound:"파일을 찾을 수 없거나 삭제되었습니다",fileTooLarge:"파일이 너무 큽니다 (제한 초과)",backendError:"파일 읽기에 실패했습니다. 원격 환경이 사용 불가능할 수 있습니다",backendTimeout:"파일 읽기 시간 초과",unsupportedBackend:"현재 터미널 백엔드는 파일 다운로드를 지원하지 않습니다",invalidPath:"잘못된 파일 경로",contentDisplay:"내용 표시",download:"다운로드",downloadFile:"파일 다운로드"},gateways:{title:"게이트웨이",running:"실행 중",stopped:"중지됨",started:"시작됨",startFailed:"Gateway 시작 실패",stopFailed:"Gateway 중지 실패"},workflow:{title:"워크플로",profile:"프로필",namePlaceholder:"워크플로 이름",workspace:{title:"작업 공간 선택",select:"작업 공간 선택",clear:"작업 공간 지우기"},actions:{newWorkflow:"새 워크플로",addNode:"노드 추가",createWorkflowFirst:"먼저 워크플로를 생성하세요",reset:"재설정",startExecution:"실행 시작",executionPending:"워크플로 실행 기능은 아직 연결되지 않았습니다",executionStarted:"워크플로 실행을 시작했습니다",executionCompleted:"워크플로 실행이 완료되었습니다",executionFailed:"워크플로 실행 실패",rerunDownstreamKeepNode:"이 노드 메시지를 유지하고 하위 실행",rerunDownstreamClearNode:"이 노드 메시지를 지우고 하위 실행",rerunDownstreamStarted:"하위 재실행을 시작했습니다",rerunFromNodeStarted:"이 노드부터 재실행을 시작했습니다",rerunFailed:"워크플로 재실행 실패",deleteNode:"노드 삭제",deleteEdge:"연결 삭제"},batch:{toggle:"일괄 선택",selectAll:"전체 선택",confirmDelete:"선택한 워크플로 {count}개를 삭제할까요?",deleteSuccess:"워크플로 {count}개를 삭제했습니다",deletePartial:"워크플로 {failed}개 삭제 실패",deleteFailed:"일괄 삭제 실패"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"노드 이름",agent:"Agent",model:"모델",apiMode:"API 모드",input:"입력",promptPlaceholder:"이 Agent가 수행할 작업을 설명하세요...",skillsPlaceholder:"스킬, Enter로 추가",uploadImages:"이미지 업로드"},status:{idle:"대기",queued:"대기열",running:"실행 중",completed:"완료",failed:"실패",canceled:"취소됨"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"선택한 노드",none:"선택한 노드 없음"},stats:{nodes:"노드",edges:"연결"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"기본 모델",fast:"빠른 모델",reasoning:"추론 모델"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"이 노드의 입력을 작성하세요.",node2:"이 노드의 입력을 작성하세요.",node3:"이 노드의 입력을 작성하세요.",plan:"요청을 실행 가능한 단계로 나눕니다.",execute:"구현 단계를 실행하고 결과물을 만듭니다.",review:"출력 품질을 검토하고 후속 작업을 식별합니다."},newNodeTitle:"Node {count}"},kanban:{title:"Kanban 보드",createTask:"새 작업",noTasks:"작업 없음",allStatuses:"모든 상태",allAssignees:"모든 담당자",columns:{triage:"분류 대기",todo:"할 일",scheduled:"예약됨",ready:"준비됨",running:"진행 중",blocked:"차단됨",review:"검토",done:"완료됨",archived:"보관됨"},card:{assigneeTooltip:"담당자",priority:{low:"낮음",medium:"보통",high:"높음"},timeAgo:{justNow:"방금",minutes:"{count}분 전",hours:"{count}시간 전",days:"{count}일 전"}},board:{create:"새 보드",archive:"보드 보관",archiveConfirm:"현재 보드를 보관하시겠습니까?",archived:"보드가 보관되었습니다",created:"보드가 생성되었습니다",slugPlaceholder:"보드 식별자, 예: project-a",namePlaceholder:"표시 이름 (선택)",slugRequired:"보드 식별자는 필수입니다"},form:{title:"제목",titlePlaceholder:"작업 제목",titleRequired:"제목은 필수입니다",body:"설명",bodyPlaceholder:"작업 설명 (선택)",assignee:"담당자",selectAssignee:"담당자 선택...",priority:"우선순위",selectPriority:"우선순위 선택...",tenant:"테넌트",tenantPlaceholder:"테넌트 (선택)",workspace:"작업 공간",workspaceScratch:"임시 작업 공간",workspaceDir:"디렉터리 사용",workspaceWorktree:"worktree 사용",workspacePath:"작업 공간 경로",workspacePathPlaceholder:"절대 경로 (선택)",branch:"브랜치",branchPlaceholder:"Worktree 브랜치",skills:"스킬",skillsPlaceholder:"스킬 선택...",triage:"분류 상태로 생성",goalMode:"목표 모드",maxRuntime:"최대 실행 시간",maxRuntimePlaceholder:"예: 30m, 2h",maxRetries:"최대 재시도",maxRetriesPlaceholder:"재시도 횟수",goalMaxTurns:"목표 최대 턴",goalMaxTurnsPlaceholder:"최대 턴"},detail:{status:"상태",priority:"우선순위",assignee:"담당자",tenant:"테넌트",createdAt:"생성 시간",startedAt:"시작 시간",completedAt:"완료 시간",comments:"댓글",events:"이벤트",runs:"실행 기록",artifacts:"산출 파일",result:"완료 결과",highlights:"핵심 정보",sources:"데이터 소스",sessions:"관련 세션",sessionMessages:"세션 기록",noSessions:"관련 세션을 찾을 수 없습니다.",noLog:"이 작업의 로그를 찾을 수 없습니다.",addComment:"댓글 추가",commentPlaceholder:"작업 댓글 입력...",operations:"작업"},action:{title:"작업",assign:"할당",assignTo:"할당 대상...",block:"차단",blockReason:"차단 이유",unblock:"차단 해제",complete:"완료",completeSummary:"완료 요약 (선택)",dispatch:"디스패치",recoveryReason:"복구 이유 (선택)",reclaim:"회수",reassign:"재할당",specify:"구체화",loadLog:"로그 로드",loadDiagnostics:"진단 로드"},message:{loadFailed:"작업 로드 실패",taskCreated:"작업이 생성되었습니다",taskAssigned:"작업이 할당되었습니다",taskBlocked:"작업이 차단되었습니다",taskUnblocked:"작업 차단이 해제되었습니다",taskCompleted:"작업이 완료되었습니다",dispatchNudged:"디스패처를 실행했습니다",commentAdded:"댓글이 추가되었습니다",taskReclaimed:"작업이 회수되었습니다",taskReassigned:"작업이 재할당되었습니다",taskSpecified:"작업이 구체화되었습니다"},stats:{total:"합계",tasks:"작업 수"}}},Cr={login:{title:"Hermes Web UI",description:"Entrez votre nom d'utilisateur et votre mot de passe pour continuer.",placeholder:"Jeton d'acces",submit:"Connexion",tokenRequired:"Veuillez entrer votre jeton d'acces",invalidToken:"Jeton invalide",connectionFailed:"Impossible de se connecter au serveur",passwordLogin:"Mot de passe",tokenLogin:"Jeton",usernamePlaceholder:"Nom d'utilisateur",passwordPlaceholder:"Mot de passe",defaultCredentialsHint:"Nom d utilisateur par defaut : admin. Mot de passe par defaut : 123456.",credentialsRequired:"Veuillez entrer le nom d'utilisateur et le mot de passe",invalidCredentials:"Nom d'utilisateur ou mot de passe incorrect",tooManyAttempts:"Trop de tentatives echouees, veuillez reessayer plus tard",lockResetHint:"Si c est votre serveur, supprimez le verrouillage de connexion avec :",defaultLoginResetHint:"Pour reinitialiser le mot de passe admin par defaut, executez :",sessionExpired:"La session a expire. Veuillez vous reconnecter.",accessDenied:"Vous n'avez pas l'autorisation d'acceder a cette ressource.",passwordMismatch:"Les mots de passe ne correspondent pas",passwordTooShort:"Le mot de passe doit contenir au moins 6 caracteres",setupSuccess:"Login par mot de passe configure avec succes",passwordChanged:"Mot de passe change avec succes",passwordRemoved:"Login par mot de passe supprime",setupPassword:"Configurer le login par mot de passe",changePassword:"Changer le mot de passe",changeUsername:"Changer le nom d'utilisateur",removePasswordLogin:"Supprimer",username:"Nom d'utilisateur",currentPassword:"Mot de passe actuel",newPassword:"Nouveau mot de passe",confirmPassword:"Confirmer le mot de passe",newUsername:"Nouveau nom d'utilisateur",usernameChanged:"Nom d'utilisateur change avec succes",usernameTooShort:"Le nom d'utilisateur doit contenir au moins 2 caracteres",setupDescription:"Gerez le nom d'utilisateur et le mot de passe utilises pour vous connecter.",removeConfirm:"Le login par mot de passe est requis pour les comptes utilisateur.",passwordLoginNotConfigured:"Login par mot de passe non configure",passwordLoginConfigured:"Compte actuel : {username}",defaultCredentialTitle:"Modifiez le compte et le mot de passe par defaut",defaultCredentialMessage:"Le compte connecte utilise encore le nom d utilisateur ou le mot de passe par defaut. Pour eviter tout acces non autorise, modifiez rapidement le nom d utilisateur et le mot de passe du compte actuel.",defaultCredentialAction:"Modifier maintenant",defaultCredentialLater:"Me le rappeler plus tard"},users:{title:"Gestion des comptes",description:"Creez des utilisateurs, attribuez des roles et controlez les profils accessibles aux administrateurs standard.",create:"Creer un utilisateur",edit:"Modifier l utilisateur",username:"Nom d utilisateur",role:"Role",statusLabel:"Statut",profiles:"Profils accessibles",profilesPlaceholder:"Selectionner les profils accessibles",allProfiles:"Tous les profils",noProfiles:"Aucun profil assigne",lastLogin:"Derniere connexion",newPasswordOptional:"Nouveau mot de passe (laisser vide pour conserver)",loadFailed:"Echec du chargement des utilisateurs",deleteConfirm:"Supprimer cet utilisateur ?",enable:"Activer",disable:"Desactiver",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Actif",disabled:"Desactive"}},common:{loading:"Chargement...",cancel:"Annuler",retry:"Réessayer",reset:"Réinitialiser",delete:"Supprimer",edit:"Modifier",save:"Enregistrer",saved:"Enregistre",update:"Mettre a jour",create:"Creer",saveFailed:"Echec de l'enregistrement",deleteFailed:"Echec de la suppression",ok:"OK",copied:"Copie",copy:"Copier",noData:"Aucune donnee",fetch:"Recuperer",add:"Ajouter",enable:"Activer",disable:"Desactiver",configured:"Configure",notConfigured:"Non configure",confirm:"Confirmer",expand:"Developper",collapse:"Reduire",stop:"Arrêter",start:"Démarrer",expired:"Expiré"},mcp:{title:"Serveurs MCP",loadFailed:"Echec du chargement des serveurs MCP",reloadAll:"Tout recharger",refresh:"Rafraichir",total:"Total",connected:"Connecte",disconnected:"Deconnecte",tools:"outils",tool:"Outils",searchPlaceholder:"Rechercher des serveurs...",addServer:"+ Ajouter un serveur",zeroTools:"0 outils",loading:"Chargement...",empty:"Aucun serveur MCP configure",reloaded:"{server} recharge",reloadedAll:"Tous les serveurs MCP recharges",reloadFailed:"Echec du rechargement",serverAdded:'Serveur "{name}" ajoute',addFailed:"Echec de l ajout du serveur",serverUpdated:'Serveur "{name}" mis a jour',updateFailed:"Echec de la mise a jour du serveur",saveFailed:"Echec de la sauvegarde",serverRemoved:'"{name}" supprime',enabled:"Activé : {name}",disabled:"Désactivé : {name}",connectedStatus:"Connecté",disconnectedStatus:"Déconnecté",disabledStatus:"Désactivé",toolList:"Liste des outils",count:" ",more:"de plus",removeFailed:"Echec de la suppression du serveur",testOk:"Test OK — {count} outils disponibles",testEmpty:"Le test n a retourne aucun outil",testFailed:"Echec du test",edit:"Modifier",test:"Tester",reload:"Recharger",remove:"Supprimer",confirmRemove:'Supprimer le serveur "{name}" ?',cancel:"Annuler",add:"Ajouter",save:"Enregistrer",addTitle:"Ajouter un serveur MCP",editTitle:"Modifier le serveur MCP",invalidJson:"JSON invalide",invalidYaml:"Format YAML invalide",invalidConfig:"Configuration invalide",invalidServerConfig:"Configuration du serveur invalide",missingCommandOrUrl:"Doit contenir command ou url",manageTools:"Gérer les outils",toolsVisibilityTitle:"Gestion de la visibilité des outils",fetchTools:"Récupérer la liste des outils",fetchToolsFailed:"Échec de la récupération de la liste des outils",toolsMode:"Mode :",toolsModeAll:"Tous",toolsModeInclude:"Inclure",toolsModeExclude:"Exclure",toolsListHeader:"Nom de l'outil",toolsEmpty:"Aucun outil disponible, veuillez d'abord récupérer la liste des outils",toolsSummaryAll:"{count} outils au total, tous activés",toolsSummaryInclude:"{total} outils au total, {count} sélectionnés",toolsSummaryExclude:"{total} outils au total, {count} exclus",toolsVisibilitySaved:"Visibilité des outils enregistrée",toolsSelectAll:"Tout sélectionner",toolsClearSelection:"Effacer la sélection",toolsExcludeAll:"Tout exclure",toolsClearExcluded:"Effacer les exclusions"},sidebar:{chat:"Discussion",backToChat:"Retour",search:"Rechercher",apiRelay:"API Relay",history:"Historique",jobs:"Taches planifiees",models:"Modeles",profiles:"Profils",plugins:"Plugins",mcp:"MCP",petdex:"Pets",skills:"Competences",memory:"Memoire",logs:"Journaux",usage:"Utilisation",performance:"Performance",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",singleChat:"Discussion",globalAgent:"Global Agent",files:"Fichiers",devices:"Appareils",groupChat:"Chat de groupe",groupConversation:"Conversation",groupConversationShort:"Conv.",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"Systeme",groupSystemShort:"Sys",groupMonitoring:"Suivi",groupMonitoringShort:"Suivi",settings:"Parametres",connected:"Connecte",disconnected:"Deconnecte",updateTip:'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',updateVersion:"Mettre a jour vers v{version}",reloadClientVersion:"Recharger pour v{version}",updating:"Mise a jour...",updateSuccess:"Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.",updateFailed:"Echec de la mise a jour",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible",versionManagement:"Gestion des versions",kanban:"Kanban",workflow:"Workflow",groupTools:"Outils",groupToolsShort:"Outils",codingAgents:"Agents de code",versionPreview:"Aperçu de version",groupPlatform:"Plateforme",gateways:"Passerelles",expand:"Déplier le menu",collapse:"Replier le menu"},runtimeVersions:{title:"Gestion des versions",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Plateforme",currentWebUi:"Web UI actuel",activeVersion:"Version active",active:"Active",installed:"Installée",download:"Télécharger",downloadGithub:"Télécharger depuis GitHub",downloadCf:"Télécharger depuis Cloudflare",github:"GitHub",cf:"Cloudflare",useVersion:"Utiliser au prochain redémarrage",deleteVersion:"Supprimer",deleteRuntimeConfirm:"Supprimer Hermes Runtime {version} ?",deleteWebUiConfirm:"Supprimer Web UI {version} ?",deleteRuntimeSuccess:"Runtime supprimé",deleteWebUiSuccess:"Web UI supprimé",refresh:"Actualiser",noVersions:"Aucune version disponible",remoteLoadFailed:"Impossible de charger les versions distantes",downloadTasks:"Tâches de téléchargement",downloadStarted:"Téléchargement démarré",activateSuccess:"Sélection de version enregistrée. Redémarrez Hermes Studio pour l’utiliser.",jobStatus:{queued:"En attente",running:"En cours",completed:"Terminé",failed:"Échec"},jobStageStatus:{queued:"En attente",resolve:"Résolution",download:"Téléchargement",verify:"Vérification",extract:"Extraction",install:"Installation",completed:"Terminé",failed:"Échec"},jobStage:{queued:"En attente",download:"Téléchargement",resolveRuntime:"Résolution du package Runtime",verifyRuntime:"Vérification de l’archive Runtime",extractRuntime:"Extraction de l’archive Runtime",installRuntime:"Installation du Runtime",resolveWebUi:"Résolution du package Web UI",verifyWebUi:"Vérification de l’archive Web UI",extractWebUi:"Extraction de l’archive Web UI",installWebUi:"Installation de Web UI",completed:"Terminé",failed:"Échec"}},devices:{title:"Appareils",count:"{count} appareils",lastScanned:"Dernier scan : {time}",refresh:"Actualiser",empty:"Aucun appareil trouvé",computer:"Ordinateur",endpointLabel:"Point de terminaison",statusLabel:"Statut",online:"Online",offline:"Offline",address:"Adresse",os:"Système",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Latence",lastSeen:"Vu pour la dernière fois",open:"Ouvrir",never:"Jamais",unknown:"Inconnu",loadFailed:"Impossible de charger les appareils",scanFailed:"Impossible de scanner les appareils",updateFailed:"Impossible de mettre à jour l'appareil",duplicateRequest:"Une demande d'appairage est déjà en attente",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Traité",unprocessed:"Non traité",deleteHistory:"Supprimer l'entrée",deleteHistoryConfirm:"Supprimer cette demande et révoquer l'accès de connexion de cet appareil ?",requests:"Demandes",requestsWithCount:"Demandes ({count})",noRequests:"Aucune demande",requestPairing:"Demander l'appairage",paired:"Appairé",approve:"Approuver",reject:"Rejeter",block:"Bloquer",unblock:"Débloquer",inboundStatus:{none:"Demande autorisée",pending:"En attente",approved:"Approuvé",rejected:"Rejeté",blocked:"Bloqué"},outboundStatus:{none:"Non appairé",pending:"Demandé",approved:"Appairé",rejected:"Rejeté",blocked:"Bloqué"},endpoint:{web:"Web",desktop:"Bureau",custom:"Personnalisé"}},performance:{title:"Performance",subtitle:"Surveiller les ressources système, Bridge Broker, Workers et sessions actives",refresh:"Actualiser",autoRefreshOn:"Actualisation auto",autoRefreshOff:"Actualisation manuelle",loadFailed:"Échec du chargement des métriques de performance",systemCpu:"CPU système",systemMemory:"Mémoire système",activeSessions:"Sessions actives",runningSessions:"En cours {count}",workers:"Workers",totalWorkerMemory:"Mémoire totale Worker",processes:"Processus",uptime:"Disponibilité",running:"En cours",stopped:"Arrêté",workerMemory:"Mémoire Worker",lastUpdated:"Mis à jour",profile:"Profile",memory:"Mémoire",sessions:"Sessions",runningActiveSessions:"En cours / Actives",lastUsed:"Dernière utilisation",status:"Statut",noWorkers:"Aucun Worker",sessionsByProfile:"Sessions par Profile",noActiveSessions:"Aucune session active"},drawer:{terminal:"Terminal",files:"Espace de travail"},chat:{contextRemaining:"restant",contextClickToEdit:"Cliquez pour modifier la longueur du contexte",contextEditTitle:"Modifier la longueur du contexte",contextEditDesc:"Définir la limite de longueur du contexte pour le modèle actuel (en tokens)",contextEditPlaceholder:"Entrez la longueur du contexte",contextEditHint:"Valeurs courantes : 256k (Hermes par défaut), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Enregistrer",contextEditCancel:"Annuler",contextEditInvalid:"Veuillez entrer une longueur de contexte valide",contextEditSuccess:"Longueur du contexte mise à jour",contextEditFailed:"Échec de la mise à jour",emptyState:"Demarrer une conversation avec Hermes Agent",emptyStateAgent:"Demarrer une conversation avec {agent}",viewOlderInHistory:"Voir les messages precedents dans l’historique",scrollToBottom:"Aller en bas",outlineTitle:"Plan de la conversation",outlineEmpty:"Aucun contenu de conversation",outlineUserQuestion:"Question utilisateur",inputPlaceholder:"Tapez un message... (Entree pour envoyer, Shift+Entree pour un saut de ligne)",inputHeightResizeHint:"Faites glisser pour changer la hauteur du champ de chat, double-cliquez pour reinitialiser.",slashCommandArgs:{message:"<message>",title:"<titre>",text:"<texte>"},slashCommands:{usage:"Calculer l’utilisation de la session actuelle",status:"Afficher l’état de la session et la file",abort:"Arrêter l’exécution Bridge active",queue:"Mettre un message en file après l’exécution active",learn:"Apprendre une compétence réutilisable depuis les sources décrites",plan:"Rédiger un plan d’implémentation Markdown",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"Effacer l’affichage actuel",clearHistory:"Supprimer l’historique des messages enregistrés de cette session",title:"Renommer cette session",compress:"Lancer la compression du contexte au repos",steer:"Envoyer un guidage à l’exécution Bridge active",destroy:"Libérer l’agent Bridge de cette session",reloadMcp:"Recharger les serveurs MCP",reloadSkills:"Recharger les commandes de skills"},attachFiles:"Joindre des fichiers",reasoningEffort:{tooltip:"Effort de raisonnement",defaultLabel:"Par défaut",options:{default:"Par défaut (config.yaml)",none:"Aucun",minimal:"Minimal",low:"Faible",medium:"Moyen",high:"Élevé",xhigh:"Très élevé"}},showToolCalls:"Afficher les appels d’outils",hideToolCalls:"Masquer les appels d’outils",messageQueue:"File de messages",removeQueuedMessage:"Retirer le message de la file",stop:"Arreter",send:"Envoyer",contextUsed:"Contexte utilise :",sessions:"Sessions",webUiSessions:"Sessions",allProfiles:"Tous les profils",profileMissingModelsTip:'Le profil "{profile}" n’a aucun fournisseur ni modèle disponible pour cette session',sessionScopeHint:"Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.",openHistory:"Ouvrir l’historique",hermesHistory:"Historique Hermes",historyScopeHint:"Sessions d’historique Hermes du profil actuel en lecture seule, regroupées par source.",noSessions:"Aucune session",newChat:"Nouvelle discussion",agent:"Agent",approvalKicker:"Permission terminal",approvalTitle:"Vérifier la commande avant exécution",approvalAgree:"Accepter",approvalAllowOnce:"Autoriser une fois",approvalAllowSession:"Autoriser la session",approvalAlways:"Toujours",approvalDeny:"Refuser",clarifyKicker:"L'agent a besoin d'éclaircissements",clarifyTitle:"L'agent a une question pour vous",clarifyPlaceholder:"Tapez votre réponse...",clarifySubmit:"Répondre",clarifyDismiss:"Ignorer",deleteSession:"Supprimer cette session ?",toggleBatchMode:"Sélection par lot",selectAll:"Tout sélectionner",confirmBatchDelete:"Supprimer {count} sessions sélectionnées?",batchDeleteSuccess:"{count} sessions supprimées",batchDeletePartial:"{failed} sessions ont échoué",batchDeleteFailed:"Échec de la suppression par lot",importToWebUi:"Importer dans Web UI",importSessionSuccess:"Session importée dans Web UI",importSessionAlreadyExists:"La session existe déjà dans Web UI",importSessionFailed:"Échec de l’import de la session",sessionDeleted:"Session supprimee",rename:"Renommer",archiveSession:"Archiver",unarchiveSession:"Désarchiver",pin:"Épingler",unpin:"Désépingler",pinned:"Épinglés",chatMode:"Mode chat",liveMode:"Direct",liveSessions:"Sessions en direct",recentBadge:"Récent",linkedSessions:"{count} sessions liées",noVisibleMessages:"Aucun message visible par l’humain.",monitorRoleUser:"Utilisateur",monitorRoleAssistant:"Assistant",copySessionLink:"Copier le lien de session",openSessionInNewTab:"Ouvrir dans un nouvel onglet",sessionLinkCopied:"Session link copied",copySessionId:"Copier l'ID de session",export:"Exporter",editConfig:"Modifier la configuration",exportFull:"Export complet (JSON)",exportCompressed:"Export compressé (TXT)",exportCompressing:"Compression du contexte, veuillez patienter...",exportSuccess:"Session exportée",exportFailed:"Échec de l'export",renamed:"Renomme",renameFailed:"Echec du renommage",sessionArchived:"Session archivée",archiveSessionFailed:"Échec de l'archivage de la session",sessionUnarchived:"Session désarchivée",unarchiveSessionFailed:"Échec du désarchivage de la session",renameSession:"Renommer la session",sessionNotFound:"Session non trouvee",enterNewTitle:"Entrez un nouveau titre",other:"Autre",runFailed:"Echec de l'execution",error:"Erreur",tool:"Outil",arguments:"Arguments",result:"Resultat",workspaceChanges:"Modifications du workspace",changedFiles:"{files} fichiers modifies",diffUnavailable:"Diff indisponible",binaryFileDiffUnavailable:"Diff indisponible pour les fichiers binaires",truncated:"... (tronque)",unchangedLines:"{count} lignes inchangées",executionDuration:"Temps d’exécution",thinkingLabel:"Raisonnement",thinkingInProgress:"En réflexion",thinkingShow:"Afficher le raisonnement",thinkingHide:"Masquer le raisonnement",thinkingDuration:"Observé {duration}",thinkingChars:"{count} caractères",copyBubble:"Copier le message",copiedBubble:"Message copié",copyFailed:"Échec de la copie",playSpeech:"Lire à voix haute",pauseSpeech:"Pause",resumeSpeech:"Reprendre",stopSpeech:"Arrêter",speechNotSupported:"Reproduction vocale non prise en charge dans ce navigateur",searchEnterHint:"Entrée pour ouvrir · Échap pour fermer",searchHint:"Cmd/Ctrl+K",searchScope:"Portée de recherche : base locale des sessions Web UI uniquement ; les sessions d’historique Hermes en lecture seule ne sont pas incluses.",searchFailed:"Échec de la recherche de sessions",searchNoSnippet:"Aucun extrait disponible",searchNoResults:"Aucune session correspondante",searchRecent:"Session récente",searchEmpty:"Sessions récentes",searchPlaceholder:"Rechercher des sessions...",searchSubtitle:"Rechercher par titre ou contenu des messages",searchTitle:"Rechercher des sessions",stopGateway:"Arrêter le gateway",start:"Démarrer",workspaceSetFailed:"Échec de la définition du workspace",workspaceSet:"Workspace défini",workspacePlaceholder:"Saisissez le chemin du projet, ex. /home/user/project",folderPickerEmpty:"(Vide)",folderPickerNoFolders:"Aucun dossier de workspace",folderPickerSelected:"Sélectionné :",workspace:"Espace de travail",setWorkspaceTitle:"Définir le workspace de session",setWorkspace:"Définir le workspace",modelSetFailed:"Échec de la définition du modèle",modelSet:"Modèle défini",setModelTitle:"Définir le modèle de session",setModel:"Définir le modèle",newCliChat:"Nouveau CLI",cliEmptyState:"Démarrer un chat CLI",autoPlaySpeech:"Lire la voix automatiquement",voiceInput:{startCapture:"Demarrer la saisie vocale",stopCaptureAndInsert:"Arreter la saisie vocale et inserer la transcription",cancelCapture:"Annuler la saisie vocale",statusLabel:"Statut : {status}",transcriptLabel:"Transcription : {text}",errorLabel:"Erreur : {error}",recentEvents:"Evenements recents",status:{idle:"Inactif",capturing:"Ecoute",transcribing:"Transcription",sending:"Insertion dans la saisie",error:"Erreur"},browserSpeechUnsupported:"La reconnaissance vocale du navigateur n est pas prise en charge par ce navigateur.",browserSpeechFailed:"La reconnaissance vocale du navigateur a echoue.",browserSpeechFailedWithReason:"La reconnaissance vocale du navigateur a echoue : {error}.",microphoneUnsupported:"La capture micro n est pas prise en charge par ce navigateur.",microphoneRecordingFailed:"L enregistrement micro a echoue."}},jobs:{title:"Taches planifiees",createJob:"Creer une tache",editJob:"Modifier la tache",noJobs:"Aucune tache planifiee. Creez-en une pour commencer.",sortBy:"Trier",sortByName:"Par nom",sortByTime:"Par date",sortByNameHint:"Trier par nom",sortByTimeHint:"Trier par date",sortAsc:"Croissant",sortDesc:"Décroissant",name:"Nom",namePlaceholder:"Nom de la tache",schedule:"Planification (expression Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapides",selectPreset:"Selectionner un preset...",presetEveryMinute:"Chaque minute",presetEvery5Min:"Toutes les 5 minutes",presetEveryHour:"Chaque heure",presetEveryDay:"Tous les jours a 00:00",presetEveryDay9:"Tous les jours a 09:00",presetEveryMonday:"Chaque lundi a 09:00",presetEveryMonth:"Le 1er de chaque mois a 09:00",prompt:"Invite",promptPlaceholder:"L'invite a executer",skills:"Skills",skillsPlaceholder:"Selectionner les skills...",deliverTarget:"Cible de livraison",origin:"Origine",local:"Local",repeatCount:"Nombre de repetitions (facultatif)",modelPlaceholder:"Modele par defaut",repeatPlaceholder:"Laisser vide pour infini",jobCreated:"Tache creee",jobUpdated:"Tache mise a jour",nameRequired:"Le nom est requis",scheduleRequired:"La planification est requise",loadFailed:"Echec du chargement de la tache",jobPaused:"Tache en pause",jobResumed:"Tache reprise",jobTriggered:"Job declenche",modelUpdated:"Modele mis a jour",jobDeleted:"Tache supprimee",status:{running:"En cours",paused:"En pause",disabled:"Desactivee",scheduled:"Planifiee"},info:{model:"Modele",schedule:"Planification",lastRun:"Derniere execution",nextRun:"Prochaine execution",deliver:"Livraison",repeat:"Repetition"},action:{pause:"Pause",pauseJob:"Mettre en pause",resume:"Reprendre",resumeJob:"Reprendre la tache",runNow:"Executer maintenant",triggerImmediately:"Déclencher immédiatement"},runHistory:{title:"Historique",runs:"exécutions",noRuns:"Aucun historique trouvé."}},skills:{title:"Competences",targetFilter:"Runtime",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Rechercher des competences...",noMatch:"Aucune competence ne correspond a votre recherche",noSkills:"Aucune competence trouvee",backTo:"Retour a",attachedFiles:"Fichiers joints",loadFailed:"Echec du chargement de la competence",fileLoadFailed:"Echec du chargement du fichier",modified:"Modifié par l'utilisateur",archived:"Archivé",pinned:"Épinglé",pin:"Épingler la compétence",unpin:"Désépingler la compétence",pinFailed:"Impossible de changer le statut d'épinglage",edit:"Modifier",saving:"Enregistrement...",editorLabel:"Éditeur de skill",saveSuccess:"Compétence enregistrée",saveFailed:"Échec de l’enregistrement de la compétence",toggleFailed:"Echec de l'activation/desactivation de la competence",source:{builtin:"Intégré",hub:"Hub",local:"Local",external:"Externe"},delete:"Supprimer",deleteConfirm:'Supprimer la compétence "{name}" ? Action irréversible.',deleteSuccess:"Compétence supprimée",deleteFailed:"Échec de la suppression",import:"Importer",importTitle:"Importer une compétence",importModeZip:"Zip",importModeFolder:"Dossier",importHintZip:"Téléversez une archive .zip contenant un dossier avec SKILL.md",importHintFolder:"Sélectionnez un dossier local (doit contenir SKILL.md)",importTargetCategory:"Catégorie cible (optionnel)",importTargetCategoryPlaceholder:"Laisser vide pour misc",importSelectFile:"Choisir un fichier .zip",importSelectFolder:"Choisir un dossier",importInvalidFile:"Seules les archives .zip sont prises en charge",importFileCount:"fichiers",importNoSelection:"Veuillez d'abord choisir un fichier ou dossier",importSuccess:"Compétence importée",importFailed:"Échec de l'import",path:{local:"Local",external:"Externe"},externalDirs:{manage:"Dossiers externes",title:"Gérer les dossiers externes",hint:"Gère config.skills.external_dirs. Prend en charge ~ et $VAR ; les chemins absents sont grisés.",add:"Ajouter un dossier",placeholder:"/path/to/skills ou ~/my-skills",empty:"Aucun dossier externe",missing:"Chemin introuvable",notDir:"Pas un dossier",saveSuccess:"Dossiers externes enregistrés",saveFailed:"Échec de l'enregistrement",loadFailed:"Échec du chargement des dossiers externes",removeRow:"Retirer"},pathCopied:"Chemin copié",pathCopyFailed:"Échec de la copie du chemin",reloadHint:"Sessions actives : exécutez /reload-skills ; les nouvelles le chargent automatiquement.",writeApprovalButton:"En attente {count}",writeApprovalTitle:"Ecritures en attente de validation",writeApprovalDescription:"Approuvez ou refusez les ecritures de memoire et de skills preparees par Hermes Agent.",writeApprovalRefresh:"Actualiser",writeApprovalEmpty:"Aucune ecriture en attente.",writeApprovalUnsupported:"Cette version de Hermes Agent ne prend pas en charge la validation des ecritures. Mettez Hermes Agent a jour pour utiliser cette fonction.",writeApprovalMemory:"Memoire",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Verifier",writeApprovalHideDiff:"Masquer",writeApprovalNoDiff:"Aucune difference disponible.",writeApprovalLoadFailed:"Impossible de charger les ecritures en attente",writeApprovalDiffFailed:"Impossible de charger les details de l ecriture",writeApprovalActionFailed:"Impossible de traiter l ecriture en attente",writeApprovalApproved:"Ecriture approuvee",writeApprovalRejected:"Ecriture refusee",writeApprovalApprove:"Approuver",writeApprovalReject:"Refuser",writeApprovalPendingMemoryWrite:"Ecriture de memoire en attente",writeApprovalCurrentFile:"Fichier actuel {file}",writeApprovalProposedFile:"Fichier propose {file}",writeApprovalDiffSection:"Difference",writeApprovalPatchOldStringMissing:"Le old_string du patch est introuvable dans le fichier actuel {file}; l approbation ne modifiera pas le fichier.",writeApprovalRequestedOldString:"old_string demande",writeApprovalCurrentReadFailed:"Le fichier actuel {file} n a pas pu etre lu comme texte UTF-8.",writeApprovalDeleteSkill:"Cette validation supprime le skill {skill}.",writeApprovalRemoveFile:"Cette validation supprime {file} du skill {skill}."},plugins:{title:"Plugins",refresh:"Actualiser",notice:"Inventaire des manifests de plugins Hermes détectables. Les métadonnées de découverte sont lues sans charger le code des plugins. Les plugins utilisateur standalone peuvent être activés ou désactivés ici; les changements prennent effet dans les nouvelles sessions Hermes.",loadFailed:"Échec du chargement des plugins",updateFailed:"Échec de la mise à jour du plugin",enableSuccess:"{name} activé",disableSuccess:"{name} désactivé",commandCopied:"Commande copiée",searchPlaceholder:"Rechercher key, nom, description, chemin...",source:"Source",kind:"Type",statusTitle:"Statut",configStatus:"config : {status}",notAvailable:"n/a",copyCommand:"Copier la commande",managedElsewhere:"géré ailleurs",noMatch:"Aucun plugin ne correspond aux filtres actuels",enabled:"activé",disabled:"désactivé",summary:{total:"Total",active:"Activé / auto",inactive:"Inactif",disabled:"Désactivé",providerManaged:"Géré par provider"},status:{enabled:"Activé","auto-active":"Auto-actif",inactive:"Inactif",disabled:"Désactivé","provider-managed":"Géré par provider"},statusLabel:{enabled:"Activé par configuration","auto-active":"Auto-actif",inactive:"Inactif",disabled:"Désactivé","provider-managed":"Géré par provider"},configStatuses:{enabled:"activé",disabled:"désactivé","not-enabled":"non activé",auto:"auto","provider-managed":"géré par provider"},table:{plugin:"Plugin",status:"Statut",source:"Source",kind:"Type",capabilities:"Capacités",path:"Chemin / entrypoint",manage:"Gérer"},capabilities:{tools:"{count} outils",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Racine de l’agent",python:"Python",scanCwd:"Analyser cwd",projectPlugins:"Plugins du projet"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Memoire",refresh:"Actualiser",loadFailed:"Echec du chargement de la memoire",myNotes:"Mes notes",noNotes:"Aucune note pour l'instant.",notesPlaceholder:"Ecrivez vos notes...",userProfile:"Profil utilisateur",noProfile:"Aucun profil pour l'instant.",profilePlaceholder:"Ecrivez votre profil...",soul:"Ame",noSoul:"Aucune configuration d'ame pour l'instant.",soulPlaceholder:"Ecrivez la configuration de l'ame..."},models:{title:"Modeles",addProvider:"Ajouter un fournisseur",refreshModelCache:"Actualiser le cache des modeles",refreshModelCacheLoading:"Actualisation du cache des modeles...",refreshModelCacheSuccess:"Cache des modeles actualise",refreshModelCacheFailed:"Impossible d actualiser le cache des modeles",providerType:"Type de fournisseur",preset:"Préréglage",custom:"Personnalise",selectProvider:"Selectionner un fournisseur",chooseProvider:"Choisir un fournisseur...",name:"Nom",autoGeneratedName:"Genere automatiquement a partir de l'URL de base",baseUrl:"URL de base",region:"Région",regionIntl:"International",regionCn:"Chine continentale",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Cle API",apiKeyPlaceholder:"sk-...",defaultModel:"Modele par defaut",selectOrInput:"Sélectionner ou saisir un modèle...",selectModel:"Selectionner un modele...",providerAdded:"Fournisseur ajoute",providerDeleted:"Fournisseur supprime",providerCredentialsCleared:"Identifiants du fournisseur effaces",clearProviderCredentials:"Effacer les identifiants",clearCredentialsConfirm:"Effacer les identifiants enregistres pour « {name} » ? Ce fournisseur integre restera dans la liste et pourra etre reutilise apres configuration des identifiants.",disableProvider:"Desactiver le fournisseur",disableProviderConfirm:"Desactiver le fournisseur integre « {name} » ? Il restera integre et pourra etre reactive plus tard.",providerDisabled:"Fournisseur desactive",defaultProviderUpdated:"Fournisseur par defaut mis a jour",defaultProviderUpdateFailed:"Echec de la mise a jour du fournisseur par defaut",defaultModelUpdated:"Modele par defaut mis a jour",defaultModelUpdateFailed:"Echec de la mise a jour du modele par defaut",deleteProvider:"Supprimer le fournisseur",deleteConfirm:'Etes-vous sur de vouloir supprimer "{name}" ?',codexLoginTitle:"Connexion OpenAI Codex",codexWaiting:"Entrez ce code sur la page d'autorisation pour vous connecter :",codexCopyCode:"Code copié",codexOpenLink:"Ouvrir la page d'autorisation",codexApproved:"Connexion réussie",codexExpired:"L'autorisation a expiré. Veuillez réessayer.",nousLoginTitle:"Connexion Nous Portal",nousWaiting:"Entrez ce code sur la page d'autorisation:",nousCopyCode:"Code copié",nousOpenLink:"Ouvrir la page d'autorisation",nousApproved:"Connexion réussie",nousDenied:"Autorisation refusée",nousExpired:"Autorisation expirée",copilotLoginTitle:"Connexion GitHub Copilot",copilotWaiting:"Ouvrez GitHub et saisissez le code ci-dessous pour autoriser. La fenêtre se fermera automatiquement après approbation.",copilotCopyCode:"Code copié",copilotOpenLink:"Ouvrir la page d'autorisation GitHub",copilotApproved:"Connexion réussie !",copilotDenied:"Autorisation refusée.",copilotExpired:"Le lien d'autorisation a expiré. Veuillez réessayer.",copilotAddDetectedTitle:"GitHub Copilot détecté",copilotAddDetected:"Un token OAuth GitHub Copilot a été détecté sur cette machine. Cliquez sur Ajouter pour activer Copilot dans Hermes.",copilotAddSourceEnv:"Source : ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source : gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source : extension Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Cela supprimera COPILOT_GITHUB_TOKEN dans ~/.hermes/.env. Les autres outils ne sont pas affectés.",copilotDeleteHintGhCli:"Copilot sera masqué dans Hermes. Votre connexion gh CLI n'est pas affectée — `gh auth status` indiquera toujours que vous êtes connecté.",copilotDeleteHintAppsJson:"Copilot sera masqué dans Hermes. Votre extension Copilot de VS Code reste connectée.",customBadge:"PERSONNALISÉ",previewBadge:"APERÇU",disabledBadge:"INDISPONIBLE",disabledTooltip:"Ce modèle n'est pas disponible pour votre compte.",customModelPlaceholder:"ID de modèle non listé",customModelHint:"Pour les modèles pris en charge par le fournisseur mais non renvoyés par l’API ; ce n’est pas un renommage affiché. Entrée pour charger.",noProviders:"Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.",clearVisibleModels:"Effacer la sélection",generalTitle:"Modeles generaux",combinationTitle:"Ensembles de modeles",combinationSubtitle:"Configurez les presets MoA : les modeles de reference fournissent d abord des perspectives, puis un modele agregateur produit la reponse finale et les appels d outils.",combinationPreset:"Preset",combinationName:"Nom",combinationAddModel:"Ajouter un ensemble de modeles",combinationEditModel:"Modifier l ensemble de modeles",combinationNewPreset:"Nouveau preset",combinationPresetPlaceholder:"ex. review",combinationAddPreset:"Ajouter un preset",combinationSetDefault:"Definir par defaut",combinationEnabled:"Activer les references",combinationReferenceModels:"Modeles de reference",combinationReferenceModel:"Modele de reference",combinationAddReference:"Ajouter un modele de reference",combinationAggregator:"Modele agregateur",combinationReferenceTemperature:"Temperature des references",combinationAggregatorTemperature:"Temperature de l agregateur",combinationMaxTokens:"Tokens max.",combinationNotSet:"Non defini",combinationSaved:"Ensemble de modeles enregistre",combinationLoadFailed:"Echec du chargement de l ensemble de modeles",combinationSaveFailed:"Echec de l enregistrement de l ensemble de modeles",combinationPresetExists:"Le preset existe deja",combinationNameRequired:"Saisissez un nom d ensemble de modeles",combinationNameInvalid:"Le nom ne peut contenir que des lettres, des chiffres, des underscores, des tirets et des points",combinationReferenceRequired:"Ajoutez au moins un modele de reference",combinationAggregatorRequired:"Selectionnez un modele agregateur",auxiliaryTitle:"Modèles auxiliaires",auxiliarySubtitle:"Remplacements de modèle pour les tâches secondaires comme la compression, la vision, les approbations, MCP et la maintenance en arrière-plan.",auxiliaryRefresh:"Actualiser",auxiliaryTask:"Tâche",auxiliaryTimeout:"Délai",auxiliaryDownloadTimeout:"Délai de téléchargement",auxiliaryActions:"Actions",auxiliaryDefault:"Par défaut",auxiliaryCustomEndpoint:"Endpoint personnalisé",auxiliaryProviderAuto:"Auto",auxiliaryProviderMain:"Modèle principal",auxiliaryProviderPlaceholder:"auto, main ou clé fournisseur",auxiliaryDownloadShort:"téléchargement",auxiliaryExtraBody:"JSON de corps supplémentaire",auxiliaryClear:"Réinitialiser",auxiliarySaved:"Modèles auxiliaires enregistrés",auxiliaryLoadFailed:"Impossible de charger les modèles auxiliaires",auxiliarySaveFailed:"Impossible d’enregistrer les modèles auxiliaires",auxiliaryInvalidExtraBody:"Le corps supplémentaire doit être un objet JSON",auxiliaryTaskCompression:"Compression",auxiliaryTaskVision:"Vision",auxiliaryTaskWebExtract:"Extraction web",auxiliaryTaskSkillsHub:"Hub de compétences",auxiliaryTaskApproval:"Approbation",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Génération de titre",auxiliaryTaskTriageSpecifier:"Spécificateur de triage",auxiliaryTaskKanbanDecomposer:"Décomposition Kanban",auxiliaryTaskProfileDescriber:"Description du profil",auxiliaryTaskCurator:"Curateur",auxiliaryTaskSessionSearch:"Recherche de sessions",auxiliaryTaskFlushMemories:"Écriture des mémoires",currentDefault:"Par défaut actuel",defaultShort:"Défaut",setDefaultProvider:"Definir comme fournisseur par defaut",setDefault:"Definir par defaut",builtIn:"Integre",customType:"Personnalise",provider:"Fournisseur",contextLength:"Longueur du contexte",contextLengthPlaceholder:"ex. 256000 (facultatif)",apiMode:"Mode API",local:"Local ({host})",selectProviderRequired:"Veuillez selectionner un fournisseur",baseUrlRequired:"L'URL de base est requise",apiKeyRequired:"La cle API est requise",modelRequired:"Le modele par defaut est requis",enterBaseUrl:"Veuillez d'abord entrer l'URL de base",unexpectedFormat:"Format de reponse inattendu",foundModels:"{count} modeles trouves",fetchFailed:"Echec de la recuperation des modeles",xaiWaiting:"Terminez l’autorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.",xaiOpenLink:"Ouvrir la page d’autorisation xAI",xaiLoginTitle:"Connexion OAuth xAI Grok",xaiExpired:"Le lien d’autorisation a expiré. Veuillez réessayer.",xaiCopyLink:"Copier le lien d’autorisation",xaiApproved:"Connexion réussie !",anthropicLoginTitle:"Connexion OAuth Claude",anthropicWaiting:"Terminez l’autorisation sur Claude, puis collez ici le code renvoyé.",anthropicOpenLink:"Ouvrir la page d’autorisation Claude",anthropicCopyLink:"Copier le lien d’autorisation",anthropicCodePlaceholder:"Collez le code d’autorisation...",anthropicSubmitCode:"Envoyer le code",anthropicApproved:"Connexion réussie !",anthropicExpired:"L’autorisation a expiré. Veuillez réessayer.",geminiLoginTitle:"Connexion OAuth Google Gemini",geminiWaiting:"Terminez l’autorisation sur la page Google ouverte. La fenêtre se fermera automatiquement.",geminiOpenLink:"Ouvrir la page d’autorisation Google",geminiCopyLink:"Copier le lien d’autorisation",geminiApproved:"Connexion réussie !",geminiExpired:"Le lien d’autorisation a expiré. Veuillez réessayer.",visibilitySelectOne:"Conserver au moins un modèle visible",visibilitySaved:"Modèles visibles enregistrés",visibilitySaveFailed:"Échec de l’enregistrement des modèles visibles",visibilityHint:"Affecte uniquement le sélecteur de modèles et la page Modèles de la Web UI. La configuration provider/model de Hermes CLI n’est pas modifiée ; les appels utilisent toujours l’ID de modèle d’origine.",showAllModels:"Afficher tous les modèles",searchPlaceholder:"Rechercher des modèles...",noResults:"Aucun résultat",noModels:"Aucun modèle",removeCustomModel:"Retirer ce modèle non listé",refresh:"Actualiser la liste des modèles (recharger config.yaml)",more:"de plus",models:"Liste des modèles",manageVisibleModelsFor:"Gérer les modèles visibles de {name}",manageVisibleModels:"Gérer les modèles visibles",getApiKey:"Obtenir une API Key",count:"modèles",aliasUseOriginal:"Restaurer l’ID d’origine",aliasTitleFor:"Nom affiché pour {model}",aliasTitle:"Nom affiché du modèle",aliasSaveFailed:"Échec de l’enregistrement du nom affiché",aliasPlaceholder:"Laisser vide pour utiliser l’ID de modèle d’origine",aliasManageFor:"Noms affichés pour {provider}",aliasManage:"Noms affichés",aliasHint:"Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours l’ID de modèle d’origine.",aliasEdit:"Renommer",aliasCanonical:"ID d’origine : {model}"},profiles:{title:"Profils",create:"Creer un profil",import:"Importer",export:"Exporter",rename:"Renommer",delete:"Supprimer",switchTo:"Changer Hermes Profile",switchConfirm:"Cette action execute `hermes profile use {name}` et change le active profile Hermes CLI. Continuer ?",switchSuccess:'Hermes active profile change vers "{name}"',switchFailed:"Echec du changement Hermes Profile. La passerelle peut necessiter un redemarrage manuel.",createSuccess:'Profil "{name}" cree',createFailed:"Echec de la creation du profil",renameSuccess:"Profil renomme",renameFailed:"Echec du renommage du profil",deleteConfirm:'Etes-vous sur de vouloir supprimer le profil "{name}" ?',deleteSuccess:"Profil supprime",deleteFailed:"Echec de la suppression du profil",exportSuccess:"Profil exporte",exportFailed:"Echec de l'exportation du profil",importSuccess:"Profil importe",importFailed:"Echec de l'importation du profil",importSelectFile:"Selectionner un fichier d'archive",importInvalidFile:"Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)",name:"Nom du profil",namePlaceholder:"Lettres, chiffres et tirets uniquement",nameValidation:"Le nom du profil ne peut contenir que des lettres minuscules, des chiffres, des tirets bas et des tirets",newName:"Nouveau nom",newNamePlaceholder:"Entrez un nouveau nom",cloneFromCurrent:"Cloner depuis le profil actuel",cloneCleanupNotice:"Lors du clonage, les identifiants de plateformes exclusives (Weixin / Telegram / Slack, etc.) sont automatiquement ignorés pour éviter les conflits avec le profil source",cloneStrippedCredentials:"{count} identifiant(s) exclusif(s) supprimé(s) : {list}",cloneDisabledPlatforms:"{count} plateforme(s) désactivée(s) : {list}",cloneStrippedConfigCredentials:"{count} identifiant(s) intégré(s) supprimé(s) de config.yaml : {list}",archivePath:"Chemin de l'archive",archivePathPlaceholder:"Chemin serveur du fichier d'archive",importName:"Nom du profil (facultatif)",importNamePlaceholder:"Laisser vide pour utiliser le nom de l'archive",active:"Actif",model:"Modele",gateway:"Passerelle",alias:"Alias",provider:"Fournisseur",path:"Chemin",skills:"Competences",hasEnv:"A un .env",hasSoulMd:"A un soul.md",noProfiles:"Aucun profil trouve. Creez-en un pour commencer.",avatar:{title:"Avatar personnalisé",customize:"Personnaliser l’avatar",upload:"Importer une image",random:"Générer au hasard",reset:"Restaurer par défaut",hint:"PNG, JPEG ou WebP, 1 Mo maximum",invalidType:"Veuillez choisir une image PNG, JPEG ou WebP",tooLarge:"L’image d’avatar ne doit pas dépasser 1 Mo",saveSuccess:"Avatar enregistré",saveFailed:"Échec de l’enregistrement de l’avatar",resetSuccess:"Avatar par défaut restauré",resetFailed:"Échec de la restauration de l’avatar par défaut"},runtime:{activeProfile:"Actuel : {name}",bridgeWorker:"État du Bridge",gateway:"Passerelle",active:"Actif",activeTag:"Actuel",idle:"Inactif",checking:"Vérification",running:"En cours",stopped:"Arrêté",restartGateway:"Redémarrer le gateway",restartProfile:"Redémarrer le profil",switchProfile:"Changer le profil frontend",gatewayRestarted:"Gateway redémarré : {name}",gatewayRestartFailed:"Échec du redémarrage du gateway",profileRestarted:"Profil redémarré : {name}",profileRestartFailed:"Échec du redémarrage du profil"}},logs:{title:"Journaux",all:"Tout",searchPlaceholder:"Rechercher...",refresh:"Actualiser",noEntries:"Aucune entree de journal"},settings:{title:"Parametres",saved:"Enregistre",saveFailed:"Echec de l'enregistrement",tabs:{display:"Affichage",account:"Compte actuel",users:"Gestion des comptes",agent:"Agent",proxy:"Proxy",memory:"Memoire",compression:"Compression",session:"Session",privacy:"Confidentialite",apiServer:"Serveur API",models:"Modèles",voice:"Voix"},display:{streaming:"Reponses en continu",streamingHint:"Afficher les reponses de l'IA en temps reel",compact:"Mode compact",compactHint:"Reduire l'espacement des messages",showReasoning:"Afficher le raisonnement",showReasoningHint:"Afficher le processus de reflexion du modele",showCost:"Afficher le cout",showCostHint:"Afficher l'utilisation des jetons dans les reponses",inlineDiffs:"Diffs en ligne",inlineDiffsHint:"Afficher les changements de code en ligne",bellOnComplete:"Son de fin",bellOnCompleteHint:"Jouer un son lorsque l'IA a termine",notifyOnComplete:"Notification de fin",notifyOnCompleteHint:"Afficher une notification systeme lorsque l'IA a termine",notifyOnCompleteMacHint:"Sur macOS, autorisez les notifications du navigateur dans Reglages Systeme.",notifyOnCompleteDenied:"Autorisation de notification refusee",notifyOnCompleteInsecure:"Les notifications du navigateur exigent HTTPS ou localhost",notifyOnCompleteUnsupported:"Ce navigateur ne prend pas en charge les notifications",notifyOnCompleteTest:"Notifications activees.",notifyOnCompleteTestButton:"Tester",notifyOnCompleteTesting:"Envoi de la notification de test...",notifyOnCompleteTestSent:"Notification de test envoyee",notifyOnCompleteTestFailed:"Echec de l envoi de la notification de test",busyInputMode:"Mode saisie active",busyInputModeHint:"Permettre la saisie pendant le traitement de l'IA",theme:"Thème",themeHint:"Choisir clair, sombre ou suivre les preferences du systeme",themeLight:"Clair",themeDark:"Sombre",themeSystem:"Systeme",chatInputHeight:"Hauteur de saisie du chat",chatInputHeightHint:"Hauteur par défaut de la zone de saisie sur ordinateur, en pixels. Le mobile reste automatique."},agent:{maxTurns:"Tours maximum",maxTurnsHint:"Nombre maximum de tours d'interaction par conversation",gatewayTimeout:"Delai d'attente de la passerelle",gatewayTimeoutHint:"Delai d'attente de la requete en secondes",restartDrainTimeout:"Delai de vidange au redemarrage",restartDrainTimeoutHint:"Delai de vidange avant redemarrage en secondes",toolEnforcement:"Application des outils",toolEnforcementHint:"Controler le mode d'execution des appels d'outils",auto:"Automatique",always:"Toujours",never:"Jamais"},gatewayAutoStart:{title:"Démarrage automatique des gateways",description:"Contrôle les gateways de profils Hermes locaux que la Web UI démarre au lancement. Cette option est stockée dans la configuration Web UI, pas dans le config.yaml du profil.",enabled:"Démarrer automatiquement les gateways",enabledHint:"Si désactivé, aucun gateway de profil ne sera démarré automatiquement au lancement.",management:"Gateway unifié",managementHint:"Nécessite Hermes Agent 0.17.0 ou ultérieur. Si activé, la Web UI écrit multiplex_profiles afin que le gateway default serve tous les profils; les autres profils ne peuvent pas configurer des points d entree de messagerie distincts comme Feishu, Weixin ou QQBot. Désactiver retire cette configuration.",managementAuto:"Automatique",managementPerProfile:"Un gateway par profil",managementUnified:"Gateway default unifié",mode:"Politique des profils",modeHint:"Démarrer tous les profils détectés ou uniquement la liste incluse explicitement.",modeAll:"Tous les profils détectés",modeInclude:"Uniquement les profils inclus",include:"Profils inclus",includeHint:"Noms de profils séparés par des virgules. En mode inclusion, une liste vide ne démarre aucun profil.",exclude:"Profils exclus",excludeHint:"Noms de profils séparés par des virgules à ignorer après application de la politique.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Proxy gateway",description:"Definit les variables d environnement proxy pour le gateway du profil selectionne. Les changements redemarrent le gateway afin que les plateformes de messagerie utilisent les nouveaux parametres reseau.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Proxy pour les requetes HTTPS. C est generalement la valeur principale.",httpProxy:"HTTP_PROXY",httpProxyHint:"Proxy pour les requetes HTTP simples.",allProxy:"ALL_PROXY",allProxyHint:"Proxy de secours lorsqu aucun proxy specifique au protocole n est defini.",noProxy:"NO_PROXY",noProxyHint:"Hosts ou domaines separes par des virgules qui contournent le proxy.",save:"Enregistrer les parametres proxy"},memory:{enabled:"Activer la memoire",enabledHint:"Permettre a l'IA de memoriser le contexte de conversation",userProfile:"Profil utilisateur",userProfileHint:"Permettre a l'IA de memoriser les preferences utilisateur",charLimit:"Limite de caracteres de la memoire",charLimitHint:"Nombre maximum de caracteres pour MEMORY.md",userCharLimit:"Limite de caracteres du profil utilisateur",userCharLimitHint:"Nombre maximum de caracteres pour USER.md"},compression:{enabled:"Activer la compression",enabledHint:"Compresser automatiquement un long historique avant de depasser le contexte du modele",threshold:"Seuil de compression",thresholdHint:"Demarrer la compression quand les jetons estimes depassent ce ratio de contexte",targetRatio:"Ratio cible",targetRatioHint:"Taille cible de l'historique apres compression comme ratio du contexte",protectLastN:"Proteger les messages recents",protectLastNHint:"Garder autant de messages recents non compresses",protectFirstN:"Proteger les premiers messages",protectFirstNHint:"Garder autant de premiers messages non compresses"},session:{mode:"Mode de reinitialisation",modeHint:"Condition de declenchement de la reinitialisation de session",modeBoth:"Inactivite + Planifie",modeIdle:"Inactivite uniquement",modeDaily:"Planifie uniquement",modeNone:"Jamais (manuel uniquement)",idleMinutes:"Delai d'inactivite",idleMinutesHint:"Temps d'attente avant reinitialisation automatique (minutes)",atHour:"Heure de reinitialisation planifiee",humanOnly:"Afficher uniquement les sessions humaines",humanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session",liveMonitorHumanOnly:"Moniteur live : n’afficher que les sessions humaines",liveMonitorHumanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live",atHourHint:"Reinitialiser la session a cette heure chaque jour",requireAuth:"Autorisation de session",requireAuthHint:"Exiger une autorisation pour les operations de session",memoryWriteApproval:"Verifier les ecritures de memoire",memoryWriteApprovalHint:"Mettre les ecritures de memoire de Hermes Agent en attente de validation avant de les enregistrer.",skillsWriteApproval:"Verifier les ecritures de skills",skillsWriteApprovalHint:"Mettre les modifications de skills de Hermes Agent en attente de validation avant de les enregistrer.",writeApprovalTitle:"Ecritures en attente de validation",writeApprovalDescription:"Approuvez ou refusez les ecritures de memoire et de skills preparees par Hermes Agent.",writeApprovalRefresh:"Actualiser",writeApprovalEmpty:"Aucune ecriture en attente.",writeApprovalMemory:"Memoire",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Verifier",writeApprovalHideDiff:"Masquer",writeApprovalNoDiff:"Aucune difference disponible.",writeApprovalLoadFailed:"Impossible de charger les ecritures en attente",writeApprovalDiffFailed:"Impossible de charger les details de l ecriture",writeApprovalActionFailed:"Impossible de traiter l ecriture en attente",writeApprovalApproved:"Ecriture approuvee",writeApprovalRejected:"Ecriture refusee",writeApprovalApprove:"Approuver",writeApprovalReject:"Refuser",writeApprovalPendingMemoryWrite:"Ecriture de memoire en attente",writeApprovalCurrentFile:"Fichier actuel {file}",writeApprovalProposedFile:"Fichier propose {file}",writeApprovalDiffSection:"Difference",writeApprovalPatchOldStringMissing:"Le old_string du patch est introuvable dans le fichier actuel {file}; l approbation ne modifiera pas le fichier.",writeApprovalRequestedOldString:"old_string demande",writeApprovalCurrentReadFailed:"Le fichier actuel {file} n a pas pu etre lu comme texte UTF-8.",writeApprovalDeleteSkill:"Cette validation supprime le skill {skill}.",writeApprovalRemoveFile:"Cette validation supprime {file} du skill {skill}."},privacy:{redactPii:"Masquer les DPI",redactPiiHint:"Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)"},apiServer:{enable:"Activer",enableHint:"Activer le serveur API",host:"Hote",hostHint:"Adresse d'ecoute",port:"Port",portHint:"Port d'ecoute",key:"Cle",keyHint:"Cle d'acces API",cors:"Origines CORS",corsHint:"Sources cross-origin autorisees"},voice:{activeTtsApi:"API TTS active",activeSttApi:"API STT active",ttsProvidersTitle:"Fournisseurs TTS",ttsProvidersDescription:"Gerez les integrations de synthese vocale utilisees pour lire les reponses de l’assistant et les apercus vocaux.",sttProvidersTitle:"Fournisseurs STT",sttProvidersDescription:"Gerez les integrations de transcription vocale utilisees par le microphone et le flux de saisie vocale.",noneSelected:"Aucun selectionne",keyStored:"Enregistree",keyMissing:"Manquante",customApi:"API",localBuiltin:"Integre localement",ttsCardHint:"Fournisseur de synthese vocale",sttCardHint:"Fournisseur de transcription vocale",setActive:"Activer",testAction:"Tester",connect:"Connecter",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Voix cloud gratuites de haute qualite de Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"TTS personnalise",presetBrowserSttLabel:"STT du navigateur",presetBrowserSttDescription:"API native de reconnaissance vocale du navigateur.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"STT personnalise",apiCompatibility:"Compatibilite API",openaiCompatible:"Compatible OpenAI",manualCustomEndpoint:"Endpoint personnalise manuel",connectionStep:"Connexion",discoveryManualHint:"Endpoint personnalise manuel selectionne. La decouverte des modeles n est pas disponible ; saisissez le nom du modele manuellement.",discoveryCredentialHint:"Saisissez la Base URL et la cle API, puis connectez-vous pour recuperer les modeles disponibles.",discoveryNoAutoProbeHint:"Aucune requete n est envoyee pendant la saisie. Utilisez Connect quand les identifiants sont prets.",apiKeyConnectPlaceholder:"Collez la cle API pour vous connecter ; les cles stockees ne sont jamais affichees",connectFetchModels:"Connecter et recuperer les modeles",modelRecommendedSuffix:"recommande",modelConnectManualHint:"Connectez-vous pour remplir automatiquement, ou saisissez manuellement.",modelRequiredConnectManual:"Le modele est requis. Connectez-vous pour remplir automatiquement, ou saisissez manuellement.",apiKeyRequired:"La cle API est requise.",apiKeyRequiredForDiscovery:"La cle API est requise pour recuperer les modeles.",baseUrlRequired:"La Base URL est requise.",baseUrlHttpsRequired:"Veuillez utiliser http:// ou https://.",baseUrlInvalid:"Saisissez une Base URL valide, avec https://.",discoveryFailedManualFallback:"Impossible de recuperer les modeles. Vous pouvez toujours saisir le nom du modele manuellement.",completeRequiredProviderFields:"Completez les champs provider requis avant d enregistrer.",fetchingModels:"Recuperation des modeles...",recommendedModel:"Recommande : {model}.",useRecommendedModel:"Utiliser celui-ci.",modelsDiscovered:"{count} modeles decouverts. Le modele recommande est selectionne quand le champ est vide.",remove:"Supprimer",testSuccess:"Test termine",testTextRequired:"Saisissez du texte avant de tester.",keyMissingForTest:"Ajoutez une cle API avant de tester ce fournisseur.",testing:"Test en cours...",transcribing:"Transcription...",browserSttTestHint:"Le STT du navigateur se teste depuis le microphone du chat.",sttEmptyAudio:"Aucun audio capture. Reessayez.",sttTestSuccess:"Transcription terminee",sttRecordingHint:"Enregistrement... cliquez sur Arreter pour transcrire.",keepStoredKeyPlaceholder:"Laisser vide pour conserver la cle enregistree",apiKeyPlaceholder:"Saisir la cle API",lastTest:"Dernier test",notTested:"—",recording:"Enregistrement",testFailedShort:"Echec",testFailedSummary:"Le test a echoue. Verifiez les parametres du fournisseur et reessayez.",showDetails:"Afficher les details",hideDetails:"Masquer les details",moreActions:"Plus",moreActionsFor:"Plus d’actions pour {provider}",addTtsApi:"Ajouter une API TTS",addSttApi:"Ajouter une API STT",active:"Actif",builtin:"Integre",connected:"Connecte",disconnected:"Deconnecte",source:"Source",model:"Modele",voice:"Voix",doubaoVoiceHint:"Selectionnez une voix Seed TTS 2.0 ; le champ de ressource est mis a jour automatiquement.",apiKey:"Cle API",confirmDeleteSecret:"Supprimer la cle API enregistree pour cette API vocale ?",ttsTitle:"Texte vers parole",ttsSaved:"Parametres TTS enregistres sur le serveur",ttsSaveFailed:"Impossible d’enregistrer les parametres TTS",ttsTestSaved:"Ecoute reussie; parametres TTS enregistres sur le serveur",ttsTestSaving:"Enregistrement des parametres TTS avant l’ecoute...",ttsMissingBaseUrl:"La Base URL est requise avant le test. Saisissez un endpoint fournisseur puis retestez.",ttsMissingApiKey:"La cle API est requise avant le test. Collez la cle ou enregistrez d’abord une cle serveur.",ttsCleared:"Cle TTS enregistree supprimee",ttsClearFailed:"Impossible de supprimer la cle TTS enregistree",storedBaseUrlsTitle:"Base URLs enregistrées",storedBaseUrlsHint:"Endpoints vocaux enregistrés. Les champs ci-dessus effacent seulement la valeur actuelle; supprimez les URL enregistrées ici.",storedBaseUrlsEmpty:"Aucune Base URL vocale personnalisée n’est enregistrée sur le serveur.",storedBaseUrlDelete:"Supprimer URL",storedApiKeysTitle:"API keys enregistrées",storedApiKeysHint:"Liste masquée des clés vocales stockées côté serveur. Seuls l’usage et la source sont affichés; la key complète ne l’est jamais.",storedApiKeysEmpty:"Aucune API key vocale n’est enregistrée sur le serveur.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Supprimer key",baseUrlPresetClear:"Effacer URL",baseUrlPresetCleared:"Base URL effacée du champ.",baseUrlPresetDelete:"Supprimer URL",baseUrlPresetDeleted:"URL de base retirée de la liste enregistrée.",baseUrlPresetDeleteFailed:"Impossible de supprimer l’URL de base enregistrée.",ttsPendingSecret:"La nouvelle cle sera enregistree",ttsStoredSecret:"Le serveur a une cle enregistree : {value}",ttsClearKey:"Supprimer la cle enregistree",sttTitle:"Parole vers texte",sttProvider:"Fournisseur STT",sttProviderHint:"Choisissez comment l’entree vocale est transcrite",sttProviderBrowser:"Navigateur",sttProviderOpenai:"Compatible OpenAI",sttProviderCustom:"Personnalise",sttBrowserHint:"Utilise la reconnaissance vocale integree du navigateur lorsqu’elle est disponible.",sttApiKey:"Cle API",sttApiKeyHint:"Enregistree cote serveur pour les fournisseurs STT qui exigent une authentification.",sttStoredSecret:"Cle serveur enregistree : {value}",sttPendingSecret:"Cle serveur enregistree : sera mise a jour a l’enregistrement",sttClearKey:"Supprimer la cle enregistree",sttModel:"Modele",sttModelHint:"Modele de parole vers texte a utiliser.",sttLanguage:"Langue",sttLanguageHint:"Indice de langue facultatif, comme en ou zh.",sttPrompt:"Prompt",sttPromptHint:"Prompt de transcription facultatif.",sttAudioTranscode:"Transcodage audio",sttAudioTranscodeNone:"Envoyer l’audio original",sttAudioTranscodeFfmpeg:"Convertir en WAV avec ffmpeg",sttBaseUrl:"Base URL",sttBaseUrlHint:"Endpoint parole vers texte personnalise compatible OpenAI.",sttSave:"Enregistrer les parametres STT",sttSaved:"Parametres STT enregistres sur le serveur.",sttSaveFailed:"Impossible d’enregistrer les parametres STT.",sttCleared:"Secret STT enregistre supprime du serveur.",sttClearFailed:"Impossible de supprimer le secret STT enregistre.",sttActiveSaved:"Fournisseur STT actif enregistre sur le serveur.",sttSaveActive:"Enregistrer le fournisseur STT actif",sttEndpointHint:"Endpoint final de transcription : {endpoint}",sttTestTitle:"Tester parole vers texte",sttTestButton:"Tester l’API STT",sttTestStopButton:"Arreter et transcrire",sttTestBackendOnly:"Le test d’API STT est disponible pour les fournisseurs compatibles OpenAI et personnalises.",sttTestRecording:"Enregistrement de l’echantillon de test... cliquez sur Arreter et transcrire lorsque vous avez termine.",sttTestTranscribing:"Transcription de l’echantillon de test...",sttTestEmpty:"Aucun audio capture pour le test STT.",sttTestSucceeded:"Test STT reussi.",sttTestFailed:"Echec du test STT : {error} — {hint}",sttFailureHintMissingConfig:"Verifiez que le fournisseur est enregistre avec une Base URL/un modele et une cle API avant le test.",sttFailureHintAuth:"Verifiez la cle API. Si une cle etait deja enregistree, collez de nouveau la cle actuelle et enregistrez avant de tester.",sttFailureHintForbidden:"La cle a atteint le fournisseur, mais n’a pas l’autorisation pour ce modele STT ou ce compte. Verifiez l’acces/la facturation du fournisseur.",sttFailureHintEndpointModel:"Verifiez la Base URL et le modele. Pour Groq, utilisez {endpoint} avec whisper-large-v3-turbo ou un autre modele STT Groq.",sttFailureHintModel:"Verifiez que le modele STT selectionne existe et est active pour ce compte.",sttFailureHintQuota:"Le fournisseur signale un probleme de quota, facturation ou limite de debit. Verifiez le quota/la facturation ou reessayez plus tard.",sttFailureHintNetworkCustom:"Le serveur n’a pas pu joindre l’endpoint STT personnalise. Verifiez que {endpoint} est joignable depuis le serveur Web UI et compatible OpenAI.",sttFailureHintNetwork:"Le serveur Web UI n’a pas pu joindre le fournisseur STT. Verifiez reseau/proxy/pare-feu et reessayez.",sttFailureHintAudio:"L’audio enregistre etait vide ou rejete. Essayez un court echantillon clair, autorisez le microphone ou reessayez dans Chrome.",sttFailureHintGenericCustom:"Verifiez la cle API, la Base URL, le modele et l’endpoint final {endpoint}.",sttFailureHintGeneric:"Verifiez la cle API, le modele et l’acces au compte fournisseur, puis reessayez.",sttTestRecordFailed:"Impossible de demarrer l’enregistrement du microphone : {error}",sttTestTranscript:"Transcription : {text}",ttsProvider:"Fournisseur TTS",ttsProviderHint:"Choisir le moteur de synthese vocale pour la lecture des messages",providerWebSpeech:"WebSpeech API (Navigateur)",providerOpenai:"OpenAI TTS",providerCustom:"Point d'acces personnalise (compatible OpenAI)",providerEdge:"Edge TTS (Gratuit, sans cle API)",webspeechVoice:"Voix",webspeechVoiceHint:"Choisir une voix depuis le navigateur ou l'OS",webspeechVoicePlaceholder:"Auto (voix par defaut)",openaiKey:"Cle API",openaiKeyHint:"Votre cle API OpenAI avec acces TTS",openaiUrl:"URL de base API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modele",openaiModelHint:"tts-1 (rapide) / tts-1-hd (haute qualite)",openaiVoice:"Voix",openaiVoiceHint:"Voix a utiliser pour la synthese",customHint:"Utilisez toute API TTS compatible OpenAI — fonctionne avec GPT-SoVITS, CosyVoice, etc.",customUrl:"URL API",customUrlHint:"URL de base de votre service TTS",customUrlPlaceholder:"Adresse configuree dans l'adaptateur local, ex. http://127.0.0.1:9880",customApiKey:"Cle API (optionnelle)",customApiKeyHint:"Certains points d'acces personnalises necessitent une authentification",customApiKeyPlaceholder:"Laisser vide si inutile",edgeHint:"Propulse par Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL de l'adaptateur",edgeUrlHint:"Adresse de l'adaptateur Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voix",edgeVoiceHint:"Choisir une voix pour la synthese vocale",edgeRate:"Vitesse",edgeRateHint:"Ajuster la vitesse de la voix (0.5x ~ 2.0x)",edgePitch:"Hauteur",edgePitchHint:"Ajuster la hauteur de la voix (-20 ~ +20 Hz)",testTitle:"Test vocal",testText:"Texte de test",testTextPlaceholder:"Entrez le texte a tester...",testTextDefault:"Bonjour, ceci est un test vocal.",testButton:"Tester",testButtonPlaying:"Lecture...",testFailed:"Echec du test : {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voices predefinies, conception vocale et clonage vocal",mimoApiKey:"Cle API",mimoApiKeyHint:"Obtenez votre cle sur platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Cle API MiMo",mimoAuthMode:"Mode d’authentification",mimoAuthModeHint:"Format d’en-tete attendu par le point de terminaison MiMo selectionne",mimoAuthModeBearer:"Jeton Bearer (Authorization)",mimoAuthModeApiKey:"En-tete API key (api-key)",mimoAuthModeBoth:"Les deux en-tetes",mimoBaseUrl:"URL de base",mimoBaseUrlHint:"URL de l'endpoint API MiMo",mimoModel:"Modele",mimoModelHint:"Selectionnez le modele de synthese vocale",mimoModelPreset:"Voix predefinies",mimoModelVoiceDesign:"Conception vocale",mimoModelVoiceClone:"Clonage vocal",mimoVoice:"Voix",mimoVoiceHint:"Selectionnez une voix predefinie",mimoVoiceDesignPrompt:"Description vocale",mimoVoiceDesignPromptHint:"Decrivez les caracteristiques vocales souhaitees",mimoVoiceDesignPromptPlaceholder:"Ex : Une voix feminine chaude et jeune, legerement lente, avec un ton magnetique",mimoCloneAudio:"Televerser un audio",mimoCloneAudioHint:"Televersez un echantillon audio pour le clonage (mp3/wav, max 10 Mo)",mimoCloneAudioUpload:"Choisir un fichier",mimoCloneAudioClear:"Effacer",mimoStylePrompt:"Invite de style",mimoStylePromptHint:"Optionnel — decrivez le style de parole en langage naturel",mimoStylePromptPlaceholder:"Ex : Ton vif et entrain, rythme rapide"},lockedIps:{title:"IPs bloquees",count:"{count} bloquees",empty:"Aucune IP bloquee",unlock:"Debloquer",unlockAll:"Tout debloquer",unlockAllConfirm:"Debloquer toutes les IPs?",unlocked:"IP debloquee",allUnlocked:"{count} IPs debloquees",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"Avatar utilisateur",upload:"Importer une image",random:"Générer aléatoirement",reset:"Rétablir par défaut",hint:"PNG, JPEG et WebP jusqu’à 1 Mo; compression automatique sous 500 Ko.",invalidType:"Choisissez une image PNG, JPEG ou WebP",tooLarge:"L’image d’avatar doit faire 1 Mo ou moins",saveSuccess:"Avatar enregistré",saveFailed:"Échec de l’enregistrement de l’avatar",resetSuccess:"Avatar réinitialisé",resetFailed:"Échec de la réinitialisation de l’avatar"},models:{apiKey:"API Key",apiKeyPlaceholder:"Saisir l’API Key",noProviders:"Aucun fournisseur configuré",save:"Enregistrer",saveFailed:"Échec de l’enregistrement",saved:"Enregistré"}},githubPreview:{title:"Aperçu de version",description:"Clone le tag GitHub sélectionné dans l’espace de prévisualisation Web UI, installe les dépendances, puis lance l’application sur les ports de développement.",refresh:"Actualiser",selectTag:"Sélectionner un tag",prepare:"Préparer le code",install:"Installer les dépendances",start:"Démarrer l’aperçu",stop:"Arrêter",note:"Le code de prévisualisation est stocké dans le dossier de données Web UI. La production reste sur le port 8648 ; la prévisualisation utilise le frontend 8651 et le backend 8650.",path:"Chemin de prévisualisation",webuiHome:"Données de prévisualisation",currentTag:"Tag actuel",repoReady:"Dépôt prêt",dependencies:"Dépendances installées",running:"État",notRunning:"Arrêté",open:"Ouvrir l’aperçu",log:"Chemin du journal d’action",logOutput:"Sortie des journaux",actionLog:"Journal d’action",devLog:"Journal du serveur dev",yes:"Oui",no:"Non",actionFailed:"Échec de l’action",nodeEnvironmentMissing:"Node/npm n’a pas été détecté. Installez Node.js puis réessayez.",prepareSuccess:"Code de prévisualisation prêt",installSuccess:"Dépendances installées",startSuccess:"Prévisualisation terminée",stopSuccess:"Prévisualisation arrêtée"},codingAgents:{title:"Agents de code",notice:"Tous les fournisseurs et modèles ne sont pas compatibles.",claudeDescription:"CLI Anthropic pour les tâches ponctuelles en print mode et les sessions de code interactives.",codexDescription:"CLI OpenAI et flux fournisseur Hermes openai-codex pour les tâches de dépôt.",copyCommand:"Copier",commandCopied:"Commande copiée",commandCopyFailed:"Échec de la copie",refresh:"Actualiser",checking:"Vérification",installStatus:"État d’installation",installed:"Installé",notInstalled:"Non installé",installRequired:"{agent} n’est pas installé. Installez-le avant de créer une session.",installNow:"Installer",installing:"Installation",installSuccess:"Installé",installFailed:"Échec de l’installation",installFailedHermesHint:"L’installation a échoué. Demandez à Hermes de l’installer pour vous.",installFailureReason:"Raison",nodeEnvironmentMissing:"Node/npm n’a pas été détecté. Installez Node.js puis réessayez.",deleteNow:"Supprimer",deleting:"Suppression",deleteSuccess:"Supprimé",deleteFailed:"Échec de la suppression",configFiles:"Fichiers de configuration",profileScope:"Profil",providerScope:"Fournisseur",providerPlaceholder:"ex. custom:glm",modelScope:"Modèle",modelPlaceholder:"Sélectionner un modèle",launchModeScope:"Mode de lancement",launchModeGlobal:"Configuration globale",launchModeScoped:"Fournisseur et modèle",protocolScope:"Protocole",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"Recharger la configuration",configFileNotCreated:"Non créé",configLoadFailed:"Impossible de lire le fichier de configuration",loadFailed:"Impossible d’inspecter les agents de code",launch:"Lancer",launchTitle:"Lancer l’agent de code",nativeTerminal:"Terminal natif",builtInTerminal:"Terminal intégré",launchPrepared:"Configuration de lancement prête",launchPrepareFailed:"Échec de la préparation du lancement",nativeLaunchStarted:"Terminal natif ouvert",nativeLaunchFailed:"Impossible d’ouvrir le terminal natif",terminalTitle:"Terminal de l’agent de code",loadProvidersFailed:"Impossible de charger les fournisseurs du profil actuel",selectProviderModel:"Sélectionnez un fournisseur et un modèle",launchConfigDir:"Dossier de configuration de lancement",launchCommand:"Commande de lancement",table:{tool:"Outil",kind:"Étape",command:"Commande",note:"Note",action:"Action"},kinds:{install:"Installer",auth:"Auth",health:"Santé",run:"Exécuter"},notes:{claudeInstall:"Installe la CLI Claude Code globalement.",codexInstall:"Installe la CLI Codex globalement.",claudeAuth:"Vérifie l’état de connexion Claude Code ; exécutez claude une fois si la connexion manque.",codexAuth:"Ajoute les identifiants OAuth OpenAI Codex gérés par Hermes.",claudeHealth:"Vérifie le programme de mise à jour et l’état de la CLI locale.",codexHealth:"Confirme que la CLI Codex est disponible dans PATH.",claudeRun:"Print mode est le chemin le plus propre pour les tâches ponctuelles pilotées par API.",codexRun:"Les tâches ponctuelles Codex doivent s’exécuter dans un dépôt git."}},platform:{requireMention:"Exiger une mention {'@'}",requireMentionGroup:"Exiger une mention {'@'} dans les groupes pour repondre",requireMentionChannel:"Exiger une mention {'@'} dans les canaux pour repondre",requireMentionRoom:"Exiger une mention {'@'} dans les salles pour repondre",reactions:"Réactions",reactionsHint:"Reagir aux messages avec des emoji",freeResponseChats:"Discussions en reponse libre",freeResponseChatsHint:"ID de discussions repondant sans mention {'@'} (separes par des virgules)",freeResponseChannels:"Canaux en reponse libre",freeResponseChannelsHint:"ID de canaux repondant sans mention {'@'} (separes par des virgules)",freeResponseRooms:"Salles en reponse libre",freeResponseRoomsHint:"ID de salles repondant sans mention {'@'} (separes par des virgules)",mentionPatterns:"Motifs de mention personnalises",mentionPatternsHint:"Motifs de declenchement supplementaires",autoThread:"Fil automatique",autoThreadHint:"Creer automatiquement des fils de reponse apres une mention {'@'}",autoThreadHintRoom:"Creer automatiquement des fils de reponse dans les salles",dmMentionThreads:"Fils de mention en MP",dmMentionThreadsHint:"Utiliser des fils de reponse pour les mentions en MP",allowBots:"Autoriser les messages de bots",allowBotsHint:"Repondre aux messages d'autres bots",allowedChannels:"Canaux autorises",allowedChannelsHint:"Liste blanche des ID de canaux (separes par des virgules)",ignoredChannels:"Canaux ignores",ignoredChannelsHint:"Canaux ou le bot ne repond jamais (separes par des virgules)",noThreadChannels:"Canaux sans fil",noThreadChannelsHint:"Canaux ou le bot repond sans fil (separes par des virgules)",exclusiveTokenWarning:"Cette plateforme utilise un verrou de jeton exclusif. Chaque profil doit utiliser un jeton d'identite different pour eviter les conflits avec les autres profils.",botToken:"Jeton de bot",botTokenHint:"Jeton de bot depuis le portail developpeur",proxyUrl:"URL du proxy",proxyUrlHint:"Proxy optionnel pour cette plateforme. Prend en charge http://, https:// et socks5://",accessToken:"Jeton d'acces",accessTokenHint:"Jeton d'acces Matrix",homeserver:"URL du serveur domestique",homeserverHint:"URL du serveur domestique Matrix",matrixUserId:"ID utilisateur Matrix",matrixUserIdHint:"Requis avec le mot de passe, facultatif avec le jeton",matrixPassword:"Mot de passe Matrix",matrixPasswordHint:"Alternative au jeton d'acces",appId:"ID de l'application",appIdHint:"ID de l'application Feishu",appSecret:"Secret de l'application",appSecretHint:"Secret de l'application Feishu",encryptKey:"Clé de chiffrement",encryptKeyHint:"Clé de chiffrement Feishu",verificationToken:"Jeton de vérification",verificationTokenHint:"Jeton de vérification Feishu",clientId:"ID client",clientIdHint:"ID client DingTalk",clientSecret:"Secret client",clientSecretHint:"Secret client DingTalk",cardTemplateId:"ID du modèle de carte IA",cardTemplateIdHint:"ID du modèle de carte IA DingTalk ; laisser vide pour désactiver les cartes IA",botId:"ID du bot",botIdHint:"ID du bot WeCom",wecomSecretHint:"Secret du bot WeCom",waEnabled:"Activer WhatsApp",waEnabledHint:"Activer WhatsApp via appairage par code QR",weixinToken:"Jeton Weixin",weixinTokenHint:"Depuis la connexion QR de la CLI weixin (hermes weixin)",accountId:"ID de compte",accountIdHint:"ID du compte Weixin",qrLogin:"Connexion QR",qrRelogin:"Reconnexion",qrFetching:"Recuperation du code QR...",qrScanHint:"Scannez avec WeChat pour vous connecter",qrScanedHint:"Scanne, veuillez confirmer sur le telephone...",qqSandboxHint:"Activer l’environnement sandbox (pour les tests)",qqSandbox:"Mode sandbox",qqQrScanHint:"Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer l’association",qqMarkdownHint:"Activer les messages au format Markdown (certains clients peuvent ne pas le prendre en charge)",qqMarkdown:"Support Markdown",qqAppSecretHint:"App Secret du bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID du bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Liste blanche d’ID utilisateur ou OpenID, séparés par des virgules",allowedUsers:"Utilisateurs autorisés",allowAllUsersHint:"Autoriser les messages de tout utilisateur ; désactivez pour utiliser la liste blanche",allowAllUsers:"Autoriser tous les utilisateurs"},language:{label:"Langue",zh:"中文",en:"English",fr:"Francais"},terminal:{sessions:"Sessions",newTab:"Nouveau terminal",closeSession:"Fermer cette session ?",sessionExited:"Terminee",processExited:"Processus termine avec le code {code}",noSessions:"Aucune session terminal",connectionFailed:"Connexion au terminal impossible",connectionError:"Erreur de connexion",connectionClosed:"Connexion fermée"},usage:{title:"Statistiques d'utilisation",refresh:"Actualiser",totalTokens:"Total des jetons",inputTokens:"Entree",outputTokens:"Sortie",totalSessions:"Total des sessions",avgPerDay:"~{n}/jour en moy.",estimatedCost:"Cout est.",cacheHitRate:"Taux de succes du cache",modelBreakdown:"Repartition par modele",dailyTrend:"Utilisation quotidienne",date:"Date",tokens:"Jetons",cache:"Cache",cacheRead:"Lecture cache",cacheWrite:"Écriture cache",sessions:"Sessions",cost:"Cout",noData:"Aucune donnee d'utilisation"},skillsUsage:{title:"Utilisation des compétences",subtitle:"Suivre les chargements et modifications de compétences dans les sessions Hermes",refresh:"Actualiser",periodSelector:"Période d'utilisation des compétences",periodLabel:"{days} j",summary:"Résumé",totalActions:"Act.",loads:"Charg.",edits:"Modif.",distinctSkills:"Comp.",topSkills:"Top comp.",dailyTrend:"Tendance",periodSummary:"{days} derniers jours",skill:"Comp.",share:"%",lastUsed:"Dern. usage",noData:"Aucune donnée d'utilisation des compétences",loadFailed:"Impossible de charger l'utilisation des compétences",otherSkills:"Autres comp."},changelog:{new_0_6_25_1:"Correction des echecs execute_code avec Hermes Agent 0.18.0 en transmettant le nouveau parametre has_host_access via le wrapper de memoire d approbation Agent Bridge",new_0_6_24_1:"Cette version couvre les PR fusionnees apres 0.6.23 avec des ameliorations pour la saisie chat, la visibilite des workspaces, les plugins, les modeles par defaut et la revue des diffs",new_0_6_24_2:"Les champs de saisie chat et groupe utilisent une barre integree, des controles de modele compacts, des reglages regroupes, un usage du contexte plus lisible, un mobile chrome plus stable et le redimensionnement manuel du chat simple est retabli",new_0_6_24_3:"Les changements de workspace run apparaissent comme cartes diff persistantes avec un tiroir lateral pour consulter les diffs et editer les fichiers, restaurees apres reprise de session et ajustees pour mobile",new_0_6_24_4:"Le selecteur de dossiers workspace gere mieux les disques et junctions Windows et affiche les dossiers commencant par un point comme .hermes, .config et .codex tout en conservant les controles WORKSPACE_BASE",new_0_6_24_5:"La page Plugins permet d activer ou desactiver les plugins utilisateur gerables et reflete plus precisement l etat combine de la configuration Hermes de base et du profile courant",new_0_6_24_6:"La page Models ajoute les actions de provider et modele par defaut; la detection d erreurs terminal bridge genere moins de faux positifs, le runtime Hermes Agent passe a 0.18.0 et le manifest de versions du site est actualise",new_0_6_23_1:"Cette version couvre les PR fusionnees depuis 0.6.22, avec des mises a jour pour l auto-update desktop, le nettoyage MCP, les pets Petdex, la voix MCU et plusieurs parcours de reglages",new_0_6_23_2:"L auto-update desktop revient a un flux bloquant, Windows arrete les services plus proprement avant la mise a jour, et la sortie desktop nettoie mieux gateway, profile MCP et les processus enfants associes",new_0_6_23_3:"L injection MCP desktop et les chemins de lancement MCP du Coding Agent sont plus stables, les workspaces Windows gagnent un selecteur de disque, et l affichage des dossiers symlink ainsi que les apercus Petdex desktop sont corriges",new_0_6_23_4:"Les pets Petdex prennent maintenant en charge les pets web, une fenetre desktop dediee, l affichage immediat apres adoption, un bouton de fermeture en haut a droite et une taille initiale desktop plus visible",new_0_6_23_5:"La voix MCU et globale ajoute des invites audio, des protections OTA, du TTS segmente en streaming, le nettoyage des liens, blocs de code et tableaux avant lecture, ainsi que l annulation des generations TTS inachevees",new_0_6_23_6:"Les reglages et workflows ajoutent l edition de config profile, la hauteur de saisie du chat, l expiration JWT de login, l edition des Skills, la conservation de l etat archive local dans History, un libelle plus clair pour le tiroir de nouveau chat et des textes de danger plus surs pour les Providers integres",new_0_6_22_1:"Cette version couvre les PR fusionnees depuis 0.6.21, avec des mises a jour front-end pour les modeles combines, l historique des sessions, les parametres proxy, les commandes slash et les finitions mobiles",new_0_6_22_2:"La page Modeles inclut maintenant un panneau de modeles combines, et le chat peut afficher la progression reelle des references et agregateurs MoA sans l ancien outil factice",new_0_6_22_3:"Les sessions de chat peuvent etre archivees depuis la liste puis restaurees depuis l historique; les sessions locales Claude Code et Codex apparaissent maintenant correctement dans l historique",new_0_6_22_4:"Les parametres ajoutent un onglet Proxy pour les valeurs HTTP(S), ALL_PROXY et NO_PROXY globales au gateway, avec proxy par plateforme pour Telegram, Discord et Matrix",new_0_6_22_5:"Le chat Hermes ajoute la commande /learn, Agent Bridge utilise le workspace selectionne comme cwd, et seules les commandes desktop /learn et MoA attendent la prochaine version de Hermes Agent",new_0_6_21_1:"Cette version se concentre sur reruns workflow, outils MCP workflow, suppression des reglages voice, reglages Matrix, nettoyage update et documentation",new_0_6_21_2:"Les messages de node workflow s ouvrent maintenant dans un drawer chat complet a gauche et redimensionnable; l historique mobile des runs est restaure et les reruns peuvent garder ou effacer le node selectionne",new_0_6_21_3:"Le toolset MCP use peut maintenant lister, creer, modifier, supprimer, lancer, arreter, supprimer des runs et rerun des workflows depuis un node selectionne",new_0_6_21_4:"La suppression d un voice provider supprime maintenant les reglages du profile au lieu de seulement vider l API key, tandis que Browser STT et Edge TTS restent proteges",new_0_6_21_5:"Les reglages Matrix acceptent maintenant user ID plus password et detectent correctement l etat configure avec le login par mot de passe",new_0_6_21_6:"Web UI restart, update et upgrade in-app arretent maintenant Agent Bridge broker par defaut afin d eviter de reutiliser un vieux process Python bridge",new_0_6_21_7:"Les headers chat, group chat et workflow sont mieux alignes; Xiao Fang He affiche sold out; le scope BSL est clarifie; le plan /learn est documente; le vieux proxy Hermes est supprime",new_0_6_20_1:"Workflow est maintenant disponible: creez des nodes Agent, connectez-les en graphe et lancez le flow complet depuis la page Workflow",new_0_6_20_2:"Les workflow runs conservent run records, graph snapshots, sessions par node, live node status, raisons d echec et actions stop/delete",new_0_6_20_3:"La vue et l edition workflow sont plus completes avec run history, snapshots read-only, consultation des chats par node, handles plus grands et garde create-workflow-first",new_0_6_20_4:"Le desktop laisse agent-browser resoudre Chrome depuis AGENT_BROWSER_HOME au lieu de figer un executable path obsolete, avec guards d integrite des patches et fixes stdout navigateur",new_0_6_20_5:"Les browser runtimes packages fixent Chrome for Testing 149.0.7827.55 sur les plateformes desktop supportees pour eviter les regressions runtime browser",new_0_6_20_6:"ESP32 et Xiao Fang He gagnent des liens tutoriel mis a jour, un badge plus lisible sur fond clair et une animation de flux compatible Windows",new_0_6_19_1:"Cette version inclut 16 PR depuis 0.6.18 et ameliore les experiences visibles de device, voice, Coding Agent et settings",new_0_6_19_2:"Les sessions Coding Agent peuvent changer de modele, et les nouvelles sessions suivent maintenant correctement le modele global par defaut",new_0_6_19_3:"Les interactions MCU sont plus stables avec le debounce Wi-Fi/boot au demarrage, l audio envoye seulement au device cible et un meilleur double-clic materiel pour vider et interrompre",new_0_6_19_4:"Les reglages TTS sont maintenant enregistres par profile, et la vitesse, le pitch et les tests vocaux lisent la meme source de configuration",new_0_6_19_5:"Les changements de modele Coding Agent n affectent plus les sessions existantes, et les custom provider keys sont transmises correctement",new_0_6_19_6:"Filtres skills runtime, tri des cron jobs, limite de hauteur des details skill, recuperation updater Windows, fallbacks de backup et logos compresses completent cette mise a jour",new_0_6_18_2:"Hermes Studio MCP est separe en toolsets api, devices et use, avec de nouvelles actions session, model, chat-run et ops",new_0_6_18_3:"Les historiques de chat et de groupe sont plus fiables avec historique UI separe, gestion sure des messages nuls, reponses assistant preservees apres run failures et replay reasoning aligne",new_0_6_18_4:"Le retour MCU est plus clair: les tool calls restent prioritaires sur la voix, l audio ne marque plus les taches terminees trop tot, le login active-device est plus stable et les longs textes ONLINE/IP defilent",new_0_6_18_5:"Les workflows voix et messages ajoutent des endpoints HTTP TTS/STT personnalises, le transcodage audio, les actions fork message, les marqueurs fork persistants et des erreurs d upload plus claires",new_0_6_18_6:"La configuration desktop et runtime est plus sure avec un enregistrement PATH Windows compatible Unicode, le support de publication runtime Hermes Agent 0.17.0, les metadonnees PWA mobile et plusieurs corrections profile/auth",new_0_6_18_7:"Optimisations et ameliorations de details dans toute l application",new_0_6_17_1:"Correction des problemes de demarrage des conversations Codex et Claude Code",new_0_6_16_1:"Les reglages Provider conservent maintenant les API modes personnalises, couvrent LongCat correctement, permettent de supprimer les Providers v12 et synchronisent les catalogues de modeles avec les Providers auth et image a API key",new_0_6_16_2:"Les commandes de chat ajoutent reload-skills, les mises a jour de titre web, le passthrough des commandes slash inconnues et une API de contexte de session propre sans tool calls ni tool results",new_0_6_16_3:"La navigation des sessions est plus stable avec les resultats Global Agent dans la recherche, le tri des nouvelles sessions par activite recente, les controles mobiles de barre laterale restaures et un footer de reglages stable",new_0_6_16_4:"Les fichiers sont plus simples a utiliser: nom complet du workspace au survol et upload par drag-and-drop dans les chats individuels et de groupe",new_0_6_16_5:"Les reglages de plateforme incluent des champs de validation Feishu Webhook localises et une meilleure couverture de localisation",new_0_6_16_6:"La decouverte des skills suit maintenant les repertoires symlink, afin que les skills locaux partages apparaissent de facon coherente",new_0_6_16_7:"Les grands assets statiques evitent la compression Brotli dynamique, ameliorant la livraison du Web UI package sous charge",new_0_6_16_8:"Les flux outbound relay et login MCU sont disponibles pour les integrations de type connector",new_0_6_16_9:"La CLI Web UI ajoute --no-open pour les scripts et les lancements headless",new_0_6_16_10:"La taille du viewport Linux desktop et les lignes de statut de compression en direct ont ete ajustees pour un layout plus stable",new_0_6_15_1:"Les barres laterales du chat ont ete repensees, et les controles de chargement de l historique rendent les longues conversations plus faciles a parcourir",new_0_6_15_2:"Le selecteur de commandes skill permet de trouver et inserer plus vite les commandes disponibles depuis la saisie du chat",new_0_6_15_3:"Les fournisseurs OAuth Claude et Gemini sont disponibles, les IDs de modele Gemini sont normalises correctement et les selecteurs de modele peuvent rafraichir config.yaml a la demande",new_0_6_15_4:"Les etats thinking ont un indicateur rafraichi et une barre d outils plus lisible pour suivre le reasoning sans perturber le fil des messages",new_0_6_15_5:"Les bordures des inputs et selects sont de nouveau visibles en theme sombre",new_0_6_15_6:"La configuration runtime verifie maintenant le runtime local avant d afficher les sources de telechargement et garde l etat de verification visible pendant le demarrage",new_0_6_15_7:"Les auto-mises a jour desktop ne sont plus bloquees par d anciens processus, et le nettoyage des gateways Windows a la fermeture est plus complet",new_0_6_15_8:"Les gateways geres sont arretes a la fermeture de l app, tandis que les gateways termines de facon inattendue peuvent toujours redemarrer dans les sessions gerees",new_0_6_15_9:"Le serveur desktop se ferme plus proprement au quit afin de reduire les processus orphelins backend, bridge et gateway",new_0_6_15_10:"Le README et le showcase du site utilisent maintenant un GIF anime unique, avec une image statique dediee pour le hero du site",new_0_6_13_1:"Alibaba Coding Plan inclut maintenant le preset de modele qwen3.7-plus",new_0_6_13_2:"La gestion des fichiers est plus sure, avec validation des points litteraux dans les chemins et rejet des noms de fichiers d import de skill mal encodes",new_0_6_13_3:"Le chat est plus stable sur mobile et dans les navigateurs sans prise en charge de speech synthesis",new_0_6_13_4:"Les echecs d Agent conservent maintenant la fin d erreur du bridge, et les lancements Claude Code avec permission root sont plus fiables",new_0_6_13_5:"Les mises a jour desktop sont plus fiables : les mises a niveau Windows ferment les anciens processus Hermes Studio, Cloudflare est verifie en premier et GitHub reste le flux de secours",new_0_6_13_6:"L automatisation des releases garde les releases Web UI et Docker hors de GitHub Latest, tandis que les releases desktop completes sont promues manuellement en Latest apres build reussi"},files:{title:"Fichiers",tree:"Arborescence",list:"Liste des fichiers",breadcrumbRoot:"Accueil",newFile:"Nouveau fichier",newFolder:"Nouveau dossier",upload:"Telecharger",refresh:"Actualiser",open:"Ouvrir",edit:"Modifier",preview:"Apercu",download:"Telecharger",copyPath:"Copier le chemin",rename:"Renommer",delete:"Supprimer",name:"Nom",size:"Taille",modified:"Modifie",actions:"Actions",emptyDir:"Dossier vide",loading:"Chargement...",confirmDelete:'Voulez-vous vraiment supprimer "{name}" ?',confirmDeleteDir:'Voulez-vous vraiment supprimer le dossier "{name}" et tout son contenu ?',deleteFailed:"Echec de la suppression",deleted:"Supprime",renameTo:"Renommer en",newFileName:"Nom du fichier",newFolderName:"Nom du dossier",created:"Cree",createFailed:"Echec de la creation",renamed:"Renomme",renameFailed:"Echec du renommage",uploadSuccess:"{count} fichier(s) televerse(s)",uploadFailed:"Echec du televersement",saveFailed:"Echec de l'enregistrement",saved:"Enregistre",unsavedChanges:"Vous avez des modifications non enregistrees. Annuler ?",pathCopied:"Chemin copie",fileTooLarge:"Fichier trop volumineux (max 10 Mo)",permissionDenied:"Impossible de modifier un fichier protege",notFound:"Fichier ou dossier introuvable",backendError:"Echec de l'operation sur le fichier",dragDropHint:"Glissez des fichiers ici pour les televerser",closeEditor:"Fermer l'editeur",closePreview:"Fermer",saveFile:"Enregistrer",fileTree:"Arborescence des fichiers"},groupChat:{title:"Chat de groupe",createRoom:"Creer un salon",joinByCode:"Rejoindre avec un code",roomName:"Nom du salon",roomNamePlaceholder:"Entrez le nom du salon",inviteCode:"Code d'invitation",autoGenerate:"Generer automatiquement",noRooms:"Aucun salon pour le moment",selectOrCreate:"Selectionnez ou creez un salon pour commencer a discuter",agents:"Agents",addAgent:"Ajouter un agent",selectProfile:"Selectionnez un profil",agentAdded:"Agent ajoute",selectRoomFirst:"Veuillez d'abord sélectionner une salle",agentAlreadyInRoom:"L'agent est deja dans ce salon",agentAddFailedCount:"{count} agent(s) n'ont pas ete ajoutes : {details}",noAgents:"Aucun agent dans ce salon",members:"Membres",roomCreated:"Salon cree",roomDeleted:"Salon supprime",roomCloned:"Salon clone",cloneRoom:"Cloner le salon",copyRoomLink:"Copier le lien du salon",deleteRoomConfirm:"Supprimer ce salon ?",clearContext:"Effacer le contexte",clearContextConfirm:"Effacer le contexte de ce salon ? Les messages et instantanés de compression seront supprimés, les agents et membres restent.",contextCleared:"Contexte effacé",you:"Vous",joined:"Vous avez rejoint le salon",joinFailed:"Echec de la connexion au salon",inputPlaceholder:"Tapez un message... (Entree pour envoyer)",messageDisplayLimit:"Le chat de groupe affiche jusqu’a 600 messages",enterCode:"Entrez le code d'invitation",yourName:"Votre nom",yourNamePlaceholder:"Entrez votre nom d'affichage",yourDescription:"Description (facultatif)",yourDescriptionPlaceholder:"Decrivez-vous aux autres...",agentName:"Nom de l'agent",agentNamePlaceholder:"Nom personnalise (vide = nom du profil)",agentDesc:"Description de l'agent",agentDescPlaceholder:"Decrivez le role de cet agent...",agentReplying:"est en train de répondre...",agentCompressing:"compresse le contexte...",compressionSettings:"Paramètres de compression",triggerTokens:"Seuil de tokens",triggerTokensDesc:"Seuil de tokens pour déclencher la compression",maxHistoryTokens:"Max tokens historique",maxHistoryTokensDesc:"Maximum de tokens pour le contexte compressé",tailMessageCount:"Messages récents",tailMessageCountDesc:"Nombre de messages récents à conserver",compressionConfig:"Config. compression",compressNow:"Comprimer maintenant",compressingInProgress:"Compression en cours",compressionSaved:"Configuration enregistrée"},download:{downloading:"Telechargement...",downloadFailed:"Echec du telechargement",fileNotFound:"Fichier introuvable ou supprime",fileTooLarge:"Fichier trop volumineux (limite depassee)",backendError:"Echec de la lecture du fichier, l'environnement distant est peut-etre indisponible",backendTimeout:"Delai de lecture du fichier depasse",unsupportedBackend:"Le backend de terminal actuel ne prend pas en charge le telechargement de fichiers",invalidPath:"Chemin de fichier invalide",contentDisplay:"Affichage du contenu",download:"Telecharger",downloadFile:"Telecharger le fichier"},gateways:{title:"Passerelles",running:"En cours",stopped:"Arrêté",started:"Démarré",startFailed:"Échec du démarrage du gateway",stopFailed:"Échec de l’arrêt du gateway"},workflow:{title:"Workflow",profile:"Profil",namePlaceholder:"Nom du workflow",workspace:{title:"Sélectionner le workspace",select:"Sélectionner le workspace",clear:"Effacer le workspace"},actions:{newWorkflow:"New Workflow",addNode:"Add Node",createWorkflowFirst:"Please create a workflow first",reset:"Reset",startExecution:"Start Execution",executionPending:"Workflow execution is not connected yet",executionStarted:"Workflow execution started",executionCompleted:"Workflow execution completed",executionFailed:"Workflow execution failed",rerunDownstreamKeepNode:"Conserver ce noeud et exécuter la suite",rerunDownstreamClearNode:"Effacer ce noeud et exécuter la suite",rerunDownstreamStarted:"Réexécution aval lancée",rerunFromNodeStarted:"Réexécution lancée depuis ce noeud",rerunFailed:"Échec de la réexécution du workflow",deleteNode:"Delete Node",deleteEdge:"Delete Connection"},batch:{toggle:"Batch selection",selectAll:"Select all",confirmDelete:"Delete {count} selected workflows?",deleteSuccess:"Deleted {count} workflows",deletePartial:"{failed} workflows failed to delete",deleteFailed:"Batch delete failed"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Node name",agent:"Agent",model:"Model",apiMode:"Mode API",input:"Input",promptPlaceholder:"Describe what this agent should do...",skillsPlaceholder:"Skills, Entrée pour ajouter",uploadImages:"Importer des images"},status:{idle:"Inactif",queued:"En file",running:"En cours",completed:"Terminé",failed:"Échec",canceled:"Annulé"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Selected Node",none:"No node selected"},stats:{nodes:"Nodes",edges:"Links"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Default Model",fast:"Fast Model",reasoning:"Reasoning Model"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Enter this node input.",node2:"Enter this node input.",node3:"Enter this node input.",plan:"Break the request into actionable steps.",execute:"Run the implementation steps and produce artifacts.",review:"Review output quality and identify follow-up work."},newNodeTitle:"Node {count}"},kanban:{title:"Tableau Kanban",createTask:"Nouvelle tâche",noTasks:"Aucune tâche",allStatuses:"Tous les statuts",allAssignees:"Tous les responsables",columns:{triage:"Triage",todo:"À faire",scheduled:"Planifié",ready:"Prêt",running:"En cours",blocked:"Bloqué",review:"Revue",done:"Terminé",archived:"Archivé"},card:{assigneeTooltip:"Responsable",priority:{low:"Basse",medium:"Moyenne",high:"Haute"},timeAgo:{justNow:"à l’instant",minutes:"il y a {count} min",hours:"il y a {count} h",days:"il y a {count} j"}},board:{create:"Nouveau tableau",archive:"Archiver le tableau",archiveConfirm:"Archiver le tableau actuel ?",archived:"Tableau archivé",created:"Tableau créé",slugPlaceholder:"Identifiant du tableau, ex. project-a",namePlaceholder:"Nom affiché (facultatif)",slugRequired:"L’identifiant du tableau est requis"},form:{title:"Titre",titlePlaceholder:"Titre de la tâche",titleRequired:"Le titre est requis",body:"Description",bodyPlaceholder:"Description de la tâche (facultatif)",assignee:"Responsable",selectAssignee:"Choisir un responsable...",priority:"Priorité",selectPriority:"Choisir une priorité...",tenant:"Locataire",tenantPlaceholder:"Locataire (facultatif)",workspace:"Workspace",workspaceScratch:"Workspace temporaire",workspaceDir:"Utiliser un dossier",workspaceWorktree:"Utiliser un worktree",workspacePath:"Chemin du workspace",workspacePathPlaceholder:"Chemin absolu (facultatif)",branch:"Branche",branchPlaceholder:"Branche du worktree",skills:"Skills",skillsPlaceholder:"Selectionner les skills...",triage:"Créer en triage",goalMode:"Mode objectif",maxRuntime:"Durée max",maxRuntimePlaceholder:"ex. 30m, 2h",maxRetries:"Tentatives max",maxRetriesPlaceholder:"Nombre de tentatives",goalMaxTurns:"Tours max de l’objectif",goalMaxTurnsPlaceholder:"Nombre maximal de tours"},detail:{status:"Statut",priority:"Priorité",assignee:"Responsable",tenant:"Locataire",createdAt:"Créé",startedAt:"Démarré",completedAt:"Terminé",comments:"Commentaires",events:"Événements",runs:"Exécutions",artifacts:"Fichiers produits",result:"Résultat",highlights:"Informations clés",sources:"Sources de données",sessions:"Sessions liées",sessionMessages:"Messages de session",noSessions:"Aucune session liée trouvée.",noLog:"Aucun log trouvé pour cette tâche.",addComment:"Ajouter un commentaire",commentPlaceholder:"Écrire un commentaire...",operations:"Opérations"},action:{title:"Actions",assign:"Assigner",assignTo:"Assigner à...",block:"Bloquer",blockReason:"Raison du blocage",unblock:"Débloquer",complete:"Terminer",completeSummary:"Résumé de fin (facultatif)",dispatch:"Dispatcher",recoveryReason:"Raison de récupération (facultatif)",reclaim:"Récupérer",reassign:"Réassigner",specify:"Spécifier",loadLog:"Charger le log",loadDiagnostics:"Charger les diagnostics"},message:{loadFailed:"Échec du chargement de la tâche",taskCreated:"Tâche créée",taskAssigned:"Tâche assignée",taskBlocked:"Tâche bloquée",taskUnblocked:"Tâche débloquée",taskCompleted:"Tâche terminée",dispatchNudged:"Dispatcher déclenché",commentAdded:"Commentaire ajouté",taskReclaimed:"Tâche récupérée",taskReassigned:"Tâche réassignée",taskSpecified:"Tâche spécifiée"},stats:{total:"Total",tasks:"Tâches"}}},_r={login:{title:"Hermes Web UI",description:"Introduce tu nombre de usuario y contrasena para continuar.",placeholder:"Token de acceso",submit:"Iniciar sesion",tokenRequired:"Por favor, introduce tu token de acceso",invalidToken:"Token invalido",connectionFailed:"No se puede conectar al servidor",passwordLogin:"Contrasena",tokenLogin:"Token",usernamePlaceholder:"Nombre de usuario",passwordPlaceholder:"Contrasena",defaultCredentialsHint:"Nombre de usuario predeterminado: admin. Contrasena predeterminada: 123456.",credentialsRequired:"Por favor, introduzca nombre de usuario y contrasena",invalidCredentials:"Nombre de usuario o contrasena incorrectos",tooManyAttempts:"Demasiados intentos fallidos, por favor intente mas tarde",lockResetHint:"Si este es su servidor, borre el bloqueo de inicio de sesion con:",defaultLoginResetHint:"Para restablecer la contrasena admin predeterminada, ejecute:",sessionExpired:"La sesion expiro. Inicia sesion de nuevo.",accessDenied:"No tienes permiso para acceder a este recurso.",passwordMismatch:"Las contrasenas no coinciden",passwordTooShort:"La contrasena debe tener al menos 6 caracteres",setupSuccess:"Login con contrasena configurado correctamente",passwordChanged:"Contrasena cambiada correctamente",passwordRemoved:"Login con contrasena eliminado",setupPassword:"Configurar login con contrasena",changePassword:"Cambiar contrasena",changeUsername:"Cambiar nombre de usuario",removePasswordLogin:"Eliminar",username:"Nombre de usuario",currentPassword:"Contrasena actual",newPassword:"Nueva contrasena",confirmPassword:"Confirmar contrasena",newUsername:"Nuevo nombre de usuario",usernameChanged:"Nombre de usuario cambiado correctamente",usernameTooShort:"El nombre de usuario debe tener al menos 2 caracteres",setupDescription:"Administra el nombre de usuario y la contrasena usados para iniciar sesion.",removeConfirm:"El login con contrasena es obligatorio para las cuentas de usuario.",passwordLoginNotConfigured:"Login con contrasena no configurado",passwordLoginConfigured:"Cuenta actual: {username}",defaultCredentialTitle:"Cambia la cuenta y contrasena predeterminadas",defaultCredentialMessage:"La cuenta actual aun usa el nombre de usuario o la contrasena predeterminados. Para evitar accesos no autorizados, cambia cuanto antes el nombre de usuario y la contrasena de la cuenta actual.",defaultCredentialAction:"Cambiar ahora",defaultCredentialLater:"Recordar mas tarde"},users:{title:"Gestion de cuentas",description:"Crea usuarios, asigna roles y controla que perfiles pueden usar los administradores normales.",create:"Crear usuario",edit:"Editar usuario",username:"Nombre de usuario",role:"Rol",statusLabel:"Estado",profiles:"Perfiles accesibles",profilesPlaceholder:"Selecciona perfiles accesibles",allProfiles:"Todos los perfiles",noProfiles:"Sin perfiles asignados",lastLogin:"Ultimo inicio",newPasswordOptional:"Nueva contrasena (dejar vacio para conservar)",loadFailed:"No se pudieron cargar los usuarios",deleteConfirm:"Eliminar este usuario?",enable:"Activar",disable:"Desactivar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Activo",disabled:"Desactivado"}},common:{loading:"Cargando...",cancel:"Cancelar",retry:"Reintentar",reset:"Restablecer",delete:"Eliminar",edit:"Editar",save:"Guardar",saved:"Guardado",update:"Actualizar",create:"Crear",saveFailed:"Error al guardar",deleteFailed:"Error al eliminar",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sin datos",fetch:"Obtener",add:"Anadir",enable:"Activar",disable:"Desactivar",configured:"Configurado",notConfigured:"No configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Contraer",stop:"Detener",start:"Iniciar",expired:"Expirado"},mcp:{title:"Servidores MCP",loadFailed:"Error al cargar servidores MCP",reloadAll:"Recargar todos",refresh:"Actualizar",total:"Total",connected:"Conectado",disconnected:"Desconectado",tools:"herramientas",tool:"Herramientas",searchPlaceholder:"Buscar servidores...",addServer:"+ Agregar servidor",zeroTools:"0 herramientas",loading:"Cargando...",empty:"No hay servidores MCP configurados",reloaded:"{server} recargado",reloadedAll:"Todos los servidores MCP recargados",reloadFailed:"Error al recargar",serverAdded:'Servidor "{name}" agregado',addFailed:"Error al agregar servidor",serverUpdated:'Servidor "{name}" actualizado',updateFailed:"Error al actualizar servidor",saveFailed:"Error al guardar",serverRemoved:'"{name}" eliminado',enabled:"Habilitado: {name}",disabled:"Deshabilitado: {name}",connectedStatus:"Conectado",disconnectedStatus:"Desconectado",disabledStatus:"Deshabilitado",toolList:"Lista de herramientas",count:" ",more:"más",removeFailed:"Error al eliminar servidor",testOk:"Prueba OK — {count} herramientas disponibles",testEmpty:"La prueba no devolvio herramientas",testFailed:"Error en la prueba",edit:"Editar",test:"Probar",reload:"Recargar",remove:"Eliminar",confirmRemove:'¿Eliminar servidor "{name}"?',cancel:"Cancelar",add:"Agregar",save:"Guardar",addTitle:"Agregar servidor MCP",editTitle:"Editar servidor MCP",invalidJson:"JSON inválido",invalidYaml:"Formato YAML no válido",invalidConfig:"Configuración no válida",invalidServerConfig:"Configuración del servidor no válida",missingCommandOrUrl:"Debe incluir command o url",manageTools:"Gestionar herramientas",toolsVisibilityTitle:"Gestión de visibilidad de herramientas",fetchTools:"Obtener lista de herramientas",fetchToolsFailed:"Error al obtener la lista de herramientas",toolsMode:"Modo:",toolsModeAll:"Todas",toolsModeInclude:"Incluir",toolsModeExclude:"Excluir",toolsListHeader:"Nombre de herramienta",toolsEmpty:"No hay herramientas disponibles, primero obtenga la lista de herramientas",toolsSummaryAll:"{count} herramientas en total, todas habilitadas",toolsSummaryInclude:"{total} herramientas en total, {count} seleccionadas",toolsSummaryExclude:"{total} herramientas en total, {count} excluidas",toolsVisibilitySaved:"Visibilidad de herramientas guardada",toolsSelectAll:"Seleccionar todo",toolsClearSelection:"Borrar selección",toolsExcludeAll:"Excluir todo",toolsClearExcluded:"Borrar exclusiones"},sidebar:{chat:"Chat",backToChat:"Volver",search:"Buscar",apiRelay:"API Relay",history:"Historial",jobs:"Tareas programadas",models:"Modelos",profiles:"Perfiles",plugins:"Plugins",mcp:"MCP",petdex:"Pets",skills:"Habilidades",memory:"Memoria",logs:"Registros",usage:"Uso",performance:"Rendimiento",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",singleChat:"Chat",globalAgent:"Global Agent",files:"Archivos",devices:"Dispositivos",groupChat:"Chat grupal",groupConversation:"Conversación",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoreo",groupMonitoringShort:"Mon.",settings:"Configuracion",connected:"Conectado",disconnected:"Desconectado",updateTip:'Ejecuta "hermes-web-ui update" en la terminal para actualizar',updateVersion:"Actualizar a v{version}",reloadClientVersion:"Recargar para v{version}",updating:"Actualizando...",updateSuccess:"Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.",updateFailed:"Error al actualizar",logout:"Cerrar sesion",nodeVersionWarning:"Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.",changelog:"Registro de cambios",noChangelog:"No hay registro de cambios",versionManagement:"Gestión de versiones",kanban:"Kanban",workflow:"Workflow",groupTools:"Herramientas",groupToolsShort:"Herr.",codingAgents:"Agentes de código",versionPreview:"Vista previa de versión",groupPlatform:"Plataforma",gateways:"Puertas de enlace",expand:"Expandir menú",collapse:"Contraer menú"},runtimeVersions:{title:"Gestión de versiones",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Plataforma",currentWebUi:"Web UI actual",activeVersion:"Versión activa",active:"Activa",installed:"Instalada",download:"Descargar",downloadGithub:"Descargar desde GitHub",downloadCf:"Descargar desde Cloudflare",github:"GitHub",cf:"Cloudflare",useVersion:"Usar en el próximo reinicio",deleteVersion:"Eliminar",deleteRuntimeConfirm:"¿Eliminar Hermes Runtime {version}?",deleteWebUiConfirm:"¿Eliminar Web UI {version}?",deleteRuntimeSuccess:"Runtime eliminado",deleteWebUiSuccess:"Web UI eliminado",refresh:"Actualizar",noVersions:"No hay versiones disponibles",remoteLoadFailed:"No se pudieron cargar las versiones remotas",downloadTasks:"Tareas de descarga",downloadStarted:"Descarga iniciada",activateSuccess:"Selección de versión guardada. Reinicia Hermes Studio para usarla.",jobStatus:{queued:"En cola",running:"En ejecución",completed:"Completada",failed:"Fallida"},jobStageStatus:{queued:"En cola",resolve:"Resolviendo",download:"Descargando",verify:"Verificando",extract:"Extrayendo",install:"Instalando",completed:"Completada",failed:"Fallida"},jobStage:{queued:"En cola",download:"Descargando",resolveRuntime:"Resolviendo paquete Runtime",verifyRuntime:"Verificando archivo Runtime",extractRuntime:"Extrayendo archivo Runtime",installRuntime:"Instalando Runtime",resolveWebUi:"Resolviendo paquete Web UI",verifyWebUi:"Verificando archivo Web UI",extractWebUi:"Extrayendo archivo Web UI",installWebUi:"Instalando Web UI",completed:"Completada",failed:"Fallida"}},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Último escaneo: {time}",refresh:"Actualizar",empty:"No se encontraron dispositivos",computer:"Equipo",endpointLabel:"Extremo",statusLabel:"Estado",online:"Online",offline:"Offline",address:"Dirección",os:"Sistema operativo",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Latencia",lastSeen:"Visto por última vez",open:"Abrir",never:"Nunca",unknown:"Desconocido",loadFailed:"No se pudieron cargar los dispositivos",scanFailed:"No se pudieron escanear los dispositivos",updateFailed:"No se pudo actualizar el dispositivo",duplicateRequest:"Ya existe una solicitud de emparejamiento pendiente",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Procesada",unprocessed:"Sin procesar",deleteHistory:"Eliminar registro",deleteHistoryConfirm:"¿Eliminar este registro de solicitud y revocar el acceso de conexión de este dispositivo?",requests:"Solicitudes",requestsWithCount:"Solicitudes ({count})",noRequests:"No hay solicitudes",requestPairing:"Solicitar emparejamiento",paired:"Emparejado",approve:"Aprobar",reject:"Rechazar",block:"Bloquear",unblock:"Desbloquear",inboundStatus:{none:"Puede solicitar",pending:"Pendiente",approved:"Aprobado",rejected:"Rechazado",blocked:"Bloqueado"},outboundStatus:{none:"Sin emparejar",pending:"Solicitado",approved:"Emparejado",rejected:"Rechazado",blocked:"Bloqueado"},endpoint:{web:"Web",desktop:"Escritorio",custom:"Personalizado"}},performance:{title:"Rendimiento",subtitle:"Supervisa recursos del sistema, Bridge Broker, Workers y sesiones activas",refresh:"Actualizar",autoRefreshOn:"Actualización automática",autoRefreshOff:"Actualización manual",loadFailed:"No se pudieron cargar las métricas de rendimiento",systemCpu:"CPU del sistema",systemMemory:"Memoria del sistema",activeSessions:"Sesiones activas",runningSessions:"En ejecución {count}",workers:"Workers",totalWorkerMemory:"Memoria total de Worker",processes:"Procesos",uptime:"Tiempo activo",running:"En ejecución",stopped:"Detenido",workerMemory:"Memoria de Worker",lastUpdated:"Actualizado",profile:"Profile",memory:"Memoria",sessions:"Sesiones",runningActiveSessions:"En ejecución / Activas",lastUsed:"Último uso",status:"Estado",noWorkers:"Sin Workers",sessionsByProfile:"Sesiones por Profile",noActiveSessions:"No hay sesiones activas"},drawer:{terminal:"Terminal",files:"Espacio de trabajo"},chat:{contextRemaining:"restante",contextClickToEdit:"Haz clic para editar la longitud del contexto",contextEditTitle:"Editar longitud del contexto",contextEditDesc:"Establecer el límite de longitud del contexto para el modelo actual (en tokens)",contextEditPlaceholder:"Ingresa la longitud del contexto",contextEditHint:"Valores comunes: 256k (Hermes predeterminado), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Guardar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor ingresa una longitud de contexto válida",contextEditSuccess:"Longitud del contexto actualizada",contextEditFailed:"Error en la actualización",emptyState:"Inicia una conversacion con Hermes Agent",emptyStateAgent:"Inicia una conversacion con {agent}",viewOlderInHistory:"Ver mensajes anteriores en el historial",scrollToBottom:"Ir al final",outlineTitle:"Esquema de la conversación",outlineEmpty:"Sin contenido de conversación",outlineUserQuestion:"Pregunta del usuario",inputPlaceholder:"Escribe un mensaje... (Enter para enviar, Shift+Enter para nueva linea)",inputHeightResizeHint:"Arrastra para cambiar la altura del cuadro de chat y haz doble clic para restablecerla.",slashCommandArgs:{message:"<mensaje>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular el uso de la sesión actual",status:"Mostrar estado de sesión y cola",abort:"Detener la ejecución activa de Bridge",queue:"Poner un mensaje en cola tras la ejecución activa",learn:"Aprender un skill reutilizable desde fuentes descritas",plan:"Escribir un plan de implementación en Markdown",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"Limpiar la vista actual",clearHistory:"Eliminar el historial de mensajes guardado de esta sesión",title:"Renombrar esta sesión",compress:"Ejecutar compresión de contexto cuando esté inactiva",steer:"Enviar texto de guía a la ejecución activa de Bridge",destroy:"Liberar el agente Bridge de esta sesión",reloadMcp:"Recargar servidores MCP",reloadSkills:"Recargar comandos de skills"},attachFiles:"Adjuntar archivos",reasoningEffort:{tooltip:"Esfuerzo de razonamiento",defaultLabel:"Predeterminado",options:{default:"Predeterminado (config.yaml)",none:"Ninguno",minimal:"Mínimo",low:"Bajo",medium:"Medio",high:"Alto",xhigh:"Extra alto"}},showToolCalls:"Mostrar llamadas de herramientas",hideToolCalls:"Ocultar llamadas de herramientas",messageQueue:"Cola de mensajes",removeQueuedMessage:"Quitar mensaje de la cola",stop:"Detener",send:"Enviar",contextUsed:"Contexto utilizado:",sessions:"Sesiones",webUiSessions:"Sesiones",allProfiles:"Todos los perfiles",profileMissingModelsTip:'El perfil "{profile}" no tiene proveedor ni modelo disponible para esta sesión',sessionScopeHint:"Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.",openHistory:"Abrir historial",hermesHistory:"Historial de Hermes",historyScopeHint:"Sesiones del historial de Hermes del perfil actual, de solo lectura y agrupadas por origen.",noSessions:"Sin sesiones",newChat:"Nuevo chat",agent:"Agent",approvalKicker:"Permiso de terminal",approvalTitle:"Revisar comando antes de ejecutar",approvalAgree:"Aceptar",approvalAllowOnce:"Permitir una vez",approvalAllowSession:"Permitir sesión",approvalAlways:"Siempre",approvalDeny:"Denegar",clarifyKicker:"El agente necesita aclaración",clarifyTitle:"El agente tiene una pregunta para usted",clarifyPlaceholder:"Escriba su respuesta...",clarifySubmit:"Responder",clarifyDismiss:"Descartar",deleteSession:"Eliminar esta sesion?",toggleBatchMode:"Selección por lotes",selectAll:"Seleccionar todo",confirmBatchDelete:"¿Eliminar {count} sesiones seleccionadas?",batchDeleteSuccess:"{count} sesiones eliminadas",batchDeletePartial:"{failed} sesiones fallaron al eliminar",batchDeleteFailed:"Error al eliminar por lotes",importToWebUi:"Importar a Web UI",importSessionSuccess:"Sesion importada a Web UI",importSessionAlreadyExists:"La sesion ya existe en Web UI",importSessionFailed:"Error al importar la sesion",sessionDeleted:"Sesion eliminada",rename:"Renombrar",archiveSession:"Archivar",unarchiveSession:"Desarchivar",pin:"Fijar",unpin:"Desfijar",pinned:"Fijados",chatMode:"Modo de chat",liveMode:"En vivo",liveSessions:"Sesiones en vivo",recentBadge:"Reciente",linkedSessions:"{count} vinculadas",noVisibleMessages:"No hay mensajes visibles para humanos.",monitorRoleUser:"Usuario",monitorRoleAssistant:"Asistente",copySessionLink:"Copiar enlace de sesión",openSessionInNewTab:"Abrir en una nueva pestaña",sessionLinkCopied:"Session link copied",copySessionId:"Copiar ID de sesión",export:"Exportar",editConfig:"Editar configuración",exportFull:"Exportación completa (JSON)",exportCompressed:"Exportación comprimida (TXT)",exportCompressing:"Comprimiendo contexto, espere...",exportSuccess:"Sesión exportada",exportFailed:"Error al exportar",renamed:"Renombrada",renameFailed:"Error al renombrar",sessionArchived:"Sesión archivada",archiveSessionFailed:"No se pudo archivar la sesión",sessionUnarchived:"Sesión desarchivada",unarchiveSessionFailed:"No se pudo desarchivar la sesión",renameSession:"Renombrar sesion",sessionNotFound:"Sesion no encontrada",enterNewTitle:"Introduce un nuevo titulo",other:"Otro",runFailed:"Error en la ejecucion",error:"Error",tool:"Herramienta",arguments:"Argumentos",result:"Resultado",workspaceChanges:"Cambios del workspace",changedFiles:"{files} archivos modificados",diffUnavailable:"Diff no disponible",binaryFileDiffUnavailable:"Diff no disponible para archivos binarios",truncated:"... (truncado)",unchangedLines:"{count} líneas sin cambios",executionDuration:"Tiempo de ejecución",thinkingLabel:"Pensamiento",thinkingInProgress:"Pensando",thinkingShow:"Mostrar pensamiento",thinkingHide:"Ocultar pensamiento",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensaje",copiedBubble:"Mensaje copiado",copyFailed:"Error al copiar",playSpeech:"Reproducir voz",pauseSpeech:"Pausa",resumeSpeech:"Reanudar",stopSpeech:"Detener",speechNotSupported:"Reproducción de voz no soportada en este navegador",searchEnterHint:"Enter para abrir · Esc para cerrar",searchHint:"Cmd/Ctrl+K",searchScope:"Alcance de búsqueda: solo base de datos local de sesiones de Web UI; no incluye sesiones históricas Hermes de solo lectura.",searchFailed:"No se pudieron buscar sesiones",searchNoSnippet:"No hay resumen disponible",searchNoResults:"No hay sesiones que coincidan",searchRecent:"Sesión reciente",searchEmpty:"Sesiones recientes",searchPlaceholder:"Buscar sesiones...",searchSubtitle:"Buscar por título o contenido de mensajes",searchTitle:"Buscar sesiones",stopGateway:"Detener gateway",start:"Iniciar",workspaceSetFailed:"No se pudo definir el workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Introduce la ruta del proyecto, p. ej. /home/user/project",folderPickerEmpty:"(Vacío)",folderPickerNoFolders:"No hay carpetas de workspace",folderPickerSelected:"Seleccionado:",workspace:"Espacio de trabajo",setWorkspaceTitle:"Definir workspace de sesión",setWorkspace:"Definir workspace",modelSetFailed:"No se pudo definir el modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo de sesión",setModel:"Definir modelo",newCliChat:"Nuevo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproducir voz automáticamente",voiceInput:{startCapture:"Iniciar entrada de voz",stopCaptureAndInsert:"Detener entrada de voz e insertar la transcripcion",cancelCapture:"Cancelar entrada de voz",statusLabel:"Estado: {status}",transcriptLabel:"Transcripcion: {text}",errorLabel:"Error: {error}",recentEvents:"Eventos recientes",status:{idle:"Inactivo",capturing:"Escuchando",transcribing:"Transcribiendo",sending:"Insertando en la entrada",error:"Error"},browserSpeechUnsupported:"El reconocimiento de voz del navegador no es compatible con este navegador.",browserSpeechFailed:"Fallo el reconocimiento de voz del navegador.",browserSpeechFailedWithReason:"Fallo el reconocimiento de voz del navegador: {error}.",microphoneUnsupported:"La captura de microfono no es compatible con este navegador.",microphoneRecordingFailed:"Fallo la grabacion del microfono."}},jobs:{title:"Tareas programadas",createJob:"Crear tarea",editJob:"Editar tarea",noJobs:"No hay tareas programadas aun. Crea una para comenzar.",sortBy:"Ordenar",sortByName:"Por nombre",sortByTime:"Por fecha",sortByNameHint:"Ordenar por nombre",sortByTimeHint:"Ordenar por fecha",sortAsc:"Ascendente",sortDesc:"Descendente",name:"Nombre",namePlaceholder:"Nombre de la tarea",schedule:"Programacion (expresion Cron)",schedulePlaceholder:"ej. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Seleccionar un preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"Cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos los dias a las 00:00",presetEveryDay9:"Todos los dias a las 09:00",presetEveryMonday:"Cada lunes a las 09:00",presetEveryMonth:"El dia 1 de cada mes a las 09:00",prompt:"Prompt",promptPlaceholder:"El prompt a ejecutar",skills:"Skills",skillsPlaceholder:"Seleccionar skills...",deliverTarget:"Destino de entrega",origin:"Origen",local:"Local",repeatCount:"Repeticiones (opcional)",modelPlaceholder:"Modelo por defecto",repeatPlaceholder:"Dejar vacio para infinito",jobCreated:"Tarea creada",jobUpdated:"Tarea actualizada",nameRequired:"El nombre es obligatorio",scheduleRequired:"La programacion es obligatoria",loadFailed:"Error al cargar la tarea",jobPaused:"Tarea en pausa",jobResumed:"Tarea reanudada",jobTriggered:"Job ejecutado",modelUpdated:"Modelo actualizado",jobDeleted:"Tarea eliminada",status:{running:"En ejecucion",paused:"En pausa",disabled:"Desactivada",scheduled:"Programada"},info:{model:"Modelo",schedule:"Programacion",lastRun:"Ultima ejecucion",nextRun:"Proxima ejecucion",deliver:"Entrega",repeat:"Repeticion"},action:{pause:"Pausar",pauseJob:"Pausar tarea",resume:"Reanudar",resumeJob:"Reanudar tarea",runNow:"Ejecutar ahora",triggerImmediately:"Ejecutar inmediatamente"},runHistory:{title:"Historial",runs:"ejecuciones",noRuns:"No se encontró historial."}},skills:{title:"Habilidades",targetFilter:"Runtime",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Buscar habilidades...",noMatch:"Ninguna habilidad coincide con tu busqueda",noSkills:"No se encontraron habilidades",backTo:"Volver a",attachedFiles:"Archivos adjuntos",loadFailed:"Error al cargar la habilidad",fileLoadFailed:"Error al cargar el archivo",modified:"Modificado por el usuario",archived:"Archivado",pinned:"Fijado",pin:"Fijar habilidad",unpin:"Desfijar habilidad",pinFailed:"Error al cambiar estado de fijacion",edit:"Editar",saving:"Guardando...",editorLabel:"Editor de skill",saveSuccess:"Habilidad guardada",saveFailed:"Error al guardar la habilidad",toggleFailed:"Error al activar/desactivar la habilidad",source:{builtin:"Integrado",hub:"Hub",local:"Local",external:"Externo"},delete:"Eliminar",deleteConfirm:'¿Eliminar la habilidad "{name}"? Esta acción no se puede deshacer.',deleteSuccess:"Habilidad eliminada",deleteFailed:"No se pudo eliminar",import:"Importar",importTitle:"Importar habilidad",importModeZip:"Zip",importModeFolder:"Carpeta",importHintZip:"Sube un archivo .zip con un directorio que contenga SKILL.md",importHintFolder:"Selecciona una carpeta local (debe contener SKILL.md)",importTargetCategory:"Categoría destino (opcional)",importTargetCategoryPlaceholder:"Vacío para colocar bajo misc",importSelectFile:"Elegir archivo .zip",importSelectFolder:"Elegir carpeta",importInvalidFile:"Solo se admiten archivos .zip",importFileCount:"archivos",importNoSelection:"Selecciona un archivo o carpeta primero",importSuccess:"Habilidad importada",importFailed:"Error al importar",path:{local:"Local",external:"Externo"},externalDirs:{manage:"Directorios externos",title:"Gestionar directorios externos",hint:"Gestiona config.skills.external_dirs. Admite ~ y $VAR; las rutas inexistentes se atenúan.",add:"Añadir directorio",placeholder:"/path/to/skills o ~/my-skills",empty:"Sin directorios externos",missing:"Ruta no encontrada",notDir:"No es un directorio",saveSuccess:"Directorios externos guardados",saveFailed:"Error al guardar",loadFailed:"Error al cargar directorios externos",removeRow:"Quitar"},pathCopied:"Ruta copiada",pathCopyFailed:"Error al copiar la ruta",reloadHint:"Sesiones activas: ejecuta /reload-skills; las nuevas la cargan automáticamente.",writeApprovalButton:"Pendientes {count}",writeApprovalTitle:"Escrituras pendientes de revision",writeApprovalDescription:"Aprueba o rechaza escrituras de memoria y skills preparadas por Hermes Agent.",writeApprovalRefresh:"Actualizar",writeApprovalEmpty:"No hay escrituras pendientes.",writeApprovalUnsupported:"Esta version de Hermes Agent no admite revision de escrituras. Actualiza Hermes Agent para usar esta funcion.",writeApprovalMemory:"Memoria",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Revisar",writeApprovalHideDiff:"Ocultar",writeApprovalNoDiff:"No hay diferencias disponibles.",writeApprovalLoadFailed:"No se pudieron cargar las escrituras pendientes",writeApprovalDiffFailed:"No se pudieron cargar los detalles de escritura",writeApprovalActionFailed:"No se pudo resolver la escritura pendiente",writeApprovalApproved:"Escritura aprobada",writeApprovalRejected:"Escritura rechazada",writeApprovalApprove:"Aprobar",writeApprovalReject:"Rechazar",writeApprovalPendingMemoryWrite:"Escritura de memoria pendiente",writeApprovalCurrentFile:"Archivo actual {file}",writeApprovalProposedFile:"Archivo propuesto {file}",writeApprovalDiffSection:"Diferencias",writeApprovalPatchOldStringMissing:"No se encontro el old_string del parche en el archivo actual {file}; aprobarlo no cambiara el archivo.",writeApprovalRequestedOldString:"old_string solicitado",writeApprovalCurrentReadFailed:"El archivo actual {file} no se pudo leer como texto UTF-8.",writeApprovalDeleteSkill:"Esta aprobacion elimina el skill {skill}.",writeApprovalRemoveFile:"Esta aprobacion elimina {file} del skill {skill}."},plugins:{title:"Plugins",refresh:"Actualizar",notice:"Inventario de manifests de plugins Hermes detectables. Los metadatos de descubrimiento se leen sin cargar código de plugins. Los plugins de usuario standalone se pueden activar o desactivar aquí; los cambios se aplican en nuevas sesiones Hermes.",loadFailed:"No se pudieron cargar los plugins",updateFailed:"No se pudo actualizar el plugin",enableSuccess:"{name} activado",disableSuccess:"{name} desactivado",commandCopied:"Comando copiado",searchPlaceholder:"Buscar key, nombre, descripción, ruta...",source:"Origen",kind:"Tipo",statusTitle:"Estado",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"Copiar comando",managedElsewhere:"gestionado en otro lugar",noMatch:"Ningún plugin coincide con los filtros actuales",enabled:"activado",disabled:"desactivado",summary:{total:"Total",active:"Activado / auto",inactive:"Inactivo",disabled:"Desactivado",providerManaged:"Gestionado por provider"},status:{enabled:"Activado","auto-active":"Autoactivo",inactive:"Inactivo",disabled:"Desactivado","provider-managed":"Gestionado por provider"},statusLabel:{enabled:"Activado por configuración","auto-active":"Autoactivo",inactive:"Inactivo",disabled:"Desactivado","provider-managed":"Gestionado por provider"},configStatuses:{enabled:"activado",disabled:"desactivado","not-enabled":"no activado",auto:"auto","provider-managed":"gestionado por provider"},table:{plugin:"Plugin",status:"Estado",source:"Origen",kind:"Tipo",capabilities:"Capacidades",path:"Ruta / entrypoint",manage:"Gestionar"},capabilities:{tools:"{count} herramientas",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Raíz del agente",python:"Python",scanCwd:"Escanear cwd",projectPlugins:"Plugins del proyecto"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Memoria",refresh:"Actualizar",loadFailed:"Error al cargar la memoria",myNotes:"Mis notas",noNotes:"Sin notas aun.",notesPlaceholder:"Escribe tus notas...",userProfile:"Perfil de usuario",noProfile:"Sin perfil aun.",profilePlaceholder:"Escribe tu perfil...",soul:"Alma",noSoul:"Sin configuracion de alma aun.",soulPlaceholder:"Escribe la configuracion del alma..."},models:{title:"Modelos",addProvider:"Anadir proveedor",refreshModelCache:"Actualizar cache de modelos",refreshModelCacheLoading:"Actualizando cache de modelos...",refreshModelCacheSuccess:"Cache de modelos actualizado",refreshModelCacheFailed:"No se pudo actualizar el cache de modelos",providerType:"Tipo de proveedor",preset:"Preajuste",custom:"Personalizado",selectProvider:"Seleccionar proveedor",chooseProvider:"Elige un proveedor...",name:"Nombre",autoGeneratedName:"Generado automaticamente desde la URL base",baseUrl:"URL base",region:"Región",regionIntl:"Internacional",regionCn:"China continental",baseUrlPlaceholder:"ej. https://api.example.com/v1",apiKey:"Clave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo predeterminado",selectOrInput:"Seleccionar o ingresar un modelo...",selectModel:"Seleccionar un modelo...",providerAdded:"Proveedor anadido",providerDeleted:"Proveedor eliminado",providerCredentialsCleared:"Credenciales del proveedor borradas",clearProviderCredentials:"Borrar credenciales",clearCredentialsConfirm:'¿Borrar las credenciales guardadas de "{name}"? Este proveedor integrado seguira apareciendo y podra usarse de nuevo cuando se configuren credenciales.',disableProvider:"Desactivar proveedor",disableProviderConfirm:'¿Desactivar el proveedor integrado "{name}"? El proveedor seguira siendo integrado y podra reactivarse mas tarde.',providerDisabled:"Proveedor desactivado",defaultProviderUpdated:"Proveedor predeterminado actualizado",defaultProviderUpdateFailed:"No se pudo actualizar el proveedor predeterminado",defaultModelUpdated:"Modelo predeterminado actualizado",defaultModelUpdateFailed:"No se pudo actualizar el modelo predeterminado",deleteProvider:"Eliminar proveedor",deleteConfirm:'Estas seguro de que quieres eliminar "{name}"?',codexLoginTitle:"Inicio de sesión de OpenAI Codex",codexWaiting:"Ingrese este código en la página de autorización para iniciar sesión:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorización",codexApproved:"Inicio de sesión exitoso",codexExpired:"La autorización ha expirado. Por favor, inténtelo de nuevo.",nousLoginTitle:"Inicio de sesión de Nous Portal",nousWaiting:"Ingrese este código en la página de autorización:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorización",nousApproved:"Inicio de sesión exitoso",nousDenied:"Autorización denegada",nousExpired:"Autorización expirada",copilotLoginTitle:"Inicio de sesión de GitHub Copilot",copilotWaiting:"Abra GitHub e introduzca el código de dispositivo a continuación para autorizar. La ventana se cerrará automáticamente tras la aprobación.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir la página de autorización de GitHub",copilotApproved:"¡Inicio de sesión exitoso!",copilotDenied:"Autorización denegada.",copilotExpired:"El enlace de autorización ha caducado. Vuelva a intentarlo.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Se detectó un token OAuth de GitHub Copilot en este equipo. Haz clic en Agregar para habilitar Copilot en Hermes.",copilotAddSourceEnv:"Origen: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origen: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origen: extensión Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Esto borrará COPILOT_GITHUB_TOKEN en ~/.hermes/.env. Otras herramientas no se verán afectadas.",copilotDeleteHintGhCli:"Copilot se ocultará de Hermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.",copilotDeleteHintAppsJson:"Copilot se ocultará de Hermes. La extensión Copilot de VS Code seguirá conectada.",customBadge:"PERSONALIZADO",previewBadge:"VISTA PREVIA",disabledBadge:"NO DISPONIBLE",disabledTooltip:"Este modelo no está disponible para tu cuenta.",customModelPlaceholder:"ID de modelo no listado",customModelHint:"Para modelos compatibles con el proveedor que la API no devuelve; no es un cambio de nombre visible. Enter para cargar.",noProviders:"No se encontraron proveedores. Anade un proveedor personalizado para comenzar.",clearVisibleModels:"Borrar selección",generalTitle:"Modelos generales",combinationTitle:"Conjuntos de modelos",combinationSubtitle:"Configura presets de MoA: los modelos de referencia aportan perspectivas primero y luego un modelo agregador produce la respuesta final y las llamadas a herramientas.",combinationPreset:"Preset",combinationName:"Nombre",combinationAddModel:"Agregar conjunto de modelos",combinationEditModel:"Editar conjunto de modelos",combinationNewPreset:"Nuevo preset",combinationPresetPlaceholder:"p. ej. review",combinationAddPreset:"Agregar preset",combinationSetDefault:"Establecer como predeterminado",combinationEnabled:"Activar referencias",combinationReferenceModels:"Modelos de referencia",combinationReferenceModel:"Modelo de referencia",combinationAddReference:"Agregar modelo de referencia",combinationAggregator:"Modelo agregador",combinationReferenceTemperature:"Temperatura de referencia",combinationAggregatorTemperature:"Temperatura del agregador",combinationMaxTokens:"Tokens maximos",combinationNotSet:"Sin configurar",combinationSaved:"Conjunto de modelos guardado",combinationLoadFailed:"No se pudo cargar el conjunto de modelos",combinationSaveFailed:"No se pudo guardar el conjunto de modelos",combinationPresetExists:"El preset ya existe",combinationNameRequired:"Introduce un nombre para el conjunto de modelos",combinationNameInvalid:"El nombre solo puede contener letras, numeros, guiones bajos, guiones y puntos",combinationReferenceRequired:"Agrega al menos un modelo de referencia",combinationAggregatorRequired:"Selecciona un modelo agregador",auxiliaryTitle:"Modelos auxiliares",auxiliarySubtitle:"Sobrescrituras de modelo para tareas secundarias como compresión, visión, aprobaciones, MCP y mantenimiento en segundo plano.",auxiliaryRefresh:"Actualizar",auxiliaryTask:"Tarea",auxiliaryTimeout:"Tiempo de espera",auxiliaryDownloadTimeout:"Tiempo de espera de descarga",auxiliaryActions:"Acciones",auxiliaryDefault:"Predeterminado",auxiliaryCustomEndpoint:"Endpoint personalizado",auxiliaryProviderAuto:"Automático",auxiliaryProviderMain:"Modelo principal",auxiliaryProviderPlaceholder:"auto, main o clave del proveedor",auxiliaryDownloadShort:"descarga",auxiliaryExtraBody:"JSON de cuerpo extra",auxiliaryClear:"Restablecer",auxiliarySaved:"Modelos auxiliares guardados",auxiliaryLoadFailed:"No se pudieron cargar los modelos auxiliares",auxiliarySaveFailed:"No se pudieron guardar los modelos auxiliares",auxiliaryInvalidExtraBody:"El cuerpo extra debe ser un objeto JSON",auxiliaryTaskCompression:"Compresión",auxiliaryTaskVision:"Visión",auxiliaryTaskWebExtract:"Extracción web",auxiliaryTaskSkillsHub:"Centro de habilidades",auxiliaryTaskApproval:"Aprobación",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Generación de títulos",auxiliaryTaskTriageSpecifier:"Especificador de triage",auxiliaryTaskKanbanDecomposer:"Descomposición de Kanban",auxiliaryTaskProfileDescriber:"Descripción de perfil",auxiliaryTaskCurator:"Curador",auxiliaryTaskSessionSearch:"Búsqueda de sesiones",auxiliaryTaskFlushMemories:"Guardar memorias",currentDefault:"Predeterminado actual",defaultShort:"Predeterminado",setDefaultProvider:"Establecer como proveedor predeterminado",setDefault:"Establecer como predeterminado",builtIn:"Integrado",customType:"Personalizado",provider:"Proveedor",contextLength:"Longitud del contexto",contextLengthPlaceholder:"ej. 256000 (opcional)",apiMode:"Modo API",local:"Local ({host})",selectProviderRequired:"Por favor, selecciona un proveedor",baseUrlRequired:"La URL base es obligatoria",apiKeyRequired:"La clave API es obligatoria",modelRequired:"El modelo predeterminado es obligatorio",enterBaseUrl:"Por favor, introduce primero la URL base",unexpectedFormat:"Formato de respuesta inesperado",foundModels:"{count} modelos encontrados",fetchFailed:"Error al obtener los modelos",xaiWaiting:"Completa la autorización en la página de xAI abierta. La ventana se cerrará automáticamente al aprobarse.",xaiOpenLink:"Abrir página de autorización de xAI",xaiLoginTitle:"Inicio de sesión OAuth de xAI Grok",xaiExpired:"El enlace de autorización expiró. Inténtalo de nuevo.",xaiCopyLink:"Copiar enlace de autorización",xaiApproved:"¡Inicio de sesión correcto!",anthropicLoginTitle:"Inicio de sesión OAuth de Claude",anthropicWaiting:"Completa la autorización en Claude y pega aquí el código devuelto.",anthropicOpenLink:"Abrir página de autorización de Claude",anthropicCopyLink:"Copiar enlace de autorización",anthropicCodePlaceholder:"Pega el código de autorización...",anthropicSubmitCode:"Enviar código",anthropicApproved:"¡Inicio de sesión correcto!",anthropicExpired:"La autorización expiró. Inténtalo de nuevo.",geminiLoginTitle:"Inicio de sesión OAuth de Google Gemini",geminiWaiting:"Completa la autorización en la página de Google abierta. La ventana se cerrará automáticamente.",geminiOpenLink:"Abrir página de autorización de Google",geminiCopyLink:"Copiar enlace de autorización",geminiApproved:"¡Inicio de sesión correcto!",geminiExpired:"El enlace de autorización expiró. Inténtalo de nuevo.",visibilitySelectOne:"Mantén al menos un modelo visible",visibilitySaved:"Modelos visibles guardados",visibilitySaveFailed:"No se pudieron guardar los modelos visibles",visibilityHint:"Solo afecta al selector de modelos y a la página de modelos de Web UI. No modifica la configuración provider/model de Hermes CLI; las llamadas siguen usando el ID original del modelo.",showAllModels:"Mostrar todos los modelos",searchPlaceholder:"Buscar modelos...",noResults:"Sin resultados",noModels:"Sin modelos",removeCustomModel:"Eliminar este modelo no listado",refresh:"Actualizar lista de modelos (recargar config.yaml)",more:"más",models:"Lista de modelos",manageVisibleModelsFor:"Gestionar modelos visibles de {name}",manageVisibleModels:"Gestionar modelos visibles",getApiKey:"Obtener API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nombre visible de {model}",aliasTitle:"Nombre visible del modelo",aliasSaveFailed:"No se pudo guardar el nombre visible",aliasPlaceholder:"Dejar vacío para usar el ID original del modelo",aliasManageFor:"Nombres visibles de {provider}",aliasManage:"Nombres visibles",aliasHint:"Solo cambia el nombre visible en Web UI. Hermes sigue recibiendo el ID original del modelo.",aliasEdit:"Renombrar",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfiles",create:"Crear perfil",import:"Importar",export:"Exportar",rename:"Renombrar",delete:"Eliminar",switchTo:"Cambiar Hermes Profile",switchConfirm:"Esto ejecutara `hermes profile use {name}` y cambiara el active profile de Hermes CLI. Continuar?",switchSuccess:'Hermes active profile cambiado a "{name}"',switchFailed:"Error al cambiar Hermes Profile. Es posible que la pasarela necesite un reinicio manual.",createSuccess:'Perfil "{name}" creado',createFailed:"Error al crear el perfil",renameSuccess:"Perfil renombrado",renameFailed:"Error al renombrar el perfil",deleteConfirm:'Estas seguro de que quieres eliminar el perfil "{name}"?',deleteSuccess:"Perfil eliminado",deleteFailed:"Error al eliminar el perfil",exportSuccess:"Perfil exportado",exportFailed:"Error al exportar el perfil",importSuccess:"Perfil importado",importFailed:"Error al importar el perfil",importSelectFile:"Seleccionar archivo de archivo",importInvalidFile:"Por favor, selecciona un archivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nombre del perfil",namePlaceholder:"Solo letras, numeros y guiones",nameValidation:"El nombre del perfil solo puede contener letras minúsculas, números, guiones bajos y guiones",newName:"Nuevo nombre",newNamePlaceholder:"Introduce un nuevo nombre",cloneFromCurrent:"Clonar desde el perfil actual",cloneCleanupNotice:"Al clonar se omiten automáticamente las credenciales exclusivas de plataforma (Weixin / Telegram / Slack, etc.) para evitar conflictos con el perfil de origen",cloneStrippedCredentials:"Se eliminaron {count} credenciales exclusivas: {list}",cloneDisabledPlatforms:"Se deshabilitaron {count} plataforma(s): {list}",cloneStrippedConfigCredentials:"Se eliminaron {count} credencial(es) integradas de config.yaml: {list}",archivePath:"Ruta del archivo",archivePathPlaceholder:"Ruta del servidor al archivo de archivo",importName:"Nombre del perfil (opcional)",importNamePlaceholder:"Dejar vacio para usar el nombre del archivo",active:"Activo",model:"Modelo",gateway:"Pasarela",alias:"Alias",provider:"Proveedor",path:"Ruta",skills:"Habilidades",hasEnv:"Tiene .env",hasSoulMd:"Tiene soul.md",noProfiles:"No se encontraron perfiles. Crea uno para comenzar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Subir imagen",random:"Generar aleatorio",reset:"Restaurar predeterminado",hint:"PNG, JPEG o WebP, máximo 1 MB",invalidType:"Elige una imagen PNG, JPEG o WebP",tooLarge:"La imagen del avatar no puede superar 1 MB",saveSuccess:"Avatar guardado",saveFailed:"No se pudo guardar el avatar",resetSuccess:"Avatar predeterminado restaurado",resetFailed:"No se pudo restaurar el avatar predeterminado"},runtime:{activeProfile:"Actual: {name}",bridgeWorker:"Estado del Bridge",gateway:"Puerta de enlace",active:"Activo",activeTag:"Actual",idle:"Inactivo",checking:"Comprobando",running:"En ejecución",stopped:"Detenido",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Cambiar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"No se pudo reiniciar el gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"No se pudo reiniciar el perfil"}},logs:{title:"Registros",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Actualizar",noEntries:"Sin entradas de registro"},settings:{title:"Configuracion",saved:"Guardado",saveFailed:"Error al guardar",tabs:{display:"Pantalla",account:"Cuenta actual",users:"Gestion de cuentas",agent:"Agente",proxy:"Proxy",memory:"Memoria",compression:"Compresion",session:"Sesion",privacy:"Privacidad",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respuestas en streaming",streamingHint:"Mostrar respuestas de la IA en tiempo real",compact:"Modo compacto",compactHint:"Reducir el espaciado entre mensajes",showReasoning:"Mostrar razonamiento",showReasoningHint:"Mostrar el proceso de pensamiento del modelo",showCost:"Mostrar costo",showCostHint:"Mostrar uso de tokens en las respuestas",inlineDiffs:"Diffs en linea",inlineDiffsHint:"Mostrar cambios de codigo en linea",bellOnComplete:"Sonido de finalizacion",bellOnCompleteHint:"Reproducir un sonido cuando la IA termina",notifyOnComplete:"Notificacion de finalizacion",notifyOnCompleteHint:"Mostrar una notificacion del sistema cuando la IA termina",notifyOnCompleteMacHint:"En macOS, permite las notificaciones del navegador en Ajustes del Sistema.",notifyOnCompleteDenied:"Permiso de notificacion denegado",notifyOnCompleteInsecure:"Las notificaciones del navegador requieren HTTPS o localhost",notifyOnCompleteUnsupported:"Este navegador no admite notificaciones",notifyOnCompleteTest:"Notificaciones activadas.",notifyOnCompleteTestButton:"Probar",notifyOnCompleteTesting:"Enviando notificacion de prueba...",notifyOnCompleteTestSent:"Notificacion de prueba enviada",notifyOnCompleteTestFailed:"No se pudo enviar la notificacion de prueba",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada mientras la IA procesa",theme:"Tema",themeHint:"Elige claro, oscuro o seguir la preferencia del sistema",themeLight:"Claro",themeDark:"Oscuro",themeSystem:"Sistema",chatInputHeight:"Altura de entrada del chat",chatInputHeightHint:"Altura predeterminada de la entrada del chat en escritorio, en píxeles. En móvil se mantiene automática."},agent:{maxTurns:"Turnos maximos",maxTurnsHint:"Rondas maximas de interaccion por conversacion",gatewayTimeout:"Tiempo de espera de la pasarela",gatewayTimeoutHint:"Tiempo de espera de la peticion en segundos",restartDrainTimeout:"Tiempo de drenado al reiniciar",restartDrainTimeoutHint:"Tiempo de drenado antes de reiniciar en segundos",toolEnforcement:"Aplicacion de herramientas",toolEnforcementHint:"Controlar el modo de ejecucion de llamadas a herramientas",auto:"Automatico",always:"Siempre",never:"Nunca"},gatewayAutoStart:{title:"Inicio automático de gateway",description:"Controla qué gateways de perfiles Hermes locales inicia la Web UI al arrancar. Se guarda en la configuración de la Web UI, no en el config.yaml del perfil.",enabled:"Iniciar gateways automáticamente",enabledHint:"Si está desactivado, el arranque no iniciará automáticamente ningún gateway de perfil.",management:"Gateway unificado",managementHint:"Requiere Hermes Agent 0.17.0 o posterior. Al activarlo, Web UI escribe multiplex_profiles para que el gateway default sirva todos los perfiles; otros perfiles no pueden configurar entradas de mensajeria separadas como Feishu, Weixin o QQBot. Al desactivarlo elimina esa configuración.",managementAuto:"Automático",managementPerProfile:"Un gateway por perfil",managementUnified:"Gateway default unificado",mode:"Política de perfiles",modeHint:"Inicia todos los perfiles detectados o solo la lista incluida explícitamente.",modeAll:"Todos los perfiles detectados",modeInclude:"Solo perfiles incluidos",include:"Perfiles incluidos",includeHint:"Nombres de perfil separados por comas. En modo de inclusión, una lista vacía no inicia ninguno.",exclude:"Perfiles excluidos",excludeHint:"Nombres de perfil separados por comas que se omiten después de aplicar la política.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Proxy del gateway",description:"Configura variables de entorno de proxy para el gateway del perfil seleccionado. Los cambios reinician el gateway para que las plataformas de mensajeria usen la nueva red.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Proxy para solicitudes HTTPS. Normalmente es el valor principal.",httpProxy:"HTTP_PROXY",httpProxyHint:"Proxy para solicitudes HTTP simples.",allProxy:"ALL_PROXY",allProxyHint:"Proxy de respaldo cuando no hay un proxy especifico del protocolo.",noProxy:"NO_PROXY",noProxyHint:"Hosts o dominios separados por comas que no deben usar proxy.",save:"Guardar ajustes de proxy"},memory:{enabled:"Activar memoria",enabledHint:"Permitir que la IA recuerde el contexto de la conversacion",userProfile:"Perfil de usuario",userProfileHint:"Permitir que la IA recuerde las preferencias del usuario",charLimit:"Limite de caracteres de memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres del perfil de usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Activar compresion",enabledHint:"Comprimir automaticamente el historial largo antes de superar el contexto del modelo",threshold:"Umbral de compresion",thresholdHint:"Iniciar compresion cuando los tokens estimados superen esta proporcion del contexto",targetRatio:"Proporcion objetivo",targetRatioHint:"Tamano objetivo del historial tras comprimir como proporcion del contexto",protectLastN:"Proteger mensajes recientes",protectLastNHint:"Mantener sin comprimir esta cantidad de mensajes recientes",protectFirstN:"Proteger primeros mensajes",protectFirstNHint:"Mantener sin comprimir esta cantidad de mensajes iniciales"},session:{mode:"Modo de reinicio",modeHint:"Condicion de activacion del reinicio de sesion",modeBoth:"Inactividad + Programado",modeIdle:"Solo inactividad",modeDaily:"Solo programado",modeNone:"Nunca (solo manual)",idleMinutes:"Tiempo de inactividad",idleMinutesHint:"Tiempo de espera antes del reinicio automatico (minutos)",atHour:"Hora de reinicio programado",humanOnly:"Mostrar solo sesiones humanas",humanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones",liveMonitorHumanOnly:"Monitor en vivo: mostrar solo sesiones humanas",liveMonitorHumanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones en el monitor en vivo",atHourHint:"Reiniciar sesion a esta hora todos los dias",requireAuth:"Autorizacion de sesion",requireAuthHint:"Requerir autorizacion para operaciones de sesion",memoryWriteApproval:"Revisar escrituras de memoria",memoryWriteApprovalHint:"Preparar las escrituras de memoria de Hermes Agent para aprobacion antes de guardarlas.",skillsWriteApproval:"Revisar escrituras de skills",skillsWriteApprovalHint:"Preparar los cambios de skills de Hermes Agent para aprobacion antes de guardarlos.",writeApprovalTitle:"Escrituras pendientes de revision",writeApprovalDescription:"Aprueba o rechaza escrituras de memoria y skills preparadas por Hermes Agent.",writeApprovalRefresh:"Actualizar",writeApprovalEmpty:"No hay escrituras pendientes.",writeApprovalMemory:"Memoria",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Revisar",writeApprovalHideDiff:"Ocultar",writeApprovalNoDiff:"No hay diferencias disponibles.",writeApprovalLoadFailed:"No se pudieron cargar las escrituras pendientes",writeApprovalDiffFailed:"No se pudieron cargar los detalles de escritura",writeApprovalActionFailed:"No se pudo resolver la escritura pendiente",writeApprovalApproved:"Escritura aprobada",writeApprovalRejected:"Escritura rechazada",writeApprovalApprove:"Aprobar",writeApprovalReject:"Rechazar",writeApprovalPendingMemoryWrite:"Escritura de memoria pendiente",writeApprovalCurrentFile:"Archivo actual {file}",writeApprovalProposedFile:"Archivo propuesto {file}",writeApprovalDiffSection:"Diferencias",writeApprovalPatchOldStringMissing:"No se encontro el old_string del parche en el archivo actual {file}; aprobarlo no cambiara el archivo.",writeApprovalRequestedOldString:"old_string solicitado",writeApprovalCurrentReadFailed:"El archivo actual {file} no se pudo leer como texto UTF-8.",writeApprovalDeleteSkill:"Esta aprobacion elimina el skill {skill}.",writeApprovalRemoveFile:"Esta aprobacion elimina {file} del skill {skill}."},privacy:{redactPii:"Ocultar informacion personal",redactPiiHint:"Detectar y ocultar automaticamente informacion sensible (contrasenas, claves, etc.)"},apiServer:{enable:"Activar",enableHint:"Activar servidor API",host:"Host",hostHint:"Direccion de escucha",port:"Puerto",portHint:"Puerto de escucha",key:"Clave",keyHint:"Clave de acceso API",cors:"Origenes CORS",corsHint:"Fuentes cross-origin permitidas"},voice:{activeTtsApi:"API TTS activa",activeSttApi:"API STT activa",ttsProvidersTitle:"Proveedores TTS",ttsProvidersDescription:"Gestiona integraciones de texto a voz para reproducir respuestas del asistente y vistas previas de voz.",sttProvidersTitle:"Proveedores STT",sttProvidersDescription:"Gestiona integraciones de voz a texto usadas por el microfono y el flujo de entrada por voz.",noneSelected:"Ninguno seleccionado",keyStored:"Guardada",keyMissing:"Falta",customApi:"API",localBuiltin:"Local integrado",ttsCardHint:"Proveedor de sintesis de voz",sttCardHint:"Proveedor de transcripcion de voz",setActive:"Activar",testAction:"Probar",connect:"Conectar",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Voces en la nube gratuitas de alta calidad de Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"TTS personalizado",presetBrowserSttLabel:"STT del navegador",presetBrowserSttDescription:"API nativa de reconocimiento de voz del navegador.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"STT personalizado",apiCompatibility:"Compatibilidad de API",openaiCompatible:"Compatible con OpenAI",manualCustomEndpoint:"Endpoint personalizado manual",connectionStep:"Conexion",discoveryManualHint:"Endpoint personalizado manual seleccionado. El descubrimiento de modelos no esta disponible; introduce el nombre del modelo manualmente.",discoveryCredentialHint:"Introduce Base URL y API key, luego conecta para obtener los modelos disponibles.",discoveryNoAutoProbeHint:"No se envian solicitudes mientras escribes. Usa Connect cuando las credenciales esten listas.",apiKeyConnectPlaceholder:"Pega la API key para conectar; las claves guardadas nunca se muestran",connectFetchModels:"Conectar y obtener modelos",modelRecommendedSuffix:"recomendado",modelConnectManualHint:"Conecta para autocompletar o introduce manualmente.",modelRequiredConnectManual:"El modelo es obligatorio. Conecta para autocompletar o introduce manualmente.",apiKeyRequired:"La API key es obligatoria.",apiKeyRequiredForDiscovery:"La API key es obligatoria para obtener modelos.",baseUrlRequired:"Base URL es obligatoria.",baseUrlHttpsRequired:"Usa http:// o https://.",baseUrlInvalid:"Introduce una Base URL valida, incluyendo https://.",discoveryFailedManualFallback:"No se pudieron obtener modelos. Aun puedes introducir el nombre del modelo manualmente.",completeRequiredProviderFields:"Completa los campos obligatorios del provider antes de guardar.",fetchingModels:"Obteniendo modelos...",recommendedModel:"Recomendado: {model}.",useRecommendedModel:"Usar este.",modelsDiscovered:"{count} modelos descubiertos. Se selecciona el modelo recomendado cuando el campo esta vacio.",remove:"Eliminar",testSuccess:"Prueba completada",testTextRequired:"Introduce texto antes de probar.",keyMissingForTest:"Agrega una clave API antes de probar este proveedor.",testing:"Probando...",transcribing:"Transcribiendo...",browserSttTestHint:"El STT del navegador se prueba desde el microfono del chat.",sttEmptyAudio:"No se capturo audio. Intentalo de nuevo.",sttTestSuccess:"Transcripcion completada",sttRecordingHint:"Grabando... haz clic en Detener para transcribir.",keepStoredKeyPlaceholder:"Dejar en blanco para conservar la clave guardada",apiKeyPlaceholder:"Introduce la clave API",lastTest:"Ultima prueba",notTested:"—",recording:"Grabando",testFailedShort:"Fallo",testFailedSummary:"La prueba fallo. Revisa la configuracion del proveedor e intentalo de nuevo.",showDetails:"Mostrar detalles",hideDetails:"Ocultar detalles",moreActions:"Mas",moreActionsFor:"Mas acciones para {provider}",addTtsApi:"Agregar API TTS",addSttApi:"Agregar API STT",active:"Activo",builtin:"Integrado",connected:"Conectado",disconnected:"Desconectado",source:"Origen",model:"Modelo",voice:"Voz",doubaoVoiceHint:"Selecciona una voz de Seed TTS 2.0; el campo de recurso se actualiza automaticamente.",apiKey:"Clave API",confirmDeleteSecret:"Eliminar la clave API guardada para esta API de voz?",ttsTitle:"Texto a voz",ttsSaved:"Configuracion TTS guardada en el servidor",ttsSaveFailed:"No se pudo guardar la configuracion TTS",ttsTestSaved:"Audicion correcta; configuracion TTS guardada en el servidor",ttsTestSaving:"Guardando configuracion TTS antes de la audicion...",ttsMissingBaseUrl:"La Base URL es obligatoria antes de probar. Introduce un endpoint del proveedor y vuelve a probar.",ttsMissingApiKey:"La clave API es obligatoria antes de probar. Pega la clave o guarda primero una clave del servidor.",ttsCleared:"Clave TTS guardada eliminada",ttsClearFailed:"No se pudo eliminar la clave TTS guardada",storedBaseUrlsTitle:"Base URLs guardadas",storedBaseUrlsHint:"Endpoints de voz guardados. Los campos superiores solo limpian el valor actual; elimina endpoints guardados aquí.",storedBaseUrlsEmpty:"No hay Base URLs de voz personalizadas guardadas en el servidor.",storedBaseUrlDelete:"Eliminar URL",storedApiKeysTitle:"API keys guardadas",storedApiKeysHint:"Lista enmascarada de claves de voz guardadas en el servidor. Solo muestra uso y origen; nunca muestra la key completa.",storedApiKeysEmpty:"No hay API keys de voz guardadas en el servidor.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Eliminar key",baseUrlPresetClear:"Borrar URL",baseUrlPresetCleared:"Base URL borrada del campo.",baseUrlPresetDelete:"Eliminar URL",baseUrlPresetDeleted:"URL base eliminada de la lista guardada.",baseUrlPresetDeleteFailed:"No se pudo eliminar la URL base guardada.",ttsPendingSecret:"La nueva clave se guardara",ttsStoredSecret:"El servidor tiene una clave guardada: {value}",ttsClearKey:"Eliminar clave guardada",sttTitle:"Voz a texto",sttProvider:"Proveedor STT",sttProviderHint:"Elige como se transcribe la entrada de voz",sttProviderBrowser:"Navegador",sttProviderOpenai:"Compatible con OpenAI",sttProviderCustom:"Personalizado",sttBrowserHint:"Usa el reconocimiento de voz integrado del navegador cuando este disponible.",sttApiKey:"Clave API",sttApiKeyHint:"Guardada en el servidor para proveedores STT que requieren autenticacion.",sttStoredSecret:"Clave del servidor guardada: {value}",sttPendingSecret:"Clave del servidor guardada: se actualizara al guardar",sttClearKey:"Eliminar clave guardada",sttModel:"Modelo",sttModelHint:"Modelo de voz a texto que se usara.",sttLanguage:"Idioma",sttLanguageHint:"Pista de idioma opcional, como en o zh.",sttPrompt:"Prompt",sttPromptHint:"Prompt de transcripcion opcional.",sttAudioTranscode:"Transcodificación de audio",sttAudioTranscodeNone:"Enviar audio original",sttAudioTranscodeFfmpeg:"Convertir a WAV con ffmpeg",sttBaseUrl:"Base URL",sttBaseUrlHint:"Endpoint personalizado de voz a texto compatible con OpenAI.",sttSave:"Guardar configuracion STT",sttSaved:"Configuracion STT guardada en el servidor.",sttSaveFailed:"No se pudo guardar la configuracion STT.",sttCleared:"Se elimino el secreto STT guardado del servidor.",sttClearFailed:"No se pudo eliminar el secreto STT guardado.",sttActiveSaved:"Proveedor STT activo guardado en el servidor.",sttSaveActive:"Guardar proveedor STT activo",sttEndpointHint:"Endpoint final de transcripcion: {endpoint}",sttTestTitle:"Probar voz a texto",sttTestButton:"Probar API STT",sttTestStopButton:"Detener y transcribir",sttTestBackendOnly:"La prueba de API STT esta disponible para proveedores compatibles con OpenAI y personalizados.",sttTestRecording:"Grabando muestra de prueba... haz clic en Detener y transcribir al terminar.",sttTestTranscribing:"Transcribiendo muestra de prueba...",sttTestEmpty:"No se capturo audio para la prueba STT.",sttTestSucceeded:"Prueba STT correcta.",sttTestFailed:"La prueba STT fallo: {error} — {hint}",sttFailureHintMissingConfig:"Comprueba que el proveedor este guardado con Base URL/modelo y una clave API antes de probar.",sttFailureHintAuth:"Comprueba la clave API. Si ya habia una clave guardada, pega de nuevo la clave actual y guarda antes de probar.",sttFailureHintForbidden:"La clave llego al proveedor, pero no tiene permiso para este modelo STT o cuenta. Revisa el acceso o la facturacion del proveedor.",sttFailureHintEndpointModel:"Comprueba la Base URL y el modelo. Para Groq, usa {endpoint} con whisper-large-v3-turbo u otro modelo STT de Groq.",sttFailureHintModel:"Comprueba que el modelo STT seleccionado exista y este habilitado para esta cuenta.",sttFailureHintQuota:"El proveedor informa problemas de cuota, facturacion o limite de frecuencia. Revisa la cuota/facturacion o reintenta mas tarde.",sttFailureHintNetworkCustom:"El servidor no pudo alcanzar el endpoint STT personalizado. Comprueba que {endpoint} sea accesible desde el servidor Web UI y compatible con OpenAI.",sttFailureHintNetwork:"El servidor Web UI no pudo alcanzar el proveedor STT. Revisa red/proxy/firewall y reintenta.",sttFailureHintAudio:"El audio grabado estaba vacio o fue rechazado. Prueba con una muestra corta y clara, permite acceso al microfono o reintenta en Chrome.",sttFailureHintGenericCustom:"Comprueba clave API, Base URL, modelo y el endpoint final {endpoint}.",sttFailureHintGeneric:"Comprueba clave API, modelo y acceso de la cuenta del proveedor, luego reintenta.",sttTestRecordFailed:"No se pudo iniciar la grabacion del microfono: {error}",sttTestTranscript:"Transcripcion: {text}",ttsProvider:"Proveedor TTS",ttsProviderHint:"Elija el motor de texto a voz para la reproduccion de mensajes",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compatible con OpenAI)",providerEdge:"Edge TTS (Gratuito, sin clave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Seleccione una voz de su navegador o sistema operativo",webspeechVoicePlaceholder:"Auto (voz predeterminada)",openaiKey:"Clave API",openaiKeyHint:"Su clave API de OpenAI con acceso TTS",openaiUrl:"URL base de API",openaiUrlHint:"ej. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mas rapido) / tts-1-hd (mayor calidad)",openaiVoice:"Voz",openaiVoiceHint:"Voz a utilizar para la sintesis",customHint:"Utilice cualquier API TTS compatible con OpenAI — funciona con GPT-SoVITS, CosyVoice, etc.",customUrl:"URL de API",customUrlHint:"URL base de su servicio TTS",customUrlPlaceholder:"Direccion configurada en el adaptador local, ej. http://127.0.0.1:9880",customApiKey:"Clave API (opcional)",customApiKeyHint:"Algunos endpoints personalizados requieren autenticacion",customApiKeyPlaceholder:"Dejar en blanco si no es necesario",edgeHint:"Impulsado por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL del adaptador",edgeUrlHint:"Direccion del adaptador Edge TTS, ej. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Seleccione una voz para la sintesis de voz",edgeRate:"Velocidad",edgeRateHint:"Ajustar velocidad del habla (0.5x ~ 2.0x)",edgePitch:"Tono",edgePitchHint:"Ajustar tono del habla (-20 ~ +20 Hz)",testTitle:"Prueba de voz",testText:"Texto de prueba",testTextPlaceholder:"Ingrese texto para probar...",testTextDefault:"Hola, esta es una prueba de voz.",testButton:"Probar",testButtonPlaying:"Reproduciendo...",testFailed:"Prueba fallida: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voces predefinidas, diseño de voz y clonación de voz",mimoApiKey:"Clave API",mimoApiKeyHint:"Obtenga su clave en platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Clave API MiMo",mimoAuthMode:"Modo de autenticación",mimoAuthModeHint:"Formato de encabezado requerido por el endpoint MiMo seleccionado",mimoAuthModeBearer:"Token Bearer (Authorization)",mimoAuthModeApiKey:"Encabezado API key (api-key)",mimoAuthModeBoth:"Ambos encabezados",mimoBaseUrl:"URL base",mimoBaseUrlHint:"URL del endpoint de la API MiMo",mimoModel:"Modelo",mimoModelHint:"Seleccione el modelo de síntesis de voz",mimoModelPreset:"Voces predefinidas",mimoModelVoiceDesign:"Diseño de voz",mimoModelVoiceClone:"Clonación de voz",mimoVoice:"Voz",mimoVoiceHint:"Seleccione una voz predefinida",mimoVoiceDesignPrompt:"Descripción de voz",mimoVoiceDesignPromptHint:"Describa las características de voz deseadas",mimoVoiceDesignPromptPlaceholder:"Ej: Una voz femenina cálida y joven, algo lenta, con tono magnético",mimoCloneAudio:"Subir audio",mimoCloneAudioHint:"Suba una muestra de audio para clonación (mp3/wav, máx. 10 MB)",mimoCloneAudioUpload:"Elegir archivo",mimoCloneAudioClear:"Borrar",mimoStylePrompt:"Indicador de estilo",mimoStylePromptHint:"Opcional — describa el estilo de habla en lenguaje natural",mimoStylePromptPlaceholder:"Ej: Tono brillante y animado, ritmo rápido"},lockedIps:{title:"IPs bloqueadas",count:"{count} bloqueadas",empty:"Sin IPs bloqueadas",unlock:"Desbloquear",unlockAll:"Desbloquear todo",unlockAllConfirm:"Desbloquear todas las IPs?",unlocked:"IP desbloqueada",allUnlocked:"{count} IPs desbloqueadas",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"Avatar de usuario",upload:"Subir imagen",random:"Generar aleatorio",reset:"Restablecer predeterminado",hint:"Admite PNG, JPEG y WebP hasta 1 MB; se comprime automáticamente por debajo de 500 KB.",invalidType:"Elige una imagen PNG, JPEG o WebP",tooLarge:"La imagen del avatar debe ser de 1 MB o menos",saveSuccess:"Avatar guardado",saveFailed:"No se pudo guardar el avatar",resetSuccess:"Avatar restablecido",resetFailed:"No se pudo restablecer el avatar"},models:{apiKey:"API Key",apiKeyPlaceholder:"Introduce API Key",noProviders:"No hay proveedores configurados",save:"Guardar",saveFailed:"Error al guardar",saved:"Guardado"}},githubPreview:{title:"Vista previa de versión",description:"Clona el tag de GitHub seleccionado en el espacio de vista previa de Web UI, instala dependencias y lo ejecuta con los puertos de desarrollo.",refresh:"Actualizar",selectTag:"Selecciona un tag",prepare:"Preparar código",install:"Instalar dependencias",start:"Iniciar vista previa",stop:"Detener",note:"El código de vista previa se guarda bajo el directorio de datos de Web UI. Producción sigue en el puerto 8648; la vista previa usa frontend 8651 y backend 8650.",path:"Ruta de vista previa",webuiHome:"Datos de vista previa",currentTag:"Tag actual",repoReady:"Repositorio listo",dependencies:"Dependencias instaladas",running:"Estado",notRunning:"No ejecutándose",open:"Abrir vista previa",log:"Ruta del log de acciones",logOutput:"Salida de logs",actionLog:"Log de acciones",devLog:"Log del servidor dev",yes:"Sí",no:"No",actionFailed:"Acción fallida",nodeEnvironmentMissing:"No se detectó Node/npm. Instala Node.js y vuelve a intentarlo.",prepareSuccess:"Código de vista previa listo",installSuccess:"Dependencias instaladas",startSuccess:"Vista previa completada",stopSuccess:"Vista previa detenida"},codingAgents:{title:"Agentes de código",notice:"No todos los proveedores y modelos son compatibles.",claudeDescription:"CLI de Anthropic para tareas únicas en print mode y sesiones interactivas de código.",codexDescription:"CLI de OpenAI y flujo del proveedor openai-codex de Hermes para tareas de repositorio.",copyCommand:"Copiar",commandCopied:"Comando copiado",commandCopyFailed:"Error al copiar",refresh:"Actualizar",checking:"Comprobando",installStatus:"Estado de instalación",installed:"Instalado",notInstalled:"No instalado",installRequired:"{agent} no está instalado. Instálalo antes de crear una sesión.",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Error de instalación",installFailedHermesHint:"La instalación falló. Pide a Hermes que lo instale por ti.",installFailureReason:"Motivo",nodeEnvironmentMissing:"No se detectó Node/npm. Instala Node.js y vuelve a intentarlo.",deleteNow:"Eliminar",deleting:"Eliminando",deleteSuccess:"Eliminado",deleteFailed:"Error al eliminar",configFiles:"Archivos de configuración",profileScope:"Perfil",providerScope:"Proveedor",providerPlaceholder:"p. ej. custom:glm",modelScope:"Modelo",modelPlaceholder:"Selecciona modelo",launchModeScope:"Modo de inicio",launchModeGlobal:"Configuración global",launchModeScoped:"Proveedor y modelo",protocolScope:"Protocolo",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"Recargar configuración",configFileNotCreated:"No creado",configLoadFailed:"No se pudo leer el archivo de configuración",loadFailed:"No se pudieron inspeccionar los agentes de código",launch:"Iniciar",launchTitle:"Iniciar agente de código",nativeTerminal:"Terminal nativa",builtInTerminal:"Terminal integrada",launchPrepared:"Configuración de inicio preparada",launchPrepareFailed:"No se pudo preparar la configuración de inicio",nativeLaunchStarted:"Terminal nativa abierta",nativeLaunchFailed:"No se pudo abrir la terminal nativa",terminalTitle:"Terminal del agente de código",loadProvidersFailed:"No se pudieron cargar proveedores del perfil actual",selectProviderModel:"Selecciona un proveedor y un modelo",launchConfigDir:"Directorio de configuración de inicio",launchCommand:"Comando de inicio",table:{tool:"Herramienta",kind:"Paso",command:"Comando",note:"Nota",action:"Acción"},kinds:{install:"Instalar",auth:"Autenticación",health:"Salud",run:"Ejecutar"},notes:{claudeInstall:"Instala la CLI de Claude Code globalmente.",codexInstall:"Instala la CLI de Codex globalmente.",claudeAuth:"Comprueba el inicio de sesión de Claude Code; ejecuta claude una vez si falta.",codexAuth:"Agrega credenciales OAuth de OpenAI Codex gestionadas por Hermes.",claudeHealth:"Comprueba el actualizador y el estado de la CLI local.",codexHealth:"Confirma que la CLI de Codex está disponible en PATH.",claudeRun:"Print mode es la ruta más limpia para tareas únicas impulsadas por API.",codexRun:"Las tareas únicas de Codex deben ejecutarse dentro de un repositorio git."}},platform:{requireMention:"Requerir mencion {'@'}",requireMentionGroup:"Requerir mencion {'@'} en grupos para responder",requireMentionChannel:"Requerir mencion {'@'} en canales para responder",requireMentionRoom:"Requerir mencion {'@'} en salas para responder",reactions:"Reacciones",reactionsHint:"Reaccionar a mensajes con emoji",freeResponseChats:"Chats de respuesta libre",freeResponseChatsHint:"IDs de chats que responden sin mencion {'@'} (separados por comas)",freeResponseChannels:"Canales de respuesta libre",freeResponseChannelsHint:"IDs de canales que responden sin mencion {'@'} (separados por comas)",freeResponseRooms:"Salas de respuesta libre",freeResponseRoomsHint:"IDs de salas que responden sin mencion {'@'} (separados por comas)",mentionPatterns:"Patrones de mencion personalizados",mentionPatternsHint:"Patrones de activacion adicionales",autoThread:"Hilo automatico",autoThreadHint:"Crear automaticamente hilos de respuesta despues de mencion {'@'}",autoThreadHintRoom:"Crear automaticamente hilos de respuesta en salas",dmMentionThreads:"Hilos de mencion en MD",dmMentionThreadsHint:"Usar hilos de respuesta para menciones en mensajes directos",allowBots:"Permitir mensajes de bots",allowBotsHint:"Responder a mensajes de otros bots",allowedChannels:"Canales permitidos",allowedChannelsHint:"Lista blanca de IDs de canales (separados por comas)",ignoredChannels:"Canales ignorados",ignoredChannelsHint:"Canales donde el bot nunca responde (separados por comas)",noThreadChannels:"Canales sin hilo",noThreadChannelsHint:"Canales donde el bot responde sin hilos (separados por comas)",exclusiveTokenWarning:"Esta plataforma usa bloqueo exclusivo de token. Cada perfil debe usar un token de identidad distinto para evitar conflictos con otros perfiles.",botToken:"Token del bot",botTokenHint:"Token del bot del portal de desarrolladores",proxyUrl:"URL del proxy",proxyUrlHint:"Proxy opcional de la plataforma. Admite http://, https:// y socks5://",accessToken:"Token de acceso",accessTokenHint:"Token de acceso de Matrix",homeserver:"URL del homeserver",homeserverHint:"URL del homeserver de Matrix",matrixUserId:"ID de usuario de Matrix",matrixUserIdHint:"Obligatorio con contrasena; opcional con token",matrixPassword:"Contrasena de Matrix",matrixPasswordHint:"Alternativa al token de acceso",appId:"ID de aplicacion",appIdHint:"ID de aplicacion de Feishu",appSecret:"Secreto de aplicacion",appSecretHint:"Secreto de aplicacion de Feishu",encryptKey:"Clave de cifrado",encryptKeyHint:"Clave de cifrado de Feishu",verificationToken:"Token de verificación",verificationTokenHint:"Token de verificación de Feishu",clientId:"ID de cliente",clientIdHint:"ID de cliente de DingTalk",clientSecret:"Secreto de cliente",clientSecretHint:"Secreto de cliente de DingTalk",cardTemplateId:"ID de plantilla de tarjeta IA",cardTemplateIdHint:"ID de plantilla de tarjeta IA de DingTalk; déjelo vacío para desactivar las tarjetas IA",botId:"ID del bot",botIdHint:"ID del bot de WeCom",wecomSecretHint:"Secreto del bot de WeCom",waEnabled:"Activar WhatsApp",waEnabledHint:"Activar WhatsApp mediante emparejamiento por codigo QR",weixinToken:"Token de Weixin",weixinTokenHint:"Desde el inicio de sesion QR de la CLI de weixin (hermes weixin)",accountId:"ID de cuenta",accountIdHint:"ID de cuenta de Weixin",qrLogin:"Inicio de sesion QR",qrRelogin:"Volver a iniciar sesion",qrFetching:"Obteniendo codigo QR...",qrScanHint:"Escanea con WeChat para iniciar sesion",qrScanedHint:"Escaneado, por favor confirma en el telefono...",qqSandboxHint:"Habilitar entorno sandbox (para pruebas)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escanea el código QR con QQ o abre el enlace en el teléfono para completar la vinculación",qqMarkdownHint:"Habilitar mensajes con formato Markdown (algunos clientes pueden no soportarlo)",qqMarkdown:"Soporte Markdown",qqAppSecretHint:"App Secret del bot de QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID del bot de QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista blanca de IDs de usuario u OpenID, separados por comas",allowedUsers:"Usuarios permitidos",allowAllUsersHint:"Permite mensajes de cualquier usuario; desactívalo para usar la lista blanca",allowAllUsers:"Permitir todos los usuarios"},language:{label:"Idioma",zh:"中文",en:"English",es:"Espanol"},terminal:{sessions:"Sesiones",newTab:"Nueva terminal",closeSession:"Cerrar esta sesion?",sessionExited:"Finalizada",processExited:"Proceso finalizado con codigo {code}",noSessions:"No hay sesiones de terminal",connectionFailed:"No se pudo conectar al terminal",connectionError:"Error de conexión",connectionClosed:"Conexión cerrada"},usage:{title:"Estadisticas de uso",refresh:"Actualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Salida",totalSessions:"Total de sesiones",avgPerDay:"~{n}/dia de promedio",estimatedCost:"Costo est.",cacheHitRate:"Tasa de acierto de cache",modelBreakdown:"Desglose por modelo",dailyTrend:"Uso diario",date:"Fecha",tokens:"Tokens",cache:"Caché",cacheRead:"Lectura de caché",cacheWrite:"Escritura de caché",sessions:"Sesiones",cost:"Costo",noData:"Sin datos de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Sigue las cargas y ediciones de habilidades en sesiones de Hermes",refresh:"Actualizar",periodSelector:"Periodo de uso de habilidades",periodLabel:"{days} d",summary:"Resumen",totalActions:"Acciones",loads:"Cargas",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendencia diaria",periodSummary:"Últimos {days} días",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"No hay datos de uso de habilidades",loadFailed:"No se pudo cargar el uso de habilidades",otherSkills:"Otras habs."},changelog:{new_0_6_25_1:"Corrige fallos de execute_code con Hermes Agent 0.18.0 al reenviar el nuevo parametro has_host_access desde el wrapper de memoria de aprobaciones de Agent Bridge",new_0_6_24_1:"Esta version cubre los PR fusionados despues de 0.6.23 y mejora la entrada de chat, la visibilidad de workspaces, la gestion de plugins, los modelos predeterminados y la revision de diffs",new_0_6_24_2:"Las entradas de chat individual y grupal usan una barra integrada, controles de modelo compactos, ajustes agrupados, uso de contexto mas claro, mejor vista movil y restaura el redimensionado manual del chat individual",new_0_6_24_3:"Los cambios de workspace run aparecen como tarjetas diff persistentes con un panel derecho para ver diffs y editar archivos, se restauran tras reanudar la sesion y se ajustan mejor en movil",new_0_6_24_4:"El selector de carpetas workspace navega mejor discos y junctions de Windows y muestra carpetas con punto como .hermes, .config y .codex manteniendo las comprobaciones de WORKSPACE_BASE",new_0_6_24_5:"La pagina Plugins permite activar o desactivar plugins de usuario gestionables y refleja mejor el estado combinado de la configuracion base de Hermes y del profile actual",new_0_6_24_6:"La pagina Models anade acciones de provider y modelo predeterminado; la deteccion de errores terminal bridge reduce falsos positivos, el runtime Hermes Agent sube a 0.18.0 y se actualiza el manifest de versiones del sitio",new_0_6_23_1:"Esta version resume los PR fusionados desde 0.6.22, con mejoras para la autoactualizacion de escritorio, limpieza de MCP, mascotas Petdex, voz MCU y varios flujos de ajustes",new_0_6_23_2:"La autoactualizacion de escritorio vuelve a un flujo bloqueante, Windows detiene servicios con mas fiabilidad antes de actualizar, y al salir del escritorio se limpian mejor gateway, profile MCP y procesos hijo relacionados",new_0_6_23_3:"La inyeccion MCP de escritorio y las rutas de arranque MCP del Coding Agent son mas estables, los workspaces de Windows tienen selector de unidad, y se corrigieron las carpetas symlink y las vistas previas Petdex de escritorio",new_0_6_23_4:"Las mascotas Petdex ahora admiten mascotas web, una ventana de escritorio independiente, aparicion inmediata tras adoptar, boton de cierre arriba a la derecha y un tamano inicial de escritorio mas visible",new_0_6_23_5:"La voz MCU y global incorpora avisos de audio, protecciones OTA, TTS segmentado en streaming, limpieza de enlaces, bloques de codigo y tablas antes de leer, y cancelacion de generaciones TTS pendientes",new_0_6_23_6:"Ajustes y flujos suman edicion de configuracion de profile, altura del input de chat, expiracion JWT de login, edicion de Skills, conservacion del estado archivado local en History, texto mas claro del cajon de nuevo chat y textos de peligro mas seguros para Providers integrados",new_0_6_22_1:"Esta version resume los PR fusionados desde 0.6.21, con mejoras de frontend para modelos combinados, historial de sesiones, ajustes de proxy, comandos slash y detalles del diseno movil",new_0_6_22_2:"La pagina Modelos ahora incluye un panel de modelos combinados, y el chat puede mostrar el progreso real de referencias y agregadores MoA sin la antigua herramienta sintetica de marcador",new_0_6_22_3:"Las sesiones de chat se pueden archivar desde la lista y restaurar desde Historial; las sesiones locales de Claude Code y Codex ahora aparecen correctamente en Historial",new_0_6_22_4:"Ajustes ahora incluye una pestana Proxy para valores HTTP(S), ALL_PROXY y NO_PROXY de todo el gateway, con proxy por plataforma para Telegram, Discord y Matrix",new_0_6_22_5:"El chat de Hermes anade el comando /learn, Agent Bridge usa el workspace seleccionado como cwd, y solo las funciones de escritorio para /learn y MoA esperan la proxima version de Hermes Agent",new_0_6_21_1:"Esta version se centra en reruns de workflow, herramientas MCP de workflow, borrado de ajustes voice, ajustes Matrix, limpieza de updates y documentacion",new_0_6_21_2:"Los mensajes de nodos workflow ahora se abren en un drawer de chat completo a la izquierda y redimensionable; el historial movil de runs vuelve a abrirse y los reruns pueden conservar o limpiar el nodo seleccionado",new_0_6_21_3:"El toolset MCP use ahora puede listar, crear, actualizar, borrar, ejecutar, detener, borrar runs y rerun workflows desde un nodo seleccionado",new_0_6_21_4:"Al eliminar un voice provider ahora se borran los ajustes del profile en vez de solo limpiar la API key; Browser STT y Edge TTS siguen protegidos como defaults integrados",new_0_6_21_5:"Los ajustes Matrix soportan user ID mas password y detectan correctamente el estado configurado al usar login con password",new_0_6_21_6:"Web UI restart, update y upgrade dentro de la app ahora detienen Agent Bridge broker por defecto para no reutilizar procesos Python bridge antiguos",new_0_6_21_7:"Los headers de chat, group chat y workflow estan mejor alineados; Xiao Fang He muestra sold out; el alcance BSL queda mas claro; se documento el plan /learn; se elimino el proxy Hermes obsoleto",new_0_6_20_1:"Workflow ya esta disponible: crea nodos Agent, conectalos en un grafo y ejecuta el flujo completo desde la pagina Workflow",new_0_6_20_2:"Los workflow runs guardan registros, snapshots del grafo, sesiones por nodo, estado de nodo en vivo, motivos de fallo y acciones para detener o eliminar runs",new_0_6_20_3:"La vista y edicion de workflows son mas completas con historial de runs, snapshots de solo lectura, revision de chat por nodo, handles mas grandes y aviso para crear un workflow primero",new_0_6_20_4:"El desktop deja que agent-browser resuelva Chrome desde AGENT_BROWSER_HOME en lugar de fijar un executable path obsoleto, con guards de integridad de patches y fixes de stdout del navegador",new_0_6_20_5:"Los runtimes de navegador empaquetados fijan Chrome for Testing 149.0.7827.55 en plataformas desktop soportadas para evitar regresiones del navegador runtime",new_0_6_20_6:"ESP32 y Xiao Fang He reciben enlaces de tutorial actualizados, un fondo de badge mas claro y animacion de flujo compatible con Windows",new_0_6_19_1:"Esta version incluye 16 PR desde 0.6.18 y mejora la experiencia visible de dispositivos, voz, Coding Agent y ajustes",new_0_6_19_2:"Las sesiones de Coding Agent pueden cambiar de modelo, y las nuevas sesiones siguen correctamente el modelo global por defecto",new_0_6_19_3:"Las interacciones MCU son mas estables con debounce de Wi-Fi/boot al iniciar, audio solo al dispositivo destino y mejor doble clic fisico para limpiar e interrumpir",new_0_6_19_4:"Los ajustes TTS ahora se guardan por profile, y velocidad, tono y pruebas de voz leen la misma fuente de configuracion",new_0_6_19_5:"Los cambios de modelo de Coding Agent ya no afectan sesiones existentes y las custom provider keys se envian correctamente",new_0_6_19_6:"Filtros de skills runtime, orden de cron jobs, limite de altura en detalles de skill, recuperacion del updater de Windows, fallbacks de backup y logos comprimidos completan la version",new_0_6_18_2:"Hermes Studio MCP se divide en toolsets api, devices y use, con nuevas acciones de sesion, modelos, chat-run y ops",new_0_6_18_3:"El historial de chat y grupos es mas fiable con historial de UI separado, manejo seguro de mensajes nulos, respuestas del assistant preservadas tras run failures y replay de reasoning alineado",new_0_6_18_4:"El feedback de MCU es mas claro: las tool calls tienen prioridad sobre speech, el audio ya no marca tareas como terminadas demasiado pronto, el login del dispositivo activo es mas estable y ONLINE/IP largo se desplaza",new_0_6_18_5:"Los flujos de voz y mensajes agregan endpoints HTTP TTS/STT personalizados, transcodificacion de audio, acciones de fork de mensajes, marcadores de fork persistentes y errores de upload mas claros",new_0_6_18_6:"La configuracion de desktop y runtime es mas segura con registro Unicode-safe del PATH en Windows, soporte para publicar runtime Hermes Agent 0.17.0, metadata PWA movil y varias correcciones de recuperacion de profile/auth",new_0_6_18_7:"Optimizaciones y mejoras de detalles en toda la app",new_0_6_17_1:"Se corrigieron los problemas de inicio de conversaciones en Codex y Claude Code",new_0_6_16_1:"Los ajustes de Provider ahora conservan modos API personalizados, cubren LongCat correctamente, permiten eliminar Providers v12 y sincronizan catalogos de modelos con Providers de autenticacion e imagen con API key",new_0_6_16_2:"Los comandos de chat anaden reload-skills, actualizaciones de titulo web, passthrough de comandos slash desconocidos y una API limpia de contexto de sesion sin tool calls ni tool results",new_0_6_16_3:"La navegacion de sesiones es mas estable con resultados de Global Agent en la busqueda, orden por actividad reciente para sesiones nuevas, controles moviles de barra lateral restaurados y footer de ajustes estable",new_0_6_16_4:"Los archivos son mas faciles de usar: el nombre completo del workspace aparece al pasar el cursor y los uploads por drag-and-drop funcionan en chats individuales y grupales",new_0_6_16_5:"Los ajustes de plataforma incluyen campos localizados de validacion de Feishu Webhook y mejor cobertura de localizacion",new_0_6_16_6:"El descubrimiento de skills sigue directorios symlink, para que las skills locales compartidas aparezcan de forma consistente",new_0_6_16_7:"Los assets estaticos grandes evitan Brotli dinamico, mejorando la entrega del Web UI empaquetado bajo carga",new_0_6_16_8:"Los flujos de outbound relay y login MCU estan disponibles para integraciones tipo connector",new_0_6_16_9:"La CLI de Web UI anade --no-open para scripts y lanzamientos headless",new_0_6_16_10:"El tamano del viewport en Linux desktop y las filas de estado de compresion en vivo se pulieron para un layout mas estable",new_0_6_15_1:"Las barras laterales del chat se redisenaron y los controles de carga del historial facilitan navegar conversaciones largas",new_0_6_15_2:"El selector de comandos de skills permite descubrir e insertar comandos disponibles mas rapido desde la entrada del chat",new_0_6_15_3:"Los proveedores OAuth de Claude y Gemini estan disponibles, los ID de modelo de Gemini se normalizan correctamente y los selectores de modelo pueden refrescar cambios de config.yaml",new_0_6_15_4:"Los estados de thinking tienen indicador renovado y una barra de herramientas mas clara para seguir el progreso de reasoning sin interrumpir el flujo",new_0_6_15_5:"Los bordes de inputs y selects vuelven a ser visibles en el tema oscuro",new_0_6_15_6:"La configuracion de runtime ahora comprueba el runtime local antes de mostrar fuentes de descarga y mantiene visible el estado de comprobacion durante el inicio",new_0_6_15_7:"Las autoactualizaciones de escritorio ya no se bloquean por procesos antiguos, y la limpieza de gateways en Windows al salir es mas completa",new_0_6_15_8:"Los gateways gestionados se detienen al cerrar la app, mientras que los gateways que salen inesperadamente aun pueden reiniciarse en sesiones gestionadas",new_0_6_15_9:"El servidor de escritorio se cierra de forma mas ordenada al salir para reducir procesos huerfanos de backend, bridge y gateway",new_0_6_15_10:"README y el showcase del sitio ahora usan un unico GIF animado, y el hero del sitio usa una imagen estatica dedicada",new_0_6_13_1:"Alibaba Coding Plan ahora incluye el preset de modelo qwen3.7-plus",new_0_6_13_2:"El manejo de archivos es mas seguro, con validacion de puntos literales en rutas y rechazo de nombres de archivo de importacion de skills mal codificados",new_0_6_13_3:"El chat es mas estable en moviles y en navegadores sin soporte de speech synthesis",new_0_6_13_4:"Los fallos de Agent ahora conservan el final del error del bridge, y los lanzamientos de Claude Code con permiso root son mas fiables",new_0_6_13_5:"Las actualizaciones de escritorio son mas fiables: las actualizaciones de Windows cierran procesos Hermes Studio residuales, revisan Cloudflare primero y mantienen GitHub como feed de respaldo",new_0_6_13_6:"La automatizacion de releases mantiene Web UI y Docker fuera de GitHub Latest, mientras que las releases completas de escritorio se promocionan manualmente a Latest tras una compilacion correcta"},files:{title:"Archivos",tree:"Arbol de directorios",list:"Lista de archivos",breadcrumbRoot:"Inicio",newFile:"Nuevo archivo",newFolder:"Nueva carpeta",upload:"Subir",refresh:"Actualizar",open:"Abrir",edit:"Editar",preview:"Vista previa",download:"Descargar",copyPath:"Copiar ruta",rename:"Renombrar",delete:"Eliminar",name:"Nombre",size:"Tamano",modified:"Modificado",actions:"Acciones",emptyDir:"Directorio vacio",loading:"Cargando...",confirmDelete:'?Seguro que quiere eliminar "{name}"?',confirmDeleteDir:'?Seguro que quiere eliminar el directorio "{name}" y todo su contenido?',deleteFailed:"Error al eliminar",deleted:"Eliminado",renameTo:"Renombrar a",newFileName:"Nombre del archivo",newFolderName:"Nombre de la carpeta",created:"Creado",createFailed:"Error al crear",renamed:"Renombrado",renameFailed:"Error al renombrar",uploadSuccess:"{count} archivo(s) subido(s)",uploadFailed:"Error al subir",saveFailed:"Error al guardar",saved:"Guardado",unsavedChanges:"Tiene cambios sin guardar. ?Descartar?",pathCopied:"Ruta copiada",fileTooLarge:"Archivo demasiado grande (max 10MB)",permissionDenied:"No se puede modificar un archivo protegido",notFound:"Archivo o directorio no encontrado",backendError:"Error en la operacion de archivo",dragDropHint:"Arrastra archivos aqui para subir",closeEditor:"Cerrar editor",closePreview:"Cerrar",saveFile:"Guardar",fileTree:"Árbol de archivos"},groupChat:{title:"Chat grupal",createRoom:"Crear sala",joinByCode:"Unirse con codigo",roomName:"Nombre de la sala",roomNamePlaceholder:"Ingrese el nombre de la sala",inviteCode:"Codigo de invitacion",autoGenerate:"Generar automaticamente",noRooms:"Aun no hay salas",selectOrCreate:"Seleccione o cree una sala para comenzar a chatear",agents:"Agentes",addAgent:"Agregar agente",selectProfile:"Seleccione un perfil",agentAdded:"Agente agregado",selectRoomFirst:"Por favor selecciona una sala primero",agentAlreadyInRoom:"El agente ya esta en esta sala",agentAddFailedCount:"No se agregaron {count} agente(s): {details}",noAgents:"No hay agentes en esta sala",members:"Miembros",roomCreated:"Sala creada",roomDeleted:"Sala eliminada",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar enlace de sala",deleteRoomConfirm:"¿Eliminar esta sala?",clearContext:"Limpiar contexto",clearContextConfirm:"¿Limpiar el contexto de esta sala? Se eliminarán mensajes e instantáneas de compresión, pero se conservan agentes y miembros.",contextCleared:"Contexto limpiado",you:"Tú",joined:"Se unio a la sala",joinFailed:"Error al unirse a la sala",inputPlaceholder:"Escriba un mensaje... (Enter para enviar)",messageDisplayLimit:"El chat grupal muestra hasta 600 mensajes",enterCode:"Ingrese el codigo de invitacion",yourName:"Tu nombre",yourNamePlaceholder:"Ingresa tu nombre para mostrar",yourDescription:"Descripcion (opcional)",yourDescriptionPlaceholder:"Cuentales a los demas quien eres...",agentName:"Nombre del agente",agentNamePlaceholder:"Nombre personalizado (vacío = nombre del perfil)",agentDesc:"Descripción del agente",agentDescPlaceholder:"Describe lo que hace este agente...",agentReplying:"está respondiendo...",agentCompressing:"está comprimiendo contexto...",compressionSettings:"Configuración de compresión",triggerTokens:"Tokens de activación",triggerTokensDesc:"Umbral de tokens para activar la compresión",maxHistoryTokens:"Tokens máximos de historial",maxHistoryTokensDesc:"Máximo de tokens para el contexto comprimido",tailMessageCount:"Mensajes recientes",tailMessageCountDesc:"Número de mensajes recientes a conservar sin comprimir",compressionConfig:"Config. de compresión",compressNow:"Comprimir ahora",compressingInProgress:"Compresión en progreso",compressionSaved:"Configuración guardada"},download:{downloading:"Descargando...",downloadFailed:"Error en la descarga",fileNotFound:"Archivo no encontrado o eliminado",fileTooLarge:"Archivo demasiado grande (excede el limite)",backendError:"Error al leer el archivo, el entorno remoto puede no estar disponible",backendTimeout:"Tiempo de lectura del archivo agotado",unsupportedBackend:"El backend del terminal actual no admite la descarga de archivos",invalidPath:"Ruta de archivo invalida",contentDisplay:"Contenido",download:"Descargar",downloadFile:"Descargar archivo"},gateways:{title:"Puertas de enlace",running:"En ejecución",stopped:"Detenido",started:"Iniciado",startFailed:"No se pudo iniciar el gateway",stopFailed:"No se pudo detener el gateway"},workflow:{title:"Workflow",profile:"Perfil",namePlaceholder:"Nombre del workflow",workspace:{title:"Seleccionar workspace",select:"Seleccionar workspace",clear:"Limpiar workspace"},actions:{newWorkflow:"New Workflow",addNode:"Add Node",createWorkflowFirst:"Please create a workflow first",reset:"Reset",startExecution:"Start Execution",executionPending:"Workflow execution is not connected yet",executionStarted:"Workflow execution started",executionCompleted:"Workflow execution completed",executionFailed:"Workflow execution failed",rerunDownstreamKeepNode:"Conservar este nodo y ejecutar hacia abajo",rerunDownstreamClearNode:"Borrar este nodo y ejecutar hacia abajo",rerunDownstreamStarted:"Reejecución descendente iniciada",rerunFromNodeStarted:"Reejecución iniciada desde este nodo",rerunFailed:"Error al reejecutar el workflow",deleteNode:"Delete Node",deleteEdge:"Delete Connection"},batch:{toggle:"Batch selection",selectAll:"Select all",confirmDelete:"Delete {count} selected workflows?",deleteSuccess:"Deleted {count} workflows",deletePartial:"{failed} workflows failed to delete",deleteFailed:"Batch delete failed"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Node name",agent:"Agent",model:"Model",apiMode:"Modo API",input:"Input",promptPlaceholder:"Describe what this agent should do...",skillsPlaceholder:"Skills, Enter para agregar",uploadImages:"Subir imágenes"},status:{idle:"Inactivo",queued:"En cola",running:"En ejecución",completed:"Completado",failed:"Fallido",canceled:"Cancelado"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Selected Node",none:"No node selected"},stats:{nodes:"Nodes",edges:"Links"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Default Model",fast:"Fast Model",reasoning:"Reasoning Model"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Enter this node input.",node2:"Enter this node input.",node3:"Enter this node input.",plan:"Break the request into actionable steps.",execute:"Run the implementation steps and produce artifacts.",review:"Review output quality and identify follow-up work."},newNodeTitle:"Node {count}"},kanban:{title:"Tablero Kanban",createTask:"Nueva tarea",noTasks:"Sin tareas",allStatuses:"Todos los estados",allAssignees:"Todos los responsables",columns:{triage:"Clasificación",todo:"Pendiente",scheduled:"Programado",ready:"Listo",running:"En curso",blocked:"Bloqueado",review:"Revisión",done:"Completado",archived:"Archivado"},card:{assigneeTooltip:"Responsable",priority:{low:"Baja",medium:"Media",high:"Alta"},timeAgo:{justNow:"ahora mismo",minutes:"hace {count} min",hours:"hace {count} h",days:"hace {count} d"}},board:{create:"Nuevo tablero",archive:"Archivar tablero",archiveConfirm:"¿Archivar el tablero actual?",archived:"Tablero archivado",created:"Tablero creado",slugPlaceholder:"Identificador del tablero, p. ej. project-a",namePlaceholder:"Nombre visible (opcional)",slugRequired:"El identificador del tablero es obligatorio"},form:{title:"Título",titlePlaceholder:"Título de la tarea",titleRequired:"El título es obligatorio",body:"Descripción",bodyPlaceholder:"Descripción de la tarea (opcional)",assignee:"Responsable",selectAssignee:"Seleccionar responsable...",priority:"Prioridad",selectPriority:"Seleccionar prioridad...",tenant:"Inquilino",tenantPlaceholder:"Inquilino (opcional)",workspace:"Espacio de trabajo",workspaceScratch:"Espacio temporal",workspaceDir:"Usar directorio",workspaceWorktree:"Usar worktree",workspacePath:"Ruta del espacio",workspacePathPlaceholder:"Ruta absoluta (opcional)",branch:"Rama",branchPlaceholder:"Rama del worktree",skills:"Skills",skillsPlaceholder:"Seleccionar skills...",triage:"Crear en clasificación",goalMode:"Modo objetivo",maxRuntime:"Tiempo máximo",maxRuntimePlaceholder:"p. ej. 30m, 2h",maxRetries:"Máx. reintentos",maxRetriesPlaceholder:"Número de reintentos",goalMaxTurns:"Máx. turnos de objetivo",goalMaxTurnsPlaceholder:"Máximo de turnos"},detail:{status:"Estado",priority:"Prioridad",assignee:"Responsable",tenant:"Inquilino",createdAt:"Creada",startedAt:"Iniciada",completedAt:"Completada",comments:"Comentarios",events:"Eventos",runs:"Ejecuciones",artifacts:"Archivos generados",result:"Resultado",highlights:"Información clave",sources:"Fuentes de datos",sessions:"Sesiones relacionadas",sessionMessages:"Mensajes de sesión",noSessions:"No se encontraron sesiones relacionadas.",noLog:"No se encontró log para esta tarea.",addComment:"Agregar comentario",commentPlaceholder:"Escribe un comentario...",operations:"Operaciones"},action:{title:"Acciones",assign:"Asignar",assignTo:"Asignar a...",block:"Bloquear",blockReason:"Motivo del bloqueo",unblock:"Desbloquear",complete:"Completar",completeSummary:"Resumen de finalización (opcional)",dispatch:"Despachar",recoveryReason:"Motivo de recuperación (opcional)",reclaim:"Recuperar",reassign:"Reasignar",specify:"Especificar",loadLog:"Cargar log",loadDiagnostics:"Cargar diagnósticos"},message:{loadFailed:"No se pudo cargar la tarea",taskCreated:"Tarea creada",taskAssigned:"Tarea asignada",taskBlocked:"Tarea bloqueada",taskUnblocked:"Tarea desbloqueada",taskCompleted:"Tarea completada",dispatchNudged:"Dispatcher activado",commentAdded:"Comentario agregado",taskReclaimed:"Tarea recuperada",taskReassigned:"Tarea reasignada",taskSpecified:"Tarea especificada"},stats:{total:"Total",tasks:"Tareas"}}},xr={login:{title:"Hermes Web UI",description:"Geben Sie Benutzername und Passwort ein, um fortzufahren.",placeholder:"Zugangs-Token",submit:"Anmelden",tokenRequired:"Bitte geben Sie Ihren Zugangs-Token ein",invalidToken:"Ungultiger Token",connectionFailed:"Verbindung zum Server nicht moglich",passwordLogin:"Passwort",tokenLogin:"Token",usernamePlaceholder:"Benutzername",passwordPlaceholder:"Passwort",defaultCredentialsHint:"Standard-Benutzername: admin. Standard-Passwort: 123456.",credentialsRequired:"Bitte Benutzername und Passwort eingeben",invalidCredentials:"Ungultiger Benutzername oder Passwort",tooManyAttempts:"Zu viele fehlgeschlagene Versuche, bitte versuchen Sie es spater erneut",lockResetHint:"Wenn dies Ihr Server ist, heben Sie die Login-Sperre auf mit:",defaultLoginResetHint:"Um das Standard-Admin-Passwort zuruckzusetzen, fuhren Sie aus:",sessionExpired:"Die Anmeldung ist abgelaufen. Bitte melden Sie sich erneut an.",accessDenied:"Sie haben keine Berechtigung fur diese Ressource.",passwordMismatch:"Passworter stimmen nicht uberein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",setupSuccess:"Passwort-Login erfolgreich konfiguriert",passwordChanged:"Passwort erfolgreich geandert",passwordRemoved:"Passwort-Login entfernt",setupPassword:"Passwort-Login einrichten",changePassword:"Passwort andern",changeUsername:"Benutzername andern",removePasswordLogin:"Entfernen",username:"Benutzername",currentPassword:"Aktuelles Passwort",newPassword:"Neues Passwort",confirmPassword:"Passwort bestatigen",newUsername:"Neuer Benutzername",usernameChanged:"Benutzername erfolgreich geandert",usernameTooShort:"Benutzername muss mindestens 2 Zeichen lang sein",setupDescription:"Verwalten Sie Benutzername und Passwort fur die Anmeldung.",removeConfirm:"Passwort-Login ist fur Benutzerkonten erforderlich.",passwordLoginNotConfigured:"Passwort-Login ist nicht konfiguriert",passwordLoginConfigured:"Aktuelles Konto: {username}",defaultCredentialTitle:"Standardkonto und Passwort andern",defaultCredentialMessage:"Das aktuelle Konto verwendet noch den Standard-Benutzernamen oder das Standard-Passwort. Um unbefugten Zugriff zu vermeiden, andern Sie Benutzername und Passwort des aktuellen Kontos so bald wie moglich.",defaultCredentialAction:"Jetzt andern",defaultCredentialLater:"Spater erinnern"},users:{title:"Kontoverwaltung",description:"Benutzer erstellen, Rollen zuweisen und steuern, auf welche Profile normale Administratoren zugreifen koennen.",create:"Benutzer erstellen",edit:"Benutzer bearbeiten",username:"Benutzername",role:"Rolle",statusLabel:"Status",profiles:"Zugreifbare Profile",profilesPlaceholder:"Zugreifbare Profile auswaehlen",allProfiles:"Alle Profile",noProfiles:"Keine Profile zugewiesen",lastLogin:"Letzte Anmeldung",newPasswordOptional:"Neues Passwort (leer lassen zum Beibehalten)",loadFailed:"Benutzer konnten nicht geladen werden",deleteConfirm:"Diesen Benutzer loeschen?",enable:"Aktivieren",disable:"Deaktivieren",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Aktiv",disabled:"Deaktiviert"}},common:{loading:"Laden...",cancel:"Abbrechen",retry:"Erneutern",reset:"Zurücksetzen",delete:"Loschen",edit:"Bearbeiten",save:"Speichern",saved:"Gespeichert",update:"Aktualisieren",create:"Erstellen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Loschen fehlgeschlagen",ok:"OK",copied:"Kopiert",copy:"Kopieren",noData:"Keine Daten",fetch:"Abrufen",add:"Hinzufugen",enable:"Aktivieren",disable:"Deaktivieren",configured:"Konfiguriert",notConfigured:"Nicht konfiguriert",confirm:"Bestatigen",expand:"Aufklappen",collapse:"Zuklappen",stop:"Stoppen",start:"Starten",expired:"Abgelaufen"},mcp:{title:"MCP-Server",loadFailed:"MCP-Server konnten nicht geladen werden",reloadAll:"Alle neu laden",refresh:"Aktualisieren",total:"Gesamt",connected:"Verbunden",disconnected:"Getrennt",tools:"werkzeuge",tool:"Werkzeuge",searchPlaceholder:"Server suchen...",addServer:"+ Server hinzufuegen",zeroTools:"0 Werkzeuge",loading:"Wird geladen...",empty:"Keine MCP-Server konfiguriert",reloaded:"{server} neu geladen",reloadedAll:"Alle MCP-Server neu geladen",reloadFailed:"Neuladen fehlgeschlagen",serverAdded:'Server "{name}" hinzugefuegt',addFailed:"Server konnte nicht hinzugefuegt werden",serverUpdated:'Server "{name}" aktualisiert',updateFailed:"Server konnte nicht aktualisiert werden",saveFailed:"Speichern fehlgeschlagen",serverRemoved:'"{name}" entfernt',enabled:"Aktiviert: {name}",disabled:"Deaktiviert: {name}",connectedStatus:"Verbunden",disconnectedStatus:"Getrennt",disabledStatus:"Deaktiviert",toolList:"Werkzeugliste",count:" ",more:"mehr",removeFailed:"Server konnte nicht entfernt werden",testOk:"Test OK — {count} Werkzeuge verfuegbar",testEmpty:"Test lieferte keine Werkzeuge",testFailed:"Test fehlgeschlagen",edit:"Bearbeiten",test:"Testen",reload:"Neu laden",remove:"Entfernen",confirmRemove:'Server "{name}" entfernen?',cancel:"Abbrechen",add:"Hinzufuegen",save:"Speichern",addTitle:"MCP-Server hinzufuegen",editTitle:"MCP-Server bearbeiten",invalidJson:"Ungültiges JSON",invalidYaml:"Ungültiges YAML-Format",invalidConfig:"Ungültige Konfiguration",invalidServerConfig:"Ungültige Serverkonfiguration",missingCommandOrUrl:"Muss command oder url enthalten",manageTools:"Tools verwalten",toolsVisibilityTitle:"Tools-Sichtbarkeit verwalten",fetchTools:"Tools-Liste abrufen",fetchToolsFailed:"Tools-Liste konnte nicht abgerufen werden",toolsMode:"Modus:",toolsModeAll:"Alle",toolsModeInclude:"Einschließen",toolsModeExclude:"Ausschließen",toolsListHeader:"Tool-Name",toolsEmpty:"Keine Tools verfügbar, bitte zuerst die Tools-Liste abrufen",toolsSummaryAll:"{count} Tools insgesamt, alle aktiviert",toolsSummaryInclude:"{total} Tools insgesamt, {count} ausgewählt",toolsSummaryExclude:"{total} Tools insgesamt, {count} ausgeschlossen",toolsVisibilitySaved:"Tools-Sichtbarkeit gespeichert",toolsSelectAll:"Alle auswählen",toolsClearSelection:"Auswahl löschen",toolsExcludeAll:"Alle ausschließen",toolsClearExcluded:"Ausschlüsse löschen"},sidebar:{chat:"Chat",backToChat:"Zuruck",search:"Suche",apiRelay:"API-Relay",history:"Verlauf",jobs:"Geplante Aufgaben",models:"Modelle",profiles:"Profile",plugins:"Plugins",mcp:"MCP",petdex:"Pets",skills:"Fahigkeiten",memory:"Gedachtnis",logs:"Protokolle",usage:"Nutzung",performance:"Leistung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Konsole",singleChat:"Chat",globalAgent:"Global Agent",files:"Dateien",devices:"Gerate",groupChat:"Gruppenchat",groupConversation:"Konversation",groupConversationShort:"Konv",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Überwachung",groupMonitoringShort:"Überw.",settings:"Einstellungen",connected:"Verbunden",disconnected:"Getrennt",updateTip:'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',updateVersion:"Aktualisieren auf v{version}",reloadClientVersion:"Für v{version} neu laden",updating:"Aktualisierung...",updateSuccess:"Aktualisierung erfolgreich. Bitte aktualisieren Sie die Seite in Kurze. Wenn der Dienst langere Zeit nicht startet, starten Sie ihn manuell.",updateFailed:"Aktualisierung fehlgeschlagen",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar",versionManagement:"Versionsverwaltung",kanban:"Kanban",workflow:"Workflow",groupTools:"Werkzeuge",groupToolsShort:"Tools",codingAgents:"Coding Agents",versionPreview:"Versionsvorschau",groupPlatform:"Plattform",gateways:"Gateways",expand:"Menü ausklappen",collapse:"Menü einklappen"},runtimeVersions:{title:"Versionsverwaltung",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Plattform",currentWebUi:"Aktuelles Web UI",activeVersion:"Aktive Version",active:"Aktiv",installed:"Installiert",download:"Herunterladen",downloadGithub:"Von GitHub herunterladen",downloadCf:"Von Cloudflare herunterladen",github:"GitHub",cf:"Cloudflare",useVersion:"Beim nächsten Neustart verwenden",deleteVersion:"Löschen",deleteRuntimeConfirm:"Hermes Runtime {version} löschen?",deleteWebUiConfirm:"Web UI {version} löschen?",deleteRuntimeSuccess:"Runtime gelöscht",deleteWebUiSuccess:"Web UI gelöscht",refresh:"Aktualisieren",noVersions:"Keine Versionen verfügbar",remoteLoadFailed:"Remote-Versionen konnten nicht geladen werden",downloadTasks:"Download-Aufgaben",downloadStarted:"Download gestartet",activateSuccess:"Versionsauswahl gespeichert. Starten Sie Hermes Studio neu, um sie zu verwenden.",jobStatus:{queued:"In Warteschlange",running:"Läuft",completed:"Abgeschlossen",failed:"Fehlgeschlagen"},jobStageStatus:{queued:"In Warteschlange",resolve:"Wird aufgelöst",download:"Wird heruntergeladen",verify:"Wird geprüft",extract:"Wird entpackt",install:"Wird installiert",completed:"Abgeschlossen",failed:"Fehlgeschlagen"},jobStage:{queued:"In Warteschlange",download:"Wird heruntergeladen",resolveRuntime:"Runtime-Paket wird aufgelöst",verifyRuntime:"Runtime-Archiv wird geprüft",extractRuntime:"Runtime-Archiv wird entpackt",installRuntime:"Runtime wird installiert",resolveWebUi:"Web-UI-Paket wird aufgelöst",verifyWebUi:"Web-UI-Archiv wird geprüft",extractWebUi:"Web-UI-Archiv wird entpackt",installWebUi:"Web UI wird installiert",completed:"Abgeschlossen",failed:"Fehlgeschlagen"}},devices:{title:"Geräte",count:"{count} Geräte",lastScanned:"Zuletzt gescannt: {time}",refresh:"Aktualisieren",empty:"Keine Geräte gefunden",computer:"Rechner",endpointLabel:"Endpunkt",statusLabel:"Zustand",online:"Online",offline:"Offline",address:"Adresse",os:"Betriebssystem",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Latenz",lastSeen:"Zuletzt gesehen",open:"Öffnen",never:"Nie",unknown:"Unbekannt",loadFailed:"Geräte konnten nicht geladen werden",scanFailed:"Gerätescan fehlgeschlagen",updateFailed:"Gerät konnte nicht aktualisiert werden",duplicateRequest:"Es gibt bereits eine ausstehende Kopplungsanfrage",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Verarbeitet",unprocessed:"Unverarbeitet",deleteHistory:"Eintrag löschen",deleteHistoryConfirm:"Diesen Anfrageeintrag löschen und den Verbindungszugriff dieses Geräts widerrufen?",requests:"Anfragen",requestsWithCount:"Anfragen ({count})",noRequests:"Keine Anfragen",requestPairing:"Kopplung anfragen",paired:"Gekoppelt",approve:"Genehmigen",reject:"Ablehnen",block:"Blockieren",unblock:"Blockierung aufheben",inboundStatus:{none:"Anfrage erlaubt",pending:"Ausstehend",approved:"Genehmigt",rejected:"Abgelehnt",blocked:"Blockiert"},outboundStatus:{none:"Nicht gekoppelt",pending:"Angefragt",approved:"Gekoppelt",rejected:"Abgelehnt",blocked:"Blockiert"},endpoint:{web:"Web",desktop:"Desktop-App",custom:"Benutzerdefiniert"}},performance:{title:"Leistung",subtitle:"Systemressourcen, Bridge Broker, Workers und aktive Sitzungen überwachen",refresh:"Aktualisieren",autoRefreshOn:"Automatisch aktualisieren",autoRefreshOff:"Manuell aktualisieren",loadFailed:"Leistungsdaten konnten nicht geladen werden",systemCpu:"System-CPU",systemMemory:"Systemspeicher",activeSessions:"Aktive Sitzungen",runningSessions:"Laufend {count}",workers:"Workers",totalWorkerMemory:"Worker-Gesamtspeicher",processes:"Prozesse",uptime:"Laufzeit",running:"Läuft",stopped:"Gestoppt",workerMemory:"Worker-Speicher",lastUpdated:"Aktualisiert",profile:"Profile",memory:"Speicher",sessions:"Sitzungen",runningActiveSessions:"Laufend / Aktiv",lastUsed:"Zuletzt verwendet",status:"Status",noWorkers:"Keine Workers",sessionsByProfile:"Sitzungen nach Profile",noActiveSessions:"Keine aktiven Sitzungen"},drawer:{terminal:"Konsole",files:"Arbeitsbereich"},chat:{contextRemaining:"übrig",contextClickToEdit:"Klicken zum Bearbeiten der Kontextlänge",contextEditTitle:"Kontextlänge bearbeiten",contextEditDesc:"Kontextlängenlimit für aktuelles Modell festlegen (in Tokens)",contextEditPlaceholder:"Kontextlänge eingeben",contextEditHint:"Häufige Werte: 256k (Hermes-Standard), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Speichern",contextEditCancel:"Abbrechen",contextEditInvalid:"Bitte geben Sie eine gültige Kontextlänge ein",contextEditSuccess:"Kontextlänge aktualisiert",contextEditFailed:"Aktualisierung fehlgeschlagen",emptyState:"Starten Sie eine Konversation mit Hermes Agent",emptyStateAgent:"Starten Sie eine Konversation mit {agent}",viewOlderInHistory:"Fruehere Nachrichten im Verlauf ansehen",scrollToBottom:"Nach unten scrollen",outlineTitle:"Konversationsübersicht",outlineEmpty:"Kein Konversationsinhalt",outlineUserQuestion:"Benutzerfrage",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)",inputHeightResizeHint:"Zum Andern der Chat-Eingabehohe ziehen, zum Zurucksetzen doppelklicken.",slashCommandArgs:{message:"<Nachricht>",title:"<Titel>",text:"<Text>"},slashCommands:{usage:"Nutzung der aktuellen Sitzung berechnen",status:"Sitzungsstatus und Warteschlange anzeigen",abort:"Aktiven Bridge-Lauf stoppen",queue:"Nachricht hinter dem aktiven Lauf einreihen",learn:"Wiederverwendbaren Skill aus beschriebenen Quellen lernen",plan:"Markdown-Implementierungsplan schreiben",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"Aktuelle Anzeige leeren",clearHistory:"Gespeicherten Nachrichtenverlauf dieser Sitzung löschen",title:"Diese Sitzung umbenennen",compress:"Kontextkomprimierung im Leerlauf ausführen",steer:"Steuertext an den aktiven Bridge-Lauf senden",destroy:"Bridge-Agent für diese Sitzung freigeben",reloadMcp:"MCP-Server neu laden",reloadSkills:"Skill-Befehle neu laden"},attachFiles:"Dateien anhangen",reasoningEffort:{tooltip:"Denkaufwand",defaultLabel:"Standard",options:{default:"Standard (config.yaml)",none:"Keiner",minimal:"Minimal",low:"Niedrig",medium:"Mittel",high:"Hoch",xhigh:"Sehr hoch"}},showToolCalls:"Tool-Aufrufe anzeigen",hideToolCalls:"Tool-Aufrufe ausblenden",messageQueue:"Nachrichtenwarteschlange",removeQueuedMessage:"Nachricht aus Warteschlange entfernen",stop:"Stopp",send:"Senden",contextUsed:"Kontext verwendet:",sessions:"Sitzungen",webUiSessions:"Sitzungen",allProfiles:"Alle Profile",profileMissingModelsTip:'Profil "{profile}" hat keinen verfuegbaren Provider oder kein Modell fuer diese Sitzung',sessionScopeHint:"Chat zeigt nur Web-UI/API-Server-Sitzungen. CLI-, Telegram-, Discord-, Cron- und andere Kanal-Sitzungen sind schreibgeschützt im Verlauf.",openHistory:"Verlauf öffnen",hermesHistory:"Hermes-Verlauf",historyScopeHint:"Schreibgeschützte Hermes-Verlaufssitzungen des aktuellen Profils, nach Quelle gruppiert.",noSessions:"Keine Sitzungen",newChat:"Neuer Chat",agent:"Agent",approvalKicker:"Terminal-Berechtigung",approvalTitle:"Befehl vor dem Ausführen prüfen",approvalAgree:"Zustimmen",approvalAllowOnce:"Einmal erlauben",approvalAllowSession:"Sitzung erlauben",approvalAlways:"Immer",approvalDeny:"Ablehnen",clarifyKicker:"Agent benötigt Klärung",clarifyTitle:"Der Agent hat eine Frage an Sie",clarifyPlaceholder:"Geben Sie Ihre Antwort ein...",clarifySubmit:"Antworten",clarifyDismiss:"Schließen",deleteSession:"Diese Sitzung loschen?",toggleBatchMode:"Batch-Auswahl",selectAll:"Alle auswählen",confirmBatchDelete:"{count} ausgewählte Sitzungen löschen?",batchDeleteSuccess:"{count} Sitzungen gelöscht",batchDeletePartial:"{failed} Sitzungen konnten nicht gelöscht werden",batchDeleteFailed:"Batch-Löschung fehlgeschlagen",importToWebUi:"In Web UI importieren",importSessionSuccess:"Sitzung in Web UI importiert",importSessionAlreadyExists:"Sitzung existiert bereits in Web UI",importSessionFailed:"Sitzung konnte nicht importiert werden",sessionDeleted:"Sitzung geloscht",rename:"Umbenennen",archiveSession:"Archivieren",unarchiveSession:"Aus Archiv holen",pin:"Anheften",unpin:"Lösen",pinned:"Angeheftet",chatMode:"Chatmodus",liveMode:"Live-Modus",liveSessions:"Live-Sitzungen",recentBadge:"Kürzlich",linkedSessions:"{count} verknüpft",noVisibleMessages:"Keine für Menschen sichtbaren Nachrichten.",monitorRoleUser:"Benutzer",monitorRoleAssistant:"Assistent",copySessionLink:"Sitzungslink kopieren",openSessionInNewTab:"In neuem Tab öffnen",sessionLinkCopied:"Session link copied",copySessionId:"Sitzungs-ID kopieren",export:"Exportieren",editConfig:"Konfiguration bearbeiten",exportFull:"Vollständiger Export (JSON)",exportCompressed:"Komprimierter Export (TXT)",exportCompressing:"Komprimiere Kontext, bitte warten...",exportSuccess:"Sitzung exportiert",exportFailed:"Export fehlgeschlagen",renamed:"Umbenannt",renameFailed:"Umbenennung fehlgeschlagen",sessionArchived:"Sitzung archiviert",archiveSessionFailed:"Sitzung konnte nicht archiviert werden",sessionUnarchived:"Sitzung aus Archiv geholt",unarchiveSessionFailed:"Sitzung konnte nicht aus dem Archiv geholt werden",renameSession:"Sitzung umbenennen",sessionNotFound:"Sitzung nicht gefunden",enterNewTitle:"Neuen Titel eingeben",other:"Sonstige",runFailed:"Ausfuhrung fehlgeschlagen",error:"Fehler",tool:"Werkzeug",arguments:"Argumente",result:"Ergebnis",workspaceChanges:"Workspace-Änderungen",changedFiles:"{files} Dateien geändert",diffUnavailable:"Diff nicht verfügbar",binaryFileDiffUnavailable:"Diff für Binärdateien nicht verfügbar",truncated:"... (abgeschnitten)",unchangedLines:"{count} unveränderte Zeilen",executionDuration:"Ausführungszeit",thinkingLabel:"Denkprozess",thinkingInProgress:"Denkt",thinkingShow:"Denkprozess anzeigen",thinkingHide:"Denkprozess ausblenden",thinkingDuration:"Beobachtet {duration}",thinkingChars:"{count} Zeichen",copyBubble:"Nachricht kopieren",copiedBubble:"Nachricht kopiert",copyFailed:"Kopieren fehlgeschlagen",playSpeech:"Sprache abspielen",pauseSpeech:"Pausieren",resumeSpeech:"Fortsetzen",stopSpeech:"Stoppen",speechNotSupported:"Sprachwiedergabe in diesem Browser nicht unterstützt",searchEnterHint:"Enter zum Öffnen · Esc zum Schließen",searchHint:"Cmd/Ctrl+K",searchScope:"Suchbereich: nur lokale Web-UI-Sitzungsdatenbank; schreibgeschützte Hermes-Verlaufssitzungen sind nicht enthalten.",searchFailed:"Sitzungssuche fehlgeschlagen",searchNoSnippet:"Keine Vorschau verfügbar",searchNoResults:"Keine passenden Sitzungen",searchRecent:"Letzte Sitzung",searchEmpty:"Letzte Sitzungen",searchPlaceholder:"Sitzungen suchen...",searchSubtitle:"Nach Titel oder Nachrichteninhalt suchen",searchTitle:"Sitzungen suchen",stopGateway:"Gateway stoppen",start:"Starten",workspaceSetFailed:"Workspace konnte nicht festgelegt werden",workspaceSet:"Workspace festgelegt",workspacePlaceholder:"Projektpfad eingeben, z. B. /home/user/project",folderPickerEmpty:"(Leer)",folderPickerNoFolders:"Keine Workspace-Ordner",folderPickerSelected:"Ausgewählt:",workspace:"Arbeitsbereich",setWorkspaceTitle:"Sitzungs-Workspace festlegen",setWorkspace:"Workspace festlegen",modelSetFailed:"Modell konnte nicht festgelegt werden",modelSet:"Modell festgelegt",setModelTitle:"Sitzungsmodell festlegen",setModel:"Modell festlegen",newCliChat:"Neue CLI",cliEmptyState:"CLI-Chat starten",autoPlaySpeech:"Sprache automatisch abspielen",voiceInput:{startCapture:"Sprachaufnahme starten",stopCaptureAndInsert:"Sprachaufnahme stoppen und Transkript in die Eingabe einfuegen",cancelCapture:"Spracheingabe abbrechen",statusLabel:"Status: {status}",transcriptLabel:"Transkript: {text}",errorLabel:"Fehler: {error}",recentEvents:"Letzte Ereignisse",status:{idle:"Bereit",capturing:"Hoert zu",transcribing:"Transkribiert",sending:"Wird in die Eingabe eingefuegt",error:"Fehler"},browserSpeechUnsupported:"Browser-Spracherkennung wird in diesem Browser nicht unterstuetzt.",browserSpeechFailed:"Browser-Spracherkennung fehlgeschlagen.",browserSpeechFailedWithReason:"Browser-Spracherkennung fehlgeschlagen: {error}.",microphoneUnsupported:"Mikrofonaufnahme wird in diesem Browser nicht unterstuetzt.",microphoneRecordingFailed:"Mikrofonaufnahme fehlgeschlagen."}},jobs:{title:"Geplante Aufgaben",createJob:"Aufgabe erstellen",editJob:"Aufgabe bearbeiten",noJobs:"Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.",sortBy:"Sortieren",sortByName:"Nach Name",sortByTime:"Nach Datum",sortByNameHint:"Nach Name sortieren",sortByTimeHint:"Nach Datum sortieren",sortAsc:"Aufsteigend",sortDesc:"Absteigend",name:"Name",namePlaceholder:"Aufgabenname",schedule:"Zeitplan (Cron-Ausdruck)",schedulePlaceholder:"z. B. 0 9 * * *",quickPresets:"Schnellvorgaben",selectPreset:"Vorgabe auswahlen...",presetEveryMinute:"Jede Minute",presetEvery5Min:"Alle 5 Minuten",presetEveryHour:"Jede Stunde",presetEveryDay:"Jeden Tag um 00:00",presetEveryDay9:"Jeden Tag um 09:00",presetEveryMonday:"Jeden Montag um 09:00",presetEveryMonth:"Am 1. jedes Monats um 09:00",prompt:"Eingabeaufforderung",promptPlaceholder:"Der auszufuhrende Prompt",skills:"Skills",skillsPlaceholder:"Skills auswählen...",deliverTarget:"Zustellziel",origin:"Herkunft",local:"Lokal",repeatCount:"Wiederholungsanzahl (optional)",modelPlaceholder:"Standardmodell",repeatPlaceholder:"Leer lassen fur unendlich",jobCreated:"Aufgabe erstellt",jobUpdated:"Aufgabe aktualisiert",nameRequired:"Name ist erforderlich",scheduleRequired:"Zeitplan ist erforderlich",loadFailed:"Laden der Aufgabe fehlgeschlagen",jobPaused:"Aufgabe pausiert",jobResumed:"Aufgabe fortgesetzt",jobTriggered:"Job ausgelost",modelUpdated:"Modell aktualisiert",jobDeleted:"Aufgabe geloscht",status:{running:"Lauft",paused:"Pausiert",disabled:"Deaktiviert",scheduled:"Geplant"},info:{model:"Modell",schedule:"Zeitplan",lastRun:"Letzte Ausfuhrung",nextRun:"Nachste Ausfuhrung",deliver:"Zustellung",repeat:"Wiederholung"},action:{pause:"Pausieren",pauseJob:"Aufgabe pausieren",resume:"Fortsetzen",resumeJob:"Aufgabe fortsetzen",runNow:"Jetzt ausfuhren",triggerImmediately:"Sofort auslösen"},runHistory:{title:"Verlauf",runs:"Läufe",noRuns:"Kein Verlauf gefunden."}},skills:{title:"Fahigkeiten",targetFilter:"Runtime",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Fahigkeiten suchen...",noMatch:"Keine Fahigkeiten entsprechen Ihrer Suche",noSkills:"Keine Fahigkeiten gefunden",backTo:"Zuruck zu",attachedFiles:"Angehange Dateien",loadFailed:"Laden der Fahigkeit fehlgeschlagen",fileLoadFailed:"Laden der Datei fehlgeschlagen",modified:"Benutzerbearbeitet",archived:"Archiviert",pinned:"Angeheftet",pin:"Fahigkeit anheften",unpin:"Anheften aufheben",pinFailed:"Anheft-Status konnte nicht geandert werden",edit:"Bearbeiten",saving:"Speichern...",editorLabel:"Skill-Editor",saveSuccess:"Skill gespeichert",saveFailed:"Skill konnte nicht gespeichert werden",toggleFailed:"Aktivieren/Deaktivieren der Fahigkeit fehlgeschlagen",source:{builtin:"Integriert",hub:"Hub",local:"Lokal",external:"Extern"},delete:"Löschen",deleteConfirm:'Skill "{name}" löschen? Dies kann nicht rückgängig gemacht werden.',deleteSuccess:"Skill gelöscht",deleteFailed:"Löschen fehlgeschlagen",import:"Importieren",importTitle:"Skill importieren",importModeZip:"Zip",importModeFolder:"Ordner",importHintZip:"Lade ein .zip-Archiv mit einem Verzeichnis hoch, das SKILL.md enthält",importHintFolder:"Wähle einen lokalen Skill-Ordner (muss SKILL.md enthalten)",importTargetCategory:"Zielkategorie (optional)",importTargetCategoryPlaceholder:"Leer lassen, um unter misc abzulegen",importSelectFile:".zip-Datei wählen",importSelectFolder:"Ordner wählen",importInvalidFile:"Nur .zip-Archive werden unterstützt",importFileCount:"Dateien",importNoSelection:"Bitte zuerst Datei oder Ordner wählen",importSuccess:"Skill importiert",importFailed:"Import fehlgeschlagen",path:{local:"Lokal",external:"Extern"},externalDirs:{manage:"Externe Verzeichnisse",title:"Externe Skill-Verzeichnisse verwalten",hint:"Verwaltet config.skills.external_dirs. Unterstützt ~ und $VAR; fehlende Pfade werden ausgegraut.",add:"Verzeichnis hinzufügen",placeholder:"/path/to/skills oder ~/my-skills",empty:"Keine externen Verzeichnisse",missing:"Pfad nicht gefunden",notDir:"Kein Verzeichnis",saveSuccess:"Externe Verzeichnisse gespeichert",saveFailed:"Speichern fehlgeschlagen",loadFailed:"Externe Verzeichnisse konnten nicht geladen werden",removeRow:"Entfernen"},pathCopied:"Pfad kopiert",pathCopyFailed:"Pfad konnte nicht kopiert werden",reloadHint:"Aktive Sitzungen: /reload-skills ausführen; neue Sitzungen laden automatisch.",writeApprovalButton:"Ausstehend {count}",writeApprovalTitle:"Ausstehende Schreibfreigaben",writeApprovalDescription:"Freigeben oder ablehnen, was Hermes Agent fuer Speicher und Skills vorgemerkt hat.",writeApprovalRefresh:"Aktualisieren",writeApprovalEmpty:"Keine ausstehenden Schreibvorgaenge.",writeApprovalUnsupported:"Diese Hermes-Agent-Version unterstuetzt keine Schreibfreigaben. Aktualisiere Hermes Agent, um diese Funktion zu nutzen.",writeApprovalMemory:"Speicher",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Pruefen",writeApprovalHideDiff:"Ausblenden",writeApprovalNoDiff:"Keine Unterschiede verfuegbar.",writeApprovalLoadFailed:"Ausstehende Schreibvorgaenge konnten nicht geladen werden",writeApprovalDiffFailed:"Schreibdetails konnten nicht geladen werden",writeApprovalActionFailed:"Ausstehender Schreibvorgang konnte nicht bearbeitet werden",writeApprovalApproved:"Schreibvorgang freigegeben",writeApprovalRejected:"Schreibvorgang abgelehnt",writeApprovalApprove:"Freigeben",writeApprovalReject:"Ablehnen",writeApprovalPendingMemoryWrite:"Ausstehender Speichereintrag",writeApprovalCurrentFile:"Aktuelle Datei {file}",writeApprovalProposedFile:"Vorgeschlagene Datei {file}",writeApprovalDiffSection:"Diff",writeApprovalPatchOldStringMissing:"Der old_string des Patches wurde in der aktuellen Datei {file} nicht gefunden; eine Freigabe aendert die Datei nicht.",writeApprovalRequestedOldString:"Angefragter old_string",writeApprovalCurrentReadFailed:"Die aktuelle Datei {file} konnte nicht als UTF-8-Text gelesen werden.",writeApprovalDeleteSkill:"Diese Freigabe loescht den Skill {skill}.",writeApprovalRemoveFile:"Diese Freigabe entfernt {file} aus dem Skill {skill}."},plugins:{title:"Plugins",refresh:"Aktualisieren",notice:"Inventar erkennbarer Hermes-Plugin-Manifeste. Discovery-Metadaten werden gelesen, ohne Plugin-Code zu laden. Standalone-Benutzerplugins können hier aktiviert oder deaktiviert werden; Änderungen gelten für neue Hermes-Sitzungen.",loadFailed:"Plugins konnten nicht geladen werden",updateFailed:"Plugin konnte nicht aktualisiert werden",enableSuccess:"{name} aktiviert",disableSuccess:"{name} deaktiviert",commandCopied:"Befehl kopiert",searchPlaceholder:"Key, Name, Beschreibung, Pfad suchen...",source:"Quelle",kind:"Typ",statusTitle:"Status",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"Befehl kopieren",managedElsewhere:"anderweitig verwaltet",noMatch:"Keine Plugins passen zu den aktuellen Filtern",enabled:"aktiviert",disabled:"deaktiviert",summary:{total:"Gesamt",active:"Aktiviert / auto",inactive:"Inaktiv",disabled:"Deaktiviert",providerManaged:"Provider-verwaltet"},status:{enabled:"Aktiviert","auto-active":"Auto-aktiv",inactive:"Inaktiv",disabled:"Deaktiviert","provider-managed":"Provider-verwaltet"},statusLabel:{enabled:"Per Konfiguration aktiviert","auto-active":"Auto-aktiv",inactive:"Inaktiv",disabled:"Deaktiviert","provider-managed":"Provider-verwaltet"},configStatuses:{enabled:"aktiviert",disabled:"deaktiviert","not-enabled":"nicht aktiviert",auto:"auto","provider-managed":"provider-verwaltet"},table:{plugin:"Plugin",status:"Status",source:"Quelle",kind:"Typ",capabilities:"Fähigkeiten",path:"Pfad / Entry Point",manage:"Verwalten"},capabilities:{tools:"{count} Tools",hooks:"{count} Hooks",env:"{count} env"},metadata:{agentRoot:"Agent-Stammverzeichnis",python:"Python",scanCwd:"Arbeitsverzeichnis scannen",projectPlugins:"Projekt-Plugins"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Gedachtnis",refresh:"Aktualisieren",loadFailed:"Laden des Gedachtnisses fehlgeschlagen",myNotes:"Meine Notizen",noNotes:"Noch keine Notizen.",notesPlaceholder:"Notizen schreiben...",userProfile:"Benutzerprofil",noProfile:"Noch kein Profil.",profilePlaceholder:"Profil schreiben...",soul:"Seele",noSoul:"Noch keine Seelenkonfiguration.",soulPlaceholder:"Seelenkonfiguration schreiben..."},models:{title:"Modelle",addProvider:"Anbieter hinzufugen",refreshModelCache:"Modellcache aktualisieren",refreshModelCacheLoading:"Modellcache wird aktualisiert...",refreshModelCacheSuccess:"Modellcache aktualisiert",refreshModelCacheFailed:"Modellcache konnte nicht aktualisiert werden",providerType:"Anbietertyp",preset:"Vorgabe",custom:"Benutzerdefiniert",selectProvider:"Anbieter auswahlen",chooseProvider:"Anbieter wahlen...",name:"Name",autoGeneratedName:"Automatisch aus Basis-URL generiert",baseUrl:"Basis-URL",region:"Region",regionIntl:"International",regionCn:"Festlandchina",baseUrlPlaceholder:"z. B. https://api.example.com/v1",apiKey:"API-Schlussel",apiKeyPlaceholder:"sk-...",defaultModel:"Standardmodell",selectOrInput:"Modell auswählen oder eingeben...",selectModel:"Modell auswahlen...",providerAdded:"Anbieter hinzugefugt",providerDeleted:"Anbieter geloscht",providerCredentialsCleared:"Anbieter-Zugangsdaten geloscht",clearProviderCredentials:"Zugangsdaten loschen",clearCredentialsConfirm:"Gespeicherte Zugangsdaten fur „{name}“ loschen? Dieser integrierte Anbieter bleibt in der Liste und kann nach erneuter Konfiguration wieder genutzt werden.",disableProvider:"Anbieter deaktivieren",disableProviderConfirm:"Integrierten Anbieter „{name}“ deaktivieren? Der Anbieter bleibt integriert und kann spater wieder aktiviert werden.",providerDisabled:"Anbieter deaktiviert",defaultProviderUpdated:"Standardanbieter aktualisiert",defaultProviderUpdateFailed:"Standardanbieter konnte nicht aktualisiert werden",defaultModelUpdated:"Standardmodell aktualisiert",defaultModelUpdateFailed:"Standardmodell konnte nicht aktualisiert werden",deleteProvider:"Anbieter loschen",deleteConfirm:'Mochten Sie "{name}" wirklich loschen?',codexLoginTitle:"OpenAI Codex Anmeldung",codexWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein, um sich anzumelden:",codexCopyCode:"Code kopiert",codexOpenLink:"Autorisierungsseite öffnen",codexApproved:"Anmeldung erfolgreich",codexExpired:"Die Autorisierung ist abgelaufen. Bitte versuchen Sie es erneut.",nousLoginTitle:"Nous-Portal-Anmeldung",nousWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein:",nousCopyCode:"Code kopiert",nousOpenLink:"Autorisierungsseite öffnen",nousApproved:"Login erfolgreich",nousDenied:"Autorisierung wurde abgelehnt",nousExpired:"Autorisierung abgelaufen",copilotLoginTitle:"GitHub Copilot Anmeldung",copilotWaiting:"Öffnen Sie GitHub und geben Sie den unten angezeigten Gerätecode ein. Das Fenster schließt sich automatisch nach Genehmigung.",copilotCopyCode:"Code kopiert",copilotOpenLink:"GitHub-Autorisierungsseite öffnen",copilotApproved:"Anmeldung erfolgreich!",copilotDenied:"Autorisierung abgelehnt.",copilotExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",copilotAddDetectedTitle:"GitHub Copilot erkannt",copilotAddDetected:'Auf diesem Rechner wurde ein GitHub Copilot OAuth-Token erkannt. Klicken Sie auf „Hinzufügen", um Copilot in Hermes zu aktivieren.',copilotAddSourceEnv:"Quelle: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Quelle: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Quelle: VS Code Copilot-Erweiterung (apps.json)",copilotDeleteHintEnv:"Dies löscht COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Andere Tools sind nicht betroffen.",copilotDeleteHintGhCli:"Copilot wird aus Hermes ausgeblendet. Ihre gh CLI-Anmeldung bleibt erhalten — `gh auth status` zeigt weiterhin als angemeldet.",copilotDeleteHintAppsJson:"Copilot wird aus Hermes ausgeblendet. Ihre VS Code Copilot-Erweiterung bleibt angemeldet.",customBadge:"BENUTZERDEF.",previewBadge:"VORSCHAU",disabledBadge:"NICHT VERFÜGBAR",disabledTooltip:"Dieses Modell ist für Ihr Konto derzeit nicht verfügbar.",customModelPlaceholder:"Nicht gelistete Modell-ID",customModelHint:"Für vom Provider unterstützte Modelle, die die API nicht zurückgibt; keine Anzeige-Umbenennung. Enter zum Laden.",noProviders:"Keine Anbieter gefunden. Fugen Sie einen benutzerdefinierten Anbieter hinzu, um zu beginnen.",clearVisibleModels:"Auswahl löschen",generalTitle:"Allgemeine Modelle",combinationTitle:"Modell-Ensembles",combinationSubtitle:"MoA-Presets konfigurieren: Referenzmodelle liefern zuerst Perspektiven, danach erstellt ein Aggregatormodell die finale Antwort und Tool-Aufrufe.",combinationPreset:"Preset",combinationName:"Name",combinationAddModel:"Modell-Ensemble hinzufügen",combinationEditModel:"Modell-Ensemble bearbeiten",combinationNewPreset:"Neues Preset",combinationPresetPlaceholder:"z. B. review",combinationAddPreset:"Preset hinzufügen",combinationSetDefault:"Als Standard festlegen",combinationEnabled:"Referenzen aktivieren",combinationReferenceModels:"Referenzmodelle",combinationReferenceModel:"Referenzmodell",combinationAddReference:"Referenzmodell hinzufügen",combinationAggregator:"Aggregatormodell",combinationReferenceTemperature:"Referenztemperatur",combinationAggregatorTemperature:"Aggregatortemperatur",combinationMaxTokens:"Max. Tokens",combinationNotSet:"Nicht festgelegt",combinationSaved:"Modell-Ensemble gespeichert",combinationLoadFailed:"Modell-Ensemble konnte nicht geladen werden",combinationSaveFailed:"Modell-Ensemble konnte nicht gespeichert werden",combinationPresetExists:"Preset existiert bereits",combinationNameRequired:"Namen für das Modell-Ensemble eingeben",combinationNameInvalid:"Der Name darf nur Buchstaben, Zahlen, Unterstriche, Bindestriche und Punkte enthalten",combinationReferenceRequired:"Mindestens ein Referenzmodell hinzufügen",combinationAggregatorRequired:"Aggregatormodell auswählen",auxiliaryTitle:"Hilfsmodelle",auxiliarySubtitle:"Modellüberschreibungen für Nebenaufgaben wie Komprimierung, Vision, Genehmigungen, MCP und Hintergrundwartung.",auxiliaryRefresh:"Aktualisieren",auxiliaryTask:"Aufgabe",auxiliaryTimeout:"Zeitlimit",auxiliaryDownloadTimeout:"Download-Zeitlimit",auxiliaryActions:"Aktionen",auxiliaryDefault:"Standard",auxiliaryCustomEndpoint:"Benutzerdefinierter Endpunkt",auxiliaryProviderAuto:"Automatisch",auxiliaryProviderMain:"Hauptmodell",auxiliaryProviderPlaceholder:"auto, main oder Provider-Key",auxiliaryDownloadShort:"Download",auxiliaryExtraBody:"Extra-Body-JSON",auxiliaryClear:"Zurücksetzen",auxiliarySaved:"Hilfsmodelle gespeichert",auxiliaryLoadFailed:"Hilfsmodelle konnten nicht geladen werden",auxiliarySaveFailed:"Hilfsmodelle konnten nicht gespeichert werden",auxiliaryInvalidExtraBody:"Extra Body muss ein JSON-Objekt sein",auxiliaryTaskCompression:"Komprimierung",auxiliaryTaskVision:"Vision",auxiliaryTaskWebExtract:"Web-Extraktion",auxiliaryTaskSkillsHub:"Skill-Hub",auxiliaryTaskApproval:"Genehmigung",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Titelgenerierung",auxiliaryTaskTriageSpecifier:"Triage-Spezifizierung",auxiliaryTaskKanbanDecomposer:"Kanban-Zerlegung",auxiliaryTaskProfileDescriber:"Profilbeschreibung",auxiliaryTaskCurator:"Kurator",auxiliaryTaskSessionSearch:"Sitzungssuche",auxiliaryTaskFlushMemories:"Erinnerungen schreiben",currentDefault:"Aktueller Standard",defaultShort:"Standard",setDefaultProvider:"Als Standardanbieter festlegen",setDefault:"Als Standard festlegen",builtIn:"Integriert",customType:"Benutzerdefiniert",provider:"Anbieter",contextLength:"Kontextlange",contextLengthPlaceholder:"z.B. 256000 (optional)",apiMode:"API-Modus",local:"Lokal ({host})",selectProviderRequired:"Bitte wahlen Sie einen Anbieter",baseUrlRequired:"Basis-URL ist erforderlich",apiKeyRequired:"API-Schlussel ist erforderlich",modelRequired:"Standardmodell ist erforderlich",enterBaseUrl:"Bitte geben Sie zuerst die Basis-URL ein",unexpectedFormat:"Unerwartetes Antwortformat",foundModels:"{count} Modelle gefunden",fetchFailed:"Abrufen der Modelle fehlgeschlagen",xaiWaiting:"Schließen Sie die Autorisierung auf der geöffneten xAI-Seite ab. Das Fenster schließt sich nach der Freigabe automatisch.",xaiOpenLink:"xAI-Autorisierungsseite öffnen",xaiLoginTitle:"xAI Grok OAuth-Anmeldung",xaiExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",xaiCopyLink:"Autorisierungslink kopieren",xaiApproved:"Anmeldung erfolgreich!",anthropicLoginTitle:"Claude OAuth-Anmeldung",anthropicWaiting:"Schließen Sie die Autorisierung auf der Claude-Seite ab und fügen Sie den zurückgegebenen Code hier ein.",anthropicOpenLink:"Claude-Autorisierungsseite öffnen",anthropicCopyLink:"Autorisierungslink kopieren",anthropicCodePlaceholder:"Autorisierungscode einfügen...",anthropicSubmitCode:"Code senden",anthropicApproved:"Anmeldung erfolgreich!",anthropicExpired:"Die Autorisierung ist abgelaufen. Bitte erneut versuchen.",geminiLoginTitle:"Google Gemini OAuth-Anmeldung",geminiWaiting:"Schließen Sie die Autorisierung auf der geöffneten Google-Seite ab. Das Fenster schließt sich automatisch.",geminiOpenLink:"Google-Autorisierungsseite öffnen",geminiCopyLink:"Autorisierungslink kopieren",geminiApproved:"Anmeldung erfolgreich!",geminiExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",visibilitySelectOne:"Mindestens ein sichtbares Modell behalten",visibilitySaved:"Sichtbare Modelle gespeichert",visibilitySaveFailed:"Sichtbare Modelle konnten nicht gespeichert werden",visibilityHint:"Wirkt sich nur auf Modellauswahl und Modellseite der Web UI aus. Die provider/model-Konfiguration der Hermes CLI wird nicht geändert; Aufrufe verwenden weiterhin die ursprüngliche Modell-ID.",showAllModels:"Alle Modelle anzeigen",searchPlaceholder:"Modelle suchen...",noResults:"Keine Ergebnisse",noModels:"Keine Modelle",removeCustomModel:"Dieses nicht gelistete Modell entfernen",refresh:"Modellliste aktualisieren (config.yaml neu laden)",more:"weitere",models:"Modellliste",manageVisibleModelsFor:"Sichtbare Modelle für {name} verwalten",manageVisibleModels:"Sichtbare Modelle verwalten",getApiKey:"API Key abrufen",count:"Modelle",aliasUseOriginal:"Ursprüngliche ID wiederherstellen",aliasTitleFor:"Anzeigename für {model}",aliasTitle:"Modell-Anzeigename",aliasSaveFailed:"Anzeigename konnte nicht gespeichert werden",aliasPlaceholder:"Leer lassen, um die ursprüngliche Modell-ID zu verwenden",aliasManageFor:"Anzeigenamen für {provider}",aliasManage:"Anzeigenamen",aliasHint:"Ändert nur den Anzeigenamen in der Web UI. Hermes erhält weiterhin die ursprüngliche Modell-ID.",aliasEdit:"Umbenennen",aliasCanonical:"Original-ID: {model}"},profiles:{title:"Profile",create:"Profil erstellen",import:"Importieren",export:"Exportieren",rename:"Umbenennen",delete:"Loschen",switchTo:"Hermes Profile wechseln",switchConfirm:"Dies fuehrt `hermes profile use {name}` aus und aendert das aktive Hermes CLI Profile. Fortfahren?",switchSuccess:'Aktives Hermes Profile ist jetzt "{name}"',switchFailed:"Hermes Profile konnte nicht gewechselt werden. Das Gateway muss eventuell manuell neu gestartet werden.",createSuccess:'Profil "{name}" erstellt',createFailed:"Erstellen des Profils fehlgeschlagen",renameSuccess:"Profil umbenannt",renameFailed:"Umbenennung des Profils fehlgeschlagen",deleteConfirm:'Mochten Sie das Profil "{name}" wirklich loschen?',deleteSuccess:"Profil geloscht",deleteFailed:"Loschen des Profils fehlgeschlagen",exportSuccess:"Profil exportiert",exportFailed:"Exportieren des Profils fehlgeschlagen",importSuccess:"Profil importiert",importFailed:"Importieren des Profils fehlgeschlagen",importSelectFile:"Archivdatei auswahlen",importInvalidFile:"Bitte wahlen Sie ein gultiges Archiv (.tar.gz, .tgz, .gz, .zip)",name:"Profilname",namePlaceholder:"Nur Buchstaben, Zahlen und Bindestriche",nameValidation:"Profilname darf nur Kleinbuchstaben, Zahlen, Unterstriche und Bindestriche enthalten",newName:"Neuer Name",newNamePlaceholder:"Neuen Namen eingeben",cloneFromCurrent:"Aus aktuellem Profil klonen",cloneCleanupNotice:"Beim Klonen werden exklusive Plattform-Anmeldeinformationen (Weixin / Telegram / Slack usw.) automatisch übersprungen, um Konflikte mit dem Quellprofil zu vermeiden",cloneStrippedCredentials:"{count} exklusive Anmeldeinformation(en) entfernt: {list}",cloneDisabledPlatforms:"{count} Plattform(en) deaktiviert: {list}",cloneStrippedConfigCredentials:"{count} eingebettete Anmeldeinformation(en) aus config.yaml entfernt: {list}",archivePath:"Archivpfad",archivePathPlaceholder:"Serverpfad zur Archivdatei",importName:"Profilname (optional)",importNamePlaceholder:"Leer lassen, um den Archivnamen zu verwenden",active:"Aktiv",model:"Modell",gateway:"Gateway",alias:"Alias",provider:"Anbieter",path:"Pfad",skills:"Fahigkeiten",hasEnv:"Hat .env",hasSoulMd:"Hat soul.md",noProfiles:"Keine Profile gefunden. Erstellen Sie eines, um zu beginnen.",avatar:{title:"Eigenes Avatar",customize:"Avatar anpassen",upload:"Bild hochladen",random:"Zufällig erzeugen",reset:"Standard wiederherstellen",hint:"PNG, JPEG oder WebP, maximal 1 MB",invalidType:"Bitte ein PNG-, JPEG- oder WebP-Bild wählen",tooLarge:"Das Avatar-Bild darf höchstens 1 MB groß sein",saveSuccess:"Avatar gespeichert",saveFailed:"Avatar konnte nicht gespeichert werden",resetSuccess:"Standard-Avatar wiederhergestellt",resetFailed:"Standard-Avatar konnte nicht wiederhergestellt werden"},runtime:{activeProfile:"Aktuell: {name}",bridgeWorker:"Bridge-Status",gateway:"Gateway",active:"Aktiv",activeTag:"Aktuell",idle:"Leerlauf",checking:"Prüfung läuft",running:"Läuft",stopped:"Gestoppt",restartGateway:"Gateway neu starten",restartProfile:"Profil neu starten",switchProfile:"Frontend-Profil wechseln",gatewayRestarted:"Gateway neu gestartet: {name}",gatewayRestartFailed:"Gateway-Neustart fehlgeschlagen",profileRestarted:"Profil neu gestartet: {name}",profileRestartFailed:"Profil-Neustart fehlgeschlagen"}},logs:{title:"Protokolle",all:"Alle",searchPlaceholder:"Suchen...",refresh:"Aktualisieren",noEntries:"Keine Protokolleintrage"},settings:{title:"Einstellungen",saved:"Gespeichert",saveFailed:"Speichern fehlgeschlagen",tabs:{display:"Anzeige",account:"Aktuelles Konto",users:"Kontoverwaltung",agent:"Agent",proxy:"Proxy",memory:"Gedachtnis",compression:"Komprimierung",session:"Sitzung",privacy:"Datenschutz",apiServer:"API-Server",models:"Modelle",voice:"Sprache"},display:{streaming:"Streaming-Antworten",streamingHint:"KI-Antworten in Echtzeit anzeigen",compact:"Kompaktmodus",compactHint:"Nachrichtenabstand reduzieren",showReasoning:"Schlussfolgerung anzeigen",showReasoningHint:"Denkprozess des Modells anzeigen",showCost:"Kosten anzeigen",showCostHint:"Token-Nutzung in Antworten anzeigen",inlineDiffs:"Inline-Diffs",inlineDiffsHint:"Codeanderungen inline anzeigen",bellOnComplete:"Abschluss-Signalton",bellOnCompleteHint:"Ton abspielen, wenn die KI fertig ist",notifyOnComplete:"Abschluss-Benachrichtigung",notifyOnCompleteHint:"Systembenachrichtigung anzeigen, wenn die KI fertig ist",notifyOnCompleteMacHint:"Unter macOS Browserbenachrichtigungen in den Systemeinstellungen erlauben.",notifyOnCompleteDenied:"Benachrichtigungsberechtigung wurde verweigert",notifyOnCompleteInsecure:"Browserbenachrichtigungen erfordern HTTPS oder localhost",notifyOnCompleteUnsupported:"Dieser Browser unterstuetzt keine Benachrichtigungen",notifyOnCompleteTest:"Benachrichtigungen aktiviert.",notifyOnCompleteTestButton:"Test",notifyOnCompleteTesting:"Sende Testbenachrichtigung...",notifyOnCompleteTestSent:"Testbenachrichtigung gesendet",notifyOnCompleteTestFailed:"Testbenachrichtigung konnte nicht gesendet werden",busyInputMode:"Eingabemodus bei Beschaftigung",busyInputModeHint:"Eingabe erlauben, wahrend die KI verarbeitet",theme:"Design",themeHint:"Hell, Dunkel oder Systemeinstellung verwenden",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System",chatInputHeight:"Chat-Eingabehöhe",chatInputHeightHint:"Standardhöhe der Chat-Eingabe auf dem Desktop in Pixeln. Mobil bleibt die Höhe automatisch."},agent:{maxTurns:"Maximale Runden",maxTurnsHint:"Maximale Interaktionsrunden pro Konversation",gatewayTimeout:"Gateway-Timeout",gatewayTimeoutHint:"Anfrage-Timeout in Sekunden",restartDrainTimeout:"Neustart-Drain-Timeout",restartDrainTimeoutHint:"Drain-Timeout vor Neustart in Sekunden",toolEnforcement:"Werkzeuferzwingung",toolEnforcementHint:"Ausfuhrungsmodus fur Werkzeugaufrufe steuern",auto:"Automatisch",always:"Immer",never:"Nie"},gatewayAutoStart:{title:"Gateway-Autostart",description:"Legt fest, welche lokalen Hermes-Profile-Gateways die Web UI beim Start startet. Diese Einstellung wird in der Web-UI-Konfiguration gespeichert, nicht in der profile config.yaml.",enabled:"Gateways automatisch starten",enabledHint:"Wenn deaktiviert, startet die Web UI beim Start kein Profile-Gateway automatisch.",management:"Vereinheitlichtes Gateway",managementHint:"Erfordert Hermes Agent 0.17.0 oder neuer. Wenn aktiviert, schreibt die Web UI multiplex_profiles, damit das default gateway alle Profile bedient; andere Profile konnen keine separaten Feishu-, Weixin-, QQBot- oder ahnlichen Messaging-Einstiegspunkte konfigurieren. Beim Deaktivieren wird diese Einstellung entfernt.",managementAuto:"Automatisch",managementPerProfile:"Ein Gateway pro Profil",managementUnified:"Vereinheitlichtes default gateway",mode:"Profilrichtlinie",modeHint:"Alle gefundenen Profile starten oder nur die explizite Einschlussliste.",modeAll:"Alle gefundenen Profile",modeInclude:"Nur eingeschlossene Profile",include:"Eingeschlossene Profile",includeHint:"Kommagetrennte Profilnamen. Im Einschlussmodus startet eine leere Liste keine Profile.",exclude:"Ausgeschlossene Profile",excludeHint:"Kommagetrennte Profilnamen, die nach der Einschluss-/Alle-Richtlinie übersprungen werden.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Gateway-Proxy",description:"Proxy-Umgebungsvariablen fur das ausgewahlte Profil-Gateway festlegen. Anderungen starten das Gateway neu, damit Messaging-Plattformen die neuen Netzwerkeinstellungen verwenden.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Proxy fur HTTPS-Anfragen. Meist der wichtigste Wert.",httpProxy:"HTTP_PROXY",httpProxyHint:"Proxy fur normale HTTP-Anfragen.",allProxy:"ALL_PROXY",allProxyHint:"Fallback-Proxy, wenn kein protokollspezifischer Proxy gesetzt ist.",noProxy:"NO_PROXY",noProxyHint:"Kommagetrennte Hosts oder Domains, die den Proxy umgehen.",save:"Proxy-Einstellungen speichern"},memory:{enabled:"Gedachtnis aktivieren",enabledHint:"KI erlauben, den Konversationskontext zu merken",userProfile:"Benutzerprofil",userProfileHint:"KI erlauben, Benutzereinstellungen zu merken",charLimit:"Zeichenlimit fur Gedachtnis",charLimitHint:"Maximale Zeichen fur MEMORY.md",userCharLimit:"Zeichenlimit fur Benutzerprofil",userCharLimitHint:"Maximale Zeichen fur USER.md"},compression:{enabled:"Komprimierung aktivieren",enabledHint:"Langen Chatverlauf automatisch komprimieren, bevor der Modellkontext uberschritten wird",threshold:"Komprimierungsschwelle",thresholdHint:"Komprimierung starten, wenn geschatzte Token dieses Kontextverhaltnis uberschreiten",targetRatio:"Zielverhaltnis",targetRatioHint:"Zielgroße des Verlaufs nach der Komprimierung als Kontextverhaltnis",protectLastN:"Neueste Nachrichten schutzen",protectLastNHint:"So viele neueste Nachrichten unkomprimiert lassen",protectFirstN:"Erste Nachrichten schutzen",protectFirstNHint:"So viele erste Nachrichten unkomprimiert lassen"},session:{mode:"Zurucksetzungsmodus",modeHint:"Ausloser fur Sitzungszurucksetzung",modeBoth:"Inaktivitat + Geplant",modeIdle:"Nur Inaktivitat",modeDaily:"Nur Geplant",modeNone:"Nie (nur manuell)",idleMinutes:"Inaktivitats-Timeout",idleMinutesHint:"Wartezeit vor automatischer Zurucksetzung (Minuten)",atHour:"Geplante Zurucksetzungszeit",humanOnly:"Nur menschliche Sitzungen anzeigen",humanOnlyHint:"Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",liveMonitorHumanOnly:"Live-Monitor: nur menschliche Sitzungen anzeigen",liveMonitorHumanOnlyHint:"Im Live-Monitor Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",atHourHint:"Sitzung taglich zu dieser Stunde zurucksetzen",requireAuth:"Sitzungsautorisierung",requireAuthHint:"Erfordert Autorisierung für Sitzungsvorgänge",memoryWriteApproval:"Speicherschreibungen pruefen",memoryWriteApprovalHint:"Hermes-Agent-Speicherschreibungen vor dem Speichern zur Freigabe vormerken.",skillsWriteApproval:"Skill-Schreibungen pruefen",skillsWriteApprovalHint:"Hermes-Agent-Skill-Aenderungen vor dem Speichern zur Freigabe vormerken.",writeApprovalTitle:"Ausstehende Schreibfreigaben",writeApprovalDescription:"Freigeben oder ablehnen, was Hermes Agent fuer Speicher und Skills vorgemerkt hat.",writeApprovalRefresh:"Aktualisieren",writeApprovalEmpty:"Keine ausstehenden Schreibvorgaenge.",writeApprovalMemory:"Speicher",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Pruefen",writeApprovalHideDiff:"Ausblenden",writeApprovalNoDiff:"Keine Unterschiede verfuegbar.",writeApprovalLoadFailed:"Ausstehende Schreibvorgaenge konnten nicht geladen werden",writeApprovalDiffFailed:"Schreibdetails konnten nicht geladen werden",writeApprovalActionFailed:"Ausstehender Schreibvorgang konnte nicht bearbeitet werden",writeApprovalApproved:"Schreibvorgang freigegeben",writeApprovalRejected:"Schreibvorgang abgelehnt",writeApprovalApprove:"Freigeben",writeApprovalReject:"Ablehnen",writeApprovalPendingMemoryWrite:"Ausstehender Speichereintrag",writeApprovalCurrentFile:"Aktuelle Datei {file}",writeApprovalProposedFile:"Vorgeschlagene Datei {file}",writeApprovalDiffSection:"Diff",writeApprovalPatchOldStringMissing:"Der old_string des Patches wurde in der aktuellen Datei {file} nicht gefunden; eine Freigabe aendert die Datei nicht.",writeApprovalRequestedOldString:"Angefragter old_string",writeApprovalCurrentReadFailed:"Die aktuelle Datei {file} konnte nicht als UTF-8-Text gelesen werden.",writeApprovalDeleteSkill:"Diese Freigabe loescht den Skill {skill}.",writeApprovalRemoveFile:"Diese Freigabe entfernt {file} aus dem Skill {skill}."},privacy:{redactPii:"Personliche Daten maskieren",redactPiiHint:"Sensible Informationen automatisch erkennen und ausblenden (Passworter, Schlussel usw.)"},apiServer:{enable:"Aktivieren",enableHint:"API-Server aktivieren",host:"Host",hostHint:"Listen-Adresse",port:"Port",portHint:"Listen-Port",key:"Schlussel",keyHint:"API-Zugangsschlussel",cors:"CORS-Ursprunge",corsHint:"Erlaubte Cross-Origin-Quellen"},voice:{activeTtsApi:"Aktive TTS-API",activeSttApi:"Aktive STT-API",ttsProvidersTitle:"TTS-Anbieter",ttsProvidersDescription:"Verwalte Text-zu-Sprache-Integrationen fuer die Wiedergabe von Assistentenantworten und Sprachvorschauen.",sttProvidersTitle:"STT-Anbieter",sttProvidersDescription:"Verwalte Sprache-zu-Text-Integrationen fuer Mikrofon und Spracheingabe.",noneSelected:"Nichts ausgewaehlt",keyStored:"Gespeichert",keyMissing:"Fehlt",customApi:"API",localBuiltin:"Lokal integriert",ttsCardHint:"Sprachsynthese-Anbieter",sttCardHint:"Transkriptionsanbieter",setActive:"Aktiv setzen",testAction:"Testen",connect:"Verbinden",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Kostenlose hochwertige Cloud-Stimmen von Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"Benutzerdefiniertes TTS",presetBrowserSttLabel:"Browser-STT",presetBrowserSttDescription:"Native Spracherkennungs-API des Browsers.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"Benutzerdefiniertes STT",apiCompatibility:"API-Kompatibilitaet",openaiCompatible:"OpenAI-kompatibel",manualCustomEndpoint:"Manueller benutzerdefinierter Endpoint",connectionStep:"Verbindung",discoveryManualHint:"Manueller benutzerdefinierter Endpoint ausgewaehlt. Modell-Erkennung ist nicht verfuegbar; gib den Modellnamen manuell ein.",discoveryCredentialHint:"Gib Base URL und API-Key ein und verbinde dann, um verfuegbare Modelle abzurufen.",discoveryNoAutoProbeHint:"Beim Tippen werden keine Anfragen gesendet. Nutze Connect, wenn die Zugangsdaten bereit sind.",apiKeyConnectPlaceholder:"API-Key zum Verbinden einfuegen; gespeicherte Keys werden nie angezeigt",connectFetchModels:"Verbinden & Modelle abrufen",modelRecommendedSuffix:"empfohlen",modelConnectManualHint:"Zum automatischen Ausfuellen verbinden oder manuell eingeben.",modelRequiredConnectManual:"Modell ist erforderlich. Verbinde zum automatischen Ausfuellen oder gib es manuell ein.",apiKeyRequired:"API-Key ist erforderlich.",apiKeyRequiredForDiscovery:"API-Key ist erforderlich, um Modelle abzurufen.",baseUrlRequired:"Base URL ist erforderlich.",baseUrlHttpsRequired:"Bitte verwende http:// oder https://.",baseUrlInvalid:"Gib eine gueltige Base URL mit https:// ein.",discoveryFailedManualFallback:"Modelle konnten nicht abgerufen werden. Du kannst den Modellnamen weiterhin manuell eingeben.",completeRequiredProviderFields:"Fuellen Sie die erforderlichen Provider-Felder vor dem Speichern aus.",fetchingModels:"Modelle werden abgerufen...",recommendedModel:"Empfohlen: {model}.",useRecommendedModel:"Dieses verwenden.",modelsDiscovered:"{count} Modelle gefunden. Das empfohlene Modell wird ausgewaehlt, wenn das Feld leer ist.",remove:"Entfernen",testSuccess:"Test abgeschlossen",testTextRequired:"Gib vor dem Testen Text ein.",keyMissingForTest:"Fuege vor dem Testen dieses Anbieters einen API-Key hinzu.",testing:"Test laeuft...",transcribing:"Transkription laeuft...",browserSttTestHint:"Browser-STT wird ueber das Chat-Mikrofon getestet.",sttEmptyAudio:"Es wurde kein Audio aufgenommen. Versuche es erneut.",sttTestSuccess:"Transkription abgeschlossen",sttRecordingHint:"Aufnahme laeuft... klicke auf Stoppen, um zu transkribieren.",keepStoredKeyPlaceholder:"Leer lassen, um den gespeicherten Key zu behalten",apiKeyPlaceholder:"API-Key eingeben",lastTest:"Letzter Test",notTested:"—",recording:"Aufnahme",testFailedShort:"Fehlgeschlagen",testFailedSummary:"Test fehlgeschlagen. Pruefe die Anbieter-Einstellungen und versuche es erneut.",showDetails:"Details anzeigen",hideDetails:"Details ausblenden",moreActions:"Mehr",moreActionsFor:"Weitere Aktionen fuer {provider}",addTtsApi:"TTS-API hinzufuegen",addSttApi:"STT-API hinzufuegen",active:"Aktiv",builtin:"Integriert",connected:"Verbunden",disconnected:"Getrennt",source:"Quelle",model:"Modell",voice:"Stimme",doubaoVoiceHint:"Seed TTS 2.0 Stimme auswaehlen; das Resource-Feld wird automatisch angepasst.",apiKey:"API-Key",confirmDeleteSecret:"Gespeicherten API-Key fuer diese Sprach-API loeschen?",ttsTitle:"Text-zu-Sprache",ttsSaved:"TTS-Einstellungen auf dem Server gespeichert",ttsSaveFailed:"TTS-Einstellungen konnten nicht gespeichert werden",ttsTestSaved:"Anhoeren erfolgreich; TTS-Einstellungen auf dem Server gespeichert",ttsTestSaving:"TTS-Einstellungen werden vor dem Anhoeren gespeichert...",ttsMissingBaseUrl:"Base URL ist vor dem Testen erforderlich. Gib einen Anbieter-Endpunkt ein und teste erneut.",ttsMissingApiKey:"API-Key ist vor dem Testen erforderlich. Fuege den Key ein oder speichere zuerst einen serverseitig gespeicherten Key.",ttsCleared:"Gespeicherter TTS-Key geloescht",ttsClearFailed:"Gespeicherter TTS-Key konnte nicht geloescht werden",storedBaseUrlsTitle:"Gespeicherte Base URLs",storedBaseUrlsHint:"Gespeicherte Voice-Provider-Endpoints. Die Felder oben löschen nur den aktuellen Wert; gespeicherte URLs hier löschen.",storedBaseUrlsEmpty:"Keine benutzerdefinierten Voice Base URLs auf dem Server gespeichert.",storedBaseUrlDelete:"URL löschen",storedApiKeysTitle:"Gespeicherte API keys",storedApiKeysHint:"Maskierte Liste der serverseitig gespeicherten Voice-API-Keys. Es werden nur Nutzung und Quelle angezeigt; der vollständige key nie.",storedApiKeysEmpty:"Keine Voice-API keys auf dem Server gespeichert.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Key löschen",baseUrlPresetClear:"URL löschen",baseUrlPresetCleared:"Base-URL aus dem Feld gelöscht.",baseUrlPresetDelete:"URL löschen",baseUrlPresetDeleted:"Base-URL aus der gespeicherten Liste entfernt.",baseUrlPresetDeleteFailed:"Gespeicherte Base-URL konnte nicht entfernt werden.",ttsPendingSecret:"Neuer Key wird gespeichert",ttsStoredSecret:"Server hat einen Key gespeichert: {value}",ttsClearKey:"Gespeicherten Key loeschen",sttTitle:"Sprache-zu-Text",sttProvider:"STT-Anbieter",sttProviderHint:"Waehle, wie Spracheingaben transkribiert werden",sttProviderBrowser:"Browser",sttProviderOpenai:"OpenAI-kompatibel",sttProviderCustom:"Benutzerdefiniert",sttBrowserHint:"Verwende die integrierte Browser-Spracherkennung, wenn verfuegbar.",sttApiKey:"API-Key",sttApiKeyHint:"Serverseitig fuer STT-Anbieter gespeichert, die Authentifizierung benoetigen.",sttStoredSecret:"Gespeicherter Server-Key: {value}",sttPendingSecret:"Gespeicherter Server-Key: wird beim Speichern aktualisiert",sttClearKey:"Gespeicherten Key loeschen",sttModel:"Modell",sttModelHint:"Zu verwendendes Sprache-zu-Text-Modell.",sttLanguage:"Sprache",sttLanguageHint:"Optionaler Sprachhinweis wie en oder zh.",sttPrompt:"Prompt",sttPromptHint:"Optionaler Transkriptions-Prompt.",sttAudioTranscode:"Audio-Transkodierung",sttAudioTranscodeNone:"Originalaudio senden",sttAudioTranscodeFfmpeg:"Mit ffmpeg in WAV konvertieren",sttBaseUrl:"Base URL",sttBaseUrlHint:"Benutzerdefinierter OpenAI-kompatibler Sprache-zu-Text-Endpunkt.",sttSave:"STT-Einstellungen speichern",sttSaved:"STT-Einstellungen auf dem Server gespeichert.",sttSaveFailed:"STT-Einstellungen konnten nicht gespeichert werden.",sttCleared:"Gespeichertes STT-Secret vom Server geloescht.",sttClearFailed:"Gespeichertes STT-Secret konnte nicht geloescht werden.",sttActiveSaved:"Aktiver STT-Anbieter auf dem Server gespeichert.",sttSaveActive:"Aktiven STT-Anbieter speichern",sttEndpointHint:"Finaler Transkriptions-Endpunkt: {endpoint}",sttTestTitle:"Sprache-zu-Text testen",sttTestButton:"STT-API testen",sttTestStopButton:"Stoppen und transkribieren",sttTestBackendOnly:"Der STT-API-Test ist fuer OpenAI-kompatible und benutzerdefinierte Anbieter verfuegbar.",sttTestRecording:"Testaufnahme laeuft... klicke danach auf Stoppen und transkribieren.",sttTestTranscribing:"Testaufnahme wird transkribiert...",sttTestEmpty:"Fuer den STT-Test wurde kein Audio aufgenommen.",sttTestSucceeded:"STT-Test erfolgreich.",sttTestFailed:"STT-Test fehlgeschlagen: {error} — {hint}",sttFailureHintMissingConfig:"Pruefe, ob der Anbieter vor dem Test mit Base URL/Modell und API-Key gespeichert wurde.",sttFailureHintAuth:"Pruefe den API-Key. Wenn bereits ein Key gespeichert war, fuege den aktuellen Key erneut ein und speichere vor dem Test.",sttFailureHintForbidden:"Der Key hat den Anbieter erreicht, hat aber keine Berechtigung fuer dieses STT-Modell oder Konto. Pruefe Zugriff/Abrechnung beim Anbieter.",sttFailureHintEndpointModel:"Pruefe Base URL und Modell. Fuer Groq verwende {endpoint} mit whisper-large-v3-turbo oder einem anderen Groq-STT-Modell.",sttFailureHintModel:"Pruefe, ob das ausgewaehlte STT-Modell existiert und fuer dieses Konto aktiviert ist.",sttFailureHintQuota:"Der Anbieter meldet Probleme mit Kontingent, Abrechnung oder Rate Limit. Pruefe Kontingent/Abrechnung oder versuche es spaeter erneut.",sttFailureHintNetworkCustom:"Der Server konnte den benutzerdefinierten STT-Endpunkt nicht erreichen. Pruefe, ob {endpoint} vom Web-UI-Server aus erreichbar und OpenAI-kompatibel ist.",sttFailureHintNetwork:"Der Web-UI-Server konnte den STT-Anbieter nicht erreichen. Pruefe Netzwerk/Proxy/Firewall und versuche es erneut.",sttFailureHintAudio:"Das aufgenommene Audio war leer oder wurde abgelehnt. Versuche eine kurze, klare Aufnahme, erlaube Mikrofonzugriff oder nutze Chrome.",sttFailureHintGenericCustom:"Pruefe API-Key, Base URL, Modell und den finalen Endpunkt {endpoint}.",sttFailureHintGeneric:"Pruefe API-Key, Modell und Anbieter-Kontozugriff und versuche es erneut.",sttTestRecordFailed:"Mikrofonaufnahme konnte nicht gestartet werden: {error}",sttTestTranscript:"Transkript: {text}",ttsProvider:"TTS-Anbieter",ttsProviderHint:"Waehlen Sie die Sprachsynthese-Engine fuer die Nachrichtenwiedergabe",providerWebSpeech:"WebSpeech API (Browser)",providerOpenai:"OpenAI TTS",providerCustom:"Benutzerdefinierter Endpunkt (OpenAI-kompatibel)",providerEdge:"Edge TTS (Kostenlos, kein API-Key erforderlich)",webspeechVoice:"Stimme",webspeechVoiceHint:"Waehlen Sie eine Stimme aus Ihrem Browser oder Betriebssystem",webspeechVoicePlaceholder:"Auto (Standardstimme)",openaiKey:"API-Key",openaiKeyHint:"Ihr OpenAI API-Key mit TTS-Zugriff",openaiUrl:"API-Basis-URL",openaiUrlHint:"z.B. https://api.openai.com/v1/audio/speech",openaiModel:"Modell",openaiModelHint:"tts-1 (schneller) / tts-1-hd (hoehere Qualitaet)",openaiVoice:"Stimme",openaiVoiceHint:"Stimme fuer die Synthese",customHint:"Jede OpenAI-kompatible TTS-API verwenden — funktioniert mit GPT-SoVITS, CosyVoice, usw.",customUrl:"API-URL",customUrlHint:"Basis-URL Ihres TTS-Dienstes",customUrlPlaceholder:"Die im lokalen Adapter konfigurierte Adresse, z.B. http://127.0.0.1:9880",customApiKey:"API-Key (optional)",customApiKeyHint:"Einige benutzerdefinierte Endpunkte erfordern Authentifizierung",customApiKeyPlaceholder:"Leer lassen wenn nicht benoetigt",edgeHint:"Angetrieben von Microsoft Edge TTS (node-edge-tts).",edgeUrl:"Adapter-URL",edgeUrlHint:"Adresse des Edge TTS-Adapters, z.B. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Stimme",edgeVoiceHint:"Waehlen Sie eine Stimme fuer die Sprachsynthese",edgeRate:"Geschwindigkeit",edgeRateHint:"Sprachgeschwindigkeit anpassen (0,5x ~ 2,0x)",edgePitch:"Tonhöhe",edgePitchHint:"Tonhöhe anpassen (-20 ~ +20 Hz)",testTitle:"Sprachtest",testText:"Testtext",testTextPlaceholder:"Text zum Testen eingeben...",testTextDefault:"Hallo, dies ist ein Sprachtest.",testButton:"Testen",testButtonPlaying:"Wiedergabe...",testFailed:"Test fehlgeschlagen: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — unterstützt Voreingestellte Stimmen, Stimmdesign und Stimmklonung",mimoApiKey:"API-Schluessel",mimoApiKeyHint:"Holen Sie sich Ihren Schluessel auf platform.xiaomimimo.com",mimoApiKeyPlaceholder:"MiMo API-Schluessel",mimoAuthMode:"Authentifizierungsmodus",mimoAuthModeHint:"Header-Format, das der ausgewählte MiMo-Endpunkt erwartet",mimoAuthModeBearer:"Bearer-Token (Authorization)",mimoAuthModeApiKey:"API-key-Header (api-key)",mimoAuthModeBoth:"Beide Header",mimoBaseUrl:"Basis-URL",mimoBaseUrlHint:"MiMo API-Endpunkt-URL",mimoModel:"Modell",mimoModelHint:"Sprachsynthesemodell auswählen",mimoModelPreset:"Voreingestellte Stimmen",mimoModelVoiceDesign:"Stimmdesign",mimoModelVoiceClone:"Stimmklonung",mimoVoice:"Stimme",mimoVoiceHint:"Voreingestellte Stimme auswählen",mimoVoiceDesignPrompt:"Stimmbeschreibung",mimoVoiceDesignPromptHint:"Beschreiben Sie die gewünschten Stimmmerkmale",mimoVoiceDesignPromptPlaceholder:"Z.B.: Eine warme junge Frauenstimme, etwas langsam, mit magnetischem Ton",mimoCloneAudio:"Audio hochladen",mimoCloneAudioHint:"Audio-Beispiel für Stimmklonung hochladen (mp3/wav, max. 10 MB)",mimoCloneAudioUpload:"Datei auswählen",mimoCloneAudioClear:"Löschen",mimoStylePrompt:"Stil-Eingabe",mimoStylePromptHint:"Optional — beschreiben Sie den Sprechstil in natürlicher Sprache",mimoStylePromptPlaceholder:"Z.B.: Heller, lebhafter Ton, schnelles Tempo"},lockedIps:{title:"Gesperrte IPs",count:"{count} gesperrt",empty:"Keine gesperrten IPs",unlock:"Entsperren",unlockAll:"Alle entsperren",unlockAllConfirm:"Alle gesperrten IPs entsperren?",unlocked:"IP entsperrt",allUnlocked:"{count} IPs entsperrt",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"Benutzeravatar",upload:"Bild hochladen",random:"Zufällig generieren",reset:"Auf Standard zurücksetzen",hint:"Unterstützt PNG, JPEG und WebP bis 1 MB; wird automatisch auf unter 500 KB komprimiert.",invalidType:"Bitte wählen Sie ein PNG-, JPEG- oder WebP-Bild aus",tooLarge:"Das Avatarbild darf höchstens 1 MB groß sein",saveSuccess:"Avatar gespeichert",saveFailed:"Avatar konnte nicht gespeichert werden",resetSuccess:"Avatar wurde zurückgesetzt",resetFailed:"Avatar konnte nicht zurückgesetzt werden"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key eingeben",noProviders:"Keine Provider konfiguriert",save:"Speichern",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert"}},githubPreview:{title:"Versionsvorschau",description:"Klont den ausgewählten GitHub-Tag in den Web-UI-Vorschaubereich, installiert Abhängigkeiten und startet ihn mit den Entwicklungsports.",refresh:"Aktualisieren",selectTag:"Tag auswählen",prepare:"Code vorbereiten",install:"Abhängigkeiten installieren",start:"Vorschau starten",stop:"Stoppen",note:"Der Vorschaucode wird im Web-UI-Datenverzeichnis gespeichert. Produktion bleibt auf Port 8648; die Vorschau nutzt Frontend 8651 und Backend 8650.",path:"Vorschaupfad",webuiHome:"Vorschau-Datenverzeichnis",currentTag:"Aktueller Tag",repoReady:"Repository bereit",dependencies:"Abhängigkeiten installiert",running:"Status",notRunning:"Nicht gestartet",open:"Vorschau öffnen",log:"Pfad zum Aktionslog",logOutput:"Logausgabe",actionLog:"Aktionslog",devLog:"Dev-Server-Log",yes:"Ja",no:"Nein",actionFailed:"Aktion fehlgeschlagen",nodeEnvironmentMissing:"Node/npm wurde nicht erkannt. Bitte installiere Node.js und versuche es erneut.",prepareSuccess:"Vorschaucode ist bereit",installSuccess:"Abhängigkeiten installiert",startSuccess:"Vorschau abgeschlossen",stopSuccess:"Vorschau gestoppt"},codingAgents:{title:"Coding Agents",notice:"Nicht alle Anbieter und Modelle sind kompatibel.",claudeDescription:"Anthropic CLI fur einmalige Print-Mode-Aufgaben und interaktive Coding-Sitzungen.",codexDescription:"OpenAI CLI und Hermes openai-codex Anbieter-Flow fur Repository-Aufgaben.",copyCommand:"Kopieren",commandCopied:"Befehl kopiert",commandCopyFailed:"Kopieren fehlgeschlagen",refresh:"Aktualisieren",checking:"Prufen",installStatus:"Installationsstatus",installed:"Installiert",notInstalled:"Nicht installiert",installRequired:"{agent} ist nicht installiert. Installiere es, bevor du eine Sitzung erstellst.",installNow:"Installieren",installing:"Installiere",installSuccess:"Installiert",installFailed:"Installation fehlgeschlagen",installFailedHermesHint:"Installation fehlgeschlagen. Bitte Hermes, es fur dich zu installieren.",installFailureReason:"Grund",nodeEnvironmentMissing:"Node/npm wurde nicht erkannt. Bitte installiere Node.js und versuche es erneut.",deleteNow:"Loschen",deleting:"Losche",deleteSuccess:"Gelöscht",deleteFailed:"Loschen fehlgeschlagen",configFiles:"Konfigurationsdateien",profileScope:"Profil",providerScope:"Anbieter",providerPlaceholder:"z. B. custom:glm",modelScope:"Modell",modelPlaceholder:"Modell auswahlen",launchModeScope:"Startmodus",launchModeGlobal:"Globale Konfiguration",launchModeScoped:"Anbieter und Modell",protocolScope:"Protokoll",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"Konfiguration neu laden",configFileNotCreated:"Nicht erstellt",configLoadFailed:"Konfigurationsdatei konnte nicht gelesen werden",loadFailed:"Coding Agents konnten nicht gepruft werden",launch:"Starten",launchTitle:"Coding Agent starten",nativeTerminal:"Natives Terminal",builtInTerminal:"Integriertes Terminal",launchPrepared:"Startkonfiguration vorbereitet",launchPrepareFailed:"Startkonfiguration konnte nicht vorbereitet werden",nativeLaunchStarted:"Natives Terminal geoffnet",nativeLaunchFailed:"Natives Terminal konnte nicht geoffnet werden",terminalTitle:"Coding-Agent-Terminal",loadProvidersFailed:"Anbieter fur das aktuelle Profil konnten nicht geladen werden",selectProviderModel:"Anbieter und Modell auswahlen",launchConfigDir:"Start-Konfigurationsordner",launchCommand:"Startbefehl",table:{tool:"Tool",kind:"Schritt",command:"Befehl",note:"Hinweis",action:"Aktion"},kinds:{install:"Installation",auth:"Auth",health:"Status",run:"Ausfuhren"},notes:{claudeInstall:"Installiert die Claude Code CLI global.",codexInstall:"Installiert die Codex CLI global.",claudeAuth:"Prüft den Claude Code Login-Status; bei fehlendem Login einmal claude ausfuhren.",codexAuth:"Fugt Hermes-verwaltete OpenAI Codex OAuth-Zugangsdaten hinzu.",claudeHealth:"Prüft Updater und lokale CLI-Gesundheit.",codexHealth:"Bestatigt, dass die Codex CLI im PATH verfugbar ist.",claudeRun:"Print mode ist der sauberste Weg fur API-gesteuerte Einmalaufgaben.",codexRun:"Codex-Einmalaufgaben mussen in einem Git-Repository laufen."}},platform:{requireMention:"Erwahnung {'@'} erfordern",requireMentionGroup:"Erwahnung {'@'} in Gruppen erfordern zum Antworten",requireMentionChannel:"Erwahnung {'@'} in Kanalen erfordern zum Antworten",requireMentionRoom:"Erwahnung {'@'} in Raumen erfordern zum Antworten",reactions:"Reaktionen",reactionsHint:"Auf Nachrichten mit Emoji reagieren",freeResponseChats:"Frei antwortende Chats",freeResponseChatsHint:"Chat-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",freeResponseChannels:"Frei antwortende Kanale",freeResponseChannelsHint:"Kanal-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",freeResponseRooms:"Frei antwortende Raume",freeResponseRoomsHint:"Raum-IDs, die ohne {'@'}Erwahnung antworten (komma-getrennt)",mentionPatterns:"Benutzerdefinierte Erwahnungsmuster",mentionPatternsHint:"Zusatzliche Auslosermuster",autoThread:"Auto-Thread",autoThreadHint:"Automatisch Antwort-Threads nach {'@'}Erwahnung erstellen",autoThreadHintRoom:"Automatisch Antwort-Threads in Raumen erstellen",dmMentionThreads:"DM-Erwahnungs-Threads",dmMentionThreadsHint:"Thread-Antworten fur Erwahnungen in DMs verwenden",allowBots:"Bot-Nachrichten erlauben",allowBotsHint:"Auf Nachrichten von anderen Bots antworten",allowedChannels:"Erlaubte Kanale",allowedChannelsHint:"Whitelist der Kanal-IDs (komma-getrennt)",ignoredChannels:"Ignorierte Kanale",ignoredChannelsHint:"Kanale, in denen der Bot nie antwortet (komma-getrennt)",noThreadChannels:"Thread-lose Kanale",noThreadChannelsHint:"Kanale, in denen der Bot ohne Threads antwortet (komma-getrennt)",exclusiveTokenWarning:"Diese Plattform verwendet einen exklusiven Token-Lock. Jedes Profil muss einen anderen Identitäts-Token verwenden, um Konflikte mit anderen Profilen zu vermeiden.",botToken:"Bot-Token",botTokenHint:"Bot-Token vom Entwicklerportal",proxyUrl:"Proxy-URL",proxyUrlHint:"Optionaler plattformspezifischer Proxy. Unterstutzt http://, https:// und socks5://",accessToken:"Zugangs-Token",accessTokenHint:"Matrix-Zugangs-Token",homeserver:"Homeserver-URL",homeserverHint:"Matrix-Homeserver-URL",matrixUserId:"Matrix-Benutzer-ID",matrixUserIdHint:"Pflicht bei Passwort-Login, optional mit Zugangs-Token",matrixPassword:"Matrix-Passwort",matrixPasswordHint:"Alternative zum Zugangs-Token",appId:"App-ID",appIdHint:"Feishu App-ID",appSecret:"App-Geheimnis",appSecretHint:"Feishu App-Geheimnis",encryptKey:"Verschlüsselungsschlüssel",encryptKeyHint:"Feishu-Verschlüsselungsschlüssel",verificationToken:"Verifizierungs-Token",verificationTokenHint:"Feishu-Verifizierungs-Token",clientId:"Client-ID",clientIdHint:"DingTalk Client-ID",clientSecret:"Client-Geheimnis",clientSecretHint:"DingTalk Client-Geheimnis",cardTemplateId:"KI-Karten-Vorlagen-ID",cardTemplateIdHint:"DingTalk KI-Karten-Vorlagen-ID; leer lassen, um KI-Karten zu deaktivieren",botId:"Bot-ID",botIdHint:"WeCom Bot-ID",wecomSecretHint:"WeCom Bot-Geheimnis",waEnabled:"WhatsApp aktivieren",waEnabledHint:"WhatsApp uber QR-Code-Kopplung aktivieren",weixinToken:"Weixin-Token",weixinTokenHint:"Von Weixin-CLI QR-Anmeldung (hermes weixin)",accountId:"Konto-ID",accountIdHint:"Weixin-Konto-ID",qrLogin:"QR-Anmeldung",qrRelogin:"Erneut anmelden",qrFetching:"QR-Code wird abgerufen...",qrScanHint:"Mit WeChat scannen zum Anmelden",qrScanedHint:"Gescannt, bitte auf dem Gerat bestatigen...",qqSandboxHint:"Sandbox-Umgebung aktivieren (für Tests)",qqSandbox:"Sandbox-Modus",qqQrScanHint:"QR-Code oben mit QQ scannen oder Link auf dem Telefon öffnen, um die Bindung abzuschließen",qqMarkdownHint:"Markdown-formatierte Nachrichten aktivieren (einige Clients unterstützen dies möglicherweise nicht)",qqMarkdown:"Markdown-Unterstützung",qqAppSecretHint:"App Secret des QQ Open Platform Bots",qqAppSecret:"App-Geheimnis",qqAppIdHint:"App-ID des QQ Open Platform Bots",qqAppId:"App-ID",allowedUsersHint:"Whitelist für Benutzer-IDs oder OpenIDs, durch Kommas getrennt",allowedUsers:"Erlaubte Benutzer",allowAllUsersHint:"Nachrichten von beliebigen Benutzern erlauben; deaktiviert lassen, um die Allowlist zu verwenden",allowAllUsers:"Alle Benutzer erlauben"},language:{label:"Sprache",zh:"中文",en:"English",de:"Deutsch"},terminal:{sessions:"Sitzungen",newTab:"Neues Terminal",closeSession:"Diese Sitzung schliessen?",sessionExited:"Beendet",processExited:"Prozess beendet mit Code {code}",noSessions:"Keine Terminal-Sitzungen",connectionFailed:"Terminaldienstverbindung fehlgeschlagen",connectionClosed:"Terminalverbindung geschlossen",connectionError:"Terminalverbindungsfehler"},usage:{title:"Nutzungsstatistiken",refresh:"Aktualisieren",totalTokens:"Gesamt-Tokens",inputTokens:"Eingabe",outputTokens:"Ausgabe",totalSessions:"Gesamt-Sitzungen",avgPerDay:"~{n}/Tag Durchschn.",estimatedCost:"Gesch. Kosten",cacheHitRate:"Cache-Trefferquote",modelBreakdown:"Modellaufschluesselung",dailyTrend:"Tagliche Nutzung",date:"Datum",tokens:"Tokens",cache:"Cache",cacheRead:"Cache gelesen",cacheWrite:"Cache geschrieben",sessions:"Sitzungen",cost:"Kosten",noData:"Keine Nutzungsdaten"},skillsUsage:{title:"Skill-Nutzung",subtitle:"Skill-Ladevorgänge und -Bearbeitungen aus Hermes-Sitzungen verfolgen",refresh:"Aktualisieren",periodSelector:"Zeitraum der Skill-Nutzung",periodLabel:"{days} T",summary:"Zusammenfassung",totalActions:"Aktionen",loads:"Laden",edits:"Änd.",distinctSkills:"Skillzahl",topSkills:"Top-Skills",dailyTrend:"Trend",periodSummary:"Letzte {days} Tage",skill:"Fähigkeit",share:"%",lastUsed:"Zuletzt",noData:"Keine Skill-Nutzungsdaten",loadFailed:"Skill-Nutzung konnte nicht geladen werden",otherSkills:"Andere Skills"},changelog:{new_0_6_25_1:"Behebt execute_code-Fehler mit Hermes Agent 0.18.0, indem der neue Parameter has_host_access durch den Agent-Bridge-Approval-Memory-Wrapper weitergereicht wird",new_0_6_24_1:"Diese Version umfasst die nach 0.6.23 gemergten PRs und verbessert Chat-Eingabe, Workspace-Sichtbarkeit, Plugin-Verwaltung, Standardmodelle und Workspace-Diff-Ansicht",new_0_6_24_2:"Einzel- und Gruppenchat-Eingaben nutzen eine integrierte Toolbar, kompakte Modellsteuerung, gebuendelte Eingabeeinstellungen, klarere Context-Nutzung, stabileres Mobile Chrome und wiederhergestelltes manuelles Resize im Einzelchat",new_0_6_24_3:"Workspace-Run-Aenderungen erscheinen als dauerhafte Chat-Diff-Karten mit rechter Diff-/Editor-Schublade, werden nach Session Resume wiederhergestellt und sind fuer mobile Ansicht angepasst",new_0_6_24_4:"Der Workspace-Ordnerauswahler durchsucht Windows-Laufwerke und Junctions zuverlaessiger und zeigt Dot-Ordner wie .hermes, .config und .codex an, waehrend WORKSPACE_BASE-Pruefungen erhalten bleiben",new_0_6_24_5:"Die Plugins-Seite kann verwaltbare Benutzer-Plugins aktivieren oder deaktivieren und zeigt den kombinierten Status aus Hermes-Basiskonfiguration und aktuellem Profile genauer an",new_0_6_24_6:"Die Models-Seite erhaelt Aktionen fuer Standard-Provider und Standardmodell; Bridge-Terminalfehler erzeugen weniger Fehlalarme, das Hermes-Agent-Runtime-Paket wechselt auf 0.18.0 und das Website-Versionsmanifest wurde aktualisiert",new_0_6_23_1:"Diese Version fasst die seit 0.6.22 gemergten PRs zusammen, mit Updates fuer Desktop-Self-Update, MCP-Cleanup, Petdex-Pets, MCU-Voice und mehrere Einstellungsablaeufe",new_0_6_23_2:"Das Desktop-Self-Update nutzt wieder einen blockierenden Ablauf, Windows beendet Dienste vor Updates zuverlaessiger, und beim Desktop-Exit werden gateway, profile MCP und zugehoerige Kindprozesse vollstaendiger beendet",new_0_6_23_3:"Desktop-MCP-Injection und Coding-Agent-MCP-Startpfade sind stabiler, Windows-Workspaces haben einen Laufwerkswaehler, und Symlink-Ordneranzeige sowie Desktop-Petdex-Previews wurden korrigiert",new_0_6_23_4:"Petdex-Pets unterstuetzen jetzt Web-Pets, ein eigenstaendiges Desktop-Pet-Fenster, sofortige Anzeige nach Adoption, einen Schliessen-Button oben rechts und eine sichtbarere Desktop-Startgroesse",new_0_6_23_5:"MCU- und globale Voice-Ablaeufe enthalten jetzt Audio-Prompts, OTA-Schutz, segmentiertes Streaming-TTS, Bereinigung von Links, Codebloecken und Tabellen vor dem Vorlesen sowie Abort-Handling fuer nicht abgeschlossene TTS-Erzeugung",new_0_6_23_6:"Settings und Workflow-Details wurden erweitert: profile config editing, Chat-Eingabehoehe, Login-JWT-Ablaufzeit, Skill-Editing, erhaltene lokale Archivzustande in History, klarere New-Chat-Drawer-Texte und sicherere Gefahrentexte fuer eingebaute Provider",new_0_6_22_1:"Diese Version fasst die seit 0.6.21 gemergten PRs zusammen, mit Frontend-Updates fuer Kombinationsmodelle, Sitzungsverlauf, Proxy-Einstellungen, Slash-Befehle und mobile Layout-Details",new_0_6_22_2:"Die Modellseite enthaelt jetzt ein Panel fuer Kombinationsmodelle, und der Chat zeigt echte MoA-Referenz- und Aggregator-Fortschritte ohne das alte kuenstliche Platzhalter-Tool",new_0_6_22_3:"Chatsitzungen koennen aus der Sitzungsliste archiviert und im Verlauf wiederhergestellt werden; lokale Claude-Code- und Codex-Sitzungen erscheinen jetzt korrekt im Verlauf",new_0_6_22_4:"Die Einstellungen enthalten jetzt einen Proxy-Tab fuer gateway-weite HTTP(S)-, ALL_PROXY- und NO_PROXY-Werte sowie Plattform-Proxys fuer Telegram, Discord und Matrix",new_0_6_22_5:"Hermes Chat unterstuetzt jetzt den /learn-Befehl, Agent-Bridge-Laeufe nutzen den ausgewaehlten Workspace als cwd, und nur die Desktop-Funktionen fuer /learn- und MoA-Befehle warten auf das naechste Hermes-Agent-Release",new_0_6_21_1:"Diese Version fokussiert Workflow-Reruns, MCP-Workflow-Tools, Voice-Settings-Loeschung, Matrix-Login-Settings, Update-Cleanup und Dokumentation",new_0_6_21_2:"Workflow-Node-Messages oeffnen jetzt links in einem resizable Full-Chat-Drawer; mobile Run-History oeffnet wieder korrekt und Reruns koennen den ausgewaehlten Node behalten oder loeschen",new_0_6_21_3:"Das MCP use Toolset kann jetzt Workflows listen, erstellen, aktualisieren, loeschen, starten, stoppen, Run-Records loeschen und ab einem ausgewaehlten Node rerunnen",new_0_6_21_4:"Voice Provider Removal loescht jetzt die Profile-Provider-Settings statt nur API Keys zu leeren; Browser STT und Edge TTS bleiben geschuetzte eingebaute Defaults",new_0_6_21_5:"Matrix Platform Settings unterstuetzen user ID plus password und erkennen den configured Status korrekt bei Password Login",new_0_6_21_6:"Web UI restart, update und In-App-Upgrade stoppen den Agent Bridge Broker jetzt standardmaessig, damit neue Builds keine alten Python-Bridge-Prozesse wiederverwenden",new_0_6_21_7:"Chat-, Group-Chat- und Workflow-Header sind besser ausgerichtet; Xiao Fang He zeigt sold out; der BSL-Scope ist klarer; /learn Planung ist dokumentiert; alter Hermes Proxy Code wurde entfernt",new_0_6_20_1:"Workflow ist jetzt verfuegbar: Agent Nodes erstellen, zu einem Graph verbinden und den gesamten Flow direkt auf der Workflow-Seite ausfuehren",new_0_6_20_2:"Workflow Runs speichern Run Records, Graph Snapshots, Node Sessions, Live Node Status, Fehlergruende sowie Stop- und Delete-Aktionen",new_0_6_20_3:"Workflow Ansicht und Editing sind kompletter mit Run History, read-only Snapshots, Node Chat Session Review, groesseren Connection Handles und Create-Workflow-First Guard",new_0_6_20_4:"Desktop-Starts lassen agent-browser Chrome ueber AGENT_BROWSER_HOME aufloesen, statt einen veralteten executable path zu pinnen, inklusive Patch-Integrity Guards und Browser-stdout-Fixes",new_0_6_20_5:"Browser-Runtimes pinnen Chrome for Testing 149.0.7827.55 auf unterstuetzten Desktop-Plattformen, um Runtime-Browser-Regressionen zu vermeiden",new_0_6_20_6:"ESP32- und Xiao-Fang-He-Details wurden mit aktualisierten Tutorial-Links, hellerem Badge-Hintergrund und Windows-kompatibler Flow-Animation verbessert",new_0_6_19_1:"Diese Version umfasst 16 PRs seit 0.6.18 und verbessert sichtbar Device-, Voice-, Coding-Agent- und Settings-Erlebnisse",new_0_6_19_2:"Coding-Agent Sessions koennen Modelle wechseln, und neue Sessions folgen nun korrekt dem globalen Default-Modell",new_0_6_19_3:"MCU Interaktionen sind stabiler mit Wi-Fi/boot Debounce beim Start, Audio nur fuer das Zielgeraet und besserem Hardware-Doppelklick zum Leeren und Unterbrechen",new_0_6_19_4:"TTS Einstellungen werden jetzt pro profile gespeichert; Speed, Pitch und Voice Tests lesen dieselbe Konfigurationsquelle",new_0_6_19_5:"Coding-Agent Modellwechsel beeinflussen bestehende Sessions nicht mehr, und custom provider keys werden korrekt weitergegeben",new_0_6_19_6:"Skills runtime Filter, Cron-Job Sortierung, begrenzte Skill-Detail-Hoehe, Windows Updater Recovery, Backup Fallbacks und komprimierte Logo Assets runden das Update ab",new_0_6_18_2:"Hermes Studio MCP ist in fokussierte api-, devices- und use-Toolsets aufgeteilt, mit neuen Session-, Modell-, Chat-Run- und Ops-Aktionen",new_0_6_18_3:"Chat- und Gruppenchat-Historien sind zuverlaessiger durch getrennte UI-Historie, sichere Null-Message-Behandlung, erhaltene Assistant-Antworten nach run failures und abgestimmtes Reasoning-Replay",new_0_6_18_4:"MCU-Device-Feedback ist klarer: Tool Calls bleiben vor Sprache sichtbar, Audio markiert Aufgaben nicht mehr zu frueh als fertig, Active-Device-Login ist stabiler und lange ONLINE/IP-Texte scrollen",new_0_6_18_5:"Voice- und Message-Workflows erhalten eigene HTTP TTS/STT-Endpunkte, Audio-Transcoding, Fork-Message-Aktionen, persistente Fork-Marker und klarere Upload-Fehler",new_0_6_18_6:"Desktop- und Runtime-Setup sind sicherer mit Unicode-sicherer Windows-PATH-Registrierung, Hermes Agent 0.17.0 Runtime-Publishing, mobiler PWA-Metadata und mehreren Profile/Auth-Recovery-Fixes",new_0_6_18_7:"Feinschliff und Detailverbesserungen in der gesamten App",new_0_6_17_1:"Probleme beim Starten von Codex- und Claude-Code-Unterhaltungen wurden behoben",new_0_6_16_1:"Provider-Einstellungen speichern jetzt eigene API-Modes, decken LongCat korrekt ab, unterstuetzen das Loeschen von v12-Providern und halten Modellkataloge mit Auth- und API-Key-Bildprovidern synchron",new_0_6_16_2:"Chat-Befehle erhalten reload-skills, Web-Titelupdates, Durchreichen unbekannter Slash-Befehle und eine saubere Session-Context-API ohne Tool Calls und Tool Results",new_0_6_16_3:"Sitzungsnavigation ist stabiler mit Global-Agent-Ergebnissen in der Suche, Sortierung neuer Sitzungen nach letzter Aktivitaet, wiederhergestellten mobilen Seitenleisten-Controls und stabilem Settings-Footer",new_0_6_16_4:"Dateien lassen sich leichter nutzen: vollstaendige Workspace-Namen erscheinen beim Hover, und Drag-and-drop-Uploads funktionieren im Einzel- und Gruppenchatbereich",new_0_6_16_5:"Plattform-Einstellungen enthalten jetzt lokalisierte Feishu-Webhook-Prueffelder und vollstaendigere Lokalisierung",new_0_6_16_6:"Skill-Discovery folgt jetzt symlinked Skill-Verzeichnissen, sodass gemeinsam genutzte lokale Skills konsistent erscheinen",new_0_6_16_7:"Grosse statische Assets umgehen dynamische Brotli-Kompression und verbessern die Auslieferung der paketierten Web UI unter Last",new_0_6_16_8:"Outbound Relay und MCU-Login-Flows sind fuer Connector-Integrationen verfuegbar",new_0_6_16_9:"Die Web UI CLI erhaelt ein --no-open Flag fuer Skripte und Headless-Starts",new_0_6_16_10:"Linux-Desktop-Viewport-Groesse und Live-Kompressionsstatuszeilen wurden fuer ein stabileres Layout verfeinert",new_0_6_15_1:"Chat-Seitenleisten wurden neu gestaltet, und die Historien-Ladecontrols machen lange Unterhaltungen leichter navigierbar",new_0_6_15_2:"Der Skill-Command-Picker hilft, verfuegbare Skill-Befehle schneller zu finden und aus dem Chat-Eingabefeld einzufuegen",new_0_6_15_3:"Claude- und Gemini-OAuth-Provider sind verfuegbar, Gemini-Modell-IDs werden korrekt normalisiert, und Modellauswahlen koennen config.yaml-Aenderungen manuell neu laden",new_0_6_15_4:"Thinking-Zustaende haben einen neuen Indikator und ein aufgeraeumtes Toolbar-Layout, damit Reasoning-Fortschritt leichter lesbar bleibt",new_0_6_15_5:"Input- und Select-Raender sind im Dark Theme wieder sichtbar",new_0_6_15_6:"Runtime-Setup prueft jetzt zuerst die lokale Runtime, bevor Download-Quellen angezeigt werden, und haelt den Pruefstatus waehrend des Starts sichtbar",new_0_6_15_7:"Desktop-Self-Updates blockieren nicht mehr an alten App-Prozessen, und Windows-Gateway-Cleanup beim Beenden ist vollstaendiger",new_0_6_15_8:"Verwaltete Gateways werden beim App-Shutdown gestoppt; waehrend verwalteter Runtime-Sitzungen koennen unerwartet beendete Gateways weiter neu starten",new_0_6_15_9:"Der Desktop-Server beendet sich beim Quit sauberer und reduziert verwaiste Backend-, Bridge- und Gateway-Prozesse",new_0_6_15_10:"README und Website-Showcase nutzen jetzt ein animiertes Walkthrough-GIF, waehrend der Website-Hero ein separates statisches Vorschaubild verwendet",new_0_6_13_1:"Alibaba Coding Plan enthaelt jetzt das Modellpreset qwen3.7-plus",new_0_6_13_2:"Die Dateiverarbeitung ist sicherer, mit Pfadvalidierung fuer literal Punkte und Ablehnung fehlerhaft codierter Skill-Import-Dateinamen",new_0_6_13_3:"Der Chat ist auf Mobilgeraeten und in Browsern ohne speech synthesis stabiler",new_0_6_13_4:"Agent-Fehler behalten nun das Bridge-Fehlerende bei, und Claude-Code-Starts mit Root-Berechtigung sind verlaesslicher",new_0_6_13_5:"Desktop-Updates sind verlaesslicher: Windows-Upgrades schliessen alte Hermes-Studio-Prozesse, pruefen zuerst Cloudflare und behalten GitHub als Fallback-Feed",new_0_6_13_6:"Die Release-Automatisierung markiert Web-UI- und Docker-Releases nicht mehr als GitHub Latest; vollstaendige Desktop-Releases werden nach erfolgreichem manuellem Build zu Latest gemacht"},files:{title:"Dateien",tree:"Verzeichnisbaum",list:"Dateiliste",breadcrumbRoot:"Start",newFile:"Neue Datei",newFolder:"Neuer Ordner",upload:"Hochladen",refresh:"Aktualisieren",open:"Offnen",edit:"Bearbeiten",preview:"Vorschau",download:"Herunterladen",copyPath:"Pfad kopieren",rename:"Umbenennen",delete:"Loschen",name:"Name",size:"Grosse",modified:"Geandert",actions:"Aktionen",emptyDir:"Leeres Verzeichnis",loading:"Wird geladen...",confirmDelete:'Mochten Sie "{name}" wirklich loschen?',confirmDeleteDir:'Mochten Sie das Verzeichnis "{name}" und seinen gesamten Inhalt wirklich loschen?',deleteFailed:"Loschen fehlgeschlagen",deleted:"Geloscht",renameTo:"Umbenennen in",newFileName:"Dateiname",newFolderName:"Ordnername",created:"Erstellt",createFailed:"Erstellen fehlgeschlagen",renamed:"Umbenannt",renameFailed:"Umbenennen fehlgeschlagen",uploadSuccess:"{count} Datei(en) hochgeladen",uploadFailed:"Hochladen fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert",unsavedChanges:"Sie haben ungespeicherte Anderungen. Verwerfen?",pathCopied:"Pfad kopiert",fileTooLarge:"Datei zu gross (max. 10 MB)",permissionDenied:"Geschutzte Datei kann nicht geandert werden",notFound:"Datei oder Verzeichnis nicht gefunden",backendError:"Dateioperation fehlgeschlagen",dragDropHint:"Dateien hierher ziehen, um sie hochzuladen",closeEditor:"Editor schliessen",closePreview:"Schliessen",saveFile:"Speichern",fileTree:"Dateibaum"},groupChat:{title:"Gruppenchat",createRoom:"Raum erstellen",joinByCode:"Mit Code beitreten",roomName:"Raumname",roomNamePlaceholder:"Raumnamen eingeben",inviteCode:"Einladungscode",autoGenerate:"Automatisch generieren",noRooms:"Noch keine Raume",selectOrCreate:"Wahlen oder erstellen Sie einen Raum, um zu chatten",agents:"Agenten",addAgent:"Agent hinzufugen",selectProfile:"Wahlen Sie ein Profil",agentAdded:"Agent hinzugefugt",selectRoomFirst:"Bitte wählen Sie zuerst einen Raum",agentAlreadyInRoom:"Agent ist bereits in diesem Raum",agentAddFailedCount:"{count} Agent(en) wurden nicht hinzugefugt: {details}",noAgents:"Keine Agenten in diesem Raum",members:"Mitglieder",roomCreated:"Raum erstellt",roomDeleted:"Raum gelöscht",roomCloned:"Raum geklont",cloneRoom:"Raum klonen",copyRoomLink:"Raumlink kopieren",deleteRoomConfirm:"Diesen Raum löschen?",clearContext:"Kontext löschen",clearContextConfirm:"Diesen Raumkontext löschen? Nachrichten und Komprimierungs-Snapshots werden entfernt, Agenten und Mitglieder bleiben.",contextCleared:"Kontext gelöscht",you:"Du",joined:"Raum beigetreten",joinFailed:"Beitreten fehlgeschlagen",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden)",messageDisplayLimit:"Der Gruppenchat zeigt maximal 600 Nachrichten an",enterCode:"Einladungscode eingeben",yourName:"Dein Name",yourNamePlaceholder:"Gib deinen Anzeigenamen ein",yourDescription:"Beschreibung (optional)",yourDescriptionPlaceholder:"Erzahl anderen wer du bist...",agentName:"Agent-Name",agentNamePlaceholder:"Benutzerdefinierter Name (leer = Profilname)",agentDesc:"Agent-Beschreibung",agentDescPlaceholder:"Beschreiben Sie, was dieser Agent tut...",agentReplying:"antwortet...",agentCompressing:"komprimiert Kontext...",compressionSettings:"Komprimierungseinstellungen",triggerTokens:"Trigger-Token",triggerTokensDesc:"Token-Schwelle für Kontextkomprimierung",maxHistoryTokens:"Max. Verlaufs-Token",maxHistoryTokensDesc:"Maximale Token für komprimierten Kontext",tailMessageCount:"Nachrichten am Ende",tailMessageCountDesc:"Anzahl der letzten Nachrichten, die unverändert bleiben",compressionConfig:"Komprimierungskonfig",compressNow:"Jetzt komprimieren",compressingInProgress:"Komprimierung läuft, bitte warten",compressionSaved:"Konfiguration gespeichert"},download:{downloading:"Wird heruntergeladen...",downloadFailed:"Download fehlgeschlagen",fileNotFound:"Datei nicht gefunden oder geloscht",fileTooLarge:"Datei zu gross (Limit uberschritten)",backendError:"Lesen der Datei fehlgeschlagen, Remote-Umgebung moglicherweise nicht verfugbar",backendTimeout:"Zeituberschreitung beim Lesen der Datei",unsupportedBackend:"Aktuelles Terminal-Backend unterstutzt keine Datei-Downloads",invalidPath:"Ungultiger Dateipfad",contentDisplay:"Inhalt anzeigen",download:"Herunterladen",downloadFile:"Datei herunterladen"},gateways:{title:"Gateways",running:"Läuft",stopped:"Gestoppt",started:"Gestartet",startFailed:"Gateway konnte nicht gestartet werden",stopFailed:"Gateway konnte nicht gestoppt werden"},workflow:{title:"Workflow",profile:"Profil",namePlaceholder:"Workflow-Name",workspace:{title:"Workspace auswählen",select:"Workspace auswählen",clear:"Workspace leeren"},actions:{newWorkflow:"New Workflow",addNode:"Add Node",createWorkflowFirst:"Please create a workflow first",reset:"Reset",startExecution:"Start Execution",executionPending:"Workflow execution is not connected yet",executionStarted:"Workflow execution started",executionCompleted:"Workflow execution completed",executionFailed:"Workflow execution failed",rerunDownstreamKeepNode:"Diesen Knoten behalten und abwärts ausführen",rerunDownstreamClearNode:"Diesen Knoten löschen und abwärts ausführen",rerunDownstreamStarted:"Abwärts-Neuausführung gestartet",rerunFromNodeStarted:"Neuausführung ab diesem Knoten gestartet",rerunFailed:"Workflow konnte nicht erneut ausgeführt werden",deleteNode:"Delete Node",deleteEdge:"Delete Connection"},batch:{toggle:"Batch selection",selectAll:"Select all",confirmDelete:"Delete {count} selected workflows?",deleteSuccess:"Deleted {count} workflows",deletePartial:"{failed} workflows failed to delete",deleteFailed:"Batch delete failed"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Node name",agent:"Agent",model:"Model",apiMode:"API-Modus",input:"Input",promptPlaceholder:"Describe what this agent should do...",skillsPlaceholder:"Skills, mit Enter hinzufügen",uploadImages:"Bilder hochladen"},status:{idle:"Leerlauf",queued:"Wartet",running:"Läuft",completed:"Abgeschlossen",failed:"Fehlgeschlagen",canceled:"Abgebrochen"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Selected Node",none:"No node selected"},stats:{nodes:"Nodes",edges:"Links"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Default Model",fast:"Fast Model",reasoning:"Reasoning Model"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Enter this node input.",node2:"Enter this node input.",node3:"Enter this node input.",plan:"Break the request into actionable steps.",execute:"Run the implementation steps and produce artifacts.",review:"Review output quality and identify follow-up work."},newNodeTitle:"Node {count}"},kanban:{title:"Kanban-Board",createTask:"Neue Aufgabe",noTasks:"Keine Aufgaben",allStatuses:"Alle Status",allAssignees:"Alle Verantwortlichen",columns:{triage:"Sichtung",todo:"Zu erledigen",scheduled:"Geplant",ready:"Bereit",running:"In Arbeit",blocked:"Blockiert",review:"Review",done:"Erledigt",archived:"Archiviert"},card:{assigneeTooltip:"Verantwortlicher",priority:{low:"Niedrig",medium:"Mittel",high:"Hoch"},timeAgo:{justNow:"gerade eben",minutes:"vor {count} Min.",hours:"vor {count} Std.",days:"vor {count} Tg."}},board:{create:"Neues Board",archive:"Board archivieren",archiveConfirm:"Aktuelles Board archivieren?",archived:"Board archiviert",created:"Board erstellt",slugPlaceholder:"Board-Kennung, z. B. project-a",namePlaceholder:"Anzeigename (optional)",slugRequired:"Board-Kennung ist erforderlich"},form:{title:"Titel",titlePlaceholder:"Aufgabentitel",titleRequired:"Titel ist erforderlich",body:"Beschreibung",bodyPlaceholder:"Aufgabenbeschreibung (optional)",assignee:"Verantwortlicher",selectAssignee:"Verantwortlichen wählen...",priority:"Priorität",selectPriority:"Priorität wählen...",tenant:"Mandant",tenantPlaceholder:"Mandant (optional)",workspace:"Workspace",workspaceScratch:"Temporärer Workspace",workspaceDir:"Verzeichnis verwenden",workspaceWorktree:"Worktree verwenden",workspacePath:"Workspace-Pfad",workspacePathPlaceholder:"Absoluter Pfad (optional)",branch:"Branch",branchPlaceholder:"Worktree-Branch",skills:"Skills",skillsPlaceholder:"Skills auswählen...",triage:"In Sichtung erstellen",goalMode:"Zielmodus",maxRuntime:"Max. Laufzeit",maxRuntimePlaceholder:"z. B. 30m, 2h",maxRetries:"Max. Wiederholungen",maxRetriesPlaceholder:"Anzahl der Wiederholungen",goalMaxTurns:"Max. Ziel-Turns",goalMaxTurnsPlaceholder:"Maximale Turns"},detail:{status:"Status",priority:"Priorität",assignee:"Verantwortlicher",tenant:"Mandant",createdAt:"Erstellt",startedAt:"Gestartet",completedAt:"Abgeschlossen",comments:"Kommentare",events:"Ereignisse",runs:"Ausführungen",artifacts:"Artefakte",result:"Ergebnis",highlights:"Highlights",sources:"Datenquellen",sessions:"Zugehörige Sitzungen",sessionMessages:"Sitzungsnachrichten",noSessions:"Keine zugehörigen Sitzungen gefunden.",noLog:"Kein Log für diese Aufgabe gefunden.",addComment:"Kommentar hinzufügen",commentPlaceholder:"Aufgabenkommentar schreiben...",operations:"Operationen"},action:{title:"Aktionen",assign:"Zuweisen",assignTo:"Zuweisen an...",block:"Blockieren",blockReason:"Blockierungsgrund",unblock:"Blockierung aufheben",complete:"Abschließen",completeSummary:"Abschlusszusammenfassung (optional)",dispatch:"Dispatch",recoveryReason:"Wiederherstellungsgrund (optional)",reclaim:"Zurückholen",reassign:"Neu zuweisen",specify:"Spezifizieren",loadLog:"Log laden",loadDiagnostics:"Diagnose laden"},message:{loadFailed:"Aufgabe konnte nicht geladen werden",taskCreated:"Aufgabe erstellt",taskAssigned:"Aufgabe zugewiesen",taskBlocked:"Aufgabe blockiert",taskUnblocked:"Blockierung aufgehoben",taskCompleted:"Aufgabe abgeschlossen",dispatchNudged:"Dispatcher angestoßen",commentAdded:"Kommentar hinzugefügt",taskReclaimed:"Aufgabe zurückgeholt",taskReassigned:"Aufgabe neu zugewiesen",taskSpecified:"Aufgabe spezifiziert"},stats:{total:"Gesamt",tasks:"Aufgaben"}}},Mr={login:{title:"Hermes Web UI",description:"Insira seu nome de usuario e senha para continuar.",placeholder:"Token de acesso",submit:"Entrar",tokenRequired:"Por favor, insira seu token de acesso",invalidToken:"Token invalido",connectionFailed:"Nao foi possivel conectar ao servidor",passwordLogin:"Senha",tokenLogin:"Token",usernamePlaceholder:"Nome de usuario",passwordPlaceholder:"Senha",defaultCredentialsHint:"Nome de usuario padrao: admin. Senha padrao: 123456.",credentialsRequired:"Por favor, insira nome de usuario e senha",invalidCredentials:"Nome de usuario ou senha incorretos",tooManyAttempts:"Muitas tentativas falhadas, por favor tente novamente mais tarde",lockResetHint:"Se este for seu servidor, limpe o bloqueio de login com:",defaultLoginResetHint:"Para redefinir a senha admin padrao, execute:",sessionExpired:"Login expirado. Entre novamente.",accessDenied:"Voce nao tem permissao para acessar este recurso.",passwordMismatch:"As senhas nao conferem",passwordTooShort:"A senha deve ter pelo menos 6 caracteres",setupSuccess:"Login por senha configurado com sucesso",passwordChanged:"Senha alterada com sucesso",passwordRemoved:"Login por senha removido",setupPassword:"Configurar login por senha",changePassword:"Alterar senha",changeUsername:"Alterar nome de usuario",removePasswordLogin:"Remover",username:"Nome de usuario",currentPassword:"Senha atual",newPassword:"Nova senha",confirmPassword:"Confirmar senha",newUsername:"Novo nome de usuario",usernameChanged:"Nome de usuario alterado com sucesso",usernameTooShort:"O nome de usuario deve ter pelo menos 2 caracteres",setupDescription:"Gerencie o nome de usuario e a senha usados para entrar.",removeConfirm:"Login por senha e obrigatorio para contas de usuario.",passwordLoginNotConfigured:"Login por senha nao configurado",passwordLoginConfigured:"Conta atual: {username}",defaultCredentialTitle:"Altere a conta e senha padrao",defaultCredentialMessage:"A conta atual ainda usa o nome de usuario ou a senha padrao. Para evitar acesso nao autorizado, altere o nome de usuario e a senha da conta atual o quanto antes.",defaultCredentialAction:"Alterar agora",defaultCredentialLater:"Lembrar depois"},users:{title:"Gerenciamento de contas",description:"Crie usuarios, atribua funcoes e controle quais perfis administradores comuns podem acessar.",create:"Criar usuario",edit:"Editar usuario",username:"Nome de usuario",role:"Funcao",statusLabel:"Status",profiles:"Perfis acessiveis",profilesPlaceholder:"Selecione perfis acessiveis",allProfiles:"Todos os perfis",noProfiles:"Nenhum perfil atribuido",lastLogin:"Ultimo login",newPasswordOptional:"Nova senha (deixe em branco para manter)",loadFailed:"Falha ao carregar usuarios",deleteConfirm:"Excluir este usuario?",enable:"Ativar",disable:"Desativar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Ativo",disabled:"Desativado"}},common:{loading:"Carregando...",cancel:"Cancelar",retry:"Tentar novamente",reset:"Redefinir",delete:"Excluir",edit:"Editar",save:"Salvar",saved:"Salvo",update:"Atualizar",create:"Criar",saveFailed:"Falha ao salvar",deleteFailed:"Falha ao excluir",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sem dados",fetch:"Buscar",add:"Adicionar",enable:"Ativar",disable:"Desativar",configured:"Configurado",notConfigured:"Nao configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Recolher",stop:"Parar",start:"Iniciar",expired:"Expirado"},mcp:{title:"Servidores MCP",loadFailed:"Falha ao carregar servidores MCP",reloadAll:"Recarregar todos",refresh:"Atualizar",total:"Total",connected:"Conectado",disconnected:"Desconectado",tools:"ferramentas",tool:"Ferramentas",searchPlaceholder:"Pesquisar servidores...",addServer:"+ Adicionar servidor",zeroTools:"0 ferramentas",loading:"Carregando...",empty:"Nenhum servidor MCP configurado",reloaded:"{server} recarregado",reloadedAll:"Todos os servidores MCP recarregados",reloadFailed:"Falha ao recarregar",serverAdded:'Servidor "{name}" adicionado',addFailed:"Falha ao adicionar servidor",serverUpdated:'Servidor "{name}" atualizado',updateFailed:"Falha ao atualizar servidor",saveFailed:"Falha ao salvar",serverRemoved:'"{name}" removido',enabled:"Habilitado: {name}",disabled:"Desabilitado: {name}",connectedStatus:"Conectado",disconnectedStatus:"Desconectado",disabledStatus:"Desativado",toolList:"Lista de ferramentas",count:" ",more:"mais",removeFailed:"Falha ao remover servidor",testOk:"Teste OK — {count} ferramentas disponiveis",testEmpty:"O teste nao retornou ferramentas",testFailed:"Falha no teste",edit:"Editar",test:"Testar",reload:"Recarregar",remove:"Remover",confirmRemove:'Remover servidor "{name}"?',cancel:"Cancelar",add:"Adicionar",save:"Salvar",addTitle:"Adicionar servidor MCP",editTitle:"Editar servidor MCP",invalidJson:"JSON inválido",invalidYaml:"Formato YAML inválido",invalidConfig:"Configuração inválida",invalidServerConfig:"Configuração do servidor inválida",missingCommandOrUrl:"Deve conter command ou url",manageTools:"Gerenciar ferramentas",toolsVisibilityTitle:"Gerenciamento de visibilidade de ferramentas",fetchTools:"Obter lista de ferramentas",fetchToolsFailed:"Falha ao obter lista de ferramentas",toolsMode:"Modo:",toolsModeAll:"Todas",toolsModeInclude:"Incluir",toolsModeExclude:"Excluir",toolsListHeader:"Nome da ferramenta",toolsEmpty:"Nenhuma ferramenta disponível, obtenha a lista de ferramentas primeiro",toolsSummaryAll:"{count} ferramentas no total, todas habilitadas",toolsSummaryInclude:"{total} ferramentas no total, {count} selecionadas",toolsSummaryExclude:"{total} ferramentas no total, {count} excluídas",toolsVisibilitySaved:"Visibilidade das ferramentas salva",toolsSelectAll:"Selecionar tudo",toolsClearSelection:"Limpar seleção",toolsExcludeAll:"Excluir tudo",toolsClearExcluded:"Limpar exclusões"},sidebar:{chat:"Chat",backToChat:"Voltar",search:"Pesquisar",apiRelay:"API Relay",history:"Historico",jobs:"Tarefas agendadas",models:"Modelos",profiles:"Perfis",plugins:"Plugins",mcp:"MCP",petdex:"Pets",skills:"Habilidades",memory:"Memoria",logs:"Logs",usage:"Uso",performance:"Desempenho",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",singleChat:"Chat",globalAgent:"Global Agent",files:"Arquivos",devices:"Dispositivos",groupChat:"Chat em grupo",groupConversation:"Conversa",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoramento",groupMonitoringShort:"Mon.",settings:"Configuracoes",connected:"Conectado",disconnected:"Desconectado",updateTip:'Execute "hermes-web-ui update" no terminal para atualizar',updateVersion:"Atualizar para v{version}",reloadClientVersion:"Recarregar para v{version}",updating:"Atualizando...",updateSuccess:"Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.",updateFailed:"Falha na atualizacao",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel",versionManagement:"Gerenciamento de versões",kanban:"Kanban",workflow:"Workflow",groupTools:"Ferramentas",groupToolsShort:"Ferr.",codingAgents:"Agentes de código",versionPreview:"Prévia de versão",groupPlatform:"Plataforma",gateways:"Gateways",expand:"Expandir menu",collapse:"Recolher menu"},runtimeVersions:{title:"Gerenciamento de versões",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Plataforma",currentWebUi:"Web UI atual",activeVersion:"Versão ativa",active:"Ativa",installed:"Instalada",download:"Baixar",downloadGithub:"Baixar do GitHub",downloadCf:"Baixar do Cloudflare",github:"GitHub",cf:"Cloudflare",useVersion:"Usar na próxima reinicialização",deleteVersion:"Excluir",deleteRuntimeConfirm:"Excluir Hermes Runtime {version}?",deleteWebUiConfirm:"Excluir Web UI {version}?",deleteRuntimeSuccess:"Runtime excluído",deleteWebUiSuccess:"Web UI excluído",refresh:"Atualizar",noVersions:"Nenhuma versão disponível",remoteLoadFailed:"Falha ao carregar versões remotas",downloadTasks:"Tarefas de download",downloadStarted:"Download iniciado",activateSuccess:"Seleção de versão salva. Reinicie o Hermes Studio para usá-la.",jobStatus:{queued:"Na fila",running:"Em execução",completed:"Concluída",failed:"Falhou"},jobStageStatus:{queued:"Na fila",resolve:"Resolvendo",download:"Baixando",verify:"Verificando",extract:"Extraindo",install:"Instalando",completed:"Concluída",failed:"Falhou"},jobStage:{queued:"Na fila",download:"Baixando",resolveRuntime:"Resolvendo pacote Runtime",verifyRuntime:"Verificando arquivo Runtime",extractRuntime:"Extraindo arquivo Runtime",installRuntime:"Instalando Runtime",resolveWebUi:"Resolvendo pacote Web UI",verifyWebUi:"Verificando arquivo Web UI",extractWebUi:"Extraindo arquivo Web UI",installWebUi:"Instalando Web UI",completed:"Concluída",failed:"Falhou"}},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Última varredura: {time}",refresh:"Atualizar",empty:"Nenhum dispositivo encontrado",computer:"Computador",endpointLabel:"Ponto de acesso",statusLabel:"Estado",online:"Online",offline:"Offline",address:"Endereço",os:"Sistema operacional",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Latência",lastSeen:"Visto por último",open:"Abrir",never:"Nunca",unknown:"Desconhecido",loadFailed:"Falha ao carregar dispositivos",scanFailed:"Falha ao escanear dispositivos",updateFailed:"Falha ao atualizar dispositivo",duplicateRequest:"Já existe uma solicitação de pareamento pendente",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Processado",unprocessed:"Não processado",deleteHistory:"Excluir registro",deleteHistoryConfirm:"Excluir este registro de solicitação e revogar o acesso de conexão deste dispositivo?",requests:"Solicitações",requestsWithCount:"Solicitações ({count})",noRequests:"Nenhuma solicitação",requestPairing:"Solicitar pareamento",paired:"Pareado",approve:"Aprovar",reject:"Rejeitar",block:"Bloquear",unblock:"Desbloquear",inboundStatus:{none:"Pode solicitar",pending:"Pendente",approved:"Aprovado",rejected:"Rejeitado",blocked:"Bloqueado"},outboundStatus:{none:"Não pareado",pending:"Solicitado",approved:"Pareado",rejected:"Rejeitado",blocked:"Bloqueado"},endpoint:{web:"Web",desktop:"Aplicativo desktop",custom:"Personalizado"}},performance:{title:"Desempenho",subtitle:"Monitore recursos do sistema, Bridge Broker, Workers e sessões ativas",refresh:"Atualizar",autoRefreshOn:"Atualização automática",autoRefreshOff:"Atualização manual",loadFailed:"Falha ao carregar métricas de desempenho",systemCpu:"CPU do sistema",systemMemory:"Memória do sistema",activeSessions:"Sessões ativas",runningSessions:"Em execução {count}",workers:"Workers",totalWorkerMemory:"Memória total de Worker",processes:"Processos",uptime:"Tempo ativo",running:"Em execução",stopped:"Parado",workerMemory:"Memória de Worker",lastUpdated:"Atualizado",profile:"Profile",memory:"Memória",sessions:"Sessões",runningActiveSessions:"Em execução / Ativas",lastUsed:"Último uso",status:"Status",noWorkers:"Nenhum Worker",sessionsByProfile:"Sessões por Profile",noActiveSessions:"Nenhuma sessão ativa"},drawer:{terminal:"Terminal",files:"Espaço de trabalho"},chat:{contextRemaining:"restante",contextClickToEdit:"Clique para editar o tamanho do contexto",contextEditTitle:"Editar tamanho do contexto",contextEditDesc:"Definir o limite de tamanho do contexto para o modelo atual (em tokens)",contextEditPlaceholder:"Digite o tamanho do contexto",contextEditHint:"Valores comuns: 256k (Hermes padrão), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Salvar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor, insira um tamanho de contexto válido",contextEditSuccess:"Tamanho do contexto atualizado",contextEditFailed:"Falha na atualização",emptyState:"Inicie uma conversa com o Hermes Agent",emptyStateAgent:"Inicie uma conversa com {agent}",viewOlderInHistory:"Ver mensagens anteriores no historico",scrollToBottom:"Rolar ate o fim",outlineTitle:"Esboço da conversa",outlineEmpty:"Nenhum conteúdo da conversa",outlineUserQuestion:"Pergunta do usuário",inputPlaceholder:"Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)",inputHeightResizeHint:"Arraste para ajustar a altura da caixa de chat e clique duas vezes para redefinir.",slashCommandArgs:{message:"<mensagem>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular o uso da sessão atual",status:"Mostrar status da sessão e fila",abort:"Parar a execução ativa do Bridge",queue:"Enfileirar uma mensagem após a execução ativa",learn:"Aprender uma skill reutilizável a partir de fontes descritas",plan:"Escrever um plano de implementação em Markdown",goal:"Set a standing goal that continues across turns",goalStatus:"Show the active goal status",goalPause:"Pause the active goal loop",goalResume:"Resume the paused goal loop",goalDone:"Complete and clear the active goal",goalClear:"Clear the active goal",subgoal:"Add a criterion to the active goal",clear:"Limpar a visualização atual",clearHistory:"Excluir o histórico de mensagens salvo desta sessão",title:"Renomear esta sessão",compress:"Executar compressão de contexto quando ocioso",steer:"Enviar texto de orientação para a execução ativa do Bridge",destroy:"Liberar o Bridge Agent desta sessão",reloadMcp:"Recarregar servidores MCP",reloadSkills:"Recarregar comandos de skills"},attachFiles:"Anexar arquivos",reasoningEffort:{tooltip:"Esforço de raciocínio",defaultLabel:"Padrão",options:{default:"Padrão (config.yaml)",none:"Nenhum",minimal:"Mínimo",low:"Baixo",medium:"Médio",high:"Alto",xhigh:"Ultra"}},showToolCalls:"Mostrar chamadas de ferramentas",hideToolCalls:"Ocultar chamadas de ferramentas",messageQueue:"Fila de mensagens",removeQueuedMessage:"Remover mensagem da fila",stop:"Parar",send:"Enviar",contextUsed:"Contexto utilizado:",sessions:"Sessoes",webUiSessions:"Sessões",allProfiles:"Todos os perfis",profileMissingModelsTip:'O perfil "{profile}" não tem provider ou modelo disponível para esta sessão',sessionScopeHint:"O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.",openHistory:"Abrir histórico",hermesHistory:"Histórico Hermes",historyScopeHint:"Sessões do histórico Hermes do perfil atual, somente leitura, agrupadas por origem.",noSessions:"Sem sessoes",newChat:"Novo chat",agent:"Agent",approvalKicker:"Permissão do terminal",approvalTitle:"Revisar comando antes de executar",approvalAgree:"Concordar",approvalAllowOnce:"Permitir uma vez",approvalAllowSession:"Permitir sessão",approvalAlways:"Sempre",approvalDeny:"Negar",clarifyKicker:"Agente precisa de esclarecimento",clarifyTitle:"O agente tem uma pergunta para você",clarifyPlaceholder:"Digite sua resposta...",clarifySubmit:"Responder",clarifyDismiss:"Descartar",deleteSession:"Excluir esta sessao?",toggleBatchMode:"Seleção em lote",selectAll:"Selecionar tudo",confirmBatchDelete:"Excluir {count} sessões selecionadas?",batchDeleteSuccess:"{count} sessões excluídas",batchDeletePartial:"{failed} sessões falharam ao excluir",batchDeleteFailed:"Falha na exclusão em lote",importToWebUi:"Importar para Web UI",importSessionSuccess:"Sessão importada para Web UI",importSessionAlreadyExists:"A sessão já existe no Web UI",importSessionFailed:"Falha ao importar sessão",sessionDeleted:"Sessao excluida",rename:"Renomear",archiveSession:"Arquivar",unarchiveSession:"Desarquivar",pin:"Fixar",unpin:"Desafixar",pinned:"Fixadas",chatMode:"Modo de chat",liveMode:"Ao vivo",liveSessions:"Sessões ao vivo",recentBadge:"Recente",linkedSessions:"{count} vinculadas",noVisibleMessages:"Nenhuma mensagem visível para humanos.",monitorRoleUser:"Usuário",monitorRoleAssistant:"Assistente",copySessionLink:"Copiar link da sessão",openSessionInNewTab:"Abrir em nova aba",sessionLinkCopied:"Session link copied",copySessionId:"Copiar ID da sessão",export:"Exportar",editConfig:"Editar configuração",exportFull:"Exportação completa (JSON)",exportCompressed:"Exportação comprimida (TXT)",exportCompressing:"Comprimindo contexto, aguarde...",exportSuccess:"Sessão exportada",exportFailed:"Falha ao exportar",renamed:"Renomeado",renameFailed:"Falha ao renomear",sessionArchived:"Sessão arquivada",archiveSessionFailed:"Falha ao arquivar sessão",sessionUnarchived:"Sessão desarquivada",unarchiveSessionFailed:"Falha ao desarquivar sessão",renameSession:"Renomear sessao",sessionNotFound:"Sessao nao encontrada",enterNewTitle:"Digite um novo titulo",other:"Outro",runFailed:"Falha na execucao",error:"Erro",tool:"Ferramenta",arguments:"Argumentos",result:"Resultado",workspaceChanges:"Alterações do workspace",changedFiles:"{files} arquivos alterados",diffUnavailable:"Diff indisponível",binaryFileDiffUnavailable:"Diff indisponível para arquivos binários",truncated:"... (truncado)",unchangedLines:"{count} linhas inalteradas",executionDuration:"Tempo de execução",thinkingLabel:"Raciocínio",thinkingInProgress:"Pensando",thinkingShow:"Mostrar raciocínio",thinkingHide:"Ocultar raciocínio",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensagem",copiedBubble:"Mensagem copiada",copyFailed:"Falha ao copiar",playSpeech:"Reproduzir voz",pauseSpeech:"Pausar",resumeSpeech:"Retomar",stopSpeech:"Parar",speechNotSupported:"Reprodução de voz não suportada neste navegador",searchEnterHint:"Enter para abrir · Esc para fechar",searchHint:"Cmd/Ctrl+K",searchScope:"Escopo da busca: apenas banco local de sessões da Web UI; sessões históricas Hermes somente leitura não são incluídas.",searchFailed:"Falha ao pesquisar sessões",searchNoSnippet:"Nenhum resumo disponível",searchNoResults:"Nenhuma sessão corresponde à busca",searchRecent:"Sessão recente",searchEmpty:"Sessões recentes",searchPlaceholder:"Pesquisar sessões...",searchSubtitle:"Pesquisar por título ou conteúdo da mensagem",searchTitle:"Pesquisar sessões",stopGateway:"Parar gateway",start:"Iniciar",workspaceSetFailed:"Falha ao definir workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Digite o caminho do projeto, ex. /home/user/project",folderPickerEmpty:"(Vazio)",folderPickerNoFolders:"Nenhuma pasta de workspace",folderPickerSelected:"Selecionado:",workspace:"Área de trabalho",setWorkspaceTitle:"Definir workspace da sessão",setWorkspace:"Definir workspace",modelSetFailed:"Falha ao definir modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo da sessão",setModel:"Definir modelo",newCliChat:"Novo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproduzir voz automaticamente",voiceInput:{startCapture:"Iniciar entrada por voz",stopCaptureAndInsert:"Parar entrada por voz e inserir a transcricao",cancelCapture:"Cancelar entrada por voz",statusLabel:"Status: {status}",transcriptLabel:"Transcricao: {text}",errorLabel:"Erro: {error}",recentEvents:"Eventos recentes",status:{idle:"Ocioso",capturing:"Ouvindo",transcribing:"Transcrevendo",sending:"Inserindo na entrada",error:"Erro"},browserSpeechUnsupported:"O reconhecimento de voz do navegador nao e suportado neste navegador.",browserSpeechFailed:"O reconhecimento de voz do navegador falhou.",browserSpeechFailedWithReason:"O reconhecimento de voz do navegador falhou: {error}.",microphoneUnsupported:"A captura do microfone nao e suportada neste navegador.",microphoneRecordingFailed:"A gravacao do microfone falhou."}},jobs:{title:"Tarefas agendadas",createJob:"Criar tarefa",editJob:"Editar tarefa",noJobs:"Nenhuma tarefa agendada ainda. Crie uma para comecar.",sortBy:"Ordenar",sortByName:"Por nome",sortByTime:"Por data",sortByNameHint:"Ordenar por nome",sortByTimeHint:"Ordenar por data",sortAsc:"Ascendente",sortDesc:"Descendente",name:"Nome",namePlaceholder:"Nome da tarefa",schedule:"Agendamento (expressao Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Selecionar um preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"A cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos os dias as 00:00",presetEveryDay9:"Todos os dias as 09:00",presetEveryMonday:"Toda segunda as 09:00",presetEveryMonth:"Dia 1 de cada mes as 09:00",prompt:"Prompt",promptPlaceholder:"O prompt a executar",skills:"Skills",skillsPlaceholder:"Selecionar skills...",deliverTarget:"Destino de entrega",origin:"Origem",local:"Local",repeatCount:"Contagem de repeticoes (opcional)",modelPlaceholder:"Modelo padrao",repeatPlaceholder:"Deixar vazio para infinito",jobCreated:"Tarefa criada",jobUpdated:"Tarefa atualizada",nameRequired:"O nome e obrigatorio",scheduleRequired:"O agendamento e obrigatorio",loadFailed:"Falha ao carregar a tarefa",jobPaused:"Tarefa pausada",jobResumed:"Tarefa retomada",jobTriggered:"Job acionado",modelUpdated:"Modelo atualizado",jobDeleted:"Tarefa excluida",status:{running:"Em execucao",paused:"Pausada",disabled:"Desativada",scheduled:"Agendada"},info:{model:"Modelo",schedule:"Agendamento",lastRun:"Ultima execucao",nextRun:"Proxima execucao",deliver:"Entrega",repeat:"Repeticao"},action:{pause:"Pausar",pauseJob:"Pausar tarefa",resume:"Retomar",resumeJob:"Retomar tarefa",runNow:"Executar agora",triggerImmediately:"Acionar imediatamente"},runHistory:{title:"Histórico",runs:"execuções",noRuns:"Nenhum histórico encontrado."}},skills:{title:"Habilidades",targetFilter:"Runtime",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Buscar habilidades...",noMatch:"Nenhuma habilidade corresponde a sua busca",noSkills:"Nenhuma habilidade encontrada",backTo:"Voltar para",attachedFiles:"Arquivos anexados",loadFailed:"Falha ao carregar a habilidade",fileLoadFailed:"Falha ao carregar o arquivo",modified:"Modificado pelo usuário",archived:"Arquivado",pinned:"Fixado",pin:"Fixar habilidade",unpin:"Desfixar habilidade",pinFailed:"Falha ao alterar estado de fixacao",edit:"Editar",saving:"Salvando...",editorLabel:"Editor de skill",saveSuccess:"Habilidade salva",saveFailed:"Falha ao salvar habilidade",toggleFailed:"Falha ao ativar/desativar a habilidade",source:{builtin:"Integrado",hub:"Hub",local:"Local",external:"Externo"},delete:"Excluir",deleteConfirm:'Excluir a habilidade "{name}"? Esta ação não pode ser desfeita.',deleteSuccess:"Habilidade excluída",deleteFailed:"Falha ao excluir",import:"Importar",importTitle:"Importar habilidade",importModeZip:"Zip",importModeFolder:"Pasta",importHintZip:"Envie um .zip contendo um diretório com SKILL.md",importHintFolder:"Selecione uma pasta local (deve conter SKILL.md)",importTargetCategory:"Categoria alvo (opcional)",importTargetCategoryPlaceholder:"Vazio para colocar em misc",importSelectFile:"Escolher arquivo .zip",importSelectFolder:"Escolher pasta",importInvalidFile:"Apenas arquivos .zip são suportados",importFileCount:"arquivos",importNoSelection:"Selecione um arquivo ou pasta primeiro",importSuccess:"Habilidade importada",importFailed:"Falha ao importar",path:{local:"Local",external:"Externo"},externalDirs:{manage:"Diretórios externos",title:"Gerenciar diretórios externos",hint:"Gerencia config.skills.external_dirs. Suporta ~ e $VAR; caminhos inexistentes ficam em cinza.",add:"Adicionar diretório",placeholder:"/path/to/skills ou ~/my-skills",empty:"Nenhum diretório externo",missing:"Caminho não encontrado",notDir:"Não é um diretório",saveSuccess:"Diretórios externos salvos",saveFailed:"Falha ao salvar",loadFailed:"Falha ao carregar diretórios externos",removeRow:"Remover"},pathCopied:"Caminho copiado",pathCopyFailed:"Falha ao copiar o caminho",reloadHint:"Sessões ativas: execute /reload-skills; novas sessões carregam automaticamente.",writeApprovalButton:"Pendentes {count}",writeApprovalTitle:"Escritas pendentes de revisao",writeApprovalDescription:"Aprove ou rejeite escritas de memoria e skills preparadas pelo Hermes Agent.",writeApprovalRefresh:"Atualizar",writeApprovalEmpty:"Nenhuma escrita pendente.",writeApprovalUnsupported:"Esta versao do Hermes Agent nao suporta revisao de escritas. Atualize o Hermes Agent para usar este recurso.",writeApprovalMemory:"Memoria",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Revisar",writeApprovalHideDiff:"Ocultar",writeApprovalNoDiff:"Nenhuma diferenca disponivel.",writeApprovalLoadFailed:"Falha ao carregar escritas pendentes",writeApprovalDiffFailed:"Falha ao carregar detalhes da escrita",writeApprovalActionFailed:"Falha ao resolver escrita pendente",writeApprovalApproved:"Escrita aprovada",writeApprovalRejected:"Escrita rejeitada",writeApprovalApprove:"Aprovar",writeApprovalReject:"Rejeitar",writeApprovalPendingMemoryWrite:"Escrita de memoria pendente",writeApprovalCurrentFile:"Arquivo atual {file}",writeApprovalProposedFile:"Arquivo proposto {file}",writeApprovalDiffSection:"Diferenca",writeApprovalPatchOldStringMissing:"O old_string do patch nao foi encontrado no arquivo atual {file}; aprovar nao alterara o arquivo.",writeApprovalRequestedOldString:"old_string solicitado",writeApprovalCurrentReadFailed:"O arquivo atual {file} nao pode ser lido como texto UTF-8.",writeApprovalDeleteSkill:"Esta aprovacao exclui o skill {skill}.",writeApprovalRemoveFile:"Esta aprovacao remove {file} do skill {skill}."},plugins:{title:"Plugins",refresh:"Atualizar",notice:"Inventário dos manifests de plugins Hermes detectáveis. Os metadados de descoberta são lidos sem carregar código de plugin. Plugins de usuário standalone podem ser ativados ou desativados aqui; mudanças entram em vigor em novas sessões Hermes.",loadFailed:"Falha ao carregar plugins",updateFailed:"Falha ao atualizar plugin",enableSuccess:"{name} ativado",disableSuccess:"{name} desativado",commandCopied:"Comando copiado",searchPlaceholder:"Buscar key, nome, descrição, caminho...",source:"Origem",kind:"Tipo",statusTitle:"Status",configStatus:"config: {status}",notAvailable:"n/a",copyCommand:"Copiar comando",managedElsewhere:"gerenciado em outro lugar",noMatch:"Nenhum plugin corresponde aos filtros atuais",enabled:"ativado",disabled:"desativado",summary:{total:"Total",active:"Ativado / auto",inactive:"Inativo",disabled:"Desativado",providerManaged:"Gerenciado por provider"},status:{enabled:"Ativado","auto-active":"Autoativo",inactive:"Inativo",disabled:"Desativado","provider-managed":"Gerenciado por provider"},statusLabel:{enabled:"Ativado por configuração","auto-active":"Autoativo",inactive:"Inativo",disabled:"Desativado","provider-managed":"Gerenciado por provider"},configStatuses:{enabled:"ativado",disabled:"desativado","not-enabled":"não ativado",auto:"auto","provider-managed":"gerenciado por provider"},table:{plugin:"Plugin",status:"Status",source:"Origem",kind:"Tipo",capabilities:"Capacidades",path:"Caminho / entrypoint",manage:"Gerenciar"},capabilities:{tools:"{count} ferramentas",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Raiz do agente",python:"Python",scanCwd:"Verificar cwd",projectPlugins:"Plugins do projeto"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Memoria",refresh:"Atualizar",loadFailed:"Falha ao carregar a memoria",myNotes:"Minhas notas",noNotes:"Nenhuma nota ainda.",notesPlaceholder:"Escreva suas notas...",userProfile:"Perfil do usuario",noProfile:"Nenhum perfil ainda.",profilePlaceholder:"Escreva seu perfil...",soul:"Alma",noSoul:"Nenhuma configuracao de alma ainda.",soulPlaceholder:"Escreva a configuracao da alma..."},models:{title:"Modelos",addProvider:"Adicionar provedor",refreshModelCache:"Atualizar cache de modelos",refreshModelCacheLoading:"Atualizando cache de modelos...",refreshModelCacheSuccess:"Cache de modelos atualizado",refreshModelCacheFailed:"Falha ao atualizar cache de modelos",providerType:"Tipo de provedor",preset:"Predefinição",custom:"Personalizado",selectProvider:"Selecionar provedor",chooseProvider:"Escolha um provedor...",name:"Nome",autoGeneratedName:"Gerado automaticamente pela URL base",baseUrl:"URL base",region:"Região",regionIntl:"Internacional",regionCn:"China Continental",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Chave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo padrao",selectOrInput:"Selecionar ou digitar um modelo...",selectModel:"Selecionar um modelo...",providerAdded:"Provedor adicionado",providerDeleted:"Provedor excluido",providerCredentialsCleared:"Credenciais do provedor limpas",clearProviderCredentials:"Limpar credenciais",clearCredentialsConfirm:'Limpar as credenciais salvas de "{name}"? Este provedor integrado continuara listado e podera ser usado novamente apos configurar credenciais.',disableProvider:"Desativar provedor",disableProviderConfirm:'Desativar o provedor integrado "{name}"? Ele continuara integrado e podera ser reativado depois.',providerDisabled:"Provedor desativado",defaultProviderUpdated:"Provedor padrao atualizado",defaultProviderUpdateFailed:"Falha ao atualizar o provedor padrao",defaultModelUpdated:"Modelo padrao atualizado",defaultModelUpdateFailed:"Falha ao atualizar o modelo padrao",deleteProvider:"Excluir provedor",deleteConfirm:'Tem certeza de que deseja excluir "{name}"?',codexLoginTitle:"Login do OpenAI Codex",codexWaiting:"Digite este código na página de autorização para fazer login:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorização",codexApproved:"Login bem-sucedido",codexExpired:"A autorização expirou. Por favor, tente novamente.",nousLoginTitle:"Login do Nous Portal",nousWaiting:"Insira este código na página de autorização:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorização",nousApproved:"Login bem-sucedido",nousDenied:"Autorização negada",nousExpired:"Autorização expirada",copilotLoginTitle:"Login do GitHub Copilot",copilotWaiting:"Abra o GitHub e insira o código do dispositivo abaixo para autorizar. A janela fechará automaticamente após a aprovação.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir a página de autorização do GitHub",copilotApproved:"Login bem-sucedido!",copilotDenied:"Autorização negada.",copilotExpired:"O link de autorização expirou. Tente novamente.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Foi detectado um token OAuth do GitHub Copilot nesta máquina. Clique em Adicionar para ativar o Copilot no Hermes.",copilotAddSourceEnv:"Origem: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origem: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origem: extensão Copilot do VS Code (apps.json)",copilotDeleteHintEnv:"Isto irá limpar o COPILOT_GITHUB_TOKEN em ~/.hermes/.env. Outras ferramentas não são afetadas.",copilotDeleteHintGhCli:"O Copilot ficará oculto no Hermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.",copilotDeleteHintAppsJson:"O Copilot ficará oculto no Hermes. A extensão Copilot do VS Code continuará conectada.",customBadge:"PERSONALIZADO",previewBadge:"PRÉVIA",disabledBadge:"INDISPONÍVEL",disabledTooltip:"Este modelo não está disponível para sua conta.",customModelPlaceholder:"ID de modelo não listado",customModelHint:"Para modelos compatíveis com o provedor que a API não retorna; não é uma renomeação de exibição. Enter para carregar.",noProviders:"Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.",clearVisibleModels:"Limpar seleção",generalTitle:"Modelos gerais",combinationTitle:"Conjuntos de modelos",combinationSubtitle:"Configure presets MoA: modelos de referencia fornecem perspectivas primeiro, depois um modelo agregador produz a resposta final e as chamadas de ferramentas.",combinationPreset:"Preset",combinationName:"Nome",combinationAddModel:"Adicionar conjunto de modelos",combinationEditModel:"Editar conjunto de modelos",combinationNewPreset:"Novo preset",combinationPresetPlaceholder:"ex.: review",combinationAddPreset:"Adicionar preset",combinationSetDefault:"Definir como padrao",combinationEnabled:"Ativar referencias",combinationReferenceModels:"Modelos de referencia",combinationReferenceModel:"Modelo de referencia",combinationAddReference:"Adicionar modelo de referencia",combinationAggregator:"Modelo agregador",combinationReferenceTemperature:"Temperatura das referencias",combinationAggregatorTemperature:"Temperatura do agregador",combinationMaxTokens:"Maximo de tokens",combinationNotSet:"Nao definido",combinationSaved:"Conjunto de modelos salvo",combinationLoadFailed:"Falha ao carregar conjunto de modelos",combinationSaveFailed:"Falha ao salvar conjunto de modelos",combinationPresetExists:"O preset ja existe",combinationNameRequired:"Informe um nome para o conjunto de modelos",combinationNameInvalid:"O nome so pode conter letras, numeros, sublinhados, hifens e pontos",combinationReferenceRequired:"Adicione pelo menos um modelo de referencia",combinationAggregatorRequired:"Selecione um modelo agregador",auxiliaryTitle:"Modelos auxiliares",auxiliarySubtitle:"Substituições de modelo para tarefas auxiliares como compressão, visão, aprovações, MCP e manutenção em segundo plano.",auxiliaryRefresh:"Atualizar",auxiliaryTask:"Tarefa",auxiliaryTimeout:"Tempo limite",auxiliaryDownloadTimeout:"Tempo limite de download",auxiliaryActions:"Ações",auxiliaryDefault:"Padrão",auxiliaryCustomEndpoint:"Endpoint personalizado",auxiliaryProviderAuto:"Automático",auxiliaryProviderMain:"Modelo principal",auxiliaryProviderPlaceholder:"auto, main ou chave do provedor",auxiliaryDownloadShort:"download",auxiliaryExtraBody:"JSON do corpo extra",auxiliaryClear:"Redefinir",auxiliarySaved:"Modelos auxiliares salvos",auxiliaryLoadFailed:"Falha ao carregar modelos auxiliares",auxiliarySaveFailed:"Falha ao salvar modelos auxiliares",auxiliaryInvalidExtraBody:"O corpo extra deve ser um objeto JSON",auxiliaryTaskCompression:"Compressão",auxiliaryTaskVision:"Visão",auxiliaryTaskWebExtract:"Extração web",auxiliaryTaskSkillsHub:"Hub de habilidades",auxiliaryTaskApproval:"Aprovação",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Geração de título",auxiliaryTaskTriageSpecifier:"Especificador de triagem",auxiliaryTaskKanbanDecomposer:"Decomposição Kanban",auxiliaryTaskProfileDescriber:"Descrição de perfil",auxiliaryTaskCurator:"Curador",auxiliaryTaskSessionSearch:"Busca de sessões",auxiliaryTaskFlushMemories:"Gravar memórias",currentDefault:"Padrão atual",defaultShort:"Padrão",setDefaultProvider:"Definir como provedor padrao",setDefault:"Definir como padrao",builtIn:"Integrado",customType:"Personalizado",provider:"Provedor",contextLength:"Tamanho do contexto",contextLengthPlaceholder:"ex: 256000 (opcional)",apiMode:"Modo da API",local:"Local ({host})",selectProviderRequired:"Por favor, selecione um provedor",baseUrlRequired:"A URL base e obrigatoria",apiKeyRequired:"A chave API e obrigatoria",modelRequired:"O modelo padrao e obrigatorio",enterBaseUrl:"Por favor, insira a URL base primeiro",unexpectedFormat:"Formato de resposta inesperado",foundModels:"{count} modelos encontrados",fetchFailed:"Falha ao buscar os modelos",xaiWaiting:"Conclua a autorização na página xAI aberta. A janela será fechada automaticamente após a aprovação.",xaiOpenLink:"Abrir página de autorização xAI",xaiLoginTitle:"Login OAuth xAI Grok",xaiExpired:"O link de autorização expirou. Tente novamente.",xaiCopyLink:"Copiar link de autorização",xaiApproved:"Login concluído!",anthropicLoginTitle:"Login OAuth Claude",anthropicWaiting:"Conclua a autorização no Claude e cole aqui o código retornado.",anthropicOpenLink:"Abrir página de autorização Claude",anthropicCopyLink:"Copiar link de autorização",anthropicCodePlaceholder:"Cole o código de autorização...",anthropicSubmitCode:"Enviar código",anthropicApproved:"Login concluído!",anthropicExpired:"A autorização expirou. Tente novamente.",geminiLoginTitle:"Login OAuth Google Gemini",geminiWaiting:"Conclua a autorização na página Google aberta. A janela será fechada automaticamente.",geminiOpenLink:"Abrir página de autorização Google",geminiCopyLink:"Copiar link de autorização",geminiApproved:"Login concluído!",geminiExpired:"O link de autorização expirou. Tente novamente.",visibilitySelectOne:"Mantenha pelo menos um modelo visível",visibilitySaved:"Modelos visíveis salvos",visibilitySaveFailed:"Falha ao salvar modelos visíveis",visibilityHint:"Afeta apenas o seletor de modelos e a página de modelos da Web UI. A configuração provider/model da Hermes CLI não é alterada; as chamadas ainda usam o ID original do modelo.",showAllModels:"Mostrar todos os modelos",searchPlaceholder:"Pesquisar modelos...",noResults:"Sem resultados",noModels:"Sem modelos",removeCustomModel:"Remover este modelo não listado",refresh:"Atualizar lista de modelos (recarregar config.yaml)",more:"mais",models:"Lista de modelos",manageVisibleModelsFor:"Gerenciar modelos visíveis de {name}",manageVisibleModels:"Gerenciar modelos visíveis",getApiKey:"Obter API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nome exibido de {model}",aliasTitle:"Nome exibido do modelo",aliasSaveFailed:"Falha ao salvar nome exibido",aliasPlaceholder:"Deixe vazio para usar o ID original do modelo",aliasManageFor:"Nomes exibidos de {provider}",aliasManage:"Nomes exibidos",aliasHint:"Altera apenas o nome exibido na Web UI. O Hermes ainda recebe o ID original do modelo.",aliasEdit:"Renomear",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfis",create:"Criar perfil",import:"Importar",export:"Exportar",rename:"Renomear",delete:"Excluir",switchTo:"Trocar Hermes Profile",switchConfirm:"Isto executara `hermes profile use {name}` e alterara o active profile do Hermes CLI. Continuar?",switchSuccess:'Hermes active profile alterado para "{name}"',switchFailed:"Falha ao trocar Hermes Profile. O gateway pode precisar de reinicio manual.",createSuccess:'Perfil "{name}" criado',createFailed:"Falha ao criar o perfil",renameSuccess:"Perfil renomeado",renameFailed:"Falha ao renomear o perfil",deleteConfirm:'Tem certeza de que deseja excluir o perfil "{name}"?',deleteSuccess:"Perfil excluido",deleteFailed:"Falha ao excluir o perfil",exportSuccess:"Perfil exportado",exportFailed:"Falha ao exportar o perfil",importSuccess:"Perfil importado",importFailed:"Falha ao importar o perfil",importSelectFile:"Selecionar arquivo de arquivo",importInvalidFile:"Por favor, selecione um arquivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nome do perfil",namePlaceholder:"Apenas letras, numeros e hifens",nameValidation:"O nome do perfil só pode conter letras minúsculas, números, sublinhados e hifens",newName:"Novo nome",newNamePlaceholder:"Digite um novo nome",cloneFromCurrent:"Clonar do perfil atual",cloneCleanupNotice:"Ao clonar, as credenciais exclusivas de plataforma (Weixin / Telegram / Slack, etc.) são automaticamente ignoradas para evitar conflitos com o perfil de origem",cloneStrippedCredentials:"{count} credencial(is) exclusiva(s) removida(s): {list}",cloneDisabledPlatforms:"{count} plataforma(s) desabilitada(s): {list}",cloneStrippedConfigCredentials:"{count} credencial(is) incorporada(s) removida(s) do config.yaml: {list}",archivePath:"Caminho do arquivo",archivePathPlaceholder:"Caminho do servidor para o arquivo",importName:"Nome do perfil (opcional)",importNamePlaceholder:"Deixe vazio para usar o nome do arquivo",active:"Ativo",model:"Modelo",gateway:"Gateway",alias:"Alias",provider:"Provedor",path:"Caminho",skills:"Habilidades",hasEnv:"Tem .env",hasSoulMd:"Tem soul.md",noProfiles:"Nenhum perfil encontrado. Crie um para comecar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Enviar imagem",random:"Gerar aleatório",reset:"Restaurar padrão",hint:"PNG, JPEG ou WebP, máximo 1 MB",invalidType:"Escolha uma imagem PNG, JPEG ou WebP",tooLarge:"A imagem do avatar não pode exceder 1 MB",saveSuccess:"Avatar salvo",saveFailed:"Falha ao salvar avatar",resetSuccess:"Avatar padrão restaurado",resetFailed:"Falha ao restaurar avatar padrão"},runtime:{activeProfile:"Atual: {name}",bridgeWorker:"Status do Bridge",gateway:"Gateway",active:"Ativo",activeTag:"Atual",idle:"Ocioso",checking:"Verificando",running:"Em execução",stopped:"Parado",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Trocar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"Falha ao reiniciar gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"Falha ao reiniciar perfil"}},logs:{title:"Logs",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Atualizar",noEntries:"Nenhuma entrada de log"},settings:{title:"Configuracoes",saved:"Salvo",saveFailed:"Falha ao salvar",tabs:{display:"Exibicao",account:"Conta atual",users:"Gerenciamento de contas",agent:"Agente",proxy:"Proxy",memory:"Memoria",compression:"Compressao",session:"Sessao",privacy:"Privacidade",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respostas em streaming",streamingHint:"Mostrar respostas da IA em tempo real",compact:"Modo compacto",compactHint:"Reduzir espacamento entre mensagens",showReasoning:"Mostrar raciocinio",showReasoningHint:"Mostrar processo de pensamento do modelo",showCost:"Mostrar custo",showCostHint:"Mostrar uso de tokens nas respostas",inlineDiffs:"Diffs em linha",inlineDiffsHint:"Mostrar alteracoes de codigo em linha",bellOnComplete:"Som de conclusao",bellOnCompleteHint:"Tocar som quando a IA terminar",notifyOnComplete:"Notificacao de conclusao",notifyOnCompleteHint:"Mostrar notificacao do sistema quando a IA terminar",notifyOnCompleteMacHint:"No macOS, permita notificacoes do navegador nos Ajustes do Sistema.",notifyOnCompleteDenied:"Permissao de notificacao negada",notifyOnCompleteInsecure:"Notificacoes do navegador exigem HTTPS ou localhost",notifyOnCompleteUnsupported:"Este navegador nao suporta notificacoes",notifyOnCompleteTest:"Notificacoes ativadas.",notifyOnCompleteTestButton:"Testar",notifyOnCompleteTesting:"Enviando notificacao de teste...",notifyOnCompleteTestSent:"Notificacao de teste enviada",notifyOnCompleteTestFailed:"Falha ao enviar notificacao de teste",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada enquanto a IA processa",theme:"Tema",themeHint:"Escolha claro, escuro ou seguir a preferencia do sistema",themeLight:"Claro",themeDark:"Escuro",themeSystem:"Sistema",chatInputHeight:"Altura da entrada do chat",chatInputHeightHint:"Altura padrão da entrada do chat no desktop, em pixels. No celular permanece automática."},agent:{maxTurns:"Maximo de turnos",maxTurnsHint:"Maximo de rodadas de interacao por conversa",gatewayTimeout:"Timeout do gateway",gatewayTimeoutHint:"Timeout da requisicao em segundos",restartDrainTimeout:"Timeout de drenagem ao reiniciar",restartDrainTimeoutHint:"Timeout de drenagem antes de reiniciar em segundos",toolEnforcement:"Obrigatoriedade de ferramentas",toolEnforcementHint:"Controlar o modo de execucao de chamadas de ferramentas",auto:"Automatico",always:"Sempre",never:"Nunca"},gatewayAutoStart:{title:"Inicialização automática do gateway",description:"Controla quais gateways de perfis Hermes locais a Web UI inicia durante a inicialização. Isto é salvo na configuração da Web UI, não no config.yaml do perfil.",enabled:"Iniciar gateways automaticamente",enabledHint:"Quando desativado, nenhum gateway de perfil será iniciado automaticamente.",management:"Gateway unificado",managementHint:"Requer Hermes Agent 0.17.0 ou superior. Quando ativado, a Web UI grava multiplex_profiles para o gateway default servir todos os perfis; outros perfis nao podem configurar entradas de mensagens separadas como Feishu, Weixin ou QQBot. Ao desativar, remove essa configuração.",managementAuto:"Automático",managementPerProfile:"Um gateway por perfil",managementUnified:"Gateway default unificado",mode:"Política de perfis",modeHint:"Inicie todos os perfis descobertos ou apenas a lista incluída explicitamente.",modeAll:"Todos os perfis descobertos",modeInclude:"Apenas perfis incluídos",include:"Perfis incluídos",includeHint:"Nomes de perfil separados por vírgula. No modo de inclusão, uma lista vazia não inicia nenhum.",exclude:"Perfis excluídos",excludeHint:"Nomes de perfil separados por vírgula a ignorar depois da política include/all.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Proxy do gateway",description:"Define variáveis de ambiente de proxy para o gateway do perfil selecionado. As alterações reiniciam o gateway para que as plataformas de mensagens usem a nova configuração de rede.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Proxy para requisições HTTPS. Normalmente é o valor principal.",httpProxy:"HTTP_PROXY",httpProxyHint:"Proxy para requisições HTTP simples.",allProxy:"ALL_PROXY",allProxyHint:"Proxy de fallback quando não há proxy específico do protocolo.",noProxy:"NO_PROXY",noProxyHint:"Hosts ou domínios separados por vírgula que devem ignorar o proxy.",save:"Salvar configurações de proxy"},memory:{enabled:"Ativar memoria",enabledHint:"Permitir que a IA lembre do contexto da conversa",userProfile:"Perfil do usuario",userProfileHint:"Permitir que a IA lembre das preferencias do usuario",charLimit:"Limite de caracteres da memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres do perfil do usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Ativar compressao",enabledHint:"Comprimir automaticamente historico longo antes de exceder o contexto do modelo",threshold:"Limiar de compressao",thresholdHint:"Iniciar compressao quando tokens estimados excederem esta proporcao do contexto",targetRatio:"Proporcao alvo",targetRatioHint:"Tamanho alvo do historico apos compressao como proporcao do contexto",protectLastN:"Proteger mensagens recentes",protectLastNHint:"Manter sem compressao esta quantidade de mensagens recentes",protectFirstN:"Proteger primeiras mensagens",protectFirstNHint:"Manter sem compressao esta quantidade de mensagens iniciais"},session:{mode:"Modo de reinicializacao",modeHint:"Condicao de acionamento para reinicializacao de sessao",modeBoth:"Inatividade + Agendado",modeIdle:"Somente inatividade",modeDaily:"Somente agendado",modeNone:"Nunca (apenas manual)",idleMinutes:"Timeout de inatividade",idleMinutesHint:"Tempo de espera antes da reinicializacao automatica (minutos)",atHour:"Horario de reinicializacao agendada",humanOnly:"Mostrar apenas sessões humanas",humanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões",liveMonitorHumanOnly:"Monitor ao vivo: mostrar apenas sessões humanas",liveMonitorHumanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões no monitor ao vivo",atHourHint:"Reiniciar sessao neste horario diariamente",requireAuth:"Autorizacao da sessao",requireAuthHint:"Exigir autorizacao para operacoes da sessao",memoryWriteApproval:"Revisar escritas de memoria",memoryWriteApprovalHint:"Colocar escritas de memoria do Hermes Agent em aprovacao antes de salvar.",skillsWriteApproval:"Revisar escritas de skills",skillsWriteApprovalHint:"Colocar alteracoes de skills do Hermes Agent em aprovacao antes de salvar.",writeApprovalTitle:"Escritas pendentes de revisao",writeApprovalDescription:"Aprove ou rejeite escritas de memoria e skills preparadas pelo Hermes Agent.",writeApprovalRefresh:"Atualizar",writeApprovalEmpty:"Nenhuma escrita pendente.",writeApprovalMemory:"Memoria",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Revisar",writeApprovalHideDiff:"Ocultar",writeApprovalNoDiff:"Nenhuma diferenca disponivel.",writeApprovalLoadFailed:"Falha ao carregar escritas pendentes",writeApprovalDiffFailed:"Falha ao carregar detalhes da escrita",writeApprovalActionFailed:"Falha ao resolver escrita pendente",writeApprovalApproved:"Escrita aprovada",writeApprovalRejected:"Escrita rejeitada",writeApprovalApprove:"Aprovar",writeApprovalReject:"Rejeitar",writeApprovalPendingMemoryWrite:"Escrita de memoria pendente",writeApprovalCurrentFile:"Arquivo atual {file}",writeApprovalProposedFile:"Arquivo proposto {file}",writeApprovalDiffSection:"Diferenca",writeApprovalPatchOldStringMissing:"O old_string do patch nao foi encontrado no arquivo atual {file}; aprovar nao alterara o arquivo.",writeApprovalRequestedOldString:"old_string solicitado",writeApprovalCurrentReadFailed:"O arquivo atual {file} nao pode ser lido como texto UTF-8.",writeApprovalDeleteSkill:"Esta aprovacao exclui o skill {skill}.",writeApprovalRemoveFile:"Esta aprovacao remove {file} do skill {skill}."},privacy:{redactPii:"Ocultar dados pessoais",redactPiiHint:"Detectar e ocultar automaticamente informacoes sensiveis (senhas, chaves, etc.)"},apiServer:{enable:"Ativar",enableHint:"Ativar servidor API",host:"Host",hostHint:"Endereco de escuta",port:"Porta",portHint:"Porta de escuta",key:"Chave",keyHint:"Chave de acesso API",cors:"Origens CORS",corsHint:"Fontes cross-origin permitidas"},voice:{activeTtsApi:"API TTS ativa",activeSttApi:"API STT ativa",ttsProvidersTitle:"Provedores TTS",ttsProvidersDescription:"Gerencie integracoes de texto para fala usadas para reproduzir respostas do assistente e pre-visualizacoes de voz.",sttProvidersTitle:"Provedores STT",sttProvidersDescription:"Gerencie integracoes de fala para texto usadas pelo microfone e pelo fluxo de entrada por voz.",noneSelected:"Nenhum selecionado",keyStored:"Armazenada",keyMissing:"Ausente",customApi:"API",localBuiltin:"Local integrado",ttsCardHint:"Provedor de sintese de fala",sttCardHint:"Provedor de transcricao de fala",setActive:"Definir como ativo",testAction:"Testar",connect:"Conectar",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Vozes em nuvem gratuitas e de alta qualidade do Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"TTS personalizado",presetBrowserSttLabel:"STT do navegador",presetBrowserSttDescription:"API nativa de reconhecimento de fala do navegador.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"STT personalizado",apiCompatibility:"Compatibilidade da API",openaiCompatible:"Compatível com OpenAI",manualCustomEndpoint:"Endpoint personalizado manual",connectionStep:"Conexão",discoveryManualHint:"Endpoint personalizado manual selecionado. A descoberta de modelos não está disponível; informe o nome do modelo manualmente.",discoveryCredentialHint:"Informe Base URL e API key, depois conecte para buscar os modelos disponíveis.",discoveryNoAutoProbeHint:"Nenhuma requisição é enviada durante a digitação. Use Connect quando as credenciais estiverem prontas.",apiKeyConnectPlaceholder:"Cole a API key para conectar; chaves armazenadas nunca são exibidas",connectFetchModels:"Conectar e buscar modelos",modelRecommendedSuffix:"recomendado",modelConnectManualHint:"Conecte para preencher automaticamente ou informe manualmente.",modelRequiredConnectManual:"O modelo é obrigatório. Conecte para preencher automaticamente ou informe manualmente.",apiKeyRequired:"A API key é obrigatória.",apiKeyRequiredForDiscovery:"A API key é obrigatória para buscar modelos.",baseUrlRequired:"Base URL é obrigatória.",baseUrlHttpsRequired:"Use http:// ou https://.",baseUrlInvalid:"Informe uma Base URL válida, incluindo https://.",discoveryFailedManualFallback:"Não foi possível buscar modelos. Você ainda pode informar o nome do modelo manualmente.",completeRequiredProviderFields:"Complete os campos obrigatórios do provider antes de salvar.",fetchingModels:"Buscando modelos...",recommendedModel:"Recomendado: {model}.",useRecommendedModel:"Usar este.",modelsDiscovered:"{count} modelos encontrados. O modelo recomendado é selecionado quando o campo está vazio.",remove:"Remover",testSuccess:"Teste concluido",testTextRequired:"Digite texto antes de testar.",keyMissingForTest:"Adicione uma chave de API antes de testar este provedor.",testing:"Testando...",transcribing:"Transcrevendo...",browserSttTestHint:"O STT do navegador e testado pelo microfone do chat.",sttEmptyAudio:"Nenhum audio foi capturado. Tente novamente.",sttTestSuccess:"Transcricao concluida",sttRecordingHint:"Gravando... clique em Parar para transcrever.",keepStoredKeyPlaceholder:"Deixe em branco para manter a chave armazenada",apiKeyPlaceholder:"Insira a chave de API",lastTest:"Ultimo teste",notTested:"—",recording:"Gravando",testFailedShort:"Falhou",testFailedSummary:"O teste falhou. Verifique as configuracoes do provedor e tente novamente.",showDetails:"Mostrar detalhes",hideDetails:"Ocultar detalhes",moreActions:"Mais",moreActionsFor:"Mais acoes para {provider}",addTtsApi:"Adicionar API TTS",addSttApi:"Adicionar API STT",active:"Ativo",builtin:"Integrado",connected:"Conectado",disconnected:"Desconectado",source:"Origem",model:"Modelo",voice:"Voz",doubaoVoiceHint:"Selecione uma voz Seed TTS 2.0; o campo de recurso e atualizado automaticamente.",apiKey:"Chave de API",confirmDeleteSecret:"Excluir a chave de API armazenada para esta API de voz?",ttsTitle:"Texto para fala",ttsSaved:"Configuracoes TTS salvas no servidor",ttsSaveFailed:"Falha ao salvar as configuracoes TTS",ttsTestSaved:"Audicao concluida; configuracoes TTS salvas no servidor",ttsTestSaving:"Salvando configuracoes TTS antes da audicao...",ttsMissingBaseUrl:"A Base URL e obrigatoria antes de testar. Insira um endpoint do provedor e teste novamente.",ttsMissingApiKey:"A chave de API e obrigatoria antes de testar. Cole a chave ou salve primeiro uma chave armazenada no servidor.",ttsCleared:"Chave TTS armazenada removida",ttsClearFailed:"Falha ao remover a chave TTS armazenada",storedBaseUrlsTitle:"Base URLs salvas",storedBaseUrlsHint:"Endpoints de voz salvos. Os campos acima só limpam o valor atual; exclua endpoints salvos aqui.",storedBaseUrlsEmpty:"Nenhuma Base URL de voz customizada está salva no servidor.",storedBaseUrlDelete:"Excluir URL",storedApiKeysTitle:"API keys salvas",storedApiKeysHint:"Lista mascarada das chaves de voz salvas no servidor. Só mostra uso e origem; a chave completa nunca aparece.",storedApiKeysEmpty:"Nenhuma API key de voz está salva no servidor.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Excluir key",baseUrlPresetClear:"Limpar URL",baseUrlPresetCleared:"URL base removida do campo.",baseUrlPresetDelete:"Excluir URL",baseUrlPresetDeleted:"URL base removida da lista salva.",baseUrlPresetDeleteFailed:"Falha ao remover a URL base salva.",ttsPendingSecret:"A nova chave sera salva",ttsStoredSecret:"O servidor tem uma chave armazenada: {value}",ttsClearKey:"Remover chave armazenada",sttTitle:"Fala para texto",sttProvider:"Provedor STT",sttProviderHint:"Escolha como a entrada de voz sera transcrita",sttProviderBrowser:"Navegador",sttProviderOpenai:"Compativel com OpenAI",sttProviderCustom:"Personalizado",sttBrowserHint:"Use o reconhecimento de fala integrado do navegador quando disponivel.",sttApiKey:"Chave de API",sttApiKeyHint:"Armazenada no servidor para provedores STT que exigem autenticacao.",sttStoredSecret:"Chave do servidor armazenada: {value}",sttPendingSecret:"Chave do servidor armazenada: sera atualizada ao salvar",sttClearKey:"Remover chave armazenada",sttModel:"Modelo",sttModelHint:"Modelo de fala para texto a usar.",sttLanguage:"Idioma",sttLanguageHint:"Dica de idioma opcional, como en ou zh.",sttPrompt:"Prompt",sttPromptHint:"Prompt opcional de transcricao.",sttAudioTranscode:"Transcodificação de áudio",sttAudioTranscodeNone:"Enviar áudio original",sttAudioTranscodeFfmpeg:"Converter para WAV com ffmpeg",sttBaseUrl:"Base URL",sttBaseUrlHint:"Endpoint personalizado de fala para texto compativel com OpenAI.",sttSave:"Salvar configuracoes STT",sttSaved:"Configuracoes STT salvas no servidor.",sttSaveFailed:"Falha ao salvar as configuracoes STT.",sttCleared:"Segredo STT armazenado removido do servidor.",sttClearFailed:"Falha ao remover o segredo STT armazenado.",sttActiveSaved:"Provedor STT ativo salvo no servidor.",sttSaveActive:"Salvar provedor STT ativo",sttEndpointHint:"Endpoint final de transcricao: {endpoint}",sttTestTitle:"Testar fala para texto",sttTestButton:"Testar API STT",sttTestStopButton:"Parar e transcrever",sttTestBackendOnly:"O teste da API STT esta disponivel para provedores compativeis com OpenAI e personalizados.",sttTestRecording:"Gravando amostra de teste... clique em Parar e transcrever ao terminar.",sttTestTranscribing:"Transcrevendo amostra de teste...",sttTestEmpty:"Nenhum audio foi capturado para o teste STT.",sttTestSucceeded:"Teste STT concluido com sucesso.",sttTestFailed:"Teste STT falhou: {error} — {hint}",sttFailureHintMissingConfig:"Verifique se o provedor foi salvo com Base URL/modelo e uma chave de API antes de testar.",sttFailureHintAuth:"Verifique a chave de API. Se uma chave ja estava armazenada, cole a chave atual novamente e salve antes de testar.",sttFailureHintForbidden:"A chave chegou ao provedor, mas nao tem permissao para este modelo STT ou conta. Verifique o acesso/faturamento do provedor.",sttFailureHintEndpointModel:"Verifique a Base URL e o modelo. Para Groq, use {endpoint} com whisper-large-v3-turbo ou outro modelo STT da Groq.",sttFailureHintModel:"Verifique se o modelo STT selecionado existe e esta habilitado para esta conta.",sttFailureHintQuota:"O provedor informa problema de cota, faturamento ou limite de taxa. Verifique a cota/faturamento ou tente mais tarde.",sttFailureHintNetworkCustom:"O servidor nao conseguiu acessar o endpoint STT personalizado. Verifique se {endpoint} e acessivel pelo servidor Web UI e compativel com OpenAI.",sttFailureHintNetwork:"O servidor Web UI nao conseguiu acessar o provedor STT. Verifique rede/proxy/firewall e tente novamente.",sttFailureHintAudio:"O audio gravado estava vazio ou foi rejeitado. Tente uma amostra curta e clara, permita acesso ao microfone ou tente no Chrome.",sttFailureHintGenericCustom:"Verifique chave de API, Base URL, modelo e o endpoint final {endpoint}.",sttFailureHintGeneric:"Verifique chave de API, modelo e acesso da conta do provedor, depois tente novamente.",sttTestRecordFailed:"Nao foi possivel iniciar a gravacao do microfone: {error}",sttTestTranscript:"Transcricao: {text}",ttsProvider:"Provedor TTS",ttsProviderHint:"Escolha o mecanismo de texto para fala para reproducao de mensagens",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compativel com OpenAI)",providerEdge:"Edge TTS (Gratuito, sem chave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Selecione uma voz do seu navegador ou SO",webspeechVoicePlaceholder:"Auto (voz padrao)",openaiKey:"Chave API",openaiKeyHint:"Sua chave API OpenAI com acesso TTS",openaiUrl:"URL base da API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mais rapido) / tts-1-hd (qualidade superior)",openaiVoice:"Voz",openaiVoiceHint:"Voz a ser usada para sintese",customHint:"Use qualquer API TTS compativel com OpenAI — funciona com GPT-SoVITS, CosyVoice, etc.",customUrl:"URL da API",customUrlHint:"URL base do seu servico TTS",customUrlPlaceholder:"Endereco configurado no adaptador local, ex. http://127.0.0.1:9880",customApiKey:"Chave API (opcional)",customApiKeyHint:"Alguns endpoints personalizados exigem autenticacao",customApiKeyPlaceholder:"Deixe em branco se nao for necessario",edgeHint:"Desenvolvido por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL do adaptador",edgeUrlHint:"Endereco do adaptador Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Selecione uma voz para sintese de fala",edgeRate:"Velocidade",edgeRateHint:"Ajustar velocidade da fala (0.5x ~ 2.0x)",edgePitch:"Tom",edgePitchHint:"Ajustar tom da fala (-20 ~ +20 Hz)",testTitle:"Teste de voz",testText:"Texto de teste",testTextPlaceholder:"Insira o texto para testar...",testTextDefault:"Ola, este e um teste de voz.",testButton:"Testar",testButtonPlaying:"Reproduzindo...",testFailed:"Teste falhou: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — vozes predefinidas, design de voz e clonagem de voz",mimoApiKey:"Chave API",mimoApiKeyHint:"Obtenha sua chave em platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Chave API MiMo",mimoAuthMode:"Modo de autenticação",mimoAuthModeHint:"Formato de cabeçalho esperado pelo endpoint MiMo selecionado",mimoAuthModeBearer:"Token Bearer (Authorization)",mimoAuthModeApiKey:"Cabeçalho API key (api-key)",mimoAuthModeBoth:"Ambos os cabeçalhos",mimoBaseUrl:"URL base",mimoBaseUrlHint:"URL do endpoint da API MiMo",mimoModel:"Modelo",mimoModelHint:"Selecione o modelo de síntese de voz",mimoModelPreset:"Vozes predefinidas",mimoModelVoiceDesign:"Design de voz",mimoModelVoiceClone:"Clonagem de voz",mimoVoice:"Voz",mimoVoiceHint:"Selecione uma voz predefinida",mimoVoiceDesignPrompt:"Descrição da voz",mimoVoiceDesignPromptHint:"Descreva as características de voz desejadas",mimoVoiceDesignPromptPlaceholder:"Ex: Uma voz feminina quente e jovem, ligeiramente lenta, com tom magnético",mimoCloneAudio:"Enviar áudio",mimoCloneAudioHint:"Envie uma amostra de áudio para clonagem (mp3/wav, máx. 10 MB)",mimoCloneAudioUpload:"Escolher arquivo",mimoCloneAudioClear:"Limpar",mimoStylePrompt:"Prompt de estilo",mimoStylePromptHint:"Opcional — descreva o estilo de fala em linguagem natural",mimoStylePromptPlaceholder:"Ex: Tom brilhante e animado, ritmo rápido"},lockedIps:{title:"IPs bloqueadas",count:"{count} bloqueadas",empty:"Nenhuma IP bloqueada",unlock:"Desbloquear",unlockAll:"Desbloquear tudo",unlockAllConfirm:"Desbloquear todas as IPs?",unlocked:"IP desbloqueada",allUnlocked:"{count} IPs desbloqueadas",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"Avatar do usuário",upload:"Enviar imagem",random:"Gerar aleatório",reset:"Restaurar padrão",hint:"Suporta PNG, JPEG e WebP até 1 MB; compacta automaticamente para menos de 500 KB.",invalidType:"Escolha uma imagem PNG, JPEG ou WebP",tooLarge:"A imagem do avatar deve ter 1 MB ou menos",saveSuccess:"Avatar salvo",saveFailed:"Falha ao salvar avatar",resetSuccess:"Avatar restaurado",resetFailed:"Falha ao restaurar avatar"},models:{apiKey:"API Key",apiKeyPlaceholder:"Digite a API Key",noProviders:"Nenhum provedor configurado",save:"Salvar",saveFailed:"Falha ao salvar",saved:"Salvo"}},githubPreview:{title:"Prévia de versão",description:"Clona a tag do GitHub selecionada para o workspace de prévia do Web UI, instala dependências e executa com as portas de desenvolvimento.",refresh:"Atualizar",selectTag:"Selecione uma tag",prepare:"Preparar código",install:"Instalar dependências",start:"Iniciar prévia",stop:"Parar",note:"O código de prévia é armazenado no diretório de dados do Web UI. Produção permanece na porta 8648; a prévia usa frontend 8651 e backend 8650.",path:"Caminho da prévia",webuiHome:"Dados da prévia",currentTag:"Tag atual",repoReady:"Repositório pronto",dependencies:"Dependências instaladas",running:"Estado",notRunning:"Não em execução",open:"Abrir prévia",log:"Caminho do log de ações",logOutput:"Saída de logs",actionLog:"Log de ações",devLog:"Log do servidor dev",yes:"Sim",no:"Não",actionFailed:"Ação falhou",nodeEnvironmentMissing:"Node/npm não foi detectado. Instale o Node.js e tente novamente.",prepareSuccess:"Código de prévia pronto",installSuccess:"Dependências instaladas",startSuccess:"Prévia concluída",stopSuccess:"Prévia parada"},codingAgents:{title:"Agentes de código",notice:"Nem todos os provedores e modelos são compatíveis.",claudeDescription:"CLI da Anthropic para tarefas únicas em print mode e sessões interativas de código.",codexDescription:"CLI da OpenAI e fluxo de provedor openai-codex do Hermes para tarefas de repositório.",copyCommand:"Copiar",commandCopied:"Comando copiado",commandCopyFailed:"Falha ao copiar",refresh:"Atualizar",checking:"Verificando",installStatus:"Status da instalação",installed:"Instalado",notInstalled:"Não instalado",installRequired:"{agent} não está instalado. Instale antes de criar uma sessão.",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Falha na instalação",installFailedHermesHint:"A instalação falhou. Peça ao Hermes para instalar para você.",installFailureReason:"Motivo",nodeEnvironmentMissing:"Node/npm não foi detectado. Instale o Node.js e tente novamente.",deleteNow:"Excluir",deleting:"Excluindo",deleteSuccess:"Excluído",deleteFailed:"Falha ao excluir",configFiles:"Arquivos de configuração",profileScope:"Perfil",providerScope:"Provedor",providerPlaceholder:"ex.: custom:glm",modelScope:"Modelo",modelPlaceholder:"Selecionar modelo",launchModeScope:"Modo de inicialização",launchModeGlobal:"Configuração global",launchModeScoped:"Provedor e modelo",protocolScope:"Protocolo",protocolOpenAiChat:"OpenAI Chat Completions (/v1/chat/completions)",protocolOpenAiResponses:"OpenAI Responses (/v1/responses)",protocolAnthropicMessages:"Anthropic Messages (/v1/messages)",reloadConfig:"Recarregar configuração",configFileNotCreated:"Não criado",configLoadFailed:"Falha ao ler arquivo de configuração",loadFailed:"Falha ao inspecionar agentes de código",launch:"Iniciar",launchTitle:"Iniciar agente de código",nativeTerminal:"Terminal nativo",builtInTerminal:"Terminal integrado",launchPrepared:"Configuração de inicialização preparada",launchPrepareFailed:"Falha ao preparar configuração de inicialização",nativeLaunchStarted:"Terminal nativo aberto",nativeLaunchFailed:"Falha ao abrir terminal nativo",terminalTitle:"Terminal do agente de código",loadProvidersFailed:"Falha ao carregar provedores do perfil atual",selectProviderModel:"Selecione um provedor e modelo",launchConfigDir:"Diretório de configuração de inicialização",launchCommand:"Comando de inicialização",table:{tool:"Ferramenta",kind:"Etapa",command:"Comando",note:"Nota",action:"Ação"},kinds:{install:"Instalar",auth:"Autenticação",health:"Saúde",run:"Executar"},notes:{claudeInstall:"Instala a CLI Claude Code globalmente.",codexInstall:"Instala a CLI Codex globalmente.",claudeAuth:"Verifica o estado de login do Claude Code; execute claude uma vez se o login estiver ausente.",codexAuth:"Adiciona credenciais OAuth do OpenAI Codex gerenciadas pelo Hermes.",claudeHealth:"Verifica o atualizador e a saúde da CLI local.",codexHealth:"Confirma que a CLI Codex está disponível no PATH.",claudeRun:"Print mode é o caminho mais limpo para tarefas únicas orientadas por API.",codexRun:"Tarefas únicas do Codex devem ser executadas dentro de um repositório git."}},platform:{requireMention:"Exigir mencao {'@'}",requireMentionGroup:"Exigir mencao {'@'} em grupos para responder",requireMentionChannel:"Exigir mencao {'@'} em canais para responder",requireMentionRoom:"Exigir mencao {'@'} em salas para responder",reactions:"Reacoes",reactionsHint:"Reagir a mensagens com emoji",freeResponseChats:"Chats de resposta livre",freeResponseChatsHint:"IDs de chats que respondem sem mencao {'@'} (separados por virgula)",freeResponseChannels:"Canais de resposta livre",freeResponseChannelsHint:"IDs de canais que respondem sem mencao {'@'} (separados por virgula)",freeResponseRooms:"Salas de resposta livre",freeResponseRoomsHint:"IDs de salas que respondem sem mencao {'@'} (separados por virgula)",mentionPatterns:"Padroes de mencao personalizados",mentionPatternsHint:"Padroes de acionamento adicionais",autoThread:"Thread automatica",autoThreadHint:"Criar automaticamente threads de resposta apos mencao {'@'}",autoThreadHintRoom:"Criar automaticamente threads de resposta em salas",dmMentionThreads:"Threads de mencao em DM",dmMentionThreadsHint:"Usar respostas em thread para mencoes em DMs",allowBots:"Permitir mensagens de bots",allowBotsHint:"Responder a mensagens de outros bots",allowedChannels:"Canais permitidos",allowedChannelsHint:"Lista branca de IDs de canais (separados por virgula)",ignoredChannels:"Canais ignorados",ignoredChannelsHint:"Canais onde o bot nunca responde (separados por virgula)",noThreadChannels:"Canais sem thread",noThreadChannelsHint:"Canais onde o bot responde sem threads (separados por virgula)",exclusiveTokenWarning:"Esta plataforma usa bloqueio exclusivo de token. Cada perfil deve usar um token de identidade diferente para evitar conflitos com outros perfis.",botToken:"Token do bot",botTokenHint:"Token do bot do portal do desenvolvedor",proxyUrl:"URL do proxy",proxyUrlHint:"Proxy opcional da plataforma. Suporta http://, https:// e socks5://",accessToken:"Token de acesso",accessTokenHint:"Token de acesso Matrix",homeserver:"URL do homeserver",homeserverHint:"URL do homeserver Matrix",matrixUserId:"ID de usuario Matrix",matrixUserIdHint:"Obrigatorio com senha; opcional com token",matrixPassword:"Senha Matrix",matrixPasswordHint:"Alternativa ao token de acesso",appId:"ID do aplicativo",appIdHint:"ID do aplicativo Feishu",appSecret:"Segredo do aplicativo",appSecretHint:"Segredo do aplicativo Feishu",encryptKey:"Chave de criptografia",encryptKeyHint:"Chave de criptografia do Feishu",verificationToken:"Token de verificação",verificationTokenHint:"Token de verificação do Feishu",clientId:"ID do cliente",clientIdHint:"ID do cliente DingTalk",clientSecret:"Segredo do cliente",clientSecretHint:"Segredo do cliente DingTalk",cardTemplateId:"ID do modelo de cartão IA",cardTemplateIdHint:"ID do modelo de cartão IA do DingTalk; deixe vazio para desativar os cartões IA",botId:"ID do bot",botIdHint:"ID do bot WeCom",wecomSecretHint:"Segredo do bot WeCom",waEnabled:"Ativar WhatsApp",waEnabledHint:"Ativar WhatsApp via pareamento por codigo QR",weixinToken:"Token Weixin",weixinTokenHint:"Do login QR da CLI weixin (hermes weixin)",accountId:"ID da conta",accountIdHint:"ID da conta Weixin",qrLogin:"Login por QR",qrRelogin:"Reconectar",qrFetching:"Buscando codigo QR...",qrScanHint:"Escaneie com WeChat para fazer login",qrScanedHint:"Escaneado, por favor confirme no celular...",qqSandboxHint:"Ativar ambiente sandbox (para testes)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escaneie o QR code com QQ ou abra o link no celular para concluir a vinculação",qqMarkdownHint:"Ativar mensagens em formato Markdown (alguns clientes podem não suportar)",qqMarkdown:"Suporte a Markdown",qqAppSecretHint:"App Secret do bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID do bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista de permissões de IDs de usuário ou OpenID, separados por vírgula",allowedUsers:"Usuários permitidos",allowAllUsersHint:"Permite mensagens de qualquer usuário; desative para usar a lista de permissões",allowAllUsers:"Permitir todos os usuários"},language:{label:"Idioma",zh:"中文",en:"English",pt:"Portugues"},terminal:{sessions:"Sessoes",newTab:"Novo terminal",closeSession:"Fechar esta sessao?",sessionExited:"Encerrada",processExited:"Processo encerrado com codigo {code}",noSessions:"Nenhuma sessão de terminal",connectionFailed:"Falha ao conectar ao terminal",connectionError:"Erro de conexão",connectionClosed:"Conexão fechada"},usage:{title:"Estatisticas de uso",refresh:"Atualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Saida",totalSessions:"Total de sessoes",avgPerDay:"~{n}/dia em media",estimatedCost:"Custo est.",cacheHitRate:"Taxa de acerto de cache",modelBreakdown:"Detalhamento por modelo",dailyTrend:"Uso diario",date:"Data",tokens:"Tokens",cache:"Cache",cacheRead:"Leitura de cache",cacheWrite:"Escrita de cache",sessions:"Sessoes",cost:"Custo",noData:"Sem dados de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Acompanhe carregamentos e edições de habilidades nas sessões Hermes",refresh:"Atualizar",periodSelector:"Período de uso de habilidades",periodLabel:"{days} d",summary:"Resumo",totalActions:"Ações",loads:"Carga",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendência diária",periodSummary:"Últimos {days} dias",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"Nenhum dado de uso de habilidades",loadFailed:"Falha ao carregar o uso de habilidades",otherSkills:"Outras habs."},changelog:{new_0_6_25_1:"Corrige falhas de execute_code com Hermes Agent 0.18.0 ao encaminhar o novo parametro has_host_access pelo wrapper de memoria de aprovacoes do Agent Bridge",new_0_6_24_1:"Esta versao cobre os PRs mesclados depois da 0.6.23 e melhora entrada de chat, visibilidade de workspaces, gestao de plugins, modelos padrao e revisao de diffs",new_0_6_24_2:"As entradas de chat individual e em grupo usam uma barra integrada, controles compactos de modelo, configuracoes agrupadas, uso de contexto mais claro, melhor mobile chrome e redimensionamento manual restaurado no chat individual",new_0_6_24_3:"Mudancas de workspace run aparecem como cards de diff persistentes com drawer lateral para ver diffs e editar arquivos, restaurados apos retomar a sessao e ajustados para mobile",new_0_6_24_4:"O seletor de pastas workspace navega melhor por drives e junctions no Windows e mostra pastas com ponto como .hermes, .config e .codex mantendo as verificacoes de WORKSPACE_BASE",new_0_6_24_5:"A pagina Plugins permite ativar ou desativar plugins de usuario gerenciaveis e reflete melhor o estado combinado da configuracao base do Hermes e do profile atual",new_0_6_24_6:"A pagina Models adiciona acoes de provider e modelo padrao; a deteccao de erros terminal bridge reduz falsos positivos, o runtime Hermes Agent vai para 0.18.0 e o manifest de versoes do site foi atualizado",new_0_6_23_1:"Esta versao resume os PRs mesclados desde 0.6.22, com melhorias para autoatualizacao desktop, limpeza de MCP, pets Petdex, voz MCU e varios fluxos de configuracao",new_0_6_23_2:"A autoatualizacao desktop voltou ao fluxo bloqueante, o Windows encerra servicos com mais confiabilidade antes de atualizar, e a saida do desktop limpa melhor gateway, profile MCP e processos filhos relacionados",new_0_6_23_3:"A injecao MCP desktop e os caminhos de inicializacao MCP do Coding Agent ficaram mais estaveis, workspaces no Windows ganharam seletor de unidade, e foram corrigidos diretorios symlink e previews Petdex no desktop",new_0_6_23_4:"Os pets Petdex agora suportam pets web, uma janela desktop dedicada, exibicao imediata apos adocao, botao de fechar no canto superior direito e tamanho inicial desktop mais visivel",new_0_6_23_5:"A voz MCU e global adiciona prompts de audio, protecoes OTA, TTS segmentado em streaming, limpeza de links, blocos de codigo e tabelas antes da fala, alem de cancelamento de geracoes TTS pendentes",new_0_6_23_6:"Configuracoes e fluxos adicionam edicao de configuracao de profile, altura do input de chat, expiracao JWT de login, edicao de Skills, preservacao do estado arquivado local no Historico, texto mais claro do drawer de novo chat e textos de perigo mais seguros para Providers embutidos",new_0_6_22_1:"Esta versao resume os PRs mesclados desde 0.6.21, com atualizacoes de frontend para modelos combinados, historico de sessoes, configuracoes de proxy, comandos slash e ajustes no layout movel",new_0_6_22_2:"A pagina Modelos agora inclui um painel de modelos combinados, e o chat pode mostrar o progresso real de referencias e agregadores MoA sem a antiga ferramenta sintetica de placeholder",new_0_6_22_3:"Sessoes de chat podem ser arquivadas pela lista e restauradas pelo Historico; sessoes locais de Claude Code e Codex agora aparecem corretamente no Historico",new_0_6_22_4:"Configuracoes agora inclui uma aba Proxy para valores HTTP(S), ALL_PROXY e NO_PROXY de todo o gateway, com proxy por plataforma para Telegram, Discord e Matrix",new_0_6_22_5:"O chat Hermes ganhou o comando /learn, execucoes do Agent Bridge usam o workspace selecionado como cwd, e apenas os comandos desktop /learn e MoA aguardam a proxima versao do Hermes Agent",new_0_6_21_1:"Esta versao foca em reruns de workflow, ferramentas MCP de workflow, remocao de ajustes voice, ajustes Matrix, limpeza de updates e documentacao",new_0_6_21_2:"Mensagens de nodes workflow agora abrem em um drawer de chat completo a esquerda e redimensionavel; o historico mobile de runs volta a abrir e reruns podem manter ou limpar o node selecionado",new_0_6_21_3:"O toolset MCP use agora lista, cria, atualiza, exclui, executa, para, exclui runs e rerun workflows a partir de um node selecionado",new_0_6_21_4:"Remover um voice provider agora exclui os ajustes do profile em vez de apenas limpar a API key; Browser STT e Edge TTS continuam protegidos como defaults integrados",new_0_6_21_5:"Ajustes Matrix agora aceitam user ID mais password e detectam corretamente o estado configurado ao usar login por password",new_0_6_21_6:"Web UI restart, update e upgrade dentro do app agora param o Agent Bridge broker por padrao para evitar reutilizar processos Python bridge antigos",new_0_6_21_7:"Headers de chat, group chat e workflow estao mais alinhados; Xiao Fang He mostra sold out; o escopo BSL ficou mais claro; o plano /learn foi documentado; o proxy Hermes legado foi removido",new_0_6_20_1:"Workflow agora esta disponivel: crie nodes Agent, conecte-os em um grafo e execute o flow completo pela pagina Workflow",new_0_6_20_2:"Workflow runs salvam registros, snapshots do grafo, sessoes por node, live node status, motivos de falha e acoes para parar ou excluir runs",new_0_6_20_3:"A visualizacao e edicao de workflows ficaram mais completas com historico de runs, snapshots read-only, revisao de chat por node, handles maiores e aviso para criar workflow primeiro",new_0_6_20_4:"O desktop deixa o agent-browser resolver Chrome a partir de AGENT_BROWSER_HOME em vez de fixar executable path antigo, com guards de integridade de patches e fixes de stdout do navegador",new_0_6_20_5:"Runtimes de navegador empacotados fixam Chrome for Testing 149.0.7827.55 em plataformas desktop suportadas para evitar regressoes do browser runtime",new_0_6_20_6:"ESP32 e Xiao Fang He receberam links de tutorial atualizados, badge com melhor contraste em fundo claro e animacao de fluxo compativel com Windows",new_0_6_19_1:"Esta versao inclui 16 PRs desde 0.6.18 e melhora as experiencias visiveis de dispositivos, voz, Coding Agent e configuracoes",new_0_6_19_2:"Sessoes do Coding Agent podem trocar de modelo, e novas sessoes agora seguem corretamente o modelo global padrao",new_0_6_19_3:"Interacoes MCU ficam mais estaveis com debounce de Wi-Fi/boot na inicializacao, audio apenas para o dispositivo alvo e melhor duplo clique fisico para limpar e interromper",new_0_6_19_4:"As configuracoes TTS agora sao salvas por profile, e velocidade, tom e testes de voz leem a mesma fonte de configuracao",new_0_6_19_5:"Trocas de modelo no Coding Agent nao afetam mais sessoes existentes e custom provider keys sao encaminhadas corretamente",new_0_6_19_6:"Filtros de skills runtime, ordenacao de cron jobs, limite de altura de detalhes de skill, recuperacao do updater do Windows, fallbacks de backup e logos comprimidos completam a atualizacao",new_0_6_18_2:"Hermes Studio MCP foi dividido em toolsets api, devices e use, com novas acoes de session, model, chat-run e ops",new_0_6_18_3:"O historico de chat e grupos e mais confiavel com historico de UI separado, tratamento seguro de mensagens nulas, respostas do assistant preservadas apos run failures e replay de reasoning alinhado",new_0_6_18_4:"O feedback do MCU ficou mais claro: tool calls ficam acima de speech, audio nao marca tarefas como concluidas cedo demais, active-device login esta mais estavel e textos ONLINE/IP longos rolam",new_0_6_18_5:"Workflows de voz e mensagens ganharam endpoints HTTP TTS/STT customizados, transcodificacao de audio, acoes de fork message, marcadores fork persistentes e erros de upload mais claros",new_0_6_18_6:"Desktop e runtime setup ficaram mais seguros com registro Unicode-safe do PATH no Windows, suporte a publicar runtime Hermes Agent 0.17.0, metadata PWA movel e varias correcoes de profile/auth recovery",new_0_6_18_7:"Otimizacoes e melhorias de detalhes em todo o app",new_0_6_17_1:"Corrigidos problemas ao iniciar conversas no Codex e no Claude Code",new_0_6_16_1:"As configuracoes de Provider agora preservam API modes personalizados, cobrem LongCat corretamente, permitem excluir Providers v12 e sincronizam catalogos de modelos com Providers de auth e imagem por API key",new_0_6_16_2:"Os comandos de chat adicionam reload-skills, atualizacoes de titulo web, passthrough de comandos slash desconhecidos e uma API limpa de contexto de sessao sem tool calls nem tool results",new_0_6_16_3:"A navegacao de sessoes ficou mais estavel com resultados de Global Agent na busca, ordenacao por atividade recente para sessoes novas, controles moveis da sidebar restaurados e footer de configuracoes estavel",new_0_6_16_4:"Arquivos ficaram mais faceis de usar: nome completo do workspace no hover e uploads por drag-and-drop em chats individuais e de grupo",new_0_6_16_5:"As configuracoes de plataforma incluem campos localizados de validacao do Feishu Webhook e melhor cobertura de localizacao",new_0_6_16_6:"A descoberta de skills agora segue diretorios symlink, entao skills locais compartilhadas aparecem de forma consistente",new_0_6_16_7:"Assets estaticos grandes evitam Brotli dinamico, melhorando a entrega do Web UI empacotado sob carga",new_0_6_16_8:"Fluxos de outbound relay e login MCU estao disponiveis para integracoes do tipo connector",new_0_6_16_9:"A CLI do Web UI adiciona --no-open para scripts e execucoes headless",new_0_6_16_10:"O tamanho do viewport no Linux desktop e as linhas de status de compressao ao vivo foram polidos para um layout mais estavel",new_0_6_15_1:"As barras laterais do chat foram redesenhadas e os controles de carregamento do historico facilitam navegar conversas longas",new_0_6_15_2:"O seletor de comandos de skills ajuda a descobrir e inserir comandos disponiveis mais rapido pela entrada do chat",new_0_6_15_3:"Providers OAuth de Claude e Gemini estao disponiveis, IDs de modelo Gemini sao normalizados corretamente e seletores de modelo podem atualizar mudancas do config.yaml sob demanda",new_0_6_15_4:"Estados de thinking receberam indicador renovado e layout de toolbar mais claro para acompanhar o progresso de reasoning sem interromper o fluxo",new_0_6_15_5:"Bordas de inputs e selects voltaram a aparecer no tema escuro",new_0_6_15_6:"A configuracao de runtime agora verifica o runtime local antes de mostrar escolhas de fonte de download e mantem o estado de verificacao visivel durante a inicializacao",new_0_6_15_7:"Autoatualizacoes desktop nao ficam mais bloqueadas por processos antigos, e a limpeza de gateways no Windows ao sair esta mais completa",new_0_6_15_8:"Gateways gerenciados sao parados no shutdown do app, enquanto gateways encerrados inesperadamente ainda podem reiniciar em sessoes runtime gerenciadas",new_0_6_15_9:"O servidor desktop encerra de forma mais limpa ao sair, reduzindo processos orfaos de backend, bridge e gateway",new_0_6_15_10:"README e showcase do site agora usam um unico GIF animado, com uma imagem estatica dedicada para o hero do site",new_0_6_13_1:"Alibaba Coding Plan agora inclui o preset de modelo qwen3.7-plus",new_0_6_13_2:"O tratamento de arquivos esta mais seguro, com validacao de pontos literais em caminhos e rejeicao de nomes de arquivo de importacao de skills mal codificados",new_0_6_13_3:"O chat esta mais estavel em dispositivos moveis e em navegadores sem suporte a speech synthesis",new_0_6_13_4:"Falhas do Agent agora preservam o final do erro do bridge, e inicializacoes do Claude Code com permissao root estao mais confiaveis",new_0_6_13_5:"As atualizacoes desktop estao mais confiaveis: upgrades no Windows fecham processos Hermes Studio residuais, verificam Cloudflare primeiro e mantem GitHub como feed de fallback",new_0_6_13_6:"A automacao de releases mantem Web UI e Docker fora do GitHub Latest, enquanto releases desktop completas sao promovidas manualmente para Latest apos build bem-sucedido"},files:{title:"Arquivos",tree:"Arvore de diretorios",list:"Lista de arquivos",breadcrumbRoot:"Inicio",newFile:"Novo arquivo",newFolder:"Nova pasta",upload:"Enviar",refresh:"Atualizar",open:"Abrir",edit:"Editar",preview:"Visualizar",download:"Baixar",copyPath:"Copiar caminho",rename:"Renomear",delete:"Excluir",name:"Nome",size:"Tamanho",modified:"Modificado",actions:"Acoes",emptyDir:"Diretorio vazio",loading:"Carregando...",confirmDelete:'Tem certeza de que deseja excluir "{name}"?',confirmDeleteDir:'Tem certeza de que deseja excluir o diretorio "{name}" e todo o seu conteudo?',deleteFailed:"Falha ao excluir",deleted:"Excluido",renameTo:"Renomear para",newFileName:"Nome do arquivo",newFolderName:"Nome da pasta",created:"Criado",createFailed:"Falha ao criar",renamed:"Renomeado",renameFailed:"Falha ao renomear",uploadSuccess:"{count} arquivo(s) enviado(s)",uploadFailed:"Falha ao enviar",saveFailed:"Falha ao salvar",saved:"Salvo",unsavedChanges:"Voce tem alteracoes nao salvas. Descartar?",pathCopied:"Caminho copiado",fileTooLarge:"Arquivo muito grande (max 10MB)",permissionDenied:"Nao e possivel modificar arquivo protegido",notFound:"Arquivo ou diretorio nao encontrado",backendError:"Falha na operacao de arquivo",dragDropHint:"Arraste arquivos aqui para enviar",closeEditor:"Fechar editor",closePreview:"Fechar",saveFile:"Salvar",fileTree:"Árvore de arquivos"},groupChat:{title:"Chat em grupo",createRoom:"Criar sala",joinByCode:"Entrar com codigo",roomName:"Nome da sala",roomNamePlaceholder:"Digite o nome da sala",inviteCode:"Codigo de convite",autoGenerate:"Gerar automaticamente",noRooms:"Nenhuma sala ainda",selectOrCreate:"Selecione ou crie uma sala para comecar a conversar",agents:"Agentes",addAgent:"Adicionar agente",selectProfile:"Selecione um perfil",agentAdded:"Agente adicionado",selectRoomFirst:"Por favor, selecione uma sala primeiro",agentAlreadyInRoom:"O agente ja esta nesta sala",agentAddFailedCount:"{count} agente(s) nao foram adicionados: {details}",noAgents:"Nenhum agente nesta sala",members:"Membros",roomCreated:"Sala criada",roomDeleted:"Sala excluída",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar link da sala",deleteRoomConfirm:"Excluir esta sala?",clearContext:"Limpar contexto",clearContextConfirm:"Limpar o contexto desta sala? Mensagens e snapshots de compactação serão removidos, mas agentes e membros ficam.",contextCleared:"Contexto limpo",you:"Você",joined:"Entrou na sala",joinFailed:"Falha ao entrar na sala",inputPlaceholder:"Digite uma mensagem... (Enter para enviar)",messageDisplayLimit:"O chat em grupo mostra ate 600 mensagens",enterCode:"Digite o codigo de convite",yourName:"Seu nome",yourNamePlaceholder:"Digite seu nome de exibicao",yourDescription:"Descricao (opcional)",yourDescriptionPlaceholder:"Conte aos outros quem voce e...",agentName:"Nome do agente",agentNamePlaceholder:"Nome personalizado (vazio = nome do perfil)",agentDesc:"Descrição do agente",agentDescPlaceholder:"Descreva o que este agente faz...",agentReplying:"está respondendo...",agentCompressing:"está compactando contexto...",compressionSettings:"Configuração de compactação",triggerTokens:"Tokens de acionamento",triggerTokensDesc:"Limite de tokens para acionar a compactação",maxHistoryTokens:"Máx. tokens de histórico",maxHistoryTokensDesc:"Máximo de tokens para o contexto compactado",tailMessageCount:"Mensagens recentes",tailMessageCountDesc:"Número de mensagens recentes a manter",compressionConfig:"Config. de compactação",compressNow:"Compactar agora",compressingInProgress:"Compactação em andamento",compressionSaved:"Configuração salva"},download:{downloading:"Baixando...",downloadFailed:"Falha no download",fileNotFound:"Arquivo nao encontrado ou excluido",fileTooLarge:"Arquivo muito grande (limite excedido)",backendError:"Falha ao ler o arquivo, o ambiente remoto pode estar indisponivel",backendTimeout:"Tempo esgotado para ler o arquivo",unsupportedBackend:"O backend de terminal atual nao suporta download de arquivos",invalidPath:"Caminho de arquivo invalido",contentDisplay:"Exibicao de conteudo",download:"Baixar",downloadFile:"Baixar arquivo"},gateways:{title:"Gateways",running:"Em execução",stopped:"Parado",started:"Iniciado",startFailed:"Falha ao iniciar gateway",stopFailed:"Falha ao parar gateway"},workflow:{title:"Workflow",profile:"Perfil",namePlaceholder:"Nome do workflow",workspace:{title:"Selecionar workspace",select:"Selecionar workspace",clear:"Limpar workspace"},actions:{newWorkflow:"New Workflow",addNode:"Add Node",createWorkflowFirst:"Please create a workflow first",reset:"Reset",startExecution:"Start Execution",executionPending:"Workflow execution is not connected yet",executionStarted:"Workflow execution started",executionCompleted:"Workflow execution completed",executionFailed:"Workflow execution failed",rerunDownstreamKeepNode:"Manter este nó e executar abaixo",rerunDownstreamClearNode:"Limpar este nó e executar abaixo",rerunDownstreamStarted:"Reexecução abaixo iniciada",rerunFromNodeStarted:"Reexecução iniciada a partir deste nó",rerunFailed:"Falha ao reexecutar o workflow",deleteNode:"Delete Node",deleteEdge:"Delete Connection"},batch:{toggle:"Batch selection",selectAll:"Select all",confirmDelete:"Delete {count} selected workflows?",deleteSuccess:"Deleted {count} workflows",deletePartial:"{failed} workflows failed to delete",deleteFailed:"Batch delete failed"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Node name",agent:"Agent",model:"Model",apiMode:"Modo da API",input:"Input",promptPlaceholder:"Describe what this agent should do...",skillsPlaceholder:"Skills, Enter para adicionar",uploadImages:"Enviar imagens"},status:{idle:"Inativo",queued:"Na fila",running:"Em execução",completed:"Concluído",failed:"Falhou",canceled:"Cancelado"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Selected Node",none:"No node selected"},stats:{nodes:"Nodes",edges:"Links"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Default Model",fast:"Fast Model",reasoning:"Reasoning Model"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Enter this node input.",node2:"Enter this node input.",node3:"Enter this node input.",plan:"Break the request into actionable steps.",execute:"Run the implementation steps and produce artifacts.",review:"Review output quality and identify follow-up work."},newNodeTitle:"Node {count}"},kanban:{title:"Quadro Kanban",createTask:"Nova tarefa",noTasks:"Nenhuma tarefa",allStatuses:"Todos os status",allAssignees:"Todos os responsáveis",columns:{triage:"Triagem",todo:"A fazer",scheduled:"Agendado",ready:"Pronto",running:"Em andamento",blocked:"Bloqueado",review:"Revisão",done:"Concluído",archived:"Arquivado"},card:{assigneeTooltip:"Responsável",priority:{low:"Baixa",medium:"Média",high:"Alta"},timeAgo:{justNow:"agora mesmo",minutes:"há {count} min",hours:"há {count} h",days:"há {count} d"}},board:{create:"Novo quadro",archive:"Arquivar quadro",archiveConfirm:"Arquivar o quadro atual?",archived:"Quadro arquivado",created:"Quadro criado",slugPlaceholder:"Identificador do quadro, ex. project-a",namePlaceholder:"Nome exibido (opcional)",slugRequired:"O identificador do quadro é obrigatório"},form:{title:"Título",titlePlaceholder:"Título da tarefa",titleRequired:"Título é obrigatório",body:"Descrição",bodyPlaceholder:"Descrição da tarefa (opcional)",assignee:"Responsável",selectAssignee:"Selecionar responsável...",priority:"Prioridade",selectPriority:"Selecionar prioridade...",tenant:"Locatário",tenantPlaceholder:"Locatário (opcional)",workspace:"Workspace",workspaceScratch:"Workspace temporário",workspaceDir:"Usar diretório",workspaceWorktree:"Usar worktree",workspacePath:"Caminho do workspace",workspacePathPlaceholder:"Caminho absoluto (opcional)",branch:"Branch",branchPlaceholder:"Branch do worktree",skills:"Skills",skillsPlaceholder:"Selecionar skills...",triage:"Criar em triagem",goalMode:"Modo objetivo",maxRuntime:"Tempo máximo",maxRuntimePlaceholder:"ex. 30m, 2h",maxRetries:"Máx. tentativas",maxRetriesPlaceholder:"Número de tentativas",goalMaxTurns:"Máx. turnos do objetivo",goalMaxTurnsPlaceholder:"Máximo de turnos"},detail:{status:"Status",priority:"Prioridade",assignee:"Responsável",tenant:"Locatário",createdAt:"Criado",startedAt:"Iniciado",completedAt:"Concluído",comments:"Comentários",events:"Eventos",runs:"Execuções",artifacts:"Arquivos gerados",result:"Resultado",highlights:"Informações principais",sources:"Fontes de dados",sessions:"Sessões relacionadas",sessionMessages:"Mensagens da sessão",noSessions:"Nenhuma sessão relacionada encontrada.",noLog:"Nenhum log encontrado para esta tarefa.",addComment:"Adicionar comentário",commentPlaceholder:"Escreva um comentário...",operations:"Operações"},action:{title:"Ações",assign:"Atribuir",assignTo:"Atribuir a...",block:"Bloquear",blockReason:"Motivo do bloqueio",unblock:"Desbloquear",complete:"Concluir",completeSummary:"Resumo de conclusão (opcional)",dispatch:"Despachar",recoveryReason:"Motivo de recuperação (opcional)",reclaim:"Recuperar",reassign:"Reatribuir",specify:"Especificar",loadLog:"Carregar log",loadDiagnostics:"Carregar diagnósticos"},message:{loadFailed:"Falha ao carregar tarefa",taskCreated:"Tarefa criada",taskAssigned:"Tarefa atribuída",taskBlocked:"Tarefa bloqueada",taskUnblocked:"Tarefa desbloqueada",taskCompleted:"Tarefa concluída",dispatchNudged:"Dispatcher acionado",commentAdded:"Comentário adicionado",taskReclaimed:"Tarefa recuperada",taskReassigned:"Tarefa reatribuída",taskSpecified:"Tarefa especificada"},stats:{total:"Total",tasks:"Tarefas"}}},Rr={login:{title:"Hermes Web UI",description:"Введите имя пользователя и пароль для продолжения.",placeholder:"Токен доступа",submit:"Войти",tokenRequired:"Введите токен доступа",invalidToken:"Недействительный токен",connectionFailed:"Не удалось подключиться к серверу",passwordLogin:"Вход по паролю",tokenLogin:"Вход по токену",usernamePlaceholder:"Имя пользователя",passwordPlaceholder:"Пароль",defaultCredentialsHint:"Логин по умолчанию: admin, пароль по умолчанию: 123456",credentialsRequired:"Введите имя пользователя и пароль",invalidCredentials:"Неверное имя пользователя или пароль",tooManyAttempts:"Слишком много неудачных попыток входа, повторите попытку позже",sessionExpired:"Сеанс истёк, войдите снова",accessDenied:"У вас нет прав доступа к этому ресурсу",passwordMismatch:"Пароли не совпадают",passwordTooShort:"Длина пароля должна быть не менее 6 символов",setupSuccess:"Настройка входа по паролю выполнена успешно",passwordChanged:"Пароль успешно изменён",passwordRemoved:"Вход по паролю удалён",setupPassword:"Настроить вход по паролю",changePassword:"Изменить пароль",changeUsername:"Изменить имя пользователя",removePasswordLogin:"Удалить",username:"Имя пользователя",currentPassword:"Текущий пароль",newPassword:"Новый пароль",confirmPassword:"Подтвердите пароль",newUsername:"Новое имя пользователя",usernameChanged:"Имя пользователя успешно изменено",usernameTooShort:"Имя пользователя должно содержать не менее 2 символов",setupDescription:"Управление именем пользователя и паролем для входа.",removeConfirm:"Учётная запись пользователя должна сохранять вход по паролю.",passwordLoginNotConfigured:"Вход по паролю не настроен",passwordLoginConfigured:"Текущая учётная запись: {username}",defaultCredentialTitle:"Измените учётные данные по умолчанию",defaultCredentialMessage:"Текущая учётная запись всё ещё использует имя пользователя или пароль по умолчанию. Во избежание несанкционированного доступа, как можно скорее измените имя пользователя и пароль для этой учётной записи.",defaultCredentialAction:"Изменить",defaultCredentialLater:"Напомнить позже"},users:{title:"Управление учётными записями",description:"Создавайте пользователей, назначайте роли и управляйте доступом к конфигурациям для обычных администраторов.",create:"Создать пользователя",edit:"Редактировать пользователя",username:"Имя пользователя",role:"Роль",statusLabel:"Статус",profiles:"Доступные конфигурации",profilesPlaceholder:"Выберите доступные конфигурации",allProfiles:"Все конфигурации",noProfiles:"Нет связанных конфигураций",lastLogin:"Последний вход",newPasswordOptional:"Новый пароль (оставьте пустым, чтобы не менять)",loadFailed:"Не удалось загрузить список пользователей",deleteConfirm:"Подтвердите удаление этого пользователя?",enable:"Включить",disable:"Отключить",roles:{superAdmin:"Суперадминистратор",admin:"Администратор"},status:{active:"Включён",disabled:"Отключён"}},common:{loading:"Загрузка...",cancel:"Отмена",delete:"Удалить",retry:"Повторить",reset:"Сбросить",edit:"Редактировать",save:"Сохранить",saved:"Сохранено",saveFailed:"Ошибка сохранения",deleteFailed:"Ошибка удаления",ok:"ОК",copied:"Скопировано",copy:"Копировать",update:"Обновить",create:"Создать",noData:"Нет данных",expired:"Истёк",fetch:"Получить",add:"Добавить",enable:"Включить",disable:"Отключить",configured:"Настроено",notConfigured:"Не настроено",confirm:"Подтвердить",expand:"Развернуть",collapse:"Свернуть",start:"Запустить",stop:"Остановить"},sidebar:{chat:"Чат",backToChat:"Назад",search:"Поиск",apiRelay:"Ретранслятор API",history:"История",jobs:"Задачи",kanban:"Канбан",workflow:"Рабочий процесс",models:"Модели",profiles:"Пользователи",plugins:"Плагины",petdex:"Pets",skills:"Навыки",memory:"Память",logs:"Логи",usage:"Использование",performance:"Мониторинг производительности",skillsUsage:"Использование навыков",channels:"Каналы",gateways:"Шлюзы",terminal:"Терминал",singleChat:"Чат",globalAgent:"Global Agent",groupChat:"Групповой чат",files:"Файлы",devices:"Устройства",groupConversation:"Диалог",groupConversationShort:"Диалог",groupPlatform:"Платформа",groupAgent:"Агент",groupAgentShort:"Агент",groupSystem:"Система",groupSystemShort:"Система",groupMonitoring:"Мониторинг",groupMonitoringShort:"Мониторинг",groupTools:"Инструменты",settings:"Настройки",connected:"Подключено",disconnected:"Отключено",collapse:"Свернуть меню",expand:"Развернуть меню",updateTip:'Для обновления выполните в терминале "hermes-web-ui update"',updateVersion:"Обновить до версии v{version}",reloadClientVersion:"Обновить клиент до v{version}",updating:"Обновление...",updateSuccess:"Обновление успешно. Обновите страницу. Если долго не запускается, запустите вручную.",updateFailed:"Ошибка обновления",logout:"Выйти",nodeVersionWarning:"Обнаружена Node.js v{version}. Пожалуйста, обновитесь до версии 23 или выше.",changelog:"Список изменений",noChangelog:"Нет списка изменений",versionManagement:"Управление версиями"},runtimeVersions:{title:"Управление версиями",runtimeTitle:"Hermes Runtime",webUiTitle:"Web UI",platform:"Платформа",currentWebUi:"Текущий Web UI",activeVersion:"Активная версия",active:"Активна",installed:"Установлена",download:"Скачать",downloadGithub:"Скачать с GitHub",downloadCf:"Скачать с Cloudflare",github:"GitHub",cf:"Cloudflare",useVersion:"Использовать при следующем запуске",deleteVersion:"Удалить",deleteRuntimeConfirm:"Удалить Hermes Runtime {version}?",deleteWebUiConfirm:"Удалить Web UI {version}?",deleteRuntimeSuccess:"Runtime удален",deleteWebUiSuccess:"Web UI удален",refresh:"Обновить",noVersions:"Нет доступных версий",remoteLoadFailed:"Не удалось загрузить удаленные версии",downloadTasks:"Задачи загрузки",downloadStarted:"Загрузка начата",activateSuccess:"Выбор версии сохранен. Перезапустите Hermes Studio, чтобы применить его.",jobStatus:{queued:"В очереди",running:"Выполняется",completed:"Завершено",failed:"Ошибка"},jobStageStatus:{queued:"В очереди",resolve:"Определение",download:"Загрузка",verify:"Проверка",extract:"Распаковка",install:"Установка",completed:"Завершено",failed:"Ошибка"},jobStage:{queued:"В очереди",download:"Загрузка",resolveRuntime:"Определение пакета Runtime",verifyRuntime:"Проверка архива Runtime",extractRuntime:"Распаковка архива Runtime",installRuntime:"Установка Runtime",resolveWebUi:"Определение пакета Web UI",verifyWebUi:"Проверка архива Web UI",extractWebUi:"Распаковка архива Web UI",installWebUi:"Установка Web UI",completed:"Завершено",failed:"Ошибка"}},codingAgents:{installFailedHermesHint:"Installation failed. Ask Hermes to install it for you.",installFailureReason:"Reason"},devices:{title:"Устройства",count:"Устройств: {count}",lastScanned:"Последнее сканирование: {time}",refresh:"Обновить",empty:"Устройства не найдены",computer:"Компьютер",endpointLabel:"Точка доступа",statusLabel:"Статус",online:"Online",offline:"Offline",address:"Адрес",os:"ОС",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Задержка",lastSeen:"Последний раз обнаружено",open:"Открыть",never:"Никогда",unknown:"Неизвестно",loadFailed:"Не удалось загрузить устройства",scanFailed:"Не удалось просканировать устройства",updateFailed:"Не удалось обновить устройство",duplicateRequest:"Уже есть ожидающий запрос на сопряжение",manualPairing:"Pair by URL",copyPairingLink:"Copy pairing link",manualUrlPlaceholder:"https://device.example.com",manualUrlRequired:"Enter a device URL",manualRequestSent:"Pairing request sent",manualRequestFailed:"Failed to request remote pairing",pairingLinkCopied:"Pairing link copied",pairingLinkCopyFailed:"Failed to copy pairing link",pairingCodeTitle:"Enter pairing code",pairingCodePlaceholder:"Pairing code",pairingCodeRequired:"Enter the pairing code",submitPairingRequest:"Submit request",processed:"Обработано",unprocessed:"Не обработано",deleteHistory:"Удалить запись",deleteHistoryConfirm:"Удалить эту запись запроса и отозвать доступ подключения для этого устройства?",requests:"Запросы",requestsWithCount:"Запросы ({count})",noRequests:"Запросов нет",requestPairing:"Запросить сопряжение",paired:"Сопряжено",approve:"Одобрить",reject:"Отклонить",block:"Заблокировать",unblock:"Разблокировать",inboundStatus:{none:"Запрос разрешен",pending:"Ожидает",approved:"Одобрено",rejected:"Отклонено",blocked:"Заблокировано"},outboundStatus:{none:"Не сопряжено",pending:"Запрошено",approved:"Сопряжено",rejected:"Отклонено",blocked:"Заблокировано"},endpoint:{web:"Web",desktop:"Настольное приложение",custom:"Пользовательский"}},performance:{title:"Мониторинг производительности",subtitle:"Просмотр системных ресурсов, Bridge Broker, воркеров и активных сеансов",refresh:"Обновить",autoRefreshOn:"Автообновление",autoRefreshOff:"Ручное обновление",loadFailed:"Ошибка загрузки данных производительности",systemCpu:"ЦП системы",systemMemory:"Память системы",activeSessions:"Активные сеансы",runningSessions:"Запущено {count}",workers:"Воркеры",totalWorkerMemory:"Общая память воркеров",processes:"Процессы",uptime:"Время работы",running:"Запущен",stopped:"Остановлен",workerMemory:"Память воркера",lastUpdated:"Время обновления",profile:"Профиль",memory:"Память",sessions:"Сеансы",runningActiveSessions:"Запущено / Активно",lastUsed:"Последнее использование",status:"Статус",noWorkers:"Нет воркеров",sessionsByProfile:"Сеансы по профилям",noActiveSessions:"Нет активных сеансов"},drawer:{terminal:"Терминал",files:"Рабочая область"},chat:{contextRemaining:"Осталось",contextClickToEdit:"Нажмите, чтобы изменить размер контекста",contextEditTitle:"Изменить размер контекста",contextEditDesc:"Установите лимит размера контекста для текущей модели (в токенах)",contextEditPlaceholder:"Введите размер контекста",contextEditHint:"Типовые значения: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Сохранить",contextEditCancel:"Отмена",contextEditInvalid:"Введите корректный размер контекста",contextEditSuccess:"Размер контекста обновлён",contextEditFailed:"Ошибка обновления",emptyState:"Начните диалог с Hermes Agent",viewOlderInHistory:"Посмотреть более ранние сообщения в истории",scrollToBottom:"Прокрутить вниз",cliEmptyState:"Начните CLI-диалог",outlineTitle:"План беседы",outlineEmpty:"Нет содержимого беседы",outlineUserQuestion:"Вопрос пользователя",inputPlaceholder:"Введите сообщение... (Enter — отправить, Shift+Enter — новая строка)",inputHeightResizeHint:"Перетащите, чтобы изменить высоту поля ввода, и дважды щелкните для сброса.",slashCommandArgs:{message:"<сообщение>",title:"<заголовок>",text:"<текст>"},slashCommands:{usage:"Рассчитать использование текущего сеанса",status:"Показать статус сеанса и очередь",abort:"Остановить текущий запуск Bridge",queue:"Добавить сообщение в очередь после текущего запуска",learn:"Создать переиспользуемый навык из описанных источников",clear:"Очистить текущее отображение",clearHistory:"Удалить сохранённую историю сообщений текущего сеанса",title:"Переименовать текущий сеанс",compress:"Запустить сжатие контекста в простое",steer:"Отправить направляющий текст текущему запуску Bridge",destroy:"Освободить Bridge Agent текущего сеанса",reloadMcp:"Перезагрузить серверы MCP",reloadSkills:"Перезагрузить команды skills"},attachFiles:"Прикрепить файлы",reasoningEffort:{tooltip:"Глубина рассуждений",defaultLabel:"По умолчанию",options:{default:"По умолчанию (config.yaml)",none:"Нет",minimal:"Минимум",low:"Низкая",medium:"Средняя",high:"Высокая",xhigh:"Очень высокая"}},autoPlaySpeech:"Автовоспроизведение речи",voiceInput:{startCapture:"Начать голосовой ввод",stopCaptureAndInsert:"Остановить голосовой ввод и вставить текст в поле ввода",cancelCapture:"Отменить голосовой ввод",statusLabel:"Статус: {status}",transcriptLabel:"Транскрипт: {text}",errorLabel:"Ошибка: {error}",recentEvents:"Последние события",status:{idle:"Ожидание",capturing:"Слушаю",transcribing:"Расшифровка",sending:"Вставка в поле ввода",error:"Ошибка"},browserSpeechUnsupported:"Распознавание речи браузером не поддерживается в этом браузере.",browserSpeechFailed:"Распознавание речи браузером не удалось.",browserSpeechFailedWithReason:"Распознавание речи браузером не удалось: {error}.",microphoneUnsupported:"Запись с микрофона не поддерживается в этом браузере.",microphoneRecordingFailed:"Запись с микрофона не удалась."},showToolCalls:"Показать вызовы инструментов",hideToolCalls:"Скрыть вызовы инструментов",messageQueue:"Очередь сообщений",removeQueuedMessage:"Удалить сообщение из очереди",stop:"Остановить",start:"Запустить",stopGateway:"Остановить шлюз",send:"Отправить",contextUsed:"Контекст использован:",sessions:"Сеансы",webUiSessions:"Сеансы",allProfiles:"Все профили",profileMissingModelsTip:"У профиля «{profile}», к которому относится этот сеанс, нет доступных провайдеров или моделей",sessionScopeHint:"Здесь отображаются только текущие сеансы; сеансы CLI, Telegram, Discord, Cron и других каналов доступны в истории только для чтения.",openHistory:"Открыть историю",hermesHistory:"История Hermes",historyScopeHint:"Здесь для чтения отображаются исторические сеансы Hermes текущего профиля с разбивкой по источникам.",noSessions:"Нет сеансов",searchTitle:"Поиск сеансов",searchSubtitle:"Поиск по заголовку или содержимому сообщений",searchScope:"Область поиска: только локальная библиотека сеансов Web UI; сеансы истории Hermes только для чтения не включаются.",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"Поиск сеансов...",searchEmpty:"Недавние сеансы",searchRecent:"Недавние сеансы",searchNoResults:"Нет подходящих сеансов",searchNoSnippet:"Нет отображаемого фрагмента",searchEnterHint:"Enter — открыть · Esc — закрыть",searchFailed:"Ошибка поиска сеансов",newChat:"Новый диалог",agent:"Agent",approvalKicker:"Авторизация в терминале",approvalTitle:"Подтвердите команду перед выполнением",approvalAgree:"Согласиться",approvalAllowOnce:"Разрешить однократно",approvalAllowSession:"Разрешить для этого сеанса",approvalAlways:"Разрешить всегда",approvalDeny:"Отказать",newCliChat:"Новый CLI",deleteSession:"Удалить этот сеанс?",sessionDeleted:"Сеанс удалён",toggleBatchMode:"Пакетный выбор",selectAll:"Выбрать всё",confirmBatchDelete:"Удалить выбранные сеансы ({count})?",batchDeleteSuccess:"Удалено сеансов: {count}",batchDeletePartial:"Не удалось удалить сеансов: {failed}",batchDeleteFailed:"Ошибка пакетного удаления",rename:"Переименовать",archiveSession:"Архивировать",unarchiveSession:"Вернуть из архива",pin:"Закрепить",unpin:"Открепить",pinned:"Закреплено",chatMode:"Чат",liveMode:"В реальном времени",liveSessions:"Сеансы в реальном времени",recentBadge:"Недавние",linkedSessions:"Связано сеансов: {count}",noVisibleMessages:"Нет видимых человеку сообщений.",monitorRoleUser:"Пользователь",monitorRoleAssistant:"Ассистент",copySessionLink:"Копировать ссылку на сеанс",copySessionId:"Копировать ID сеанса",export:"Экспорт",editConfig:"Редактировать конфигурацию",exportFull:"Полный экспорт (JSON)",exportCompressed:"Сжатый экспорт (TXT)",exportCompressing:"Сжатие контекста, подождите...",exportSuccess:"Сеанс экспортирован",exportFailed:"Ошибка экспорта",renamed:"Переименовано",renameFailed:"Ошибка переименования",sessionArchived:"Сеанс архивирован",archiveSessionFailed:"Не удалось архивировать сеанс",sessionUnarchived:"Сеанс возвращён из архива",unarchiveSessionFailed:"Не удалось вернуть сеанс из архива",renameSession:"Переименовать сеанс",sessionNotFound:"Сеанс не найден",enterNewTitle:"Введите новый заголовок",workspace:"Рабочая область",setWorkspace:"Установить рабочую область",setWorkspaceTitle:"Установить рабочую область сеанса",workspacePlaceholder:"Введите путь к проекту, например /home/user/project",folderPickerEmpty:"(Пусто)",folderPickerNoFolders:"Нет папок рабочей области",folderPickerSelected:"Выбрано:",workspaceSet:"Рабочая область установлена",workspaceSetFailed:"Ошибка установки рабочей области",setModel:"Установить модель",setModelTitle:"Установить модель сеанса",modelSet:"Модель установлена",modelSetFailed:"Ошибка установки модели",other:"Другое",runFailed:"Ошибка выполнения",error:"Ошибка",tool:"Инструмент",arguments:"Аргументы",result:"Результат",workspaceChanges:"Изменения workspace",changedFiles:"Изменено файлов: {files}",diffUnavailable:"Diff недоступен",binaryFileDiffUnavailable:"Diff для бинарного файла недоступен",truncated:"... (обрезано)",unchangedLines:"{count} строк без изменений",executionDuration:"Длительность выполнения",thinkingLabel:"Процесс размышления",thinkingInProgress:"Размышление",thinkingShow:"Развернуть процесс размышления",thinkingHide:"Свернуть процесс размышления",thinkingDuration:"Наблюдается {duration}",thinkingChars:"{count} зн.",copyBubble:"Копировать сообщение",copiedBubble:"Скопировано",copyFailed:"Ошибка копирования",playSpeech:"Воспроизвести речь",pauseSpeech:"Пауза",resumeSpeech:"Продолжить",stopSpeech:"Остановить",speechNotSupported:"Этот браузер не поддерживает воспроизведение речи"},workflow:{title:"Рабочий процесс",profile:"Профиль",namePlaceholder:"Название рабочего процесса",workspace:{title:"Выбрать рабочую область",select:"Выбрать рабочую область",clear:"Очистить рабочую область"},actions:{newWorkflow:"Новый workflow",addNode:"Добавить узел",createWorkflowFirst:"Сначала создайте workflow",reset:"Сбросить",startExecution:"Запустить выполнение",executionPending:"Выполнение workflow пока не подключено",executionStarted:"Выполнение workflow началось",executionCompleted:"Выполнение workflow завершено",executionFailed:"Выполнение workflow не удалось",rerunDownstreamKeepNode:"Сохранить этот узел и запустить ниже",rerunDownstreamClearNode:"Очистить этот узел и запустить ниже",rerunDownstreamStarted:"Повторный запуск нижних узлов начат",rerunFromNodeStarted:"Повторный запуск с этого узла начат",rerunFailed:"Не удалось повторно запустить workflow",deleteNode:"Удалить узел",deleteEdge:"Удалить соединение"},batch:{toggle:"Массовый выбор",selectAll:"Выбрать все",confirmDelete:"Удалить выбранные workflow: {count}?",deleteSuccess:"Удалено workflow: {count}",deletePartial:"Не удалось удалить workflow: {failed}",deleteFailed:"Массовое удаление не удалось"},validation:{nodesRequired:"Add at least one node",nodeNameRequired:"Node {node} needs a name",providerRequired:"Node {node} needs a provider",modelRequired:"Node {node} needs a model",apiModeRequired:"Node {node} needs an API mode",inputRequired:"Node {node} needs input",invalidEdge:"A connection references a missing node",invalidConnectionDirection:"Connections must go from the right output to the left input",orphanNode:"Node {node} is not connected to the workflow",disconnectedFlow:"The workflow cannot be split into multiple disconnected flows",cycle:"The workflow contains a cycle. Adjust the connections before saving."},node:{title:"Название узла",agent:"Agent",model:"Модель",apiMode:"Режим API",input:"Ввод",promptPlaceholder:"Опишите, что должен сделать этот Agent...",skillsPlaceholder:"Skills, Enter для добавления",uploadImages:"Загрузить изображения"},status:{idle:"Бездействует",queued:"В очереди",running:"Выполняется",completed:"Завершено",failed:"Ошибка",canceled:"Отменено"},runs:{title:"Run Records",refresh:"Refresh",empty:"No run records",startNodes:"{count} start nodes",show:"Show run records",hide:"Hide run records",nodeSessionTitle:"Node Session - {node}",noNodeSession:"This node has no session record yet",loadNodeSessionFailed:"Failed to load node session",stop:"Stop run",stopRequested:"Stop requested",stopFailed:"Failed to stop run",delete:"Delete record",deleteSuccess:"Run record deleted"},inspector:{selected:"Выбранный узел",none:"Узел не выбран"},stats:{nodes:"Узлы",edges:"Связи"},agents:{planner:"Planner",researcher:"Researcher",builder:"Builder",reviewer:"Reviewer"},models:{default:"Модель по умолчанию",fast:"Быстрая модель",reasoning:"Модель рассуждений"},initialNodes:{node1:"Node 1",node2:"Node 2",node3:"Node 3",plan:"Plan",execute:"Execute",review:"Review"},initialPrompts:{node1:"Введите данные для этого узла.",node2:"Введите данные для этого узла.",node3:"Введите данные для этого узла.",plan:"Разбейте запрос на выполнимые шаги.",execute:"Выполните шаги реализации и создайте артефакты.",review:"Проверьте качество результата и определите дальнейшую работу."},newNodeTitle:"Node {count}"},kanban:{title:"Канбан",createTask:"Создать задачу",noTasks:"Нет задач",allStatuses:"Все статусы",allAssignees:"Все ответственные",board:{create:"Создать канбан",archive:"Архивировать канбан",slugPlaceholder:"Идентификатор канбана, например project-a",namePlaceholder:"Отображаемое имя (необязательно)",slugRequired:"Идентификатор канбана не может быть пустым",created:"Канбан создан",archived:"Канбан архивирован",archiveConfirm:"Архивировать текущий канбан?"},columns:{triage:"На сортировку",todo:"К выполнению",scheduled:"Запланировано",ready:"Готово",running:"В работе",blocked:"Заблокировано",review:"Проверка",done:"Выполнено",archived:"В архиве"},form:{title:"Заголовок",titlePlaceholder:"Заголовок задачи",titleRequired:"Заголовок не может быть пустым",body:"Описание",bodyPlaceholder:"Описание задачи (необязательно)",assignee:"Ответственный",selectAssignee:"Выберите ответственного...",priority:"Приоритет",selectPriority:"Выберите приоритет...",tenant:"Арендатор",tenantPlaceholder:"Арендатор (необязательно)",workspace:"Рабочая область",workspaceScratch:"Временная рабочая область",workspaceDir:"Использовать каталог",workspaceWorktree:"Использовать worktree",workspacePath:"Путь рабочей области",workspacePathPlaceholder:"Абсолютный путь (необязательно)",branch:"Ветка",branchPlaceholder:"Ветка worktree",skills:"Навыки",skillsPlaceholder:"Выберите навыки...",triage:"Создать в сортировке",goalMode:"Режим цели",maxRuntime:"Макс. время выполнения",maxRuntimePlaceholder:"например 30m, 2h",maxRetries:"Макс. повторов",maxRetriesPlaceholder:"Количество повторов",goalMaxTurns:"Макс. ходов цели",goalMaxTurnsPlaceholder:"Максимум ходов"},card:{assigneeTooltip:"Ответственный",priority:{low:"Низкий",medium:"Средний",high:"Высокий"},timeAgo:{justNow:"Только что",minutes:"{count} мин. назад",hours:"{count} ч. назад",days:"{count} дн. назад"}},detail:{status:"Статус",assignee:"Ответственный",priority:"Приоритет",tenant:"Арендатор",createdAt:"Дата создания",startedAt:"Дата начала",completedAt:"Дата завершения",comments:"Комментарии",events:"События",runs:"Записи выполнения",result:"Результат выполнения",sessions:"Связанные сеансы",sessionMessages:"Журнал сеанса",noSessions:"Связанные сеансы не найдены.",artifacts:"Выходные файлы",sources:"Источники данных",highlights:"Ключевая информация",noLog:"Журнал для этой задачи не найден.",addComment:"Добавить комментарий",commentPlaceholder:"Напишите комментарий к задаче...",operations:"Операции"},action:{title:"Действие",complete:"Завершить",completeSummary:"Краткое описание завершения (необязательно)",block:"Заблокировать",blockReason:"Причина блокировки",unblock:"Разблокировать",assign:"Назначить",assignTo:"Назначить...",dispatch:"Запустить диспетчер",recoveryReason:"Причина восстановления (необязательно)",reclaim:"Вернуть",reassign:"Переназначить",specify:"Уточнить",loadLog:"Загрузить журнал",loadDiagnostics:"Загрузить диагностику"},message:{taskCreated:"Задача создана",taskCompleted:"Задача завершена",taskBlocked:"Задача заблокирована",taskUnblocked:"Задача разблокирована",taskAssigned:"Задача назначена",dispatchNudged:"Диспетчер запущен",commentAdded:"Комментарий добавлен",taskReclaimed:"Задача возвращена",taskReassigned:"Задача переназначена",taskSpecified:"Задача уточнена",loadFailed:"Ошибка загрузки задач"},stats:{total:"Всего",tasks:"задач"}},jobs:{title:"Периодические задачи",createJob:"Создать задачу",editJob:"Редактировать задачу",noJobs:"Нет периодических задач. Создайте первую.",sortBy:"Сортировка",sortByName:"По имени",sortByTime:"По дате",sortByNameHint:"Сортировать по имени",sortByTimeHint:"Сортировать по дате",sortAsc:"По возрастанию",sortDesc:"По убыванию",name:"Название",namePlaceholder:"Название задачи",schedule:"Выражение расписания (Cron)",schedulePlaceholder:"Например, 0 9 * * *",quickPresets:"Быстрые предустановки",selectPreset:"Выберите предустановку...",presetEveryMinute:"Каждую минуту",presetEvery5Min:"Каждые 5 минут",presetEveryHour:"Каждый час",presetEveryDay:"Каждый день в 00:00",presetEveryDay9:"Каждый день в 09:00",presetEveryMonday:"Каждый понедельник в 09:00",presetEveryMonth:"1-го числа каждого месяца в 09:00",prompt:"Подсказка (промпт)",promptPlaceholder:"Содержимое для выполнения",skills:"Навыки",skillsPlaceholder:"Выберите навыки...",deliverTarget:"Цель доставки",origin:"Источник",local:"Локально",repeatCount:"Количество повторений (необязательно)",modelPlaceholder:"Модель по умолчанию",repeatPlaceholder:"Оставьте пустым для бесконечного повторения",jobCreated:"Задача создана",jobUpdated:"Задача обновлена",nameRequired:"Название обязательно для заполнения",scheduleRequired:"Выражение расписания обязательно для заполнения",loadFailed:"Ошибка загрузки задач",jobPaused:"Задача приостановлена",jobResumed:"Задача возобновлена",jobTriggered:"Задача запущена",modelUpdated:"Модель обновлена",jobDeleted:"Задача удалена",status:{running:"Выполняется",paused:"Приостановлена",disabled:"Отключена",scheduled:"Запланирована"},info:{model:"Модель",schedule:"Расписание",lastRun:"Последний запуск",nextRun:"Следующий запуск",deliver:"Доставка",repeat:"Повторение"},action:{pause:"Приостановить",pauseJob:"Приостановить задачу",resume:"Возобновить",resumeJob:"Возобновить задачу",runNow:"Выполнить сейчас",triggerImmediately:"Запустить немедленно"},runHistory:{title:"История выполнения",runs:"запусков",noRuns:"Нет истории выполнения."}},skills:{title:"Навыки",targetFilter:"Среда",targets:{hermes:"Hermes",claude:"Claude",codex:"Codex"},searchPlaceholder:"Поиск навыков...",noMatch:"Нет подходящих навыков",noSkills:"Нет навыков",backTo:"Назад",attachedFiles:"Прикреплённые файлы",loadFailed:"Ошибка загрузки навыков",fileLoadFailed:"Ошибка загрузки файла",modified:"Пользователь изменил",archived:"В архиве",pinned:"Закреплено",pin:"Закрепить навык",unpin:"Открепить",pinFailed:"Ошибка изменения статуса закрепления",edit:"Редактировать",saving:"Сохранение...",editorLabel:"Редактор skill",saveSuccess:"Skill сохранён",saveFailed:"Ошибка сохранения skill",toggleFailed:"Ошибка переключения статуса навыка",source:{builtin:"Встроенный",hub:"Установленный из Hub",local:"Локально установленный"},writeApprovalButton:"Ожидает {count}",writeApprovalTitle:"Ожидающие подтверждения записи",writeApprovalDescription:"Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.",writeApprovalRefresh:"Обновить",writeApprovalEmpty:"Нет ожидающих записей.",writeApprovalUnsupported:"Эта версия Hermes Agent не поддерживает подтверждение записей. Обновите Hermes Agent, чтобы использовать эту функцию.",writeApprovalMemory:"Память",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Проверить",writeApprovalHideDiff:"Скрыть",writeApprovalNoDiff:"Нет доступных изменений.",writeApprovalLoadFailed:"Не удалось загрузить ожидающие записи",writeApprovalDiffFailed:"Не удалось загрузить детали записи",writeApprovalActionFailed:"Не удалось обработать ожидающую запись",writeApprovalApproved:"Запись подтверждена",writeApprovalRejected:"Запись отклонена",writeApprovalApprove:"Подтвердить",writeApprovalReject:"Отклонить",writeApprovalPendingMemoryWrite:"Ожидающая запись памяти",writeApprovalCurrentFile:"Текущий файл {file}",writeApprovalProposedFile:"Предлагаемый файл {file}",writeApprovalDiffSection:"Изменения",writeApprovalPatchOldStringMissing:"old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.",writeApprovalRequestedOldString:"Запрошенный old_string",writeApprovalCurrentReadFailed:"Текущий файл {file} не удалось прочитать как текст UTF-8.",writeApprovalDeleteSkill:"Это подтверждение удалит skill {skill}.",writeApprovalRemoveFile:"Это подтверждение удалит {file} из skill {skill}."},plugins:{title:"Плагины",refresh:"Обновить",notice:"Отображаются манифесты обнаруживаемых плагинов Hermes. Чтение метаданных не загружает код плагинов. Пользовательские standalone-плагины можно включать или отключать здесь; изменения вступают в силу в новых сеансах Hermes.",loadFailed:"Ошибка загрузки плагинов",updateFailed:"Не удалось обновить плагин",enableSuccess:"{name} включён",disableSuccess:"{name} отключён",commandCopied:"Команда скопирована",searchPlaceholder:"Поиск по ключу, имени, описанию, пути...",source:"Источник",kind:"Тип",statusTitle:"Статус",configStatus:"Конфигурация: {status}",notAvailable:"Нет",copyCommand:"Копировать команду",managedElsewhere:"Управляется из другого места",noMatch:"Нет плагинов, соответствующих текущим критериям фильтрации",enabled:"Включён",disabled:"Отключён",summary:{total:"Всего",active:"Включено / Авто",inactive:"Не включено",disabled:"Отключено",providerManaged:"Управляется провайдером"},status:{enabled:"Включён","auto-active":"Автовключение",inactive:"Не включён",disabled:"Отключён","provider-managed":"Управляется провайдером"},statusLabel:{enabled:"Включён конфигурацией","auto-active":"Автовключение",inactive:"Не включён",disabled:"Отключён","provider-managed":"Управляется провайдером"},configStatuses:{enabled:"Включён",disabled:"Отключён","not-enabled":"Не включён",auto:"Авто","provider-managed":"Управляется провайдером"},table:{plugin:"Плагин",status:"Статус",source:"Источник",kind:"Тип",capabilities:"Возможности",path:"Путь / Точка входа",manage:"Управление"},capabilities:{tools:"{count} инструментов",hooks:"{count} хуков",env:"{count} переменных окружения"},metadata:{agentRoot:"Корневая директория агента",python:"Python",scanCwd:"Сканировать cwd",projectPlugins:"Плагины проекта"}},petdex:{title:"Petdex Pets",subtitle:"Browse the public petdex catalog used by Hermes desktop pets.",refresh:"Refresh",adopt:"Adopt",active:"Active",adopted:"Adopted {name}",adoptFailed:"Failed to adopt pet",loadFailed:"Failed to load petdex catalog",searchPlaceholder:"Search by name, slug, author, or kind",kindFilter:"Kind",spritesheet:"Spritesheet",submittedBy:"By {name}",empty:"No pets match the current filters.",showMore:"Show {count} more",summary:{total:"Catalog total",visible:"Matching",kinds:"Kinds",generatedAt:"Generated at"}},memory:{title:"Память",refresh:"Обновить",loadFailed:"Ошибка загрузки памяти",myNotes:"Мои заметки",noNotes:"Нет заметок.",notesPlaceholder:"Введите текст заметки...",userProfile:"Профиль пользователя",noProfile:"Нет профиля.",profilePlaceholder:"Введите профиль пользователя...",soul:"Душа",noSoul:"Нет конфигурации души.",soulPlaceholder:"Введите конфигурацию души..."},models:{title:"Модели",searchPlaceholder:"Поиск моделей...",noResults:"Нет результатов",noModels:"Нет моделей",addProvider:"Добавить провайдера",refreshModelCache:"Обновить кеш моделей",refreshModelCacheLoading:"Обновление кеша моделей...",refreshModelCacheSuccess:"Кеш моделей обновлен",refreshModelCacheFailed:"Не удалось обновить кеш моделей",providerType:"Тип провайдера",preset:"Предустановка",custom:"Пользовательский",selectProvider:"Выбрать провайдера",chooseProvider:"Выберите провайдера...",getApiKey:"Получить API-ключ",name:"Название",autoGeneratedName:"Генерируется автоматически на основе базового URL",baseUrl:"Базовый URL",region:"Регион",regionIntl:"Международный",regionCn:"Китай",baseUrlPlaceholder:"Например, https://api.example.com/v1",apiKey:"API-ключ",apiKeyPlaceholder:"sk-...",defaultModel:"Модель по умолчанию",selectOrInput:"Выберите или введите название модели...",selectModel:"Выберите модель...",providerAdded:"Провайдер добавлен",providerDeleted:"Провайдер удалён",providerCredentialsCleared:"Учётные данные провайдера очищены",clearProviderCredentials:"Очистить учётные данные",clearCredentialsConfirm:"Очистить сохранённые учётные данные для «{name}»? Этот встроенный провайдер останется в списке и снова заработает после настройки учётных данных.",disableProvider:"Отключить провайдера",disableProviderConfirm:"Отключить встроенного провайдера «{name}»? Он останется встроенным и его можно будет включить позже.",providerDisabled:"Провайдер отключён",defaultProviderUpdated:"Провайдер по умолчанию обновлён",defaultProviderUpdateFailed:"Не удалось обновить провайдера по умолчанию",defaultModelUpdated:"Модель по умолчанию обновлена",defaultModelUpdateFailed:"Не удалось обновить модель по умолчанию",deleteProvider:"Удалить провайдера",deleteConfirm:'Удалить "{name}"?',codexLoginTitle:"Вход в OpenAI Codex",codexWaiting:"Введите следующий код на странице авторизации:",codexCopyCode:"Код скопирован",codexOpenLink:"Открыть страницу авторизации",codexApproved:"Вход выполнен",codexExpired:"Авторизация истекла. Повторите попытку.",nousLoginTitle:"Вход в Nous Portal",nousWaiting:"Введите этот код на странице авторизации:",nousCopyCode:"Код скопирован",nousOpenLink:"Открыть страницу авторизации",nousApproved:"Вход выполнен",nousDenied:"Авторизация отклонена. Повторите попытку.",nousExpired:"Авторизация истекла. Повторите попытку.",copilotLoginTitle:"Вход в GitHub Copilot",copilotWaiting:"Перейдите на GitHub и введите код устройства для авторизации. Окно закроется автоматически после завершения.",copilotCopyCode:"Код скопирован",copilotOpenLink:"Открыть страницу авторизации GitHub",copilotApproved:"Вход выполнен!",copilotDenied:"Авторизация отклонена.",copilotExpired:"Срок действия ссылки истёк. Повторите попытку.",copilotAddDetectedTitle:"Обнаружен GitHub Copilot",copilotAddDetected:"На этом компьютере найдены учётные данные OAuth GitHub Copilot. Нажмите «Добавить», чтобы включить Copilot в Hermes.",copilotAddSourceEnv:"Источник: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Источник: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Источник: плагин Copilot для VS Code (apps.json)",copilotDeleteHintEnv:"Это действие удалит COPILOT_GITHUB_TOKEN из ~/.hermes/.env, не затрагивая другие инструменты.",copilotDeleteHintGhCli:"Copilot будет удалён из списка Hermes. Это не повлияет на gh CLI — `gh auth status` по-прежнему будет показывать вход.",copilotDeleteHintAppsJson:"Copilot будет удалён из списка Hermes. Это не повлияет на вход в плагин Copilot для VS Code.",xaiLoginTitle:"Вход через OAuth xAI Grok",xaiWaiting:"Авторизуйтесь на открывшейся странице xAI. Окно закроется автоматически.",xaiOpenLink:"Открыть страницу авторизации xAI",xaiCopyLink:"Копировать ссылку авторизации",xaiApproved:"Вход выполнен!",xaiExpired:"Срок действия ссылки истёк. Повторите попытку.",anthropicLoginTitle:"Вход Claude OAuth",anthropicWaiting:"Завершите авторизацию на странице Claude и вставьте полученный код здесь.",anthropicOpenLink:"Открыть страницу авторизации Claude",anthropicCopyLink:"Копировать ссылку авторизации",anthropicCodePlaceholder:"Вставьте код авторизации...",anthropicSubmitCode:"Отправить код",anthropicApproved:"Вход выполнен!",anthropicExpired:"Авторизация истекла. Повторите попытку.",geminiLoginTitle:"Вход Google Gemini OAuth",geminiWaiting:"Завершите авторизацию на открытой странице Google. Окно закроется автоматически.",geminiOpenLink:"Открыть страницу авторизации Google",geminiCopyLink:"Копировать ссылку авторизации",geminiApproved:"Вход выполнен!",geminiExpired:"Срок действия ссылки истёк. Повторите попытку.",customBadge:"Пользовательская",previewBadge:"Предварительная",disabledBadge:"Недоступна",disabledTooltip:"Эта модель недоступна для текущей учётной записи",customModelPlaceholder:"ID модели, отсутствующей в списке",customModelHint:"Используйте, если провайдер поддерживает модель, но она не возвращена. Не переименование. Нажмите Enter для загрузки.",removeCustomModel:"Удалить эту модель из списка",refresh:"Обновить список моделей (перезагрузить config.yaml)",noProviders:"Нет провайдеров. Добавьте первого.",models:"Список моделей",count:"моделей",more:"ещё",aliasEdit:"Переименовать",aliasTitle:"Отображаемое имя модели",aliasTitleFor:"Отображаемое имя для {model}",aliasPlaceholder:"Оставьте пустым для использования исходного ID модели",aliasHint:"Изменяет только отображаемое имя в Web UI. В Hermes отправляется исходный ID модели.",aliasCanonical:"Исходный ID: {model}",aliasUseOriginal:"Восстановить исходный ID",aliasManage:"Отображаемые имена",aliasManageFor:"Отображаемые имена для {provider}",aliasSaveFailed:"Не удалось сохранить отображаемое имя",manageVisibleModels:"Управлять видимыми моделями",manageVisibleModelsFor:"Управление видимыми моделями для {name}",visibilityHint:"Влияет только на отображение в выборе моделей Web UI и на странице моделей. Не изменяет конфигурацию provider/model в Hermes CLI. Вызовы используют исходный ID модели.",visibilitySelectOne:"Оставьте хотя бы одну видимую модель",visibilitySaved:"Видимые модели сохранены",visibilitySaveFailed:"Не удалось сохранить видимые модели",showAllModels:"Показать все модели",clearVisibleModels:"Снять все",generalTitle:"Основные модели",combinationTitle:"Ансамбли моделей",combinationSubtitle:"Настройте пресеты MoA: reference-модели сначала дают варианты, затем одна aggregator-модель формирует финальный ответ и вызовы инструментов.",combinationPreset:"Пресет",combinationName:"Название",combinationAddModel:"Добавить ансамбль моделей",combinationEditModel:"Изменить ансамбль моделей",combinationNewPreset:"Новый пресет",combinationPresetPlaceholder:"например review",combinationAddPreset:"Добавить пресет",combinationSetDefault:"Сделать стандартным",combinationEnabled:"Включить reference-модели",combinationReferenceModels:"Reference-модели",combinationReferenceModel:"Reference-модель",combinationAddReference:"Добавить reference-модель",combinationAggregator:"Aggregator-модель",combinationReferenceTemperature:"Температура reference",combinationAggregatorTemperature:"Температура aggregator",combinationMaxTokens:"Макс. токенов",combinationNotSet:"Не задано",combinationSaved:"Ансамбль моделей сохранен",combinationLoadFailed:"Не удалось загрузить ансамбль моделей",combinationSaveFailed:"Не удалось сохранить ансамбль моделей",combinationPresetExists:"Пресет уже существует",combinationNameRequired:"Введите название ансамбля моделей",combinationNameInvalid:"Название может содержать только буквы, цифры, подчеркивания, дефисы и точки",combinationReferenceRequired:"Добавьте хотя бы одну reference-модель",combinationAggregatorRequired:"Выберите aggregator-модель",auxiliaryTitle:"Вспомогательные модели",auxiliarySubtitle:"Переопределения моделей для фоновых задач: сжатия, зрения, подтверждений, MCP и обслуживания.",auxiliaryRefresh:"Обновить",auxiliaryTask:"Задача",auxiliaryTimeout:"Тайм-аут",auxiliaryDownloadTimeout:"Тайм-аут загрузки",auxiliaryActions:"Действия",auxiliaryDefault:"По умолчанию",auxiliaryCustomEndpoint:"Пользовательский endpoint",auxiliaryProviderAuto:"Авто",auxiliaryProviderMain:"Основная модель",auxiliaryProviderPlaceholder:"auto, main или ключ провайдера",auxiliaryDownloadShort:"загрузка",auxiliaryExtraBody:"JSON дополнительного тела",auxiliaryClear:"Сбросить",auxiliarySaved:"Вспомогательные модели сохранены",auxiliaryLoadFailed:"Не удалось загрузить вспомогательные модели",auxiliarySaveFailed:"Не удалось сохранить вспомогательные модели",auxiliaryInvalidExtraBody:"Дополнительное тело должно быть JSON-объектом",auxiliaryTaskCompression:"Сжатие",auxiliaryTaskVision:"Зрение",auxiliaryTaskWebExtract:"Извлечение из веб-страниц",auxiliaryTaskSkillsHub:"Центр навыков",auxiliaryTaskApproval:"Подтверждение",auxiliaryTaskMcp:"MCP",auxiliaryTaskTitleGeneration:"Генерация заголовков",auxiliaryTaskTriageSpecifier:"Уточнение triage",auxiliaryTaskKanbanDecomposer:"Разбиение Kanban",auxiliaryTaskProfileDescriber:"Описание профиля",auxiliaryTaskCurator:"Куратор",auxiliaryTaskSessionSearch:"Поиск сессий",auxiliaryTaskFlushMemories:"Запись воспоминаний",currentDefault:"Текущая по умолчанию",defaultShort:"По умолч.",setDefaultProvider:"Сделать провайдером по умолчанию",setDefault:"Сделать по умолчанию",builtIn:"Встроенный",customType:"Пользовательский",provider:"Провайдер",contextLength:"Длина контекста",contextLengthPlaceholder:"Например, 200000 (необязательно)",apiMode:"Режим API",local:"Локальный ({host})",selectProviderRequired:"Выберите провайдера",baseUrlRequired:"Базовый URL обязателен",apiKeyRequired:"API-ключ обязателен",modelRequired:"Модель по умолчанию обязательна",enterBaseUrl:"Сначала введите базовый URL",unexpectedFormat:"Неожиданный формат ответа",foundModels:"Найдено моделей: {count}",fetchFailed:"Не удалось получить модели"},profiles:{title:"Профили",create:"Создать профиль",import:"Импорт",export:"Экспорт",rename:"Переименовать",delete:"Удалить",switchTo:"Переключить профиль Hermes",switchConfirm:"Будет выполнено `hermes profile use {name}` и активный профиль Hermes CLI переключится. Продолжить?",switchSuccess:'Активный профиль Hermes переключён на "{name}"',switchFailed:"Не удалось переключить профиль Hermes. Возможно, требуется ручной перезапуск шлюза.",createSuccess:'Профиль "{name}" создан',createFailed:"Ошибка создания профиля",renameSuccess:"Профиль переименован",renameFailed:"Ошибка переименования профиля",deleteConfirm:'Удалить профиль "{name}"?',deleteSuccess:"Профиль удалён",deleteFailed:"Ошибка удаления профиля",exportSuccess:"Профиль экспортирован",exportFailed:"Ошибка экспорта профиля",importSuccess:"Профиль импортирован",importFailed:"Ошибка импорта профиля",importSelectFile:"Выберите архивный файл",importInvalidFile:"Выберите корректный архивный файл (.tar.gz, .tgz, .gz, .zip)",name:"Название профиля",namePlaceholder:"Только строчные буквы, цифры, дефисы",nameValidation:"Название профиля может содержать только строчные буквы, цифры, символы подчёркивания и дефисы",newName:"Новое название",newNamePlaceholder:"Строчные буквы, цифры, дефис",cloneFromCurrent:"Клонировать из текущего профиля",cloneCleanupNotice:"При клонировании автоматически пропускаются эксклюзивные учётные данные платформ (Weixin / Telegram / Slack и др.), чтобы избежать конфликта с исходным профилем",cloneStrippedCredentials:"Очищено {count} эксклюзивных учётных данных: {list}",cloneDisabledPlatforms:"Отключено платформ: {count} — {list}",cloneStrippedConfigCredentials:"Очищено встроенных учётных данных в config.yaml: {count} — {list}",archivePath:"Путь к архиву",archivePathPlaceholder:"Путь к архивному файлу на сервере",importName:"Название профиля (необязательно)",importNamePlaceholder:"Оставьте пустым для использования имени архива",active:"Активен",model:"Модель",gateway:"Шлюз",alias:"Псевдоним",provider:"Провайдер",path:"Путь",skills:"Навыки",hasEnv:"Есть .env",hasSoulMd:"Есть soul.md",noProfiles:"Нет профилей. Создайте первый.",avatar:{title:"Пользовательский аватар",customize:"Аватар",upload:"Загрузить изображение",random:"Случайный",reset:"Сбросить на стандартный",hint:"Поддерживаются PNG, JPEG, WebP, максимум 1 МБ",invalidType:"Выберите изображение в формате PNG, JPEG или WebP",tooLarge:"Аватар не может превышать 1 МБ",saveSuccess:"Аватар сохранён",saveFailed:"Ошибка сохранения аватара",resetSuccess:"Стандартный аватар восстановлен",resetFailed:"Ошибка восстановления стандартного аватара"},runtime:{activeProfile:"Текущий: {name}",bridgeWorker:"Состояние моста",gateway:"Шлюз",active:"Активен",activeTag:"Текущий",idle:"Простой",running:"Работает",stopped:"Остановлен",restartGateway:"Перезапустить шлюз",restartProfile:"Перезапустить профиль",switchProfile:"Переключить профиль интерфейса",gatewayRestarted:"Шлюз перезапущен: {name}",gatewayRestartFailed:"Ошибка перезапуска шлюза",profileRestarted:"Профиль перезапущен: {name}",profileRestartFailed:"Ошибка перезапуска профиля"}},logs:{title:"Логи",all:"Все",searchPlaceholder:"Поиск...",refresh:"Обновить",noEntries:"Нет записей"},settings:{title:"Настройки",saved:"Сохранено",saveFailed:"Ошибка сохранения",tabs:{display:"Отображение",account:"Текущий аккаунт",users:"Управление аккаунтами",agent:"Агент",proxy:"Прокси",memory:"Память",compression:"Сжатие контекста",session:"Сеанс",privacy:"Конфиденциальность",apiServer:"API-сервер",models:"Модели",voice:"Голос"},models:{apiKey:"API-ключ",apiKeyPlaceholder:"Введите API-ключ",save:"Сохранить",saved:"Сохранено",saveFailed:"Ошибка сохранения",noProviders:"Нет настроенных моделей"},display:{streaming:"Потоковый ответ",streamingHint:"Отображать ответ AI по мере генерации",compact:"Компактный режим",compactHint:"Уменьшить отступы между сообщениями",showReasoning:"Показывать процесс рассуждения",showReasoningHint:"Отображать ход мыслей модели",showCost:"Показывать стоимость",showCostHint:"Отображать количество использованных токенов в ответе",inlineDiffs:"Встроенные различия",inlineDiffsHint:"Отображать изменения в коде внутри строки",bellOnComplete:"Звук завершения",bellOnCompleteHint:"Воспроизводить звук по окончании ответа AI",notifyOnComplete:"Уведомление о завершении",notifyOnCompleteHint:"Показывать системное уведомление по окончании ответа AI",notifyOnCompleteMacHint:"В macOS разрешите уведомления браузера в системных настройках.",notifyOnCompleteDenied:"Разрешение на уведомления отклонено",notifyOnCompleteInsecure:"Для уведомлений браузера требуется HTTPS или localhost",notifyOnCompleteUnsupported:"Этот браузер не поддерживает уведомления",notifyOnCompleteTest:"Уведомления включены.",notifyOnCompleteTestButton:"Тест",notifyOnCompleteTesting:"Отправка тестового уведомления...",notifyOnCompleteTestSent:"Тестовое уведомление отправлено",notifyOnCompleteTestFailed:"Не удалось отправить тестовое уведомление",busyInputMode:"Режим ввода во время занятости",busyInputModeHint:"Разрешить ввод, пока AI обрабатывает запрос",theme:"Тема",themeHint:"Выберите светлую, тёмную или системную тему",themeLight:"Светлая",themeDark:"Тёмная",themeSystem:"Системная",chatInputHeight:"Высота поля ввода чата",chatInputHeightHint:"Высота поля ввода чата на рабочем столе в пикселях. На мобильных остается авто."},agent:{maxTurns:"Максимум ходов",maxTurnsHint:"Максимальное количество ходов в одном диалоге",gatewayTimeout:"Таймаут шлюза",gatewayTimeoutHint:"Таймаут одного запроса (секунды)",restartDrainTimeout:"Таймаут слива при перезапуске",restartDrainTimeoutHint:"Время ожидания завершения запросов перед перезапуском (секунды)",toolEnforcement:"Стратегия выполнения инструментов",toolEnforcementHint:"Управление режимом вызова инструментов",auto:"Автоматически",always:"Всегда",never:"Никогда"},gatewayAutoStart:{title:"Автозапуск gateway",description:"Управляет тем, какие локальные gateway профилей Hermes Web UI запускает при старте. Настройка хранится в конфигурации Web UI, а не в profile config.yaml.",enabled:"Автоматически запускать gateway",enabledHint:"Если выключено, при старте не будет автоматически запущен ни один gateway профиля.",management:"Единый gateway",managementHint:"Требуется Hermes Agent 0.17.0 или новее. Если включено, Web UI записывает multiplex_profiles, чтобы default gateway обслуживал все профили; другие профили не могут отдельно настраивать точки входа сообщений, такие как Feishu, Weixin или QQBot. При выключении эта настройка удаляется.",managementAuto:"Автоматически",managementPerProfile:"Один gateway на профиль",managementUnified:"Единый default gateway",mode:"Политика профилей",modeHint:"Запускать все найденные профили или только явный список включения.",modeAll:"Все найденные профили",modeInclude:"Только включенные профили",include:"Включенные профили",includeHint:"Имена профилей через запятую. В режиме включения пустой список не запускает ничего.",exclude:"Исключенные профили",excludeHint:"Имена профилей через запятую, которые нужно пропустить после применения политики.",profileListPlaceholder:"default, reviewer"},proxy:{title:"Прокси gateway",description:"Задаёт переменные окружения прокси для gateway выбранного профиля. После изменений gateway перезапускается, чтобы платформы сообщений использовали новые сетевые настройки.",httpsProxy:"HTTPS_PROXY",httpsProxyHint:"Прокси для HTTPS-запросов. Обычно это основной параметр.",httpProxy:"HTTP_PROXY",httpProxyHint:"Прокси для обычных HTTP-запросов.",allProxy:"ALL_PROXY",allProxyHint:"Резервный прокси, если прокси для конкретного протокола не задан.",noProxy:"NO_PROXY",noProxyHint:"Хосты или домены через запятую, которые должны обходить прокси.",save:"Сохранить настройки прокси"},memory:{enabled:"Включить память",enabledHint:"Разрешить AI запоминать контекст диалога",userProfile:"Профиль пользователя",userProfileHint:"Разрешить AI запоминать предпочтения пользователя",charLimit:"Лимит символов памяти",charLimitHint:"Максимальное количество символов в MEMORY.md",userCharLimit:"Лимит символов профиля пользователя",userCharLimitHint:"Максимальное количество символов в USER.md"},compression:{enabled:"Включить сжатие",enabledHint:"Автоматически сжимать историю перед достижением лимита контекста модели",threshold:"Порог сжатия",thresholdHint:"Начинать сжатие, когда ожидаемое количество токенов превышает указанную долю контекста",targetRatio:"Целевая доля",targetRatioHint:"После сжатия история должна занимать указанную долю контекста",protectLastN:"Защищать последние сообщения",protectLastNHint:"Сколько последних сообщений не участвуют в сжатии",protectFirstN:"Защищать первые сообщения",protectFirstNHint:"Сколько первых сообщений не участвуют в сжатии"},session:{mode:"Режим сброса",modeHint:"Условия для сброса сеанса",modeBoth:"По бездействию + по расписанию",modeIdle:"Только по бездействию",modeDaily:"Только по расписанию",modeNone:"Никогда (только вручную)",idleMinutes:"Таймаут бездействия",idleMinutesHint:"Время бездействия (минуты) перед автоматическим сбросом",atHour:"Время сброса по расписанию",humanOnly:"Показывать только сеансы с человеком",humanOnlyHint:"По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов",liveMonitorHumanOnly:"В мониторинге в реальном времени: только сеансы с человеком",liveMonitorHumanOnlyHint:"По умолчанию скрывать шум от подчинённых агентов и мониторинга сеансов в просмотре в реальном времени",atHourHint:"Сбрасывать сеанс каждый день в указанный час",requireAuth:"Авторизация сеанса",requireAuthHint:"Требовать авторизацию для операций сеанса",memoryWriteApproval:"Проверять записи памяти",memoryWriteApprovalHint:"Отправлять записи памяти Hermes Agent на подтверждение перед сохранением.",skillsWriteApproval:"Проверять записи skills",skillsWriteApprovalHint:"Отправлять изменения skills от Hermes Agent на подтверждение перед сохранением.",writeApprovalTitle:"Ожидающие подтверждения записи",writeApprovalDescription:"Подтвердите или отклоните записи памяти и skills, подготовленные Hermes Agent.",writeApprovalRefresh:"Обновить",writeApprovalEmpty:"Нет ожидающих записей.",writeApprovalMemory:"Память",writeApprovalSkills:"Skills",writeApprovalViewDiff:"Проверить",writeApprovalHideDiff:"Скрыть",writeApprovalNoDiff:"Нет доступных изменений.",writeApprovalLoadFailed:"Не удалось загрузить ожидающие записи",writeApprovalDiffFailed:"Не удалось загрузить детали записи",writeApprovalActionFailed:"Не удалось обработать ожидающую запись",writeApprovalApproved:"Запись подтверждена",writeApprovalRejected:"Запись отклонена",writeApprovalApprove:"Подтвердить",writeApprovalReject:"Отклонить",writeApprovalPendingMemoryWrite:"Ожидающая запись памяти",writeApprovalCurrentFile:"Текущий файл {file}",writeApprovalProposedFile:"Предлагаемый файл {file}",writeApprovalDiffSection:"Изменения",writeApprovalPatchOldStringMissing:"old_string патча не найден в текущем файле {file}; подтверждение не изменит файл.",writeApprovalRequestedOldString:"Запрошенный old_string",writeApprovalCurrentReadFailed:"Текущий файл {file} не удалось прочитать как текст UTF-8.",writeApprovalDeleteSkill:"Это подтверждение удалит skill {skill}.",writeApprovalRemoveFile:"Это подтверждение удалит {file} из skill {skill}."},privacy:{redactPii:"Скрывать PII",redactPiiHint:"Автоматически обнаруживать и скрывать чувствительную информацию (пароли, ключи и т.д.)"},apiServer:{enable:"Включить",enableHint:"Включить API-сервер",host:"Хост",hostHint:"Адрес для прослушивания",port:"Порт",portHint:"Порт для прослушивания",key:"Ключ",keyHint:"Ключ доступа к API",cors:"Источник CORS",corsHint:"Разрешённые источники для кросс-доменных запросов"},lockedIps:{title:"Управление заблокированными IP",count:"Заблокировано IP: {count}",empty:"Нет заблокированных IP",unlock:"Разблокировать",unlockAll:"Разблокировать все",unlockAllConfirm:"Подтвердите разблокировку всех IP?",unlocked:"IP разблокирован",allUnlocked:"Разблокировано IP: {count}",type:{password:"Password",token:"API token",pairing:"Device pairing"}},userAvatar:{title:"Аватар пользователя",upload:"Загрузить изображение",random:"Сгенерировать случайный",reset:"Сбросить по умолчанию",hint:"Поддерживаются PNG, JPEG и WebP до 1 МБ; автоматически сжимается до менее 500 КБ.",invalidType:"Выберите изображение PNG, JPEG или WebP",tooLarge:"Изображение аватара должно быть не больше 1 МБ",saveSuccess:"Аватар сохранён",saveFailed:"Не удалось сохранить аватар",resetSuccess:"Аватар сброшен",resetFailed:"Не удалось сбросить аватар"},voice:{activeTtsApi:"Активная TTS API",activeSttApi:"Активная STT API",ttsProvidersTitle:"Провайдеры TTS",ttsProvidersDescription:"Управление интеграциями преобразования текста в речь для озвучивания ответов ассистента и предпросмотра голоса.",sttProvidersTitle:"Провайдеры STT",sttProvidersDescription:"Управление интеграциями распознавания речи, используемыми микрофоном и голосовым вводом.",noneSelected:"Ничего не выбрано",keyStored:"Сохранен",keyMissing:"Отсутствует",customApi:"API",localBuiltin:"Локальный встроенный",ttsCardHint:"Провайдер синтеза речи",sttCardHint:"Провайдер распознавания речи",setActive:"Сделать активным",testAction:"Тест",connect:"Подключить",presetEdgeTtsLabel:"Edge TTS",presetEdgeTtsDescription:"Бесплатные облачные голоса высокого качества от Microsoft Edge.",presetOpenaiTtsLabel:"OpenAI TTS",presetMimoTtsLabel:"MiMo TTS",presetDoubaoTtsLabel:"Volcengine Doubao TTS",presetCustomTtsLabel:"Пользовательский TTS",presetBrowserSttLabel:"STT браузера",presetBrowserSttDescription:"Нативная API распознавания речи браузера.",presetOpenaiWhisperLabel:"OpenAI Whisper",presetGroqSttLabel:"Groq STT",presetDoubaoSttLabel:"Volcengine Doubao STT",presetCustomSttLabel:"Пользовательский STT",apiCompatibility:"Совместимость API",openaiCompatible:"Совместимо с OpenAI",manualCustomEndpoint:"Ручной пользовательский endpoint",connectionStep:"Подключение",discoveryManualHint:"Выбран ручной пользовательский endpoint. Автообнаружение моделей недоступно; введите имя модели вручную.",discoveryCredentialHint:"Введите Base URL и API key, затем подключитесь, чтобы получить доступные модели.",discoveryNoAutoProbeHint:"При вводе запросы не отправляются. Нажмите Connect, когда данные готовы.",apiKeyConnectPlaceholder:"Вставьте API key для подключения; сохранённые ключи никогда не показываются",connectFetchModels:"Подключить и получить модели",modelRecommendedSuffix:"рекомендуется",modelConnectManualHint:"Подключитесь для автозаполнения или введите вручную.",modelRequiredConnectManual:"Модель обязательна. Подключитесь для автозаполнения или введите вручную.",apiKeyRequired:"API key обязателен.",apiKeyRequiredForDiscovery:"API key обязателен для получения моделей.",baseUrlRequired:"Base URL обязателен.",baseUrlHttpsRequired:"Используйте http:// или https://.",baseUrlInvalid:"Введите корректный Base URL, включая https://.",discoveryFailedManualFallback:"Не удалось получить модели. Вы всё ещё можете ввести имя модели вручную.",completeRequiredProviderFields:"Заполните обязательные поля provider перед сохранением.",fetchingModels:"Получение моделей...",recommendedModel:"Рекомендуется: {model}.",useRecommendedModel:"Использовать эту.",modelsDiscovered:"Найдено моделей: {count}. Если поле пустое, выбирается рекомендуемая модель.",remove:"Удалить",testSuccess:"Тест завершен",testTextRequired:"Введите текст перед тестом.",keyMissingForTest:"Добавьте API-ключ перед тестом этого провайдера.",testing:"Тестирование...",transcribing:"Распознавание...",browserSttTestHint:"STT браузера тестируется через микрофон чата.",sttEmptyAudio:"Аудио не было записано. Попробуйте еще раз.",sttTestSuccess:"Распознавание завершено",sttRecordingHint:"Запись... нажмите Остановить, чтобы распознать.",keepStoredKeyPlaceholder:"Оставьте пустым, чтобы сохранить текущий ключ",apiKeyPlaceholder:"Введите API-ключ",lastTest:"Последний тест",notTested:"—",recording:"Запись",testFailedShort:"Ошибка",testFailedSummary:"Тест не удался. Проверьте настройки провайдера и повторите попытку.",showDetails:"Показать детали",hideDetails:"Скрыть детали",moreActions:"Еще",moreActionsFor:"Дополнительные действия для {provider}",addTtsApi:"Добавить TTS API",addSttApi:"Добавить STT API",active:"Активно",builtin:"Встроенный",connected:"Подключено",disconnected:"Отключено",source:"Источник",model:"Модель",voice:"Голос",doubaoVoiceHint:"Выберите голос Seed TTS 2.0; поле ресурса обновится автоматически.",apiKey:"API-ключ",confirmDeleteSecret:"Удалить сохраненный API-ключ для этой голосовой API?",ttsTitle:"Текст в речь",ttsSaved:"Настройки TTS сохранены на сервере",ttsSaveFailed:"Не удалось сохранить настройки TTS",ttsTestSaved:"Прослушивание успешно; настройки TTS сохранены на сервере",ttsTestSaving:"Сохранение настроек TTS перед прослушиванием...",ttsMissingBaseUrl:"Base URL требуется перед тестом. Введите endpoint провайдера и повторите тест.",ttsMissingApiKey:"API-ключ требуется перед тестом. Вставьте ключ или сначала сохраните серверный ключ.",ttsCleared:"Сохраненный TTS-ключ удален",ttsClearFailed:"Не удалось удалить сохраненный TTS-ключ",storedBaseUrlsTitle:"Сохранённые Base URLs",storedBaseUrlsHint:"Сохранённые endpoint голосовых providers. Поля выше только очищают текущее значение; сохранённые URL удаляются здесь.",storedBaseUrlsEmpty:"На сервере нет сохранённых пользовательских голосовых Base URL.",storedBaseUrlDelete:"Удалить URL",storedApiKeysTitle:"Сохранённые API keys",storedApiKeysHint:"Список голосовых API key, сохранённых на сервере. Показываются только назначение и источник; полный key не отображается.",storedApiKeysEmpty:"На сервере нет сохранённых голосовых API key.",storedKeyKindTts:"TTS",storedKeyKindStt:"STT",storedApiKeyMasked:"[stored]",storedApiKeyDelete:"Удалить key",baseUrlPresetClear:"Очистить URL",baseUrlPresetCleared:"Base URL очищен в поле.",baseUrlPresetDelete:"Удалить URL",baseUrlPresetDeleted:"Base URL удалён из сохранённого списка.",baseUrlPresetDeleteFailed:"Не удалось удалить сохранённый Base URL.",ttsPendingSecret:"Новый ключ будет сохранен",ttsStoredSecret:"На сервере сохранен ключ: {value}",ttsClearKey:"Удалить сохраненный ключ",sttTitle:"Речь в текст",sttProvider:"Провайдер STT",sttProviderHint:"Выберите способ распознавания голосового ввода",sttProviderBrowser:"Браузер",sttProviderOpenai:"Совместимо с OpenAI",sttProviderCustom:"Пользовательский",sttBrowserHint:"Использовать встроенное распознавание речи браузера, если доступно.",sttApiKey:"API-ключ",sttApiKeyHint:"Сохраняется на сервере для STT-провайдеров, которым нужна аутентификация.",sttStoredSecret:"Сохраненный серверный ключ: {value}",sttPendingSecret:"Сохраненный серверный ключ: будет обновлен при сохранении",sttClearKey:"Удалить сохраненный ключ",sttModel:"Модель",sttModelHint:"Модель распознавания речи для использования.",sttLanguage:"Язык",sttLanguageHint:"Необязательная подсказка языка, например en или zh.",sttPrompt:"Промпт",sttPromptHint:"Необязательный промпт для распознавания.",sttAudioTranscode:"Перекодирование аудио",sttAudioTranscodeNone:"Отправлять исходное аудио",sttAudioTranscodeFfmpeg:"Конвертировать в WAV через ffmpeg",sttBaseUrl:"Base URL",sttBaseUrlHint:"Пользовательский OpenAI-совместимый endpoint распознавания речи.",sttSave:"Сохранить настройки STT",sttSaved:"Настройки STT сохранены на сервере.",sttSaveFailed:"Не удалось сохранить настройки STT.",sttCleared:"Сохраненный STT-секрет удален с сервера.",sttClearFailed:"Не удалось удалить сохраненный STT-секрет.",sttActiveSaved:"Активный STT-провайдер сохранен на сервере.",sttSaveActive:"Сохранить активный STT-провайдер",sttEndpointHint:"Итоговый endpoint распознавания: {endpoint}",sttTestTitle:"Тест речи в текст",sttTestButton:"Тестировать STT API",sttTestStopButton:"Остановить и распознать",sttTestBackendOnly:"Тест STT API доступен для OpenAI-совместимых и пользовательских провайдеров.",sttTestRecording:"Запись тестового образца... нажмите Остановить и распознать, когда закончите.",sttTestTranscribing:"Распознавание тестового образца...",sttTestEmpty:"Для STT-теста не было записано аудио.",sttTestSucceeded:"STT-тест успешен.",sttTestFailed:"STT-тест не удался: {error} — {hint}",sttFailureHintMissingConfig:"Перед тестом проверьте, что провайдер сохранен с Base URL/моделью и API-ключом.",sttFailureHintAuth:"Проверьте API-ключ. Если ключ уже был сохранен, вставьте текущий ключ снова и сохраните перед тестом.",sttFailureHintForbidden:"Ключ дошел до провайдера, но не имеет разрешения для этой STT-модели или аккаунта. Проверьте доступ/оплату у провайдера.",sttFailureHintEndpointModel:"Проверьте Base URL и модель. Для Groq используйте {endpoint} с whisper-large-v3-turbo или другой STT-моделью Groq.",sttFailureHintModel:"Проверьте, что выбранная STT-модель существует и включена для этого аккаунта.",sttFailureHintQuota:"Провайдер сообщает о проблемах с квотой, оплатой или лимитом запросов. Проверьте квоту/оплату или повторите позже.",sttFailureHintNetworkCustom:"Сервер не смог обратиться к пользовательскому STT endpoint. Проверьте, что {endpoint} доступен с сервера Web UI и совместим с OpenAI.",sttFailureHintNetwork:"Сервер Web UI не смог обратиться к STT-провайдеру. Проверьте сеть/прокси/фаервол и повторите.",sttFailureHintAudio:"Записанное аудио пустое или отклонено. Попробуйте короткий четкий образец, разрешите доступ к микрофону или повторите в Chrome.",sttFailureHintGenericCustom:"Проверьте API-ключ, Base URL, модель и итоговый endpoint {endpoint}.",sttFailureHintGeneric:"Проверьте API-ключ, модель и доступ аккаунта провайдера, затем повторите.",sttTestRecordFailed:"Не удалось начать запись микрофона: {error}",sttTestTranscript:"Текст: {text}",ttsProvider:"Провайдер TTS",ttsProviderHint:"Выберите движок для озвучивания сообщений",providerWebSpeech:"WebSpeech API (встроенный в браузер)",providerOpenai:"OpenAI TTS",providerCustom:"Пользовательская конечная точка (совместимая с OpenAI)",providerEdge:"Edge TTS (бесплатно, не требует API-ключа)",providerMimo:"MiMo TTS",webspeechVoice:"Тембр",webspeechVoiceHint:"Выберите голос из предложенных браузером или системой",webspeechVoicePlaceholder:"Автоматический (голос по умолчанию)",openaiKey:"API-ключ",openaiKeyHint:"API-ключ OpenAI с правами TTS",openaiUrl:"Базовый URL API",openaiUrlHint:"Например, https://api.openai.com/v1/audio/speech",openaiModel:"Модель",openaiModelHint:"tts-1 (быстрая) / tts-1-hd (высокое качество)",openaiVoice:"Тембр",openaiVoiceHint:"Тембр для синтеза речи",customHint:"Поддерживается любая служба TTS, совместимая с OpenAI, включая GPT-SoVITS, CosyVoice и т.п.",customUrl:"URL API",customUrlHint:"Полный базовый URL службы TTS",customUrlPlaceholder:"Адрес, указанный в локальном адаптере, например http://127.0.0.1:9880",customApiKey:"API-ключ (необязательно)",customApiKeyHint:"Некоторые саморазвёрнутые службы требуют аутентификации",customApiKeyPlaceholder:"Оставьте пустым, если не требуется",edgeHint:"Работает на движке Microsoft Edge TTS (node-edge-tts).",edgeUrl:"Адрес адаптера",edgeUrlHint:"Адрес адаптера Edge TTS, например http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Тембр",edgeVoiceHint:"Выберите тембр для синтеза речи",edgeRate:"Скорость речи",edgeRateHint:"Регулировка скорости речи (0.5–2.0)",edgePitch:"Высота тона",edgePitchHint:"Регулировка высоты тона (–20 … +20 Гц)",testTitle:"Тестовое прослушивание",testText:"Тестовый текст",testTextPlaceholder:"Введите тестовый текст...",testTextDefault:"Здравствуйте, это тест голоса.",testButton:"Прослушать",testButtonPlaying:"Воспроизведение...",testFailed:"Ошибка теста: {error}",mimoHint:"MiMo TTS от Xiaomi. Поддерживает три режима: предустановленные тембры, дизайн тембра и клонирование тембра.",mimoApiKey:"API-ключ",mimoApiKeyHint:"Получите его на platform.xiaomimimo.com",mimoApiKeyPlaceholder:"API-ключ MiMo",mimoBaseUrl:"Базовый URL",mimoBaseUrlHint:"Конечная точка API MiMo",mimoModel:"Модель",mimoModelHint:"Выберите модель синтеза речи",mimoModelPreset:"Предустановленный тембр",mimoModelVoiceDesign:"Дизайн тембра",mimoModelVoiceClone:"Клонирование тембра",mimoVoice:"Тембр",mimoVoiceHint:"Выберите предустановленный тембр",mimoVoiceDesignPrompt:"Описание тембра",mimoVoiceDesignPromptHint:"Опишите желаемые характеристики тембра",mimoVoiceDesignPromptPlaceholder:"Например: мягкий молодой женский голос, слегка замедленный, с хрипотцой",mimoCloneAudio:"Загрузить аудио",mimoCloneAudioHint:"Загрузите аудиообразец для клонирования тембра. Поддерживаются mp3/wav, максимум 10 МБ",mimoCloneAudioUpload:"Выбрать файл",mimoCloneAudioClear:"Очистить аудио",mimoStylePrompt:"Стилевая инструкция",mimoStylePromptHint:"Необязательно. Опишите желаемый стиль речи естественным языком",mimoStylePromptPlaceholder:"Например: используйте лёгкий, приподнятый тон, темп речи чуть выше среднего"}},platform:{requireMention:"Требуется упоминание {'@'}",requireMentionGroup:"В группе требуется упоминание {'@'}бота для ответа",requireMentionChannel:"В канале требуется упоминание {'@'}бота для ответа",requireMentionRoom:"В комнате требуется упоминание {'@'}бота для ответа",reactions:"Реакции",reactionsHint:"Добавлять реакции на сообщения",freeResponseChats:"Чаты со свободным ответом",freeResponseChatsHint:"ID чатов, в которых не требуется упоминание {'@'} (через запятую)",freeResponseChannels:"Каналы со свободным ответом",freeResponseChannelsHint:"ID каналов, в которых не требуется упоминание {'@'} (через запятую)",freeResponseRooms:"Комнаты со свободным ответом",freeResponseRoomsHint:"ID комнат, в которых не требуется упоминание {'@'} (через запятую)",mentionPatterns:"Пользовательские шаблоны упоминаний",mentionPatternsHint:"Дополнительные шаблоны для срабатывания",autoThread:"Автоматически создавать ветку",autoThreadHint:"Автоматически создавать ветку для ответа после упоминания {'@'}",autoThreadHintRoom:"Автоматически создавать ветку для ответа в комнате",dmMentionThreads:"Ветки для упоминаний в ЛС",dmMentionThreadsHint:"Использовать ветки для ответов на упоминания в личных сообщениях",allowBots:"Разрешить сообщения ботов",allowBotsHint:"Отвечать на сообщения от других ботов",allowedChannels:"Разрешённые каналы",allowedChannelsHint:"Белый список ID каналов (через запятую)",ignoredChannels:"Игнорируемые каналы",ignoredChannelsHint:"Каналы, на которые не отвечать (через запятую)",noThreadChannels:"Каналы без веток",noThreadChannelsHint:"Каналы, в которых не создавать ветки (через запятую)",exclusiveTokenWarning:"Эта платформа использует эксклюзивную блокировку токенов. Каждый профиль должен использовать свой токен, иначе возникнут конфликты с другими профилями, и шлюз не запустится.",botToken:"Токен бота",botTokenHint:"Токен бота, полученный на портале разработчика",proxyUrl:"URL прокси",proxyUrlHint:"Необязательный прокси для платформы. Поддерживает http://, https:// и socks5://",accessToken:"Токен доступа",accessTokenHint:"Токен доступа Matrix",homeserver:"URL домашнего сервера",homeserverHint:"Адрес сервера Matrix",matrixUserId:"ID пользователя Matrix",matrixUserIdHint:"Обязателен для входа по паролю, необязателен с токеном",matrixPassword:"Пароль Matrix",matrixPasswordHint:"Альтернатива токену доступа",appId:"ID приложения",appIdHint:"ID приложения Feishu",appSecret:"Секрет приложения",appSecretHint:"Секрет приложения Feishu",encryptKey:"Ключ шифрования",encryptKeyHint:"Ключ шифрования Feishu",verificationToken:"Токен проверки",verificationTokenHint:"Токен проверки Feishu",clientId:"ID клиента",clientIdHint:"ID клиента DingTalk",clientSecret:"Секрет клиента",clientSecretHint:"Секрет клиента DingTalk",cardTemplateId:"ID шаблона AI-карточки",cardTemplateIdHint:"ID шаблона AI-карточки DingTalk; оставьте пустым, чтобы отключить AI-карточки",allowedUsers:"Разрешённые пользователи",allowedUsersHint:"Белый список ID пользователей или OpenID (через запятую)",allowAllUsers:"Разрешить всех пользователей",allowAllUsersHint:"Разрешить любым пользователям отправлять сообщения; при отключении используется белый список",botId:"ID бота",botIdHint:"ID бота WeCom",wecomSecretHint:"Секрет бота WeCom",waEnabled:"Включить WhatsApp",waEnabledHint:"Включить WhatsApp с помощью пары по QR-коду",weixinToken:"Токен Weixin",weixinTokenHint:"Получите с помощью CLI (hermes weixin) при входе по QR-коду",accountId:"ID учётной записи",accountIdHint:"ID учётной записи Weixin",qrLogin:"Вход по QR-коду",qrRelogin:"Войти снова",qrFetching:"Получение QR-кода...",qrScanHint:"Отсканируйте QR-код с помощью WeChat для входа",qrScanedHint:"QR-код отсканирован. Подтвердите на телефоне...",qqAppId:"ID приложения",qqAppIdHint:"ID приложения бота QQ Open Platform",qqAppSecret:"Секрет приложения",qqAppSecretHint:"Секрет приложения бота QQ Open Platform",qqMarkdown:"Поддержка Markdown",qqMarkdownHint:"Включить сообщения в формате Markdown (может не поддерживаться некоторыми клиентами)",qqSandbox:"Режим песочницы",qqSandboxHint:"Включить песочницу (для тестирования)",qqQrScanHint:"Отсканируйте QR-код с помощью QQ или откройте ссылку на телефоне, чтобы завершить привязку"},gateways:{title:"Шлюзы",running:"Работает",stopped:"Остановлен",started:"Запущен",startFailed:"Ошибка запуска",stopFailed:"Ошибка остановки"},language:{label:"Язык",zh:"Китайский",en:"Английский",ru:"Русский"},terminal:{sessions:"Сеансы",newTab:"Новая вкладка терминала",closeSession:"Завершить этот сеанс?",sessionExited:"Выход выполнен",processExited:"Процесс завершён с кодом {code}",noSessions:"Нет активных сеансов терминала",connectionFailed:"Не удалось подключиться к службе терминала",connectionClosed:"Соединение с терминалом закрыто",connectionError:"Ошибка соединения с терминалом"},groupChat:{title:"Групповой чат",createRoom:"Создать комнату",joinByCode:"Присоединиться по коду-приглашению",roomName:"Название комнаты",roomNamePlaceholder:"Введите название комнаты",inviteCode:"Код-приглашение",autoGenerate:"Сгенерировать автоматически",noRooms:"Нет комнат",selectOrCreate:"Выберите или создайте комнату, чтобы начать чат",agents:"Агенты",addAgent:"Добавить агента",selectProfile:"Выберите профиль",agentAdded:"Агент добавлен",selectRoomFirst:"Сначала выберите комнату",agentAlreadyInRoom:"Агент уже в комнате",agentAddFailedCount:"Не добавлено агентов: {count} — {details}",noAgents:"В комнате нет агентов",members:"Участники",roomCreated:"Комната создана",roomDeleted:"Комната удалена",roomCloned:"Комната клонирована",cloneRoom:"Клонировать комнату",copyRoomLink:"Копировать ссылку на комнату",deleteRoomConfirm:"Удалить эту комнату?",clearContext:"Очистить контекст",clearContextConfirm:"Очистить контекст текущей комнаты? Сообщения и сжатые снимки будут удалены, агенты и участники останутся.",contextCleared:"Контекст очищен",you:"Вы",joined:"Вы присоединились к комнате",joinFailed:"Не удалось присоединиться к комнате",inputPlaceholder:"Введите сообщение... (Enter — отправить)",messageDisplayLimit:"Групповой чат показывает не более 600 сообщений",enterCode:"Введите код-приглашение",yourName:"Ваше имя",yourNamePlaceholder:"Введите ваш ник в групповом чате",yourDescription:"Самоописание (необязательно)",yourDescriptionPlaceholder:"Расскажите о себе...",agentName:"Имя агента",agentNamePlaceholder:"Пользовательское имя (оставьте пустым для использования имени профиля)",agentDesc:"Описание агента",agentDescPlaceholder:"Опишите роль этого агента...",agentReplying:"Ответ агента...",agentCompressing:"Сжатие контекста...",compressionSettings:"Настройки сжатия",triggerTokens:"Количество токенов для запуска сжатия",triggerTokensDesc:"Сжатие контекста запускается, когда количество токенов в сообщениях превышает это значение",maxHistoryTokens:"Максимум токенов в истории",maxHistoryTokensDesc:"Максимальное количество токенов, отправляемое LLM после сжатия",tailMessageCount:"Количество последних сохраняемых сообщений",tailMessageCountDesc:"Количество последних исходных сообщений, сохраняемых после сжатия",compressionConfig:"Конфигурация сжатия",compressionSaved:"Конфигурация сжатия сохранена",compressNow:"Сжать сейчас",compressingInProgress:"Выполняется сжатие, пожалуйста, подождите"},usage:{title:"Статистика использования",refresh:"Обновить",totalTokens:"Всего токенов",inputTokens:"Входящие",outputTokens:"Исходящие",totalSessions:"Всего сеансов",avgPerDay:"В среднем за день ~{n}",estimatedCost:"Примерная стоимость",cacheHitRate:"Попадания в кэш",modelBreakdown:"Распределение по моделям",dailyTrend:"Ежедневная динамика",date:"Дата",tokens:"Токены",cache:"Кэш",cacheRead:"Чтение из кэша",cacheWrite:"Запись в кэш",sessions:"Сеансы",cost:"Стоимость",noData:"Нет данных об использовании"},skillsUsage:{title:"Использование навыков",subtitle:"Отслеживание загрузки и редактирования навыков в сеансах Hermes",refresh:"Обновить",periodSelector:"Период использования навыков",periodLabel:"{days} дн.",summary:"Обзор",totalActions:"Действий",loads:"Загрузок",edits:"Правки",distinctSkills:"Навыков",topSkills:"Популярные",dailyTrend:"Динамика по дням",periodSummary:"За последние {days} дн.",skill:"Навык",share:"Доля",lastUsed:"Последний",noData:"Нет данных об использовании навыков",loadFailed:"Ошибка загрузки данных об использовании навыков",otherSkills:"Другие навыки"},files:{title:"Файлы",fileTree:"Древо файлов",tree:"Древо каталогов",list:"Список файлов",breadcrumbRoot:"Корневая директория",newFile:"Новый файл",newFolder:"Новая папка",upload:"Загрузить",refresh:"Обновить",open:"Открыть",edit:"Редактировать",preview:"Предпросмотр",download:"Скачать",copyPath:"Копировать путь",rename:"Переименовать",delete:"Удалить",name:"Имя",size:"Размер",modified:"Время изменения",actions:"Действия",emptyDir:"Папка пуста",loading:"Загрузка...",confirmDelete:"Удалить «{name}»?",confirmDeleteDir:"Удалить папку «{name}» со всем содержимым?",deleteFailed:"Ошибка удаления",deleted:"Удалено",renameTo:"Переименовать в",newFileName:"Имя файла",newFolderName:"Имя папки",created:"Создано",createFailed:"Ошибка создания",renamed:"Переименовано",renameFailed:"Ошибка переименования",uploadSuccess:"Загружено файлов: {count}",uploadFailed:"Ошибка загрузки",saveFailed:"Ошибка сохранения",saved:"Сохранено",unsavedChanges:"Есть несохранённые изменения. Отменить?",pathCopied:"Путь скопирован",fileTooLarge:"Файл слишком большой (максимум 10 МБ)",permissionDenied:"Невозможно изменить защищённый файл",notFound:"Файл или папка не найдены",backendError:"Ошибка файловой операции",dragDropHint:"Перетащите файлы сюда для загрузки",closeEditor:"Закрыть редактор",closePreview:"Закрыть",saveFile:"Сохранить"},download:{downloading:"Скачивание...",downloadFailed:"Ошибка скачивания",fileNotFound:"Файл не существует или был удалён",fileTooLarge:"Файл слишком большой (превышает лимит)",backendError:"Не удалось прочитать файл. Возможно, удалённое окружение недоступно",backendTimeout:"Таймаут чтения файла",unsupportedBackend:"Текущий терминальный бэкенд не поддерживает загрузку файлов",invalidPath:"Недействительный путь к файлу",contentDisplay:"Отображение содержимого",download:"Скачать",downloadFile:"Скачать файл"},changelog:{new_0_6_25_1:"Исправлен сбой execute_code с Hermes Agent 0.18.0: Agent Bridge теперь передает новый параметр has_host_access через wrapper памяти подтверждений",new_0_6_24_1:"Этот релиз включает PR после 0.6.23 и улучшает ввод чата, видимость workspace, управление plugins, модели по умолчанию и просмотр workspace diff",new_0_6_24_2:"Поля ввода одиночного и группового чата получили встроенную панель, компактные элементы модели, сгруппированные настройки ввода, более понятное использование context, мобильную полировку и восстановленный ручной resize одиночного чата",new_0_6_24_3:"Изменения workspace run теперь показываются как устойчивые chat diff cards с правым drawer для просмотра diff и редактирования файлов, восстанавливаются после resume session и лучше работают на mobile",new_0_6_24_4:"Workspace folder picker надежнее обходит Windows drives и junctions и показывает dot-prefixed folders вроде .hermes, .config и .codex, сохраняя проверки WORKSPACE_BASE",new_0_6_24_5:"Страница Plugins позволяет включать и отключать управляемые user plugins и точнее показывает состояние из базовой конфигурации Hermes и текущего profile",new_0_6_24_6:"Страница Models получила действия default provider и default model; bridge terminal error detection дает меньше ложных ошибок, Hermes Agent runtime packaging обновлен до 0.18.0, а website version manifest освежен",new_0_6_23_1:"В этом выпуске собраны PR, merged после 0.6.22: desktop self-update, MCP cleanup, Petdex pets, MCU voice и несколько настроек workflow",new_0_6_23_2:"Desktop self-update снова работает в blocking-режиме, Windows надежнее останавливает сервисы перед обновлением, а выход из desktop полнее очищает gateway, profile MCP и связанные дочерние процессы",new_0_6_23_3:"Desktop MCP injection и запуск MCP для Coding Agent стали стабильнее, Windows workspaces получили выбор диска, исправлены отображение symlink-папок и desktop Petdex previews",new_0_6_23_4:"Petdex pets теперь поддерживают web pets, отдельное desktop pet window, мгновенное отображение после adoption, кнопку закрытия справа сверху и более заметный начальный desktop-размер",new_0_6_23_5:"MCU и global voice получили audio prompts, OTA safeguards, segmented streaming TTS, очистку ссылок, code blocks и tables перед озвучкой, а также abort handling для незавершенной TTS generation",new_0_6_23_6:"Settings и workflow улучшены: profile config editing, настройка высоты chat input, login JWT expiry, Skill editing, сохранение local archive state в History, более понятный new chat drawer и безопаснее danger-тексты для built-in Providers",new_0_6_22_1:"В этом выпуске собраны PR, merged после 0.6.21: обновления фронтенда для комбинированных моделей, истории сессий, proxy-настроек, slash-команд и мобильной раскладки",new_0_6_22_2:"На странице моделей появилась панель комбинированных моделей, а чат теперь показывает реальный прогресс MoA reference и aggregator без старого синтетического placeholder-инструмента",new_0_6_22_3:"Чат-сессии можно архивировать из списка и восстанавливать из History; локальные сессии Claude Code и Codex теперь корректно появляются в History",new_0_6_22_4:"В Settings появилась вкладка Proxy для gateway-wide HTTP(S), ALL_PROXY и NO_PROXY, а также proxy по платформам для Telegram, Discord и Matrix",new_0_6_22_5:"В Hermes Chat добавлена команда /learn, Agent Bridge использует выбранный workspace как cwd, и только desktop-функции команд /learn и MoA ждут следующего релиза Hermes Agent",new_0_6_21_1:"This release focuses on workflow reruns, MCP workflow tools, voice settings deletion, Matrix login settings, update cleanup, and docs polish",new_0_6_21_2:"Workflow node messages now open in a left-side resizable full chat drawer, mobile run history opens correctly, and rerun actions can keep the selected node output or clear it before rerunning downstream nodes",new_0_6_21_3:"Hermes Studio MCP use toolset can now list, create, update, delete, run, stop, delete runs, and rerun workflows from a selected node",new_0_6_21_4:"Voice provider removal now deletes the profile provider settings instead of only clearing API keys, while Browser STT and Edge TTS remain protected built-in defaults",new_0_6_21_5:"Matrix platform settings support user ID plus password configuration and report configured status correctly when password login is used",new_0_6_21_6:"Web UI restart, update, and in-app upgrade now stop the Agent Bridge broker by default so new builds do not attach to stale Python bridge processes",new_0_6_21_7:"Chat, group chat, and workflow headers are better aligned; Xiao Fang He shows sold-out status; BSL scope is clearer; /learn planning docs were added; unused Hermes proxy code was removed",new_0_6_20_1:"Workflow теперь доступен: создавайте Agent nodes, соединяйте их в graph и запускайте весь flow прямо со страницы Workflow",new_0_6_20_2:"Workflow runs сохраняют run records, graph snapshots, node sessions, live node status, причины ошибок и действия stop/delete для runs",new_0_6_20_3:"Просмотр и редактирование workflow стали полнее: run history, read-only snapshots, просмотр node chat sessions, более крупные connection handles и create-workflow-first guard",new_0_6_20_4:"Desktop теперь дает agent-browser находить Chrome через AGENT_BROWSER_HOME вместо фиксации устаревшего executable path, плюс guards целостности patches и browser stdout fixes",new_0_6_20_5:"Packaged browser runtimes фиксируют Chrome for Testing 149.0.7827.55 на поддерживаемых desktop platforms, чтобы избежать runtime browser regressions",new_0_6_20_6:"ESP32 и Xiao Fang He получили обновленные tutorial links, более светлый badge background и совместимую с Windows flow animation",new_0_6_19_1:"Этот релиз включает 16 PR после 0.6.18 и улучшает видимые в UI сценарии устройств, voice, Coding Agent и настроек",new_0_6_19_2:"Coding Agent sessions могут переключать model, а новые sessions теперь корректно следуют global default model",new_0_6_19_3:"MCU взаимодействия стабильнее: debounce Wi-Fi/boot при запуске, audio только на целевое устройство и улучшенный аппаратный double-click для очистки и interrupt",new_0_6_19_4:"TTS настройки теперь сохраняются по profile, а speed, pitch и voice tests читают один источник конфигурации",new_0_6_19_5:"Переключение модели в Coding Agent больше не влияет на существующие sessions, а custom provider keys передаются корректно",new_0_6_19_6:"Skills runtime filters, сортировка cron jobs, ограничение высоты skill details, Windows updater recovery, backup fallbacks и сжатые logo assets завершают обновление",new_0_6_18_2:"Hermes Studio MCP разделен на toolsets api, devices и use с новыми действиями для session, model, chat-run и ops",new_0_6_18_3:"История чатов и групповых чатов надежнее благодаря отдельной UI history, безопасной обработке null messages, сохранению assistant replies после run failures и согласованному reasoning replay",new_0_6_18_4:"Обратная связь MCU стала понятнее: tool calls показываются поверх speech, audio больше не помечает задачи DONE слишком рано, active-device login стабильнее, а длинный ONLINE/IP текст прокручивается",new_0_6_18_5:"Voice и message workflows получили custom HTTP TTS/STT endpoints, audio transcoding, fork message actions, persistent fork markers и более понятные upload errors",new_0_6_18_6:"Desktop и runtime setup стали безопаснее: Unicode-safe регистрация Windows PATH, поддержка публикации Hermes Agent 0.17.0 runtime, mobile PWA metadata и несколько исправлений profile/auth recovery",new_0_6_18_7:"Улучшения и доработка деталей во всем приложении",new_0_6_17_1:"Исправлены проблемы запуска диалогов Codex и Claude Code",new_0_6_16_1:"Настройки Provider теперь сохраняют пользовательские API mode, корректно покрывают LongCat, поддерживают удаление Provider v12 и синхронизируют каталоги моделей с auth и API-key image Provider",new_0_6_16_2:"Команды чата получили reload-skills, обновление web title, passthrough неизвестных slash-команд и чистый session context API без tool calls и tool results",new_0_6_16_3:"Навигация по сессиям стабильнее: поиск включает Global Agent sessions, новые сессии сортируются по последней активности, мобильные controls сайдбара восстановлены, footer настроек стабилен",new_0_6_16_4:"Файлы удобнее: полное имя workspace видно при hover, а drag-and-drop upload работает по всей зоне одиночного и группового чата",new_0_6_16_5:"Настройки платформы получили локализованные поля проверки Feishu Webhook и более полное покрытие i18n",new_0_6_16_6:"Skill discovery теперь следует symlink-директориям, поэтому общие локальные skills отображаются стабильно",new_0_6_16_7:"Большие static assets обходят dynamic Brotli compression, улучшая доставку packaged Web UI под нагрузкой",new_0_6_16_8:"Добавлены outbound relay и MCU login flow для connector-style интеграций",new_0_6_16_9:"Web UI CLI получила флаг --no-open для scripts и headless launches",new_0_6_16_10:"Размер viewport в Linux desktop и строки live compression status доработаны для более стабильного layout",new_0_6_15_1:"Боковые панели чата переработаны, а управление загрузкой истории стало удобнее для навигации по длинным диалогам",new_0_6_15_2:"Пикер skill-команд помогает быстрее находить и вставлять доступные команды из поля ввода чата",new_0_6_15_3:"Добавлены OAuth providers Claude и Gemini, ID моделей Gemini корректно нормализуются, а селекторы моделей могут вручную обновлять изменения config.yaml",new_0_6_15_4:"Состояния Thinking получили обновленный индикатор и layout toolbar, чтобы прогресс reasoning было легче читать без нарушения потока сообщений",new_0_6_15_5:"Границы input и select снова видны в темной теме",new_0_6_15_6:"Runtime setup теперь сначала проверяет локальный runtime перед выбором источника загрузки и сохраняет состояние проверки видимым во время запуска",new_0_6_15_7:"Desktop self-update больше не блокируется старыми процессами приложения, а cleanup gateways в Windows при выходе стал полнее",new_0_6_15_8:"Managed gateways останавливаются при shutdown приложения, а неожиданно завершенные gateways все еще могут перезапускаться в managed runtime sessions",new_0_6_15_9:"Desktop server теперь завершает работу при quit более аккуратно, уменьшая orphan processes backend, bridge и gateway",new_0_6_15_10:"README и showcase сайта теперь используют один animated walkthrough GIF, а hero сайта использует отдельное static preview image",new_0_6_13_1:"Alibaba Coding Plan теперь включает пресет модели qwen3.7-plus",new_0_6_13_2:"Работа с файлами стала безопаснее: проверка путей допускает буквальные точки, а некорректно закодированные имена файлов импорта skills отклоняются",new_0_6_13_3:"Чат стал стабильнее на мобильных устройствах и в браузерах без поддержки speech synthesis",new_0_6_13_4:"При сбоях Agent теперь сохраняется хвост ошибки bridge, а запуск Claude Code с root-разрешениями стал надежнее",new_0_6_13_5:"Обновления desktop стали надежнее: обновления Windows закрывают оставшиеся процессы Hermes Studio, сначала проверяют Cloudflare и сохраняют GitHub как резервный feed",new_0_6_13_6:"Автоматизация релизов больше не помечает Web UI и Docker releases как GitHub Latest, а полные desktop releases вручную продвигаются в Latest после успешной сборки"}},ka=["en","zh","zh-TW","ja","ko","fr","es","de","pt","ru"];function si(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ji(e,t){const a={...e};for(const[n,r]of Object.entries(t)){const c=e[n];a[n]=si(c)&&si(r)?ji(c,r):r}return a}var Hr={en:Gi,zh:Ar,"zh-TW":kr,ja:Pr,ko:Tr,fr:Cr,es:_r,de:xr,pt:Mr,ru:Rr},$i={};for(const[e,t]of Object.entries(Hr))$i[e]=e==="en"?t:ji({...Gi},{...t});var Ir=localStorage.getItem("hermes_locale");function Fr(e){if(e&&ka.includes(e))return e;function t(a){const n=a.toLowerCase();if(n.startsWith("zh"))return n.includes("hant")||n.includes("-tw")||n.includes("-hk")||n.includes("-mo")?"zh-TW":"zh";const r=a.slice(0,2);return ka.includes(a)?a:ka.includes(r)?r:null}for(const a of navigator.languages){const n=t(a);if(n)return n}return"en"}function Ji(e){document.documentElement.lang=e}var Qi=Fr(Ir);Ji(Qi);var Yi=sr({legacy:!1,locale:Qi,fallbackLocale:"en",messages:$i});function Dr(e){Yi.global.locale.value=e,Ji(e)}var Er,Xi=Re((()=>{Er="/logo.png"}));Xi();Mt();var Lr={common:{primaryColor:"#333333",primaryColorHover:"#1a1a1a",primaryColorPressed:"#000000",primaryColorSuppl:"#333333",bodyColor:"#fafafa",cardColor:"#ffffff",modalColor:"#ffffff",popoverColor:"#ffffff",tableColor:"#ffffff",inputColor:"#ffffff",actionColor:"#f0f0f0",textColorBase:"#1a1a1a",textColor1:"#1a1a1a",textColor2:"#666666",textColor3:"#999999",dividerColor:"#e0e0e0",borderColor:"#e0e0e0",hoverColor:"rgba(0, 0, 0, 0.04)",borderRadius:"8px",borderRadiusSmall:"6px",fontSize:"14px",fontSizeMedium:"14px",heightMedium:"36px",fontFamily:"Inter, system-ui, -apple-system, sans-serif",fontFamilyMono:"JetBrains Mono, Fira Code, Consolas, monospace"},Layout:{color:"#fafafa",siderColor:"#f5f5f5",headerColor:"#fafafa"},Menu:{itemTextColorActive:"#1a1a1a",itemTextColorActiveHover:"#1a1a1a",itemTextColorChildActive:"#1a1a1a",itemIconColorActive:"#1a1a1a",itemIconColorActiveHover:"#000000",itemColorActive:"rgba(0, 0, 0, 0.06)",itemColorActiveHover:"rgba(0, 0, 0, 0.1)",arrowColorActive:"#1a1a1a"},Button:{textColorPrimary:"#ffffff",colorPrimary:"#333333",colorHoverPrimary:"#1a1a1a",colorPressedPrimary:"#000000"},Input:{color:"#ffffff",colorFocus:"#ffffff",border:"1px solid #e0e0e0",borderHover:"1px solid #999999",borderFocus:"1px solid #333333",borderDisabled:"1px solid #ebebeb",groupLabelBorder:"1px solid #e0e0e0",placeholderColor:"#999999",caretColor:"#1a1a1a"},InternalSelection:{border:"1px solid #e0e0e0",borderHover:"1px solid #999999",borderActive:"1px solid #333333",borderFocus:"1px solid #333333"},Card:{color:"#ffffff",borderColor:"#e0e0e0"},Modal:{color:"#ffffff"},Tag:{borderRadius:"6px"}},Ur={common:{primaryColor:"#e0e0e0",primaryColorHover:"#f5f5f5",primaryColorPressed:"#ffffff",primaryColorSuppl:"#e0e0e0",bodyColor:"#1a1a1a",cardColor:"#2a2a2a",modalColor:"#2a2a2a",popoverColor:"#2a2a2a",tableColor:"#2a2a2a",inputColor:"#2a2a2a",actionColor:"#252525",textColorBase:"#e0e0e0",textColor1:"#e0e0e0",textColor2:"#a0a0a0",textColor3:"#666666",dividerColor:"#3a3a3a",borderColor:"#3a3a3a",hoverColor:"rgba(255, 255, 255, 0.06)",borderRadius:"8px",borderRadiusSmall:"6px",fontSize:"14px",fontSizeMedium:"14px",heightMedium:"36px",fontFamily:"Inter, system-ui, -apple-system, sans-serif",fontFamilyMono:"JetBrains Mono, Fira Code, Consolas, monospace"},Layout:{color:"#1a1a1a",siderColor:"#202020",headerColor:"#1a1a1a"},Menu:{itemTextColorActive:"#e0e0e0",itemTextColorActiveHover:"#e0e0e0",itemTextColorChildActive:"#e0e0e0",itemIconColorActive:"#e0e0e0",itemIconColorActiveHover:"#ffffff",itemColorActive:"rgba(255, 255, 255, 0.08)",itemColorActiveHover:"rgba(255, 255, 255, 0.12)",arrowColorActive:"#e0e0e0"},Button:{textColorPrimary:"#1a1a1a",colorPrimary:"#e0e0e0",colorHoverPrimary:"#f5f5f5",colorPressedPrimary:"#ffffff"},Input:{color:"#2a2a2a",colorFocus:"#2a2a2a",border:"1px solid #555555",borderHover:"1px solid #777777",borderFocus:"1px solid #e0e0e0",borderDisabled:"1px solid #3a3a3a",groupLabelBorder:"1px solid #555555",placeholderColor:"#666666",caretColor:"#e0e0e0"},InternalSelection:{border:"1px solid #555555",borderHover:"1px solid #777777",borderActive:"1px solid #e0e0e0",borderFocus:"1px solid #e0e0e0"},Card:{color:"#2a2a2a",borderColor:"#3a3a3a"},Modal:{color:"#2a2a2a"},Tag:{borderRadius:"6px"},Switch:{railColor:"#3a3a3a",railColorActive:"#66bb6a",loadingColor:"#e0e0e0",opacityDisabled:.4}};function Nr(e,t){const a=e?Ur:Lr;return t?{...a,common:{...a.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:a}function qr(e){return e==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:e==="dark"}function zo(){const e=qr($t.value);Co.value=e,uo.value=co.value==="comic",document.documentElement.classList.toggle("dark",e),document.documentElement.classList.toggle("comic",uo.value)}function Zi(){const e=ee(()=>{const c=Co.value?"dark":"light";return uo.value?`comic-${c}`:c});function t(c){$t.value=c}function a(c){co.value=c}function n(){$t.value=Co.value?"light":"dark"}function r(){co.value=uo.value?"ink":"comic"}return{brightness:$t,style:co,isDark:Co,isComic:uo,themeName:e,setBrightness:t,setStyle:a,toggleBrightness:n,toggleStyle:r}}var Pa,Ta,$t,co,Co,uo,en=Re((()=>{Pa="hermes_brightness",Ta="hermes_style",$t=w(localStorage.getItem(Pa)||"system"),co=w(localStorage.getItem(Ta)||"ink"),Co=w(!1),uo=w(!1),zo(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{$t.value==="system"&&zo()}),ot($t,e=>{localStorage.setItem(Pa,e),zo()}),ot(co,e=>{localStorage.setItem(Ta,e),zo()})})),Ca,_a,li,di,Jt,Ho=Re((()=>{Oe(),vr(),Ca="0.6.25",_a="hermes_sidebar_collapsed",li="hermes_active_profile_name",di=3e4,Jt=ho("app",()=>{const e=w(!1),t=w(localStorage.getItem(_a)==="1"),a=w(!1),n=w(Ca),r=w(""),c=w(!1),u=w(!1),h=w(!1),S=w([]),H=w([]),f=w(""),P=w(""),V=w({}),L=w({}),j=w({}),z=w(),ue=w(""),ne=w(!0),T=w(!0),R=w(4096);let B=null,ae=0;async function ge(){h.value=!0;try{const x=await mr();return x.success&&(c.value=!1,await Ie()),x.success}catch(x){return console.error("Failed to update Hermes Web UI:",x),!1}finally{h.value=!1}}async function Ie(){try{const x=await br();a.value=x.status==="ok",x.webui_version&&(n.value=x.webui_version),u.value=!!x.webui_version&&x.webui_version!==Ca,x.webui_latest&&(r.value=x.webui_latest),c.value=!!x.webui_update_available,x.node_version&&(ue.value=x.node_version)}catch{a.value=!1,u.value=!1}}function me(x,ce={}){const Ce=f.value,Ee=P.value;if(S.value=x.groups,H.value=x.profiles||[],L.value=x.model_aliases||{},j.value=x.model_visibility||{},V.value=x.custom_models||{},ce.preserveSelection&&Ce&&Ee&&(x.groups.some(Le=>Le.provider===Ee&&Le.models.includes(Ce))||(x.custom_models?.[Ee]||[]).includes(Ce)))return;const Ve=localStorage.getItem(li)||"",He=(Ve?H.value.find(Le=>Le.profile===Ve):void 0)||x,at=He.groups||[],Qe=He.default||"",ze=He.default_provider||"",dt=at.find(Le=>Le.provider===ze&&Le.models.includes(Qe)),Rt=at.find(Le=>Le.models.includes(Qe)),Ht=at.find(Le=>Le.models.length>0),At=ze?at.find(Le=>Le.provider===ze):void 0,Lt=ze?x.allProviders.find(Le=>Le.provider===ze):void 0,ct=At?.available_models?.length?At.available_models:Lt?.available_models?.length?Lt.available_models:Lt?.models||[],Xt=ze?j.value[ze]:void 0,Ut=!!(Qe&&Xt?.mode==="include"&&!Xt.models.includes(Qe)&&(ct.length===0||ct.includes(Qe))),Zt=!!(Qe&&ze&&At&&!At.models.includes(Qe)&&!Ut);if(dt||Rt){const Le=dt||Rt;f.value=Qe,P.value=Le.provider}else Zt?(f.value=Qe,P.value=ze,V.value={...V.value,[ze]:Array.from(new Set([...V.value[ze]||[],Qe]))}):Ht?(f.value=Ht.models[0],P.value=Ht.provider):(f.value="",P.value="")}async function I(x=!1,ce={}){if(ri()){if(!x&&B)return B;if(!(!x&&ae>0&&Date.now()-ae<di))return ae=Date.now(),B=(async()=>{try{me(await hr(),ce)}catch{}finally{B=null}})(),B}}async function q(x=15e3){if(!ri())return;const ce=B||(ae===0?I():null);ce&&await Promise.race([ce,new Promise(Ce=>setTimeout(Ce,x))])}async function G(x={}){return I(!0,x)}function E(x,ce){if(ce)return L.value[ce]?.[x]||"";for(const Ce of Object.values(L.value))if(Ce[x])return Ce[x];return""}function Q(x,ce){return E(x,ce)||x}function X(x,ce,Ce){return x.map(Ee=>Ee.provider!==ce?Ee:{...Ee,models:Ee.models.filter(Ve=>Ve!==Ce),available_models:Ee.available_models?.filter(Ve=>Ve!==Ce)})}function _e(x,ce){S.value=X(S.value,x,ce),H.value=H.value.map(Ce=>({...Ce,groups:X(Ce.groups,x,ce)}))}async function J(x,ce,Ce){const Ee=Ce.trim();await Sr({provider:ce,model:x,alias:Ee});const Ve={...L.value},He={...Ve[ce]||{}};Ee?(He[x]=Ee,Ve[ce]=He):(delete He[x],Object.keys(He).length>0?Ve[ce]=He:delete Ve[ce]),L.value=Ve}async function N(x,ce){try{const Ce=S.value.find(Ve=>Ve.models.includes(x)),Ee=ce||Ce?.provider||"";await yr({default:x,provider:Ee}),f.value=x,P.value=Ee||"",Ee&&!S.value.find(Ve=>Ve.provider===Ee)?.models.includes(x)&&(V.value=(await wr({provider:Ee,model:x})).custom_models||{})}catch(Ce){console.error("Failed to switch model:",Ce)}}async function F(x,ce){const Ce=V.value[ce]||[];if(!Ce.includes(x))return;const Ee={...V.value},Ve=Ce.filter(He=>He!==x);Ve.length>0?Ee[ce]=Ve:delete Ee[ce];try{V.value=(await fr({provider:ce,model:x})).custom_models||Ee}catch(He){console.error("Failed to remove custom model:",He),V.value=Ee}if(_e(ce,x),f.value===x&&P.value===ce){const He=S.value.find(at=>at.provider===ce&&at.models.length>0)||S.value.find(at=>at.models.length>0);He?await N(He.models[0],He.provider):(f.value="",P.value="")}}function Ae(x){return j.value[x]||{mode:"all",models:[]}}function Ke(x,ce){const Ce=Ae(x);return Ce.mode!=="include"||Ce.models.includes(ce)}async function lt(x,ce){j.value=(await gr({provider:x,mode:ce.mode,models:ce.models})).model_visibility||{},await G()}function Y(x=3e4){be(),Ie(),z.value=setInterval(Ie,x)}function be(){z.value&&(clearInterval(z.value),z.value=void 0)}function ie(){const x=new URL(window.location.href);x.searchParams.set("__hwui_reload",Date.now().toString()),window.location.replace(x.toString())}function D(){e.value=!e.value}function Me(){e.value=!1}function C(){t.value=!t.value;try{localStorage.setItem(_a,t.value?"1":"0")}catch{}}return{sidebarOpen:e,sidebarCollapsed:t,toggleSidebar:D,closeSidebar:Me,toggleSidebarCollapsed:C,connected:a,serverVersion:n,latestVersion:r,nodeVersion:ue,updateAvailable:c,clientOutdated:u,updating:h,doUpdate:ge,reloadClient:ie,modelGroups:S,profileModelGroups:H,customModels:V,modelAliases:L,modelVisibility:j,selectedModel:f,selectedProvider:P,streamEnabled:ne,sessionPersistence:T,maxTokens:R,checkConnection:Ie,loadModels:I,waitForModelsForRun:q,reloadModels:G,applyAvailableModelsResponse:me,switchModel:N,removeCustomModel:F,getModelAlias:E,displayModelName:Q,setModelAlias:J,getProviderVisibility:Ae,isModelVisible:Ke,setModelVisibility:lt,startHealthPolling:Y,stopHealthPolling:be}})}));en();Ho();Oe();function zr(e){let t={};if(typeof window<"u")try{const r=window.localStorage.getItem(e);r&&(t=JSON.parse(r))}catch{t={}}const a=Zn({...t});function n(){typeof window>"u"||window.localStorage.setItem(e,JSON.stringify({...a}))}return{record:a,persist:n}}Oe();var Br=["href","title","aria-current","onClick"],Or=nt({__name:"RouteLinkItem",props:{to:{},active:{type:Boolean,default:void 0},exact:{type:Boolean,default:!1},title:{}},setup(e){const t=e;return(a,n)=>{const r=Ni("RouterLink");return _(),ke(r,{to:t.to,custom:""},{default:W(c=>[s("a",{class:Ze(["route-link-item",{active:t.active??(t.exact?!!c?.isExactActive:!!c?.isActive)}]),href:c?.href||"#",title:t.title,"aria-current":t.active??(t.exact?!!c?.isExactActive:!!c?.isActive)?"page":void 0,onClick:c?.navigate},[Xn(a.$slots,"default")],10,Br)]),_:3},8,["to"])}}}),Xe=Or;async function ci(){return(await K("/api/hermes/profiles")).profiles}async function Wr(e){return(await K(`/api/hermes/profiles/${encodeURIComponent(e)}`)).profile}async function Kr(e={}){return K(`/api/hermes/profiles/runtime-statuses${e.refresh===!1?"?refresh=0":""}`)}async function Vr(e,t){return(await K(`/api/hermes/profiles/${encodeURIComponent(e)}/avatar`,{method:"PUT",body:JSON.stringify(t)})).avatar}async function Gr(e){await K(`/api/hermes/profiles/${encodeURIComponent(e)}/avatar`,{method:"DELETE"})}async function jr(e){return(await K(`/api/hermes/profiles/${encodeURIComponent(e)}/gateway/restart`,{method:"POST"})).gateway}async function $r(e){return(await K(`/api/hermes/profiles/${encodeURIComponent(e)}/restart`,{method:"POST"})).status}async function Jr(e,t){try{const a=await K("/api/hermes/profiles",{method:"POST",body:JSON.stringify({name:e,clone:t})});return{success:!!a.success,strippedCredentials:a.strippedCredentials,disabledPlatforms:a.disabledPlatforms,strippedConfigCredentials:a.strippedConfigCredentials,error:a.error}}catch(a){return{success:!1,error:a.message||"Unknown error"}}}async function Qr(e){try{return await K(`/api/hermes/profiles/${encodeURIComponent(e)}`,{method:"DELETE"}),!0}catch{return!1}}async function Yr(e,t){try{return await K(`/api/hermes/profiles/${encodeURIComponent(e)}/rename`,{method:"POST",body:JSON.stringify({new_name:t})}),!0}catch{return!1}}async function Xr(e){return!!e}async function Zr(e){try{return await K("/api/hermes/profiles/active",{method:"PUT",body:JSON.stringify({name:e})}),!0}catch{return!1}}async function es(e){try{const t=fo(),a=Yt(),n={};a&&(n.Authorization=`Bearer ${a}`);const r=await fetch(`${t}/api/hermes/profiles/${encodeURIComponent(e)}/export`,{method:"POST",headers:n});if(!r.ok)throw new Error;const c=await r.blob(),u=URL.createObjectURL(c),h=document.createElement("a");return h.href=u,h.download=`hermes-profile-${e}.tar.gz`,h.click(),URL.revokeObjectURL(u),!0}catch{return!1}}async function ts(e){try{const t=fo(),a=Yt(),n={};a&&(n.Authorization=`Bearer ${a}`);const r=new FormData;return r.append("file",e),(await fetch(`${t}/api/hermes/profiles/import`,{method:"POST",headers:n,body:r})).ok}catch{return!1}}var tn=Re((()=>{rt()})),os=jn({useProfilesStore:()=>Et}),no,Et,Io=Re((()=>{Qt(),Oe(),tn(),no="hermes_active_profile_name",Et=ho("profiles",()=>{const e=w([]),t=w(localStorage.getItem(no)),a=w(null),n=w({}),r=w(!1),c=w(!1);async function u(){r.value=!0;try{e.value=await ci();const R=t.value||localStorage.getItem(no);let B=e.value.find(ae=>ae.name===R)??null;!B&&e.value.length>0&&(B=e.value[0],t.value=B.name,localStorage.setItem(no,B.name)),e.value=e.value.map(ae=>({...ae,active:!!B&&ae.name===B.name})),a.value=B,B?t.value=B.name:(t.value=null,localStorage.removeItem(no))}catch(R){console.error("Failed to fetch profiles:",R)}finally{r.value=!1}}async function h(){r.value=!0;try{e.value=await ci(),a.value=e.value.find(R=>R.active)??null}catch(R){console.error("Failed to fetch Hermes profiles:",R)}finally{r.value=!1}}async function S(R){if(n.value[R])return n.value[R];try{const B=await Wr(R);return n.value[R]=B,B}catch{return null}}async function H(R,B){const ae=await Vr(R,B);return e.value=e.value.map(ge=>ge.name===R?{...ge,avatar:ae}:ge),n.value[R]&&(n.value[R]={...n.value[R],avatar:ae}),a.value?.name===R&&(a.value={...a.value,avatar:ae}),ae}async function f(R){await Gr(R),e.value=e.value.map(B=>B.name===R?{...B,avatar:null}:B),n.value[R]&&(n.value[R]={...n.value[R],avatar:null}),a.value?.name===R&&(a.value={...a.value,avatar:null})}async function P(R,B){const ae=await Jr(R,B);return ae.success&&await u(),ae}async function V(R){const B=await Qr(R);return B&&(delete n.value[R],await u()),B}function L(){}async function j(R,B){const ae=await Yr(R,B);return ae&&(delete n.value[R],await u()),ae}async function z(R){c.value=!0;try{const B=await Xr(R);return B&&(t.value=R,localStorage.setItem(no,R),e.value=e.value.map(ae=>({...ae,active:ae.name===R})),a.value=e.value.find(ae=>ae.name===R)??null,await Jt().reloadModels()),B}finally{c.value=!1}}async function ue(R){c.value=!0;try{const B=await Zr(R);return B&&await h(),B}finally{c.value=!1}}async function ne(R){return es(R)}async function T(R){const B=await ts(R);return B&&await u(),B}return{profiles:e,activeProfile:a,activeProfileName:t,detailMap:n,loading:r,switching:c,fetchProfiles:u,fetchHermesProfiles:h,fetchProfileDetail:S,createProfile:P,deleteProfile:V,renameProfile:j,switchProfile:z,switchHermesProfile:ue,exportProfile:ne,importProfile:T,updateAvatar:H,deleteAvatar:f,clearAllSessionCaches:L}})}));Oe();Ho();Io();gt();var as={class:"model-selector"},is={class:"model-label-row"},ns={class:"model-label"},rs=["disabled","title","aria-label"],ss=["title"],ls={class:"model-list"},ds=["onClick"],cs={class:"model-group-label"},us={class:"model-group-count"},ps={class:"model-group-items"},ms=["title","onClick"],gs={class:"model-item-label"},hs={class:"model-item-name"},vs={key:0,class:"model-item-id"},fs={key:0,class:"model-badge-preview"},bs={key:1,class:"model-badge-disabled"},ws={key:2,class:"model-badge-custom"},ys=["title","onClick"],Ss={key:4,class:"model-check",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.5","stroke-linecap":"round","stroke-linejoin":"round"},As={key:0,class:"model-empty"},ks={class:"model-custom"},Ps={class:"model-custom-row"},Ts={class:"model-custom-hint"},Cs=nt({__name:"ModelSelector",emits:["modal-show-change"],setup(e,{emit:t}){const a=t,{t:n}=St(),r=Jt(),c=Et(),u=w(!1),h=w(""),S=w({}),H=w(""),f=w(""),P=ee(()=>c.activeProfileName||"default"),V=ee(()=>r.profileModelGroups.find(J=>J.profile===P.value)?.groups||[]),L=ee(()=>(f.value=r.selectedProvider,V.value.map(J=>({label:J.label,value:J.provider})))),j=ee(()=>V.value.map(J=>({...J,models:[...J.models,...(r.customModels[J.provider]||[]).filter(N=>!J.models.includes(N))]}))),z=ee(()=>j.value.some(J=>J.provider===r.selectedProvider&&J.models.includes(r.selectedModel))),ue=ee(()=>z.value?r.displayModelName(r.selectedModel,r.selectedProvider):"");function ne(J,N){return(r.customModels[N]||[]).includes(J)}async function T(J,N){await r.removeCustomModel(J,N)}function R(J){return typeof J=="string"?J.toLowerCase():""}const B=ee(()=>{const J=R(h.value).trim();return J?j.value.map(N=>({...N,models:N.models.filter(F=>{const Ae=r.displayModelName(F,N.provider);return R(F).includes(J)||R(Ae).includes(J)})})).filter(N=>N.models.length>0||R(N.label).includes(J)):j.value});function ae(J){S.value[J]=!S.value[J]}function ge(J){return!!S.value[J]}function Ie(J,N){V.value.find(F=>F.provider===N)?.model_meta?.[J]?.disabled||(r.switchModel(J,N),G(!1),h.value="")}function me(J,N){return r.displayModelName(J,N)}function I(J,N){return r.getModelAlias(J,N)}function q(){const J=H.value.trim();!J||!f.value||V.value.find(N=>N.provider===f.value)?.model_meta?.[J]?.disabled||(r.switchModel(J,f.value),G(!1),h.value="",H.value="")}function G(J){u.value=J,a("modal-show-change",J)}function E(){S.value={},h.value="",H.value="",f.value=r.selectedProvider,G(!0)}function Q(J){G(J)}const X=w(!1);async function _e(){if(X.value)return;X.value=!0;const J=Date.now();try{await r.reloadModels({preserveSelection:!0})}finally{const N=Date.now()-J,F=600;N<F&&await new Promise(Ae=>setTimeout(Ae,F-N)),X.value=!1}}return(J,N)=>(_(),$("div",as,[s("div",is,[s("div",ns,y(p(n)("models.title")),1),s("button",{class:"model-refresh",type:"button",disabled:X.value,title:p(n)("models.refresh"),"aria-label":p(n)("models.refresh"),onClick:_e},[(_(),$("svg",{class:Ze({spinning:X.value}),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...N[3]||(N[3]=[s("polyline",{points:"23 4 23 10 17 10"},null,-1),s("polyline",{points:"1 20 1 14 7 14"},null,-1),s("path",{d:"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"},null,-1)])],2))],8,rs)]),s("button",{class:"model-trigger",onClick:E},[s("span",{class:"model-name",title:p(r).selectedModel},y(ue.value||"—"),9,ss),N[4]||(N[4]=s("svg",{class:"model-arrow",width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[s("polyline",{points:"6 9 12 15 18 9"})],-1))]),se(p(mo),{show:u.value,preset:"card",title:p(n)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0,"onUpdate:show":Q},{default:W(()=>[se(p(Da),{value:h.value,"onUpdate:value":N[0]||(N[0]=F=>h.value=F),placeholder:p(n)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),s("div",ls,[(_(!0),$(xt,null,_t(B.value,F=>(_(),$("div",{key:F.provider,class:"model-group"},[s("div",{class:"model-group-header",onClick:Ae=>ae(F.provider)},[(_(),$("svg",{class:Ze(["model-group-arrow",{collapsed:ge(F.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...N[5]||(N[5]=[s("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),s("span",cs,y(F.label),1),s("span",us,y(F.models.length),1)],8,ds),lo(s("div",ps,[(_(!0),$(xt,null,_t(F.models,Ae=>(_(),$("div",{key:Ae,class:Ze(["model-item",{active:Ae===p(r).selectedModel&&F.provider===p(r).selectedProvider,disabled:!!F.model_meta?.[Ae]?.disabled}]),title:F.model_meta?.[Ae]?.disabled?p(n)("models.disabledTooltip"):"",onClick:Ke=>Ie(Ae,F.provider)},[s("span",gs,[s("span",hs,y(me(Ae,F.provider)),1),I(Ae,F.provider)?(_(),$("span",vs,y(p(n)("models.aliasCanonical",{model:Ae})),1)):le("",!0)]),F.model_meta?.[Ae]?.preview?(_(),$("span",fs,y(p(n)("models.previewBadge")),1)):le("",!0),F.model_meta?.[Ae]?.disabled?(_(),$("span",bs,y(p(n)("models.disabledBadge")),1)):le("",!0),ne(Ae,F.provider)?(_(),$("span",ws,y(p(n)("models.customBadge")),1)):le("",!0),ne(Ae,F.provider)?(_(),$("button",{key:3,class:"model-custom-remove",type:"button",title:p(n)("models.removeCustomModel"),onClick:tt(Ke=>T(Ae,F.provider),["stop"])}," × ",8,ys)):le("",!0),Ae===p(r).selectedModel&&F.provider===p(r).selectedProvider?(_(),$("svg",Ss,[...N[6]||(N[6]=[s("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):le("",!0)],10,ms))),128))],512),[[so,!ge(F.provider)]])]))),128)),B.value.length===0?(_(),$("div",As,y(h.value?"No results":"No models"),1)):le("",!0),s("div",ks,[s("div",Ps,[se(p(Bi),{value:f.value,"onUpdate:value":N[1]||(N[1]=F=>f.value=F),options:L.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),se(p(Da),{value:H.value,"onUpdate:value":N[2]||(N[2]=F=>H.value=F),placeholder:p(n)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:Fa(q,["enter"])},null,8,["value","placeholder"])]),s("div",Ts,y(p(n)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});ht();var _s=vt(Cs,[["__scopeId","data-v-d21ede5c"]]),ui,pi,mi,on,gi=Re((()=>{Oe(),ui=Vn(pr()),pi=["src"],mi=["innerHTML"],on=nt({__name:"ProfileAvatar",props:{name:{},avatar:{},size:{default:24}},setup(e){const t=e,a=ee(()=>t.name||"default"),n=ee(()=>(0,ui.default)(t.avatar?.seed||a.value)),r=ee(()=>({width:`${t.size}px`,height:`${t.size}px`,flexBasis:`${t.size}px`}));return(c,u)=>(_(),$("span",{class:"profile-avatar-view",style:zi(r.value)},[e.avatar?.type==="image"&&e.avatar.dataUrl?(_(),$("img",{key:0,class:"profile-avatar-image",src:e.avatar.dataUrl,alt:"",draggable:"false"},null,8,pi)):(_(),$("span",{key:1,class:"profile-avatar-svg",innerHTML:n.value},null,8,mi))],4))}})})),xs=Re((()=>{})),Ko,Ms=Re((()=>{gi(),gi(),xs(),ht(),Ko=vt(on,[["__scopeId","data-v-6a9a551b"]])}));Oe();Mt();Io();tn();Ms();gt();var Rs={class:"profile-selector"},Hs={class:"selector-label"},Is={class:"profile-name"},Fs={class:"profile-modal-header"},Ds={class:"profile-popover-title"},Es={class:"profile-popover-name"},Ls={class:"profile-popover-subtitle"},Us={class:"profile-runtime-list"},Ns={class:"profile-runtime-main"},qs={class:"profile-runtime-info"},zs={class:"profile-runtime-name-row"},Bs={class:"profile-runtime-name"},Os={key:0,class:"active-badge"},Ws={class:"runtime-status-grid"},Ks={class:"runtime-row compact"},Vs={class:"runtime-label"},Gs={class:"runtime-row compact"},js={class:"runtime-label"},$s={key:0,class:"runtime-detail"},Js={class:"profile-runtime-actions"},Qs={key:0,class:"avatar-editor"},Ys={class:"avatar-editor-meta"},Xs={class:"avatar-editor-name"},Zs={class:"avatar-editor-hint"},el={class:"avatar-editor-actions"},tl=nt({__name:"ProfileSelector",emits:["modal-show-change"],setup(e,{emit:t}){const a=t,{t:n}=St(),r=Ro(),c=Et(),u=ee(()=>c.activeProfileName??""),h=ee(()=>u.value||"default"),S=ee(()=>c.profiles.find(Y=>Y.name===h.value)),H=w([]),f=w(!1),P=w(!1),V=w(!1),L=w(null),j=w(!1),z=w(null),ue=w({}),ne=w({}),T=w({}),R=ee(()=>new Map(H.value.map(Y=>[Y.profile,Y])));let B=0;function ae(Y){P.value=Y,a("modal-show-change",Y)}async function ge(Y={}){const be=++B;Y.background||(f.value=H.value.length===0);try{const ie=await Kr({refresh:!Y.background});return be!==B?!1:(H.value=ie.profiles,!!ie.refreshing)}catch{return H.value=[],!1}finally{be===B&&(f.value=!1)}}function Ie(){ae(!0),ge().then(Y=>{Y&&me()})}function me(Y=0){Y>=12||typeof window>"u"||window.setTimeout(()=>{P.value&&ge({background:!0}).then(be=>{be&&me(Y+1)})},Y===0?700:1200)}function I(Y){ae(Y)}function q(Y){L.value=Y,V.value=!0}function G(){return`profile-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}async function E(Y){if(L.value){j.value=!0;try{await c.updateAvatar(L.value.name,Y),r.success(n("profiles.avatar.saveSuccess")),V.value=!1}catch(be){r.error(be?.message||n("profiles.avatar.saveFailed"))}finally{j.value=!1}}}async function Q(){await E({type:"generated",seed:G()})}async function X(){if(L.value){j.value=!0;try{await c.deleteAvatar(L.value.name),r.success(n("profiles.avatar.resetSuccess")),V.value=!1}catch(Y){r.error(Y?.message||n("profiles.avatar.resetFailed"))}finally{j.value=!1}}}function _e(){z.value?.click()}async function J(Y){const be=Y.target,ie=be.files?.[0];if(be.value="",!!ie){if(!["image/png","image/jpeg","image/webp"].includes(ie.type)){r.warning(n("profiles.avatar.invalidType"));return}if(ie.size>1024*1024){r.warning(n("profiles.avatar.tooLarge"));return}await E({type:"image",dataUrl:await new Promise((D,Me)=>{const C=new FileReader;C.onload=()=>D(String(C.result||"")),C.onerror=()=>Me(C.error||new Error("Failed to read file")),C.readAsDataURL(ie)})})}}function N(Y){return Y==null?n("profiles.runtime.checking"):n(Y?"profiles.runtime.running":"profiles.runtime.stopped")}function F(Y){return Y==null?n("profiles.runtime.checking"):n(Y?"profiles.runtime.active":"profiles.runtime.idle")}async function Ae(Y){ue.value={...ue.value,[Y]:!0};try{const be=await jr(Y);R.value.get(Y)&&(H.value=H.value.map(ie=>ie.profile===Y?{...ie,gateway:be}:ie)),r.success(n("profiles.runtime.gatewayRestarted",{name:Y}))}catch(be){r.error(be?.message||n("profiles.runtime.gatewayRestartFailed"))}finally{ue.value={...ue.value,[Y]:!1}}}async function Ke(Y){ne.value={...ne.value,[Y]:!0};try{const be=await $r(Y);H.value=H.value.map(ie=>ie.profile===Y?be:ie),r.success(n("profiles.runtime.profileRestarted",{name:Y}))}catch(be){r.error(be?.message||n("profiles.runtime.profileRestartFailed"))}finally{ne.value={...ne.value,[Y]:!1}}}async function lt(Y){if(Y!==h.value){T.value={...T.value,[Y]:!0};try{if(!await c.switchProfile(Y))throw new Error(n("profiles.switchFailed"));r.success(n("profiles.switchSuccess",{name:Y})),window.location.reload()}catch(be){r.error(be?.message||n("profiles.switchFailed"))}finally{T.value={...T.value,[Y]:!1}}}}return go(()=>{c.profiles.length===0&&c.fetchProfiles()}),(Y,be)=>(_(),$("div",Rs,[s("div",Hs,y(p(n)("sidebar.profiles")),1),s("div",{class:"profile-display","data-testid":"profile-selector-select",onClick:Ie},[se(Ko,{class:"profile-avatar",name:h.value,avatar:S.value?.avatar,size:24},null,8,["name","avatar"]),s("span",Is,y(h.value),1)]),se(p(mo),{show:P.value,preset:"card",bordered:!1,style:{width:"720px",maxWidth:"calc(100vw - 32px)"},class:"profile-manager-modal","onUpdate:show":I},{header:W(()=>[s("div",Fs,[s("div",Ds,[s("span",Es,y(p(n)("sidebar.profiles")),1),s("span",Ls,y(p(n)("profiles.runtime.activeProfile",{name:h.value})),1)])])]),default:W(()=>[se(p(Va),{show:f.value,size:"small"},{default:W(()=>[s("div",Us,[(_(!0),$(xt,null,_t(p(c).profiles,ie=>(_(),$("div",{key:ie.name,class:Ze(["profile-runtime-item",{active:ie.name===h.value}])},[s("div",Ns,[se(Ko,{class:"profile-runtime-avatar",name:ie.name,avatar:ie.avatar,size:34},null,8,["name","avatar"]),s("div",qs,[s("div",zs,[s("span",Bs,y(ie.name),1),ie.name===h.value?(_(),$("span",Os,y(p(n)("profiles.runtime.activeTag")),1)):le("",!0)]),s("div",Ws,[s("div",Ks,[s("span",Vs,y(p(n)("profiles.runtime.bridgeWorker")),1),s("span",{class:Ze(["runtime-value",{running:R.value.get(ie.name)?.bridge.running}])},[be[1]||(be[1]=s("span",{class:"runtime-dot"},null,-1)),Te(" "+y(F(R.value.get(ie.name)?.bridge.running)),1)],2)]),s("div",Gs,[s("span",js,y(p(n)("profiles.runtime.gateway")),1),s("span",{class:Ze(["runtime-value",{running:R.value.get(ie.name)?.gateway.running}])},[be[2]||(be[2]=s("span",{class:"runtime-dot"},null,-1)),Te(" "+y(N(R.value.get(ie.name)?.gateway.running)),1)],2)])]),!R.value.get(ie.name)?.gateway.running&&(R.value.get(ie.name)?.gateway.diagnostics?.reason||R.value.get(ie.name)?.gateway.error)?(_(),$("div",$s,y(R.value.get(ie.name)?.gateway.diagnostics?.reason||R.value.get(ie.name)?.gateway.error),1)):le("",!0)])]),s("div",Js,[se(p(je),{size:"small",type:"primary",onClick:D=>q(ie)},{default:W(()=>[Te(y(p(n)("profiles.avatar.customize")),1)]),_:1},8,["onClick"]),se(p(je),{size:"small",type:"primary",loading:ue.value[ie.name],onClick:D=>Ae(ie.name)},{default:W(()=>[Te(y(p(n)("profiles.runtime.restartGateway")),1)]),_:1},8,["loading","onClick"]),se(p(je),{size:"small",type:"primary",loading:ne.value[ie.name],onClick:D=>Ke(ie.name)},{default:W(()=>[Te(y(p(n)("profiles.runtime.restartProfile")),1)]),_:1},8,["loading","onClick"]),se(p(je),{size:"small",type:"primary",disabled:ie.name===h.value,loading:T.value[ie.name],onClick:D=>lt(ie.name)},{default:W(()=>[Te(y(p(n)("profiles.runtime.switchProfile")),1)]),_:1},8,["disabled","loading","onClick"])])],2))),128))])]),_:1},8,["show"])]),_:1},8,["show"]),se(p(mo),{show:V.value,"onUpdate:show":be[0]||(be[0]=ie=>V.value=ie),preset:"card",title:p(n)("profiles.avatar.title"),bordered:!1,style:{width:"420px",maxWidth:"calc(100vw - 32px)"}},{default:W(()=>[L.value?(_(),$("div",Qs,[se(Ko,{name:L.value.name,avatar:L.value.avatar,size:72},null,8,["name","avatar"]),s("div",Ys,[s("div",Xs,y(L.value.name),1),s("div",Zs,y(p(n)("profiles.avatar.hint")),1)]),s("input",{ref_key:"fileInputRef",ref:z,class:"avatar-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:J},null,544),s("div",el,[se(p(je),{type:"primary",loading:j.value,onClick:_e},{default:W(()=>[Te(y(p(n)("profiles.avatar.upload")),1)]),_:1},8,["loading"]),se(p(je),{type:"primary",loading:j.value,onClick:Q},{default:W(()=>[Te(y(p(n)("profiles.avatar.random")),1)]),_:1},8,["loading"]),se(p(je),{loading:j.value,onClick:X},{default:W(()=>[Te(y(p(n)("profiles.avatar.reset")),1)]),_:1},8,["loading"])])])):le("",!0)]),_:1},8,["show","title"])]))}});ht();var ol=vt(tl,[["__scopeId","data-v-800ef502"]]);Oe();gt();Mt();var al=nt({__name:"LanguageSwitch",setup(e){const{locale:t}=St(),a=[{label:"简体中文",value:"zh"},{label:"繁體中文",value:"zh-TW"},{label:"English",value:"en"},{label:"日本語",value:"ja"},{label:"한국어",value:"ko"},{label:"Français",value:"fr"},{label:"Español",value:"es"},{label:"Deutsch",value:"de"},{label:"Português",value:"pt"},{label:"Русский",value:"ru"}];function n(r){Dr(r),localStorage.setItem("hermes_locale",r)}return(r,c)=>(_(),ke(p(Bi),{value:p(t),options:a,size:"tiny","consistent-menu-width":!1,class:"language-switch input-sm","onUpdate:value":n},null,8,["value"]))}}),il=al;Oe();var nl={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},rl=["title"],sl={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ll={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},dl=["title"],cl={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ul={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},pl=nt({__name:"ThemeSwitch",setup(e){const{isDark:t,isComic:a,toggleBrightness:n,toggleStyle:r}=Zi();return(c,u)=>(_(),$("div",nl,[s("button",{class:"theme-switch",title:p(a)?"Ink style":"Comic style",onClick:u[0]||(u[0]=(...h)=>p(r)&&p(r)(...h))},[p(a)?(_(),$("svg",sl,[...u[2]||(u[2]=[s("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(_(),$("svg",ll,[...u[3]||(u[3]=[s("path",{d:"M12 3l1.5 5.5L19 10l-5.5 1.5L12 17l-1.5-5.5L5 10l5.5-1.5L12 3z"},null,-1)])]))],8,rl),s("button",{class:"theme-switch",title:p(t)?"Light mode":"Dark mode",onClick:u[1]||(u[1]=(...h)=>p(n)&&p(n)(...h))},[p(t)?(_(),$("svg",cl,[...u[4]||(u[4]=[qi('<circle cx="12" cy="12" r="5" data-v-4c30f4bd></circle><line x1="12" y1="1" x2="12" y2="3" data-v-4c30f4bd></line><line x1="12" y1="21" x2="12" y2="23" data-v-4c30f4bd></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64" data-v-4c30f4bd></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78" data-v-4c30f4bd></line><line x1="1" y1="12" x2="3" y2="12" data-v-4c30f4bd></line><line x1="21" y1="12" x2="23" y2="12" data-v-4c30f4bd></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36" data-v-4c30f4bd></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22" data-v-4c30f4bd></line>',9)])])):(_(),$("svg",ul,[...u[5]||(u[5]=[s("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,dl)]))}});ht();var ml=vt(pl,[["__scopeId","data-v-4c30f4bd"]]);rt();async function gl(){return K("/api/hermes/runtime-versions")}async function hl(e){return K("/api/hermes/runtime-versions/active-runtime",{method:"POST",body:JSON.stringify({version:e})})}async function vl(e){return K("/api/hermes/runtime-versions/active-webui",{method:"POST",body:JSON.stringify({version:e})})}async function fl(e,t){return K("/api/hermes/runtime-versions/runtime/download",{method:"POST",body:JSON.stringify({version:e,source:t})})}async function bl(e){return K(`/api/hermes/runtime-versions/runtime/${encodeURIComponent(e)}`,{method:"DELETE"})}async function wl(e,t){return K("/api/hermes/runtime-versions/webui/download",{method:"POST",body:JSON.stringify({version:e,source:t})})}async function yl(e){return K(`/api/hermes/runtime-versions/webui/${encodeURIComponent(e)}`,{method:"DELETE"})}async function Sl(){return K("/api/hermes/runtime-versions/jobs")}Oe();gt();Mt();var Al={class:"version-management"},kl={class:"version-section"},Pl={class:"section-heading"},Tl={class:"active-path"},Cl=["title"],_l={class:"version-list"},xl={class:"version-main"},Ml={class:"version-actions"},Rl={key:0,class:"empty-row"},Hl={class:"version-section"},Il={class:"section-heading"},Fl={class:"active-path"},Dl=["title"],El={class:"version-list"},Ll={class:"version-main"},Ul={class:"version-actions"},Nl={key:0,class:"empty-row"},ql={key:2,class:"version-section"},zl={class:"section-heading compact"},Bl={class:"job-list"},Ol={class:"job-main"},Wl={key:0,class:"job-progress"},Kl={key:1},Vl=nt({__name:"VersionManagementModal",props:{show:{type:Boolean}},emits:["update:show"],setup(e,{emit:t}){const a=e,n=t,{t:r}=St(),c=Ro(),u=w(null),h=w([]),S=w(!1),H=w({}),f=w("");let P=null;const V=ee(()=>(u.value?.hermes.installed||[]).filter(D=>D.platform===u.value?.platform)),L=ee(()=>ue([...u.value?.hermes.remoteVersions||[],...V.value.map(D=>D.version)])),j=ee(()=>ue([...u.value?.webui.remoteVersions||[],...(u.value?.webui.installed||[]).map(D=>D.version),u.value?.webui.currentVersion||""]));ot(()=>a.show,D=>{D?ne():ge()}),$n(ge);function z(D){n("update:show",D)}function ue(D){return Array.from(new Set(D.map(Me=>Me.trim().replace(/^v/,"")).filter(Boolean))).sort((Me,C)=>C.localeCompare(Me,void 0,{numeric:!0}))}async function ne(){S.value=!0,f.value="";try{await Promise.all([T(),R()]),Ie()&&ae()}catch(D){f.value=D instanceof Error?D.message:String(D)}finally{S.value=!1}}async function T(){u.value=await gl()}async function R(){h.value=(await Sl()).jobs}async function B(){try{const D=Ie();await R(),D&&!Ie()?(ge(),await T()):Ie()||ge()}catch{ge()}}function ae(){P||(P=setInterval(()=>{B()},2e3))}function ge(){P&&(clearInterval(P),P=null)}function Ie(){return h.value.some(D=>D.status==="queued"||D.status==="running")}function me(D){return V.value.find(Me=>Me.version===D)}function I(D){return u.value?.webui.installed.find(Me=>Me.version===D)}function q(D,Me){return h.value.find(C=>C.kind===D&&C.version===Me.replace(/^v/,"")&&(C.status==="queued"||C.status==="running"))}function G(D){return D==="completed"?"success":D==="failed"?"error":D==="running"?"info":"warning"}function E(D){return D.status==="completed"||D.status==="failed"?r(`runtimeVersions.jobStatus.${D.status}`):r(`runtimeVersions.jobStageStatus.${D.stage}`)}function Q(D){return D.startsWith("runtimeVersions.")?r(D):D}function X(D,Me){H.value={...H.value,[D]:Me}}async function _e(D,Me){X(D,!0);try{await Me()}catch(C){c.error(C instanceof Error?C.message:String(C))}finally{X(D,!1)}}function J(D){return r(D==="github"?"runtimeVersions.github":"runtimeVersions.cf")}function N(D){if(!D||D<=0)return"";const Me=["B","KB","MB","GB"];let C=D,x=0;for(;C>=1024&&x<Me.length-1;)C/=1024,x+=1;return`${C>=10||x===0?C.toFixed(0):C.toFixed(1)} ${Me[x]}`}function F(D){return D.receivedBytes&&D.totalBytes?`${N(D.receivedBytes)} / ${N(D.totalBytes)}`:D.receivedBytes?N(D.receivedBytes):Q(D.message)}async function Ae(D,Me){await _e(`download-runtime-${Me}-${D}`,async()=>{const C=await fl(D,Me);h.value=[C.job,...h.value.filter(x=>x.id!==C.job.id)],c.success(r("runtimeVersions.downloadStarted")),ae()})}async function Ke(D,Me){await _e(`download-webui-${Me}-${D}`,async()=>{const C=await wl(D,Me);h.value=[C.job,...h.value.filter(x=>x.id!==C.job.id)],c.success(r("runtimeVersions.downloadStarted")),ae()})}async function lt(D){await _e(`activate-runtime-${D}`,async()=>{await hl(D),c.success(r("runtimeVersions.activateSuccess")),await ne()})}async function Y(D){await _e(`delete-runtime-${D}`,async()=>{await bl(D),c.success(r("runtimeVersions.deleteRuntimeSuccess")),await ne()})}async function be(D){await _e(`activate-webui-${D}`,async()=>{await vl(D),c.success(r("runtimeVersions.activateSuccess")),await ne()})}async function ie(D){await _e(`delete-webui-${D}`,async()=>{await yl(D),c.success(r("runtimeVersions.deleteWebUiSuccess")),await ne()})}return(D,Me)=>(_(),ke(p(Qn),{show:a.show,placement:"right",width:"min(860px, calc(100vw - 24px))","onUpdate:show":z},{default:W(()=>[se(p(Yn),{title:p(r)("runtimeVersions.title"),closable:""},{default:W(()=>[se(p(Va),{show:S.value},{default:W(()=>[s("div",Al,[f.value?(_(),ke(p(ii),{key:0,type:"error",bordered:!1},{default:W(()=>[Te(y(f.value),1)]),_:1})):le("",!0),u.value?.remoteError?(_(),ke(p(ii),{key:1,type:"warning",bordered:!1},{default:W(()=>[Te(y(p(r)("runtimeVersions.remoteLoadFailed"))+": "+y(u.value.remoteError),1)]),_:1})):le("",!0),s("section",kl,[s("div",Pl,[s("div",null,[s("h3",null,y(p(r)("runtimeVersions.runtimeTitle")),1),s("p",null,y(p(r)("runtimeVersions.platform"))+": "+y(u.value?.platform||"-"),1)]),se(p(je),{size:"small",secondary:"",onClick:ne},{default:W(()=>[Te(y(p(r)("runtimeVersions.refresh")),1)]),_:1})]),s("div",Tl,[s("span",null,y(p(r)("runtimeVersions.activeVersion"))+": "+y(u.value?.hermes.activeVersion||"-"),1),s("span",{title:u.value?.hermes.activeDirectory||""},y(u.value?.hermes.activeDirectory||"-"),9,Cl)]),s("div",_l,[(_(!0),$(xt,null,_t(L.value,C=>(_(),$("div",{key:`runtime-${C}`,class:"version-row"},[s("div",xl,[s("strong",null,y(C),1),me(C)?.active?(_(),ke(p(Gt),{key:0,size:"small",type:"success",bordered:!1},{default:W(()=>[Te(y(p(r)("runtimeVersions.active")),1)]),_:1})):me(C)?(_(),ke(p(Gt),{key:1,size:"small",bordered:!1},{default:W(()=>[Te(y(p(r)("runtimeVersions.installed")),1)]),_:1})):le("",!0),q("runtime",C)?(_(),ke(p(Gt),{key:2,size:"small",type:G(q("runtime",C).status),bordered:!1},{default:W(()=>[Te(y(E(q("runtime",C))),1)]),_:2},1032,["type"])):le("",!0)]),s("div",Ml,[me(C)&&!me(C)?.active?(_(),ke(p(je),{key:0,size:"small",secondary:"",loading:H.value[`activate-runtime-${C}`],onClick:x=>lt(C)},{default:W(()=>[Te(y(p(r)("runtimeVersions.useVersion")),1)]),_:1},8,["loading","onClick"])):le("",!0),me(C)&&!me(C)?.active?(_(),ke(p(ni),{key:1,onPositiveClick:x=>Y(C)},{trigger:W(()=>[se(p(je),{size:"small",type:"error",secondary:"",loading:H.value[`delete-runtime-${C}`]},{default:W(()=>[Te(y(p(r)("runtimeVersions.deleteVersion")),1)]),_:1},8,["loading"])]),default:W(()=>[Te(" "+y(p(r)("runtimeVersions.deleteRuntimeConfirm",{version:C})),1)]),_:2},1032,["onPositiveClick"])):le("",!0),me(C)?le("",!0):(_(),ke(p(je),{key:2,size:"small",type:"primary",secondary:"",disabled:!!q("runtime",C),loading:H.value[`download-runtime-github-${C}`],onClick:x=>Ae(C,"github")},{default:W(()=>[Te(y(p(r)("runtimeVersions.downloadGithub")),1)]),_:1},8,["disabled","loading","onClick"])),me(C)?le("",!0):(_(),ke(p(je),{key:3,size:"small",type:"primary",secondary:"",disabled:!!q("runtime",C),loading:H.value[`download-runtime-cf-${C}`],onClick:x=>Ae(C,"cf")},{default:W(()=>[Te(y(p(r)("runtimeVersions.downloadCf")),1)]),_:1},8,["disabled","loading","onClick"]))])]))),128)),L.value.length===0?(_(),$("div",Rl,y(p(r)("runtimeVersions.noVersions")),1)):le("",!0)])]),s("section",Hl,[s("div",Il,[s("div",null,[s("h3",null,y(p(r)("runtimeVersions.webUiTitle")),1),s("p",null,y(p(r)("runtimeVersions.currentWebUi"))+": "+y(u.value?.webui.currentVersion||"-"),1)])]),s("div",Fl,[s("span",null,y(p(r)("runtimeVersions.activeVersion"))+": "+y(u.value?.webui.activeVersion||"-"),1),s("span",{title:u.value?.webui.activeDirectory||""},y(u.value?.webui.activeDirectory||"-"),9,Dl)]),s("div",El,[(_(!0),$(xt,null,_t(j.value,C=>(_(),$("div",{key:`webui-${C}`,class:"version-row"},[s("div",Ll,[s("strong",null,y(C),1),I(C)?.active||C===u.value?.webui.activeVersion?(_(),ke(p(Gt),{key:0,size:"small",type:"success",bordered:!1},{default:W(()=>[Te(y(p(r)("runtimeVersions.active")),1)]),_:1})):I(C)?(_(),ke(p(Gt),{key:1,size:"small",bordered:!1},{default:W(()=>[Te(y(p(r)("runtimeVersions.installed")),1)]),_:1})):le("",!0),q("webui",C)?(_(),ke(p(Gt),{key:2,size:"small",type:G(q("webui",C).status),bordered:!1},{default:W(()=>[Te(y(E(q("webui",C))),1)]),_:2},1032,["type"])):le("",!0)]),s("div",Ul,[I(C)&&!I(C)?.active&&C!==u.value?.webui.activeVersion?(_(),ke(p(je),{key:0,size:"small",secondary:"",loading:H.value[`activate-webui-${C}`],onClick:x=>be(C)},{default:W(()=>[Te(y(p(r)("runtimeVersions.useVersion")),1)]),_:1},8,["loading","onClick"])):le("",!0),I(C)&&!I(C)?.active&&C!==u.value?.webui.activeVersion?(_(),ke(p(ni),{key:1,onPositiveClick:x=>ie(C)},{trigger:W(()=>[se(p(je),{size:"small",type:"error",secondary:"",loading:H.value[`delete-webui-${C}`]},{default:W(()=>[Te(y(p(r)("runtimeVersions.deleteVersion")),1)]),_:1},8,["loading"])]),default:W(()=>[Te(" "+y(p(r)("runtimeVersions.deleteWebUiConfirm",{version:C})),1)]),_:2},1032,["onPositiveClick"])):le("",!0),!I(C)&&C!==u.value?.webui.activeVersion?(_(),ke(p(je),{key:2,size:"small",type:"primary",secondary:"",disabled:!!q("webui",C),loading:H.value[`download-webui-github-${C}`],onClick:x=>Ke(C,"github")},{default:W(()=>[Te(y(p(r)("runtimeVersions.downloadGithub")),1)]),_:1},8,["disabled","loading","onClick"])):le("",!0),!I(C)&&C!==u.value?.webui.activeVersion?(_(),ke(p(je),{key:3,size:"small",type:"primary",secondary:"",disabled:!!q("webui",C),loading:H.value[`download-webui-cf-${C}`],onClick:x=>Ke(C,"cf")},{default:W(()=>[Te(y(p(r)("runtimeVersions.downloadCf")),1)]),_:1},8,["disabled","loading","onClick"])):le("",!0)])]))),128)),j.value.length===0?(_(),$("div",Nl,y(p(r)("runtimeVersions.noVersions")),1)):le("",!0)])]),h.value.length>0?(_(),$("section",ql,[s("div",zl,[s("h3",null,y(p(r)("runtimeVersions.downloadTasks")),1)]),s("div",Bl,[(_(!0),$(xt,null,_t(h.value.slice(0,6),C=>(_(),$("div",{key:C.id,class:"job-row"},[s("div",Ol,[s("span",null,y(C.kind==="runtime"?p(r)("runtimeVersions.runtimeTitle"):p(r)("runtimeVersions.webUiTitle"))+" "+y(C.version)+" · "+y(J(C.source)),1),C.status==="running"||C.status==="queued"?(_(),$("div",Wl,[se(p(tr),{type:"line",percentage:Math.round(C.percent||0),"show-indicator":typeof C.percent=="number",processing:C.status==="running"&&C.stage==="download"},null,8,["percentage","show-indicator","processing"]),s("small",null,y(F(C)),1)])):le("",!0),C.error?(_(),$("small",Kl,y(C.error),1)):le("",!0)]),se(p(Gt),{size:"small",type:G(C.status),bordered:!1},{default:W(()=>[Te(y(E(C)),1)]),_:2},1032,["type"])]))),128))])])):le("",!0)])]),_:1},8,["show"])]),_:1},8,["title"])]),_:1},8,["show"]))}});ht();var Gl=vt(Vl,[["__scopeId","data-v-5c70f9fa"]]),jl=[{version:"0.6.25",date:"2026-07-03",changes:["changelog.new_0_6_25_1"]},{version:"0.6.24",date:"2026-07-03",changes:["changelog.new_0_6_24_1","changelog.new_0_6_24_2","changelog.new_0_6_24_3","changelog.new_0_6_24_4","changelog.new_0_6_24_5","changelog.new_0_6_24_6"]},{version:"0.6.23",date:"2026-07-01",changes:["changelog.new_0_6_23_1","changelog.new_0_6_23_2","changelog.new_0_6_23_3","changelog.new_0_6_23_4","changelog.new_0_6_23_5","changelog.new_0_6_23_6"]},{version:"0.6.22",date:"2026-06-29",changes:["changelog.new_0_6_22_1","changelog.new_0_6_22_2","changelog.new_0_6_22_3","changelog.new_0_6_22_4","changelog.new_0_6_22_5"]},{version:"0.6.21",date:"2026-06-25",changes:["changelog.new_0_6_21_1","changelog.new_0_6_21_2","changelog.new_0_6_21_3","changelog.new_0_6_21_4","changelog.new_0_6_21_5","changelog.new_0_6_21_6","changelog.new_0_6_21_7"]},{version:"0.6.20",date:"2026-06-24",changes:["changelog.new_0_6_20_1","changelog.new_0_6_20_2","changelog.new_0_6_20_3","changelog.new_0_6_20_4","changelog.new_0_6_20_5","changelog.new_0_6_20_6"]},{version:"0.6.19",date:"2026-06-23",changes:["changelog.new_0_6_19_1","changelog.new_0_6_19_2","changelog.new_0_6_19_3","changelog.new_0_6_19_4","changelog.new_0_6_19_5","changelog.new_0_6_19_6"]},{version:"0.6.18",date:"2026-06-20",changes:["changelog.new_0_6_18_2","changelog.new_0_6_18_3","changelog.new_0_6_18_4","changelog.new_0_6_18_5","changelog.new_0_6_18_6","changelog.new_0_6_18_7"]},{version:"0.6.17",date:"2026-06-17",changes:["changelog.new_0_6_17_1"]},{version:"0.6.16",date:"2026-06-17",changes:["changelog.new_0_6_16_1","changelog.new_0_6_16_2","changelog.new_0_6_16_3","changelog.new_0_6_16_4","changelog.new_0_6_16_5","changelog.new_0_6_16_6","changelog.new_0_6_16_7","changelog.new_0_6_16_8","changelog.new_0_6_16_9","changelog.new_0_6_16_10"]},{version:"0.6.15",date:"2026-06-14",changes:["changelog.new_0_6_15_1","changelog.new_0_6_15_2","changelog.new_0_6_15_3","changelog.new_0_6_15_4","changelog.new_0_6_15_5","changelog.new_0_6_15_6","changelog.new_0_6_15_7","changelog.new_0_6_15_8","changelog.new_0_6_15_9","changelog.new_0_6_15_10"]}];Oe();gt();Mt();Ho();rt();var $l={class:"sidebar-nav"},Jl={class:"nav-group"},Ql={class:"nav-group-items"},Yl={class:"nav-group"},Xl={class:"nav-group-items"},Zl={class:"nav-group"},ed={class:"nav-group-items"},td={class:"nav-group"},od={class:"nav-group-items"},ad={class:"sidebar-footer"},id=["title"],nd={class:"status-row"},rd={class:"status-text"},sd={class:"version-info"},ld=["onKeydown"],dd={class:"sidebar-top-actions"},cd=["title"],ud={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},pd={key:0,points:"9 18 15 12 9 6"},md={key:1,points:"15 18 9 12 15 6"},gd={class:"changelog-list"},hd={class:"changelog-version-header"},vd={class:"changelog-version-tag"},fd={class:"changelog-date"},bd={class:"changelog-changes"},wd=nt({__name:"AppSidebar",setup(e){const{t}=St(),a=Ro(),n=la(),r=da(),c=Jt(),u=ee(()=>n.name),h=ee(()=>cr()),S=ee(()=>dr()),H=ee(()=>window.hermesDesktop?.isDesktop===!0),f=w(!1),P=w(!1);function V(me){return r.hasRoute(me)}const{record:L,persist:j}=zr("hermes.sidebar.collapsedGroups");function z(me){return t(`sidebar.group${me}${c.sidebarCollapsed?"Short":""}`)}function ue(me){L[me]=!L[me],j()}function ne(me){return!!L[me]}function T(me){(me.target instanceof Element?me.target:null)?.closest(".route-link-item")&&typeof window<"u"&&window.matchMedia("(max-width: 768px)").matches&&c.closeSidebar()}async function R(){await c.doUpdate()?a.success(t("sidebar.updateSuccess"),{duration:5e3}):a.error(t("sidebar.updateFailed"))}function B(){c.reloadClient()}function ae(){localStorage.clear(),window.location.reload()}function ge(){f.value=!0}function Ie(){P.value=!0}return(me,I)=>(_(),$("aside",{class:Ze(["sidebar",{open:p(c).sidebarOpen,collapsed:p(c).sidebarCollapsed}]),onClick:T},[s("nav",$l,[s("div",Jl,[s("div",{class:"nav-group-label",onClick:I[0]||(I[0]=q=>ue("agent"))},[s("span",null,y(z("Agent")),1),(_(),$("svg",{class:Ze(["nav-group-arrow",{collapsed:ne("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...I[7]||(I[7]=[s("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),lo(s("div",Ql,[se(Xe,{class:"nav-item",to:{name:"hermes.jobs"},active:u.value==="hermes.jobs"},{default:W(()=>[I[8]||(I[8]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),s("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),s("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),s("line",{x1:"3",y1:"10",x2:"21",y2:"10"})],-1)),s("span",null,y(p(t)("sidebar.jobs")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.kanban"},active:u.value==="hermes.kanban"},{default:W(()=>[I[9]||(I[9]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),s("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),s("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),s("span",null,y(p(t)("sidebar.kanban")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.channels"},active:u.value==="hermes.channels"},{default:W(()=>[I[10]||(I[10]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),s("span",null,y(p(t)("sidebar.channels")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.skills"},active:u.value==="hermes.skills"},{default:W(()=>[I[11]||(I[11]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),s("polyline",{points:"2 17 12 22 22 17"}),s("polyline",{points:"2 12 12 17 22 12"})],-1)),s("span",null,y(p(t)("sidebar.skills")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.plugins"},active:u.value==="hermes.plugins"},{default:W(()=>[I[12]||(I[12]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l2.1-2.1a4 4 0 0 1-5.3 5.3l-7.8 7.8a2.1 2.1 0 0 1-3-3l7.8-7.8a4 4 0 0 1 5.3-5.3l-2.1 2.1z"}),s("path",{d:"M5 19l1-1"})],-1)),s("span",null,y(p(t)("sidebar.plugins")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.mcp"},active:u.value==="hermes.mcp"},{default:W(()=>[I[13]||(I[13]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M4 7V4h16v3"}),s("path",{d:"M9 20h6"}),s("path",{d:"M12 7v13"}),s("rect",{x:"4",y:"7",width:"16",height:"7",rx:"2"})],-1)),s("span",null,y(p(t)("sidebar.mcp")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.petdex"},active:u.value==="hermes.petdex"},{default:W(()=>[I[14]||(I[14]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M12 3l7 4v6c0 4-3 7-7 8-4-1-7-4-7-8V7l7-4z"}),s("path",{d:"M9 11h.01"}),s("path",{d:"M15 11h.01"}),s("path",{d:"M9.5 15c1.6 1.1 3.4 1.1 5 0"})],-1)),s("span",null,y(p(t)("sidebar.petdex")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.memory"},active:u.value==="hermes.memory"},{default:W(()=>[I[15]||(I[15]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M9 18h6"}),s("path",{d:"M10 22h4"}),s("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),s("span",null,y(p(t)("sidebar.memory")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.models"},active:u.value==="hermes.models"},{default:W(()=>[I[16]||(I[16]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("circle",{cx:"12",cy:"12",r:"3"}),s("path",{d:"M12 1v4"}),s("path",{d:"M12 19v4"}),s("path",{d:"M1 12h4"}),s("path",{d:"M19 12h4"}),s("path",{d:"M4.22 4.22l2.83 2.83"}),s("path",{d:"M16.95 16.95l2.83 2.83"}),s("path",{d:"M4.22 19.78l2.83-2.83"}),s("path",{d:"M16.95 7.05l2.83-2.83"})],-1)),s("span",null,y(p(t)("sidebar.models")),1)]),_:1},8,["active"])],512),[[so,!ne("agent")]])]),s("div",Yl,[s("div",{class:"nav-group-label",onClick:I[1]||(I[1]=q=>ue("monitoring"))},[s("span",null,y(z("Monitoring")),1),(_(),$("svg",{class:Ze(["nav-group-arrow",{collapsed:ne("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...I[17]||(I[17]=[s("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),lo(s("div",Xl,[se(Xe,{class:"nav-item",to:{name:"hermes.logs"},active:u.value==="hermes.logs"},{default:W(()=>[I[18]||(I[18]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),s("polyline",{points:"14 2 14 8 20 8"}),s("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),s("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),s("polyline",{points:"10 9 9 9 8 9"})],-1)),s("span",null,y(p(t)("sidebar.logs")),1)]),_:1},8,["active"]),se(Xe,{class:"nav-item",to:{name:"hermes.usage"},active:u.value==="hermes.usage"},{default:W(()=>[I[19]||(I[19]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),s("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),s("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),s("span",null,y(p(t)("sidebar.usage")),1)]),_:1},8,["active"]),h.value?(_(),ke(Xe,{key:0,class:"nav-item",to:{name:"hermes.performance"},active:u.value==="hermes.performance"},{default:W(()=>[I[20]||(I[20]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),s("span",null,y(p(t)("sidebar.performance")),1)]),_:1},8,["active"])):le("",!0),se(Xe,{class:"nav-item",to:{name:"hermes.skillsUsage"},active:u.value==="hermes.skillsUsage"},{default:W(()=>[I[21]||(I[21]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M21.21 15.89A10 10 0 1 1 8.11 2.79"}),s("path",{d:"M22 12A10 10 0 0 0 12 2v10z"})],-1)),s("span",null,y(p(t)("sidebar.skillsUsage")),1)]),_:1},8,["active"])],512),[[so,!ne("monitoring")]])]),s("div",Zl,[s("div",{class:"nav-group-label",onClick:I[2]||(I[2]=q=>ue("tools"))},[s("span",null,y(z("Tools")),1),(_(),$("svg",{class:Ze(["nav-group-arrow",{collapsed:ne("tools")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...I[22]||(I[22]=[s("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),lo(s("div",ed,[V("hermes.codingAgents")?(_(),ke(Xe,{key:0,class:"nav-item",to:{name:"hermes.codingAgents"},active:u.value==="hermes.codingAgents"},{default:W(()=>[I[23]||(I[23]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("polyline",{points:"16 18 22 12 16 6"}),s("polyline",{points:"8 6 2 12 8 18"}),s("line",{x1:"12",y1:"20",x2:"14",y2:"4"})],-1)),s("span",null,y(p(t)("sidebar.codingAgents")),1)]),_:1},8,["active"])):le("",!0),V("hermes.versionPreview")&&h.value?(_(),ke(Xe,{key:1,class:"nav-item",to:{name:"hermes.versionPreview"},active:u.value==="hermes.versionPreview"},{default:W(()=>[I[24]||(I[24]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"}),s("polyline",{points:"7.5 4.21 12 6.81 16.5 4.21"}),s("polyline",{points:"7.5 19.79 7.5 14.6 3 12"}),s("polyline",{points:"21 12 16.5 14.6 16.5 19.79"}),s("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"}),s("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"})],-1)),s("span",null,y(p(t)("sidebar.versionPreview")),1)]),_:1},8,["active"])):le("",!0),h.value?(_(),ke(Xe,{key:2,class:"nav-item",to:{name:"hermes.devices"},active:u.value==="hermes.devices"},{default:W(()=>[I[25]||(I[25]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),s("path",{d:"M8 20h8"}),s("path",{d:"M12 16v4"}),s("path",{d:"M6 8h.01"}),s("path",{d:"M10 8h.01"})],-1)),s("span",null,y(p(t)("sidebar.devices")),1)]),_:1},8,["active"])):le("",!0)],512),[[so,!ne("tools")]])]),s("div",td,[s("div",{class:"nav-group-label",onClick:I[3]||(I[3]=q=>ue("system"))},[s("span",null,y(z("System")),1),(_(),$("svg",{class:Ze(["nav-group-arrow",{collapsed:ne("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...I[26]||(I[26]=[s("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),lo(s("div",od,[h.value?(_(),ke(Xe,{key:0,class:"nav-item",to:{name:"hermes.profiles"},active:u.value==="hermes.profiles"},{default:W(()=>[I[27]||(I[27]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),s("circle",{cx:"12",cy:"7",r:"4"})],-1)),s("span",null,y(p(t)("sidebar.profiles")),1)]),_:1},8,["active"])):le("",!0),se(Xe,{class:"nav-item",to:{name:"hermes.settings"},active:u.value==="hermes.settings"},{default:W(()=>[I[28]||(I[28]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("circle",{cx:"12",cy:"12",r:"3"}),s("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"})],-1)),s("span",null,y(p(t)("sidebar.settings")),1)]),_:1},8,["active"])],512),[[so,!ne("system")]])])]),se(ol),se(_s),s("div",ad,[s("button",{class:"nav-item logout-item",onClick:ae},[I[29]||(I[29]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[s("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),s("polyline",{points:"16 17 21 12 16 7"}),s("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),s("span",null,y(p(t)("sidebar.logout")),1),S.value?(_(),$("span",{key:0,class:"logout-username",title:S.value},y(S.value),9,id)):le("",!0)]),s("div",nd,[s("div",{class:Ze(["status-indicator",{connected:p(c).connected,disconnected:!p(c).connected}])},[I[30]||(I[30]=s("span",{class:"status-dot"},null,-1)),s("span",rd,y(p(c).connected?p(t)("sidebar.connected"):p(t)("sidebar.disconnected")),1)],2),se(il)]),s("div",sd,[I[31]||(I[31]=qi('<div class="version-links" data-v-3d42b32c><a class="sidebar-footer-link" href="https://github.com/EKKOLearnAI/hermes-studio" target="_blank" rel="noopener noreferrer" title="GitHub" data-v-3d42b32c><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" data-v-3d42b32c><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" data-v-3d42b32c></path></svg></a><a class="sidebar-footer-link" href="https://hermes-studio.ai/" target="_blank" rel="noopener noreferrer" title="Website" data-v-3d42b32c><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-3d42b32c><circle cx="12" cy="12" r="10" data-v-3d42b32c></circle><line x1="2" y1="12" x2="22" y2="12" data-v-3d42b32c></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" data-v-3d42b32c></path></svg></a></div>',1)),s("span",{class:"version-text",role:"button",tabindex:"0",onClick:ge,onKeydown:[Fa(ge,["enter"]),Fa(tt(ge,["prevent"]),["space"])]}," Studio v"+y(p(c).serverVersion||"0.1.0"),41,ld),se(ml)]),H.value?(_(),ke(p(je),{key:0,type:"primary",size:"tiny",block:"",class:"update-btn",onClick:Ie},{default:W(()=>[Te(y(p(t)("sidebar.versionManagement")),1)]),_:1})):le("",!0),p(c).clientOutdated?(_(),ke(p(je),{key:1,type:"warning",size:"tiny",block:"",class:"update-btn",onClick:B},{default:W(()=>[Te(y(p(t)("sidebar.reloadClientVersion",{version:p(c).serverVersion})),1)]),_:1})):le("",!0),p(c).updateAvailable?(_(),ke(p(je),{key:2,type:"primary",size:"tiny",block:"",class:"update-btn",loading:p(c).updating,onClick:R},{default:W(()=>[Te(y(p(c).updating?p(t)("sidebar.updating"):p(t)("sidebar.updateVersion",{version:p(c).latestVersion})),1)]),_:1},8,["loading"])):le("",!0)]),s("div",dd,[se(Xe,{class:"nav-item sidebar-return-tab",to:{name:"hermes.chat"},title:p(t)("sidebar.backToChat")},{default:W(()=>[I[32]||(I[32]=s("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.7","stroke-linecap":"round","stroke-linejoin":"round"},[s("polyline",{points:"15 18 9 12 15 6"}),s("line",{x1:"9",y1:"12",x2:"21",y2:"12"})],-1)),s("span",null,y(p(t)("sidebar.backToChat")),1)]),_:1},8,["title"]),s("button",{class:"collapse-btn",onClick:I[4]||(I[4]=q=>p(c).toggleSidebarCollapsed()),title:p(c).sidebarCollapsed?p(t)("sidebar.expand"):p(t)("sidebar.collapse")},[(_(),$("svg",ud,[p(c).sidebarCollapsed?(_(),$("polyline",pd)):(_(),$("polyline",md))]))],8,cd)]),se(p(mo),{show:f.value,"onUpdate:show":I[5]||(I[5]=q=>f.value=q),preset:"dialog",title:p(t)("sidebar.changelog"),style:{width:"520px"}},{default:W(()=>[s("div",gd,[(_(!0),$(xt,null,_t(p(jl),q=>(_(),$("div",{key:q.version,class:"changelog-version-block"},[s("div",hd,[s("span",vd,"v"+y(q.version),1),s("span",fd,y(q.date),1)]),s("ul",bd,[(_(!0),$(xt,null,_t(q.changes,(G,E)=>(_(),$("li",{key:E},y(p(t)(G)),1))),128))])]))),128))])]),_:1},8,["show","title"]),H.value?(_(),ke(Gl,{key:0,show:P.value,"onUpdate:show":I[6]||(I[6]=q=>P.value=q)},null,8,["show"])):le("",!0)],2))}});ht();var yd=vt(wd,[["__scopeId","data-v-3d42b32c"]]);Oe();var Sd=["aria-label"],Ad={key:0,viewBox:"0 0 12 12","aria-hidden":"true"},kd={key:1,viewBox:"0 0 12 12","aria-hidden":"true"},Pd=nt({__name:"DesktopTitleBar",setup(e){const t=window.hermesDesktop,a=t?.platform,n=ee(()=>a==="darwin"),r=ee(()=>a==="darwin"||a==="win32"),c=ee(()=>a==="win32"),u=w(!1);async function h(){if(t?.getWindowState)try{u.value=!!(await t.getWindowState()).isMaximized}catch{}}async function S(H){if(t?.windowControl)try{u.value=!!(await t.windowControl(H)).isMaximized}catch{}}return go(()=>{h()}),(H,f)=>r.value?(_(),$("header",{key:0,class:Ze(["desktop-titlebar",{mac:n.value}]),onDblclick:f[4]||(f[4]=P=>S("toggle-maximize"))},[f[9]||(f[9]=s("div",{class:"desktop-titlebar__drag"},[s("div",{class:"desktop-titlebar__brand"},[s("img",{class:"desktop-titlebar__logo",src:"/logo.png",alt:"",draggable:"false"}),s("span",{class:"desktop-titlebar__title"},"Hermes Studio")])],-1)),c.value?(_(),$("div",{key:0,class:"desktop-titlebar__controls",onDblclick:f[3]||(f[3]=tt(()=>{},["stop"]))},[s("button",{class:"desktop-window-btn",type:"button","aria-label":"Minimize",onClick:f[0]||(f[0]=tt(P=>S("minimize"),["stop"]))},[...f[5]||(f[5]=[s("svg",{viewBox:"0 0 12 12","aria-hidden":"true"},[s("path",{d:"M2 6.5h8"})],-1)])]),s("button",{class:"desktop-window-btn",type:"button","aria-label":u.value?"Restore":"Maximize",onClick:f[1]||(f[1]=tt(P=>S("toggle-maximize"),["stop"]))},[u.value?(_(),$("svg",Ad,[...f[6]||(f[6]=[s("path",{d:"M4 3.5h5v5H4z"},null,-1),s("path",{d:"M3 7.5H2.5v-5h5V3"},null,-1)])])):(_(),$("svg",kd,[...f[7]||(f[7]=[s("path",{d:"M2.5 2.5h7v7h-7z"},null,-1)])]))],8,Sd),s("button",{class:"desktop-window-btn close",type:"button","aria-label":"Close",onClick:f[2]||(f[2]=tt(P=>S("close"),["stop"]))},[...f[8]||(f[8]=[s("svg",{viewBox:"0 0 12 12","aria-hidden":"true"},[s("path",{d:"M3 3l6 6M9 3L3 9"})],-1)])])],32)):le("",!0)],34)):le("",!0)}});ht();var Td=vt(Pd,[["__scopeId","data-v-5d923641"]]);function Cd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onMessageDelta&&a.onMessageDelta(e)}function hi(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onReasoningDelta&&a.onReasoningDelta(e)}function _d(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onThinkingDelta&&a.onThinkingDelta(e)}function xd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onReasoningAvailable&&a.onReasoningAvailable(e)}function Md(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onToolStarted&&a.onToolStarted(e)}function Rd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onToolCompleted&&a.onToolCompleted(e)}function Hd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onWorkspaceDiffCompleted&&a.onWorkspaceDiffCompleted(e)}function Bo(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onSubagentEvent&&a.onSubagentEvent(e)}function Id(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onRunStarted&&a.onRunStarted(e)}function Fd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onRunCompleted&&a.onRunCompleted(e),!(e.queue_remaining>0)&&Se.delete(t)}function Dd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onRunFailed&&a.onRunFailed(e),!(e.queue_remaining>0)&&Se.delete(t)}function Ed(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onRunQueued&&a.onRunQueued(e)}function Ld(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onCompressionStarted&&a.onCompressionStarted(e)}function Ud(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onCompressionCompleted&&a.onCompressionCompleted(e)}function Nd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onAbortStarted&&a.onAbortStarted(e)}function qd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onAbortTimeout&&a.onAbortTimeout(e)}function zd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onAbortCompleted&&a.onAbortCompleted(e),!(e.queue_length>0)&&Se.delete(t)}function Bd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onUsageUpdated&&a.onUsageUpdated(e)}function Od(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onSessionCommand&&a.onSessionCommand(e);for(const n of ta)n(e)}function Wd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a&&a.onSessionTitleUpdated?.(e);for(const n of oa)n(e)}function vi(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onAgentEvent&&a.onAgentEvent(e)}function Kd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onAgentEvent&&a.onAgentEvent(e)}function Vd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onApprovalRequested&&a.onApprovalRequested(e)}function Gd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onApprovalResolved&&a.onApprovalResolved(e)}function jd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onPeerUserMessage&&a.onPeerUserMessage(e);for(const n of ea)n(e)}function $d(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onClarifyRequested&&a.onClarifyRequested(e)}function Jd(e){const t=e.session_id;if(!t)return;const a=Se.get(t);a?.onClarifyResolved&&a.onClarifyResolved(e)}function Qd(e,t){return Se.set(e,t),()=>{Se.delete(e)}}function Yd(e){Se.delete(e)}function Xd(e){return ea.add(e),()=>{ea.delete(e)}}function Zd(e){return ta.add(e),()=>{ta.delete(e)}}function ec(e){return oa.add(e),()=>{oa.delete(e)}}function tc(e,t,a,n="chat-run"){ca(null,n).emit("clarify.respond",{session_id:e,clarify_id:t,response:a})}function oc(e,t,a,n="chat-run"){ca(null,n).emit("approval.respond",{session_id:e,approval_id:t,choice:a})}function xa(e){return e&&Zo!==e?null:fe}function ca(e,t="chat-run"){const a=e?.trim()||null;if(fe?.connected&&Zo===t&&(!a||Go===a))return fe;fe&&(fe.removeAllListeners(),fe.disconnect(),Vo=!1,Go=null);const n=fo(),r=Yt();let c=a||"default";try{if(!a){const{useProfilesStore:u}=(Io(),Gn(os));c=u().activeProfileName||"default"}}catch{c=a||localStorage.getItem("hermes_active_profile_name")||"default"}return Go=c,Zo=t,fe=Ki(`${n}${t==="global-agent"?"/global-agent":"/chat-run"}`,{auth:{token:r},query:{profile:c},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),Vo||(fe.on("message.delta",Cd),fe.on("reasoning.delta",hi),fe.on("thinking.delta",_d),fe.on("reasoning.available",xd),fe.on("moa.reference",hi),fe.on("moa.aggregating",vi),fe.on("tool.started",Md),fe.on("tool.completed",Rd),fe.on("workspace.diff.completed",Hd),fe.on("subagent.start",Bo),fe.on("subagent.tool",Bo),fe.on("subagent.progress",Bo),fe.on("subagent.complete",Bo),fe.on("run.started",Id),fe.on("run.failed",Dd),fe.on("run.completed",Fd),fe.on("run.queued",Ed),fe.on("approval.requested",Vd),fe.on("approval.resolved",Gd),fe.on("run.peer_user_message",jd),fe.on("clarify.requested",$d),fe.on("clarify.resolved",Jd),fe.on("compression.started",Ld),fe.on("compression.completed",Ud),fe.on("abort.started",Nd),fe.on("abort.timeout",qd),fe.on("abort.completed",zd),fe.on("usage.updated",Bd),fe.on("agent.event",vi),fe.on("run.reattach_failed",Kd),fe.on("session.command",Od),fe.on("session.title.updated",Wd),Vo=!0),fe}function To(e,t,a){const n=e;if(typeof n.off=="function"){n.off(t,a);return}n.removeListener?.(t,a)}function fi(e,t,a,n="chat-run"){const r=ca(a,n),c=u=>{u?.session_id===e&&(To(r,"resumed",c),t(u))};return r.on("resumed",c),r.emit("resume",{session_id:e,...a?{profile:a}:{}}),r}function ac(e,t,a,n,r,c){const u=e.session_id;if(!u)throw new Error("session_id is required for startRunViaSocket");let h=!1;const S=ca(e.profile,c?.transport);if(Se.has(u))return S.emit("run",e),{abort:()=>{h||S.emit("abort",{session_id:u})}};let H=!1,f=()=>{},P=null;const V=()=>{P&&(To(S,"resumed",P),P=null)},L=()=>{V(),c?.onReconnectResume&&(P=T=>{V(),!(h||T.session_id!==u)&&c.onReconnectResume?.(T)},S.on("resumed",P)),S.emit("resume",{session_id:u,...e.profile?{profile:e.profile}:{}})},j=T=>{h||(h=!0,f(),Se.delete(u),n(T))},z=T=>{h||H||j(T)};S.on("connect_error",z);const ue=T=>{if(!(h||T==="io client disconnect")){if(an.has(T)){H=!0;return}j(new Error(`Socket disconnected: ${T}`))}};S.on("disconnect",ue);const ne=()=>{h||!H||(H=!1,L())};return S.on("connect",ne),f=()=>{V(),To(S,"connect_error",z),To(S,"disconnect",ue),To(S,"connect",ne)},Se.set(u,{onMessageDelta:T=>{h||t(T)},onReasoningDelta:T=>{h||t(T)},onThinkingDelta:T=>{h||t(T)},onReasoningAvailable:T=>{h||t(T)},onToolStarted:T=>{h||t(T)},onToolCompleted:T=>{h||t(T)},onWorkspaceDiffCompleted:T=>{h||t(T)},onSubagentEvent:T=>{h||t(T)},onRunStarted:T=>{h||(t(T),r?.(T.run_id||""))},onRunCompleted:T=>{h||(t(T),!(T.queue_remaining>0)&&(h=!0,f(),a()))},onRunFailed:T=>{h||(t(T),!(T.queue_remaining>0)&&(h=!0,f(),a()))},onCompressionStarted:T=>{h||t(T)},onCompressionCompleted:T=>{h||t(T)},onAbortStarted:T=>{h||t(T)},onAbortTimeout:T=>{h||t(T)},onAbortCompleted:T=>{h||(t(T),!(T.queue_length>0)&&(h=!0,f(),a()))},onUsageUpdated:T=>{h||t(T)},onAgentEvent:T=>{h||t(T)},onSessionCommand:T=>{h||(t(T),T.terminal!==!1&&(h=!0,f(),Se.delete(u),a()))},onSessionTitleUpdated:T=>{t(T)},onRunQueued:T=>{h||t(T)},onApprovalRequested:T=>{h||t(T)},onApprovalResolved:T=>{h||t(T)},onClarifyRequested:T=>{h||t(T)},onClarifyResolved:T=>{h||t(T)}}),S.emit("run",e),{abort:()=>{h||S.emit("abort",{session_id:u})}}}var fe,Vo,Go,Zo,an,Se,ea,ta,oa,ic=Re((()=>{Vi(),rt(),fe=null,Vo=!1,Go=null,Zo="chat-run",an=new Set(["transport close","transport error","ping timeout"]),Se=new Map,ea=new Set,ta=new Set,oa=new Set}));async function _o(e,t,a){const n=new URLSearchParams;e&&n.set("source",e),t&&n.set("limit",String(t)),a&&n.set("profile",a);const r=n.toString();return(await K(`/api/hermes/sessions${r?`?${r}`:""}`)).sessions}async function nc(e){try{const t=await K(`/api/hermes/sessions/${encodeURIComponent(e)}/workspace-run-changes`);return Array.isArray(t.changes)?t.changes:[]}catch{return[]}}async function rc(e,t,a){try{return(await K(`/api/hermes/sessions/${encodeURIComponent(e)}/workspace-run-changes/${encodeURIComponent(t)}/files/${encodeURIComponent(String(a))}`)).file}catch{return null}}async function xp(e,t){const a=new URLSearchParams({path:t});return K(`/api/hermes/sessions/${encodeURIComponent(e)}/workspace-file/read?${a}`)}async function Mp(e,t,a){await K(`/api/hermes/sessions/${encodeURIComponent(e)}/workspace-file/write`,{method:"PUT",body:JSON.stringify({path:t,content:a})})}async function Rp(e,t,a){const n=new URLSearchParams;e&&n.set("source",e),t&&n.set("limit",String(t)),a&&n.set("profile",a);const r=n.toString();return(await K(`/api/hermes/sessions/hermes${r?`?${r}`:""}`)).sessions}async function bi(e,t,a,n){const r=new URLSearchParams;return r.set("q",e),t&&r.set("source",t),a&&r.set("limit",String(a)),n&&r.set("profile",n),(await K(`/api/hermes/search/sessions?${r.toString()}`)).results}async function Hp(e,t){try{const a=new URLSearchParams;t&&a.set("profile",t);const n=a.toString();return(await K(`/api/hermes/sessions/${e}${n?`?${n}`:""}`)).session}catch{return null}}async function wi(e,t,a=150,n){try{const r=new URLSearchParams;return r.set("offset",String(t)),r.set("limit",String(a)),n&&r.set("profile",n),await K(`/api/hermes/sessions/conversations/${encodeURIComponent(e)}/messages/paginated?${r}`)}catch{return null}}async function Ip(e,t){try{const a=new URLSearchParams;t&&a.set("profile",t);const n=a.toString();return(await K(`/api/hermes/sessions/hermes/${e}${n?`?${n}`:""}`)).session}catch{return null}}async function sc(e,t){try{const a=new URLSearchParams;t&&a.set("profile",t);const n=a.toString();return await K(`/api/hermes/sessions/${e}${n?`?${n}`:""}`,{method:"DELETE"}),!0}catch{return!1}}async function Fp(e,t){const a=new URLSearchParams;t&&a.set("profile",t);const n=a.toString();return K(`/api/hermes/sessions/hermes/${encodeURIComponent(e)}/import${n?`?${n}`:""}`,{method:"POST"})}async function Dp(e){try{const t=e.map(a=>typeof a=="string"?{id:a}:{id:a.id,profile:a.profile||void 0});return await K("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:t.map(a=>a.id),sessions:t})})}catch(t){throw t}}async function Ep(e,t){try{return await K(`/api/hermes/sessions/${e}/rename`,{method:"POST",body:JSON.stringify({title:t})}),!0}catch{return!1}}async function lc(e){try{return await K(`/api/hermes/sessions/${e}/archive`,{method:"POST"}),!0}catch{return!1}}async function Lp(e){try{return await K(`/api/hermes/sessions/${e}/unarchive`,{method:"POST"}),!0}catch{return!1}}async function Up(e,t){try{return await K(`/api/hermes/sessions/${e}/workspace`,{method:"POST",body:JSON.stringify({workspace:t||""})}),!0}catch{return!1}}async function dc(e,t,a,n){try{return await K(`/api/hermes/sessions/${e}/model`,{method:"POST",body:JSON.stringify({model:t,provider:a,apiMode:n})}),!0}catch{return!1}}async function Np(e,t="full",a="json"){const n=fo(),r=Yt(),c=`${n}/api/hermes/sessions/${e}/export?mode=${t}&ext=${a}&token=${encodeURIComponent(r)}`,u=await fetch(c);if(!u.ok)throw new Error("Export failed");const h=await u.blob(),S=u.headers.get("Content-Disposition")||"";let H=`session_${e}.${a}`;const f=S.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);f&&(H=decodeURIComponent(f[1].replace(/"/g,"")));const P=document.createElement("a");P.href=URL.createObjectURL(h),P.download=H,P.click(),URL.revokeObjectURL(P.href)}async function qp(e=30){const t=Number.isFinite(e)?Math.max(1,Math.floor(e)):30,a=new URLSearchParams;return a.set("days",String(t)),K(`/api/hermes/usage/stats?${a}`)}async function zp(e,t,a){const n=new URLSearchParams;e&&n.set("profile",e),t&&n.set("provider",t),a&&n.set("model",a);const r=n.toString();return(await K(`/api/hermes/sessions/context-length${r?`?${r}`:""}`)).context_length}var nn=Re((()=>{rt()}));function cc(e){return typeof e=="string"&&rn.includes(e)}function uc(e,t){const a=String(e||"").toLowerCase(),n=String(t||"").toLowerCase();return a.includes("claude")||a==="anthropic"||n.includes("anthropic")||n.includes("/anthropic")?"anthropic_messages":(a==="deepseek"||a==="lmstudio"||n.includes("deepseek")||n.includes("127.0.0.1")||n.includes("localhost"),"chat_completions")}function pc(e,t="codex_responses"){return cc(e)?e:t}async function Bp(){return K("/api/coding-agents")}async function Op(e){return K(`/api/coding-agents/${e}/install`,{method:"POST"})}async function Wp(e){return K(`/api/coding-agents/${e}`,{method:"DELETE"})}async function Kp(e,t,a={}){const n=new URLSearchParams;a.profile&&n.set("profile",a.profile),a.provider&&n.set("provider",a.provider);const r=n.toString();return K(`/api/coding-agents/${e}/config-files/${encodeURIComponent(t)}${r?`?${r}`:""}`)}async function Vp(e,t,a,n={}){return K(`/api/coding-agents/${e}/config-files/${encodeURIComponent(t)}`,{method:"PUT",body:JSON.stringify({content:a,profile:n.profile,provider:n.provider})})}async function Gp(e,t){return K(`/api/coding-agents/${e}/launch/prepare`,{method:"POST",body:JSON.stringify(t)})}async function jp(e,t){return K(`/api/coding-agents/${e}/launch/native`,{method:"POST",body:JSON.stringify(t)})}var rn,mc=Re((()=>{rt(),rn=["chat_completions","codex_responses","anthropic_messages"]}));function yi(e){try{return decodeURIComponent(e)}catch{return e}}function gc(e){return(typeof e=="string"?e.trim():"")||null}function ja(e,t,a){const n=fo();if(e.startsWith("/api/hermes/download?"))try{const H=new URL(e,"http://localhost").searchParams.get("path");H&&(e=H)}catch{}const r=yi(e),c=new URLSearchParams({path:r});if(t){const H=yi(t);c.set("name",H)}const u=gc(a),h=a===void 0?Ga():u;h&&c.set("profile",h);const S=Yt();return S&&c.set("token",S),`${n}/api/hermes/download?${c.toString()}`}async function $p(e,t,a){const n=ja(e,t,a),r=await fetch(n);if(!r.ok){const S=await r.json().catch(()=>({error:`HTTP ${r.status}`}));throw new Error(S.error||`Download failed: ${r.status}`)}const c=await r.blob(),u=URL.createObjectURL(c),h=document.createElement("a");h.href=u,h.download=t||e.split("/").pop()||"download",document.body.appendChild(h),h.click(),document.body.removeChild(h),URL.revokeObjectURL(u)}async function Jp(e,t,a){const n=ja(e,t,a),r=await fetch(n);if(!r.ok){const c=await r.json().catch(()=>({error:`HTTP ${r.status}`}));throw new Error(c.error||`Preview failed: ${r.status}`)}return r.text()}var hc=Re((()=>{rt()}));async function vc(e){return K(`/api/hermes/config${e?`?sections=${e.join(",")}`:""}`)}async function fc(e,t,a){await K("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:e,values:t,...a})})}async function Qp(){return K("/api/hermes/config/auxiliary-models")}async function Yp(e){return K("/api/hermes/config/auxiliary-models",{method:"PUT",body:JSON.stringify({auxiliary:e})})}async function Xp(){return K("/api/hermes/config/moa")}async function Zp(e){return K("/api/hermes/config/moa",{method:"PUT",body:JSON.stringify({moa:e})})}async function em(e,t){await K("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:e,values:t})})}async function tm(){return K("/api/hermes/weixin/qrcode")}async function om(e){return K(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(e)}`)}async function am(e){await K("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(e)})}var bc=Re((()=>{rt()}));function Si(e){if(!Array.isArray(e))return[];const t=new Set,a=[];for(const n of e){const r=String(n||"").trim();!r||t.has(r)||(t.add(r),a.push(r))}return a}function Ai(e,t){const a={...e};return"enabled"in t&&(typeof t.enabled=="boolean"?a.enabled=t.enabled:delete a.enabled),"include"in t&&(Array.isArray(t.include)?a.include=Si(t.include):delete a.include),"exclude"in t&&(Array.isArray(t.exclude)?a.exclude=Si(t.exclude):delete a.exclude),"management"in t&&(t.management==="auto"||t.management==="per_profile"||t.management==="unified"?a.management=t.management:delete a.management),a}var jo,wc=Re((()=>{Qt(),Oe(),bc(),jo=ho("settings",()=>{const e=w(!1),t=w(!1),a=w({}),n=w({}),r=w({}),c=w({}),u=w({}),h=w({}),S=w({}),H=w({}),f=w({}),P=w({}),V=w({}),L=w({}),j=w({}),z=w({}),ue=w({}),ne=w({}),T=w({}),R=w({}),B=w({}),ae=w({}),ge=w({});async function Ie(){e.value=!0;try{const q=await vc();a.value=q.display||{},n.value=q.agent||{},r.value=q.memory||{},c.value=q.skills||{},u.value=q.compression||{},h.value=q.session_reset||{},S.value=q.privacy||{},H.value=q.approvals||{},f.value=q.gatewayAutoStart||{},P.value=q.proxy||{},V.value=q.telegram||{},L.value=q.discord||{},j.value=q.slack||{},z.value=q.whatsapp||{},ue.value=q.matrix||{},ne.value=q.wecom||{},T.value=q.feishu||{},R.value=q.dingtalk||{},B.value=q.qqbot||{},ae.value=q.weixin||{},ge.value=q.platforms||{}}catch(q){console.error("Failed to fetch settings:",q)}finally{e.value=!1}}function me(q,G){switch(q){case"display":a.value={...a.value,...G};break;case"agent":n.value={...n.value,...G};break;case"memory":r.value={...r.value,...G};break;case"skills":c.value={...c.value,...G};break;case"compression":u.value={...u.value,...G};break;case"session_reset":h.value={...h.value,...G};break;case"privacy":S.value={...S.value,...G};break;case"approvals":H.value={...H.value,...G};break;case"gatewayAutoStart":f.value=Ai(f.value,G);break;case"proxy":P.value={...P.value,...G};break;case"telegram":V.value={...V.value,...G};break;case"discord":L.value={...L.value,...G};break;case"slack":j.value={...j.value,...G};break;case"whatsapp":z.value={...z.value,...G};break;case"matrix":ue.value={...ue.value,...G};break;case"wecom":ne.value={...ne.value,...G};break;case"feishu":T.value={...T.value,...G};break;case"dingtalk":R.value={...R.value,...G};break;case"qqbot":B.value={...B.value,...G};break;case"weixin":ae.value={...ae.value,...G};break;case"platforms":for(const[E,Q]of Object.entries(G))ge.value={...ge.value,[E]:{...ge.value[E]||{},...Q}};break}}async function I(q,G,E){t.value=!0;try{switch(await fc(q,G,E),q){case"display":a.value={...a.value,...G};break;case"agent":n.value={...n.value,...G};break;case"memory":r.value={...r.value,...G};break;case"skills":c.value={...c.value,...G};break;case"compression":u.value={...u.value,...G};break;case"session_reset":h.value={...h.value,...G};break;case"privacy":S.value={...S.value,...G};break;case"approvals":H.value={...H.value,...G};break;case"gatewayAutoStart":f.value=Ai(f.value,G);break;case"proxy":P.value={...P.value,...G};break;case"telegram":V.value={...V.value,...G};break;case"discord":L.value={...L.value,...G};break;case"slack":j.value={...j.value,...G};break;case"whatsapp":z.value={...z.value,...G};break;case"matrix":ue.value={...ue.value,...G};break;case"wechat":case"wecom":ne.value={...ne.value,...G};break;case"feishu":T.value={...T.value,...G};break;case"dingtalk":R.value={...R.value,...G};break;case"qqbot":B.value={...B.value,...G};break;case"weixin":ae.value={...ae.value,...G};break;case"platforms":for(const[Q,X]of Object.entries(G))ge.value={...ge.value,[Q]:{...ge.value[Q]||{},...X}};break}}finally{t.value=!1}}return{loading:e,saving:t,display:a,agent:n,memory:r,skills:c,compression:u,sessionReset:h,privacy:S,approvals:H,gatewayAutoStart:f,proxy:P,telegram:V,discord:L,slack:j,whatsapp:z,matrix:ue,wecom:ne,feishu:T,dingtalk:R,qqbot:B,weixin:ae,platforms:ge,fetchSettings:Ie,saveSection:I,updateLocal:me}})}));function sn(){if(typeof window>"u")return null;const e=window.AudioContext||window.webkitAudioContext;return e?($o||($o=new e),$o):null}function yc(){const e=sn();!e||e.state!=="suspended"||e.resume().catch(()=>{})}async function Sc(){const e=sn();if(!e)return!1;try{e.state==="suspended"&&await e.resume();const t=e.currentTime,a=.16,n=e.createOscillator(),r=e.createGain();return n.type="sine",n.frequency.setValueAtTime(880,t),n.frequency.exponentialRampToValueAtTime(660,t+a),r.gain.setValueAtTime(1e-4,t),r.gain.exponentialRampToValueAtTime(.18,t+.015),r.gain.exponentialRampToValueAtTime(1e-4,t+a),n.connect(r),r.connect(e.destination),n.start(t),n.stop(t+a),!0}catch(t){return console.warn("Failed to play completion sound:",t),!1}}var $o,Ac=Re((()=>{$o=null}));function Ea(e,t,a){return new Promise(n=>{const r=window.setTimeout(()=>n(a),t);e.then(c=>{window.clearTimeout(r),n(c)},()=>{window.clearTimeout(r),n(a)})})}function ln(){if(!(typeof window>"u"))return window.hermesDesktop}function dn(){return typeof window<"u"&&"Notification"in window}function cn(){return typeof window>"u"?!1:window.isSecureContext}function un(e){return{body:e.body,icon:e.icon?new URL(e.icon,window.location.origin).href:void 0,tag:e.tag}}async function kc(e){if(typeof navigator>"u"||!("serviceWorker"in navigator))return!1;try{const t=await Ea(navigator.serviceWorker.register("/notification-sw.js"),3e3,null);return t?(await Ea(navigator.serviceWorker.ready,3e3,t),await t.showNotification(e.title,un(e)),!0):!1}catch(t){return console.warn("Failed to show service worker notification:",t),!1}}function Pc(){return ln()?.isDesktop===!0}async function im(){if(Pc())return{granted:!0};if(!dn())return{granted:!1,reason:"unsupported"};if(!cn())return{granted:!1,reason:"insecure"};if(Notification.permission==="granted")return{granted:!0};if(Notification.permission==="denied")return{granted:!1,reason:"denied"};try{const e=await Ea(Notification.requestPermission(),5e3,"default");return e==="granted"?{granted:!0}:{granted:!1,reason:e==="denied"?"denied":"unsupported"}}catch{return{granted:!1,reason:"unsupported"}}}async function Tc(e){const t=ln();if(t?.isDesktop&&t.notifyCompletion)try{return await t.notifyCompletion(e)}catch(a){return console.warn("Failed to show desktop completion notification:",a),!1}if(!dn()||!cn()||Notification.permission!=="granted")return!1;try{if(await kc(e))return!0;const a=new Notification(e.title,un(e));return a.onclick=()=>{window.focus(),a.close()},!0}catch(a){return console.warn("Failed to show browser completion notification:",a),!1}}var Cc=Re((()=>{}));function La(e){const t=[];let a=e.replace(pn,n=>(t.push(n),`${aa}${t.length-1}${ia}`));return a=a.replace(mn,n=>(t.push(n),`${aa}${t.length-1}${ia}`)),{masked:a,blocks:t}}function Ma(e,t){if(t.length===0)return e;const a=new RegExp(`${aa}(\\d+)${ia}`,"g");let n=e;for(let r=0;r<t.length;r+=1){const c=n.replace(a,(u,h)=>t[Number(h)]??"");if(c===n)break;n=c}return n}function nm(e,t){const{masked:a,blocks:n}=La(e),r=[];let c=null,u="",h=0;Ua.lastIndex=0;let S;for(;(S=Ua.exec(a))!==null;)u+=a.slice(h,S.index),r.push(S[2]),h=S.index+S[0].length;const H=a.slice(h),f=H.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return f?(u+=H.slice(0,f.index),t.streaming?c=f[2]:u+=H.slice(f.index)):u+=H,{segments:r.map(P=>Ma(P,n)),pending:c===null?null:Ma(c,n),body:Ma(u,n),hasThinking:r.length>0||c!==null}}function rm(e){const t=a=>[...a].length;return e.segments.reduce((a,n)=>a+t(n),0)+t(e.pending||"")}function _c(e,t){const a=La(e).masked,n=La(t).masked;return{startedAtBoundary:!Na.test(a)&&Na.test(n),endedAtBoundary:!qa.test(a)&&qa.test(n)}}var Ua,aa,ia,pn,mn,Na,qa,xc=Re((()=>{Ua=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,aa="\0THKCODE",ia="\0",pn=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,mn=/`[^`\n]*`/g,Na=/<(think|thinking|reasoning)>/i,qa=/<\/(think|thinking|reasoning)>/i}));function Mc(e){const t=e.trim().toLowerCase();if(!t)return null;const a=hn.get(t);return a||(gn.includes(t)?t:null)}function Rc(e){const t=e.trim();if(!t.startsWith("/"))return null;const a=t.match(/^\/([a-zA-Z][\w-]*)(?:\s|$)/);return a?Mc(a[1]):null}function Hc(e){return Rc(e)!==null}var ki,gn,hn,Ic=Re((()=>{ki=[{key:"command:usage",name:"usage",args:"",descriptionKey:"chat.slashCommands.usage"},{key:"command:status",name:"status",args:"",descriptionKey:"chat.slashCommands.status"},{key:"command:abort",name:"abort",args:"",descriptionKey:"chat.slashCommands.abort"},{key:"command:queue",name:"queue",argsKey:"chat.slashCommandArgs.message",descriptionKey:"chat.slashCommands.queue"},{key:"command:skill",name:"skill",args:"",descriptionKey:"skills.title",opensSkillPicker:!0},{key:"command:learn",name:"learn",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.learn"},{key:"command:plan",name:"plan",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.plan"},{key:"command:moa",name:"moa",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.moa"},{key:"command:goal",name:"goal",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.goal"},{key:"command:goal-status",name:"goal",args:"status",insertText:"goal status",descriptionKey:"chat.slashCommands.goalStatus"},{key:"command:goal-pause",name:"goal",args:"pause",insertText:"goal pause",descriptionKey:"chat.slashCommands.goalPause"},{key:"command:goal-resume",name:"goal",args:"resume",insertText:"goal resume",descriptionKey:"chat.slashCommands.goalResume"},{key:"command:goal-done",name:"goal",args:"done",insertText:"goal done",descriptionKey:"chat.slashCommands.goalDone"},{key:"command:goal-clear",name:"goal",args:"clear",insertText:"goal clear",descriptionKey:"chat.slashCommands.goalClear"},{key:"command:subgoal",name:"subgoal",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.subgoal"},{key:"command:clear",name:"clear",args:"",descriptionKey:"chat.slashCommands.clear"},{key:"command:clear-history",name:"clear",args:"--history",insertText:"clear --history",descriptionKey:"chat.slashCommands.clearHistory"},{key:"command:title",name:"title",argsKey:"chat.slashCommandArgs.title",descriptionKey:"chat.slashCommands.title"},{key:"command:compress",name:"compress",args:"",descriptionKey:"chat.slashCommands.compress"},{key:"command:fork",name:"fork",argsKey:"chat.slashCommandArgs.title",descriptionKey:"chat.slashCommands.fork"},{key:"command:steer",name:"steer",argsKey:"chat.slashCommandArgs.text",descriptionKey:"chat.slashCommands.steer"},{key:"command:destroy",name:"destroy",args:"",descriptionKey:"chat.slashCommands.destroy"},{key:"command:reload-mcp",name:"reload-mcp",args:"",descriptionKey:"chat.slashCommands.reloadMcp"},{key:"command:reload-skills",name:"reload-skills",args:"",descriptionKey:"chat.slashCommands.reloadSkills"}],gn=Array.from(new Set(ki.map(e=>e.name))),hn=new Map([["reload_skills","reload-skills"]])}));function za(e){if(typeof e=="string")return e.trim();if(e==null)return"";if(typeof e!="object")return String(e).trim();if(Array.isArray(e))return e.map(za).filter(Boolean).join(`
|
|
2
|
+
`);const t=e;for(const a of["message","error","detail","description","code"]){const n=za(t[a]);if(n)return n}try{return JSON.stringify(e)}catch{return String(e)}}async function Fc(e,t="Request failed"){let a="";if((e.headers.get("content-type")||"").includes("application/json"))try{a=za(await e.clone().json())}catch{a=""}if(!a)try{a=(await e.clone().text()).trim()}catch{a=""}const n=`${t}: ${e.status}`;return a?`${n} - ${a}`:n}var Dc=Re((()=>{}));function Ec(e){const t=typeof e.label=="string"&&e.label.trim()?e.label.trim():"reference",a=Number.isFinite(Number(e.index))?Number(e.index):void 0,n=Number.isFinite(Number(e.count))?Number(e.count):void 0;return a!=null&&n!=null?`${a}/${n} ${t}`:t}function We(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Lc(e){if(typeof e!="string"||!e.trim())return!1;try{const t=JSON.parse(e);if(t&&typeof t=="object"){const a=t;if(a.success===!1||a.error!=null&&String(a.error).trim()!=="")return!0}}catch{return!1}return!1}function Ba(e){if(typeof e=="string")return e.trim();if(e==null)return"";if(typeof e!="object")return String(e).trim();if(Array.isArray(e))return e.map(Ba).filter(Boolean).join(`
|
|
3
|
+
`);const t=e;for(const a of["message","error","detail","description","code"]){const n=Ba(t[a]);if(n)return n}try{return JSON.stringify(e)}catch{return String(e)}}async function Uc(e){if(e.length===0)return[];const t=new FormData;for(const u of e)u.file&&t.append("file",u.file,u.name);const a=localStorage.getItem("hermes_api_key")||"",n=Ga(),r={};a&&(r.Authorization=`Bearer ${a}`),n&&(r["X-Hermes-Profile"]=n);const c=await fetch("/upload",{method:"POST",body:t,headers:r});if(!c.ok)throw new Error(await Fc(c,"Upload failed"));return(await c.json()).files}async function Nc(e,t,a){const n=[];if(e.trim()&&n.push({type:"text",text:e.trim()}),t&&t.length>0&&a)for(let r=0;r<a.length;r++){const c=a[r],u=t[r];u?.type.startsWith("image/")?n.push({type:"image",name:c.name,path:c.path,media_type:u.type}):n.push({type:"file",name:c.name,path:c.path,media_type:u?.type})}return n}function po(e){return e!=null&&e!==""}function Ct(e){return po(e)?e:void 0}function Ra(e){if(!po(e))return"";if(typeof e=="string")return e;try{const t=JSON.stringify(e);if(t!==void 0)return t}catch{}return String(e)}function qc(e,t){if(e!=="moa_reference"&&e!=="moa_aggregating")return null;const a=typeof t=="string"?(()=>{try{return JSON.parse(t)}catch{return null}})():t;if(!a||typeof a!="object")return null;const n=a;return{preview:typeof n.preview=="string"?n.preview:typeof n.label=="string"?n.label:typeof n.aggregator=="string"?n.aggregator:void 0,result:n.text??n.result}}function zc(e){return(e.role==="moa"||e.display_role==="tool")&&(e.tool_name==="moa_reference"||e.tool_name==="moa_aggregating")}function Ha(e){return typeof e=="string"&&Lc(e)}function Jo(e){if(!e||typeof e!="object")return;const t=e;if(Object.prototype.hasOwnProperty.call(t,"finishReason"))return t.finishReason;if(Object.prototype.hasOwnProperty.call(t,"finish_reason"))return t.finish_reason}function yt(e){if(!e||typeof e!="object")return;const t=e;if(Object.prototype.hasOwnProperty.call(t,"runMarker"))return typeof t.runMarker=="string"||t.runMarker==null?t.runMarker:void 0;if(Object.prototype.hasOwnProperty.call(t,"run_marker"))return typeof t.run_marker=="string"||t.run_marker==null?t.run_marker:void 0}function Bc(e){return e?e.content.trim()!==""||(e.reasoning?.trim()??"")!=="":!1}function Oc(e,t){if(e.length===0)return null;const a=e[e.length-1];if(a?.role!=="assistant")return null;const n=Jo(a),r=yt(a);return n===null||t&&r&&r===t?a:null}function Wc(e){if(!Array.isArray(e))return null;for(let t=e.length-1;t>=0;t-=1){const a=yt(e[t]?.data);if(typeof a=="string"&&a.trim()!=="")return a}return null}function Pi(e,t){const a=t.previousActiveAssistantMessageId&&e.find(n=>n.role==="assistant"&&n.id===t.previousActiveAssistantMessageId)||null||Oc(e,t.activeRunMarker);return{activeAssistant:a,reasoningAssistant:t.previousReasoningAssistantMessageId&&e.find(n=>n.role==="assistant"&&n.id===t.previousReasoningAssistantMessageId)||null||(a?.reasoning?a:null),runMarker:yt(a)??t.activeRunMarker??null,hadVisibleText:Bc(a)}}function Po(e){const t=e.filter(c=>c.role==="assistant"?(c.tool_calls?.length||0)>0||Ra(c.content).trim()!=="":!0),a=new Map,n=new Map;for(const c of t)if(c.role==="assistant"&&c.tool_calls)for(const u of c.tool_calls)u.id&&(u.function?.name&&a.set(u.id,u.function.name),po(u.function?.arguments)&&n.set(u.id,u.function.arguments));const r=[];for(const c of t){if(c.role==="assistant"&&c.tool_calls?.length&&!Ra(c.content).trim()){for(const S of c.tool_calls)r.push({id:String(c.id)+"_"+S.id,role:"tool",content:"",timestamp:Math.round(c.timestamp*1e3),toolName:S.function?.name||void 0,toolCallId:S.id,toolArgs:Ct(S.function?.arguments),toolStatus:"done",finishReason:Jo(c),runMarker:yt(c)});continue}if(c.role==="tool"||zc(c)){const S=c.tool_call_id||"",H=c.tool_name||a.get(S)||void 0,f=n.has(S)?n.get(S):void 0,P=qc(H,c.content);let V=P?.preview||"";const L=Ra(c.content);if(!V&&L)try{const z=typeof c.content=="string"?JSON.parse(L):c.content;V=z?.url||z?.title||z?.preview||z?.summary||""}catch{V=L.slice(0,80)}const j=r.findIndex(z=>z.role==="tool"&&z.toolName===H&&!z.toolResult&&z.id.includes("_"+S));j!==-1&&r.splice(j,1),r.push({id:String(c.id),role:"tool",content:"",timestamp:Math.round(c.timestamp*1e3),toolName:H,toolCallId:S||void 0,toolArgs:f,toolPreview:typeof V=="string"&&V.slice(0,100)||void 0,toolResult:Ct(P?P.result:c.content),toolStatus:"done",finishReason:Jo(c),runMarker:yt(c)});continue}const u=c.display_role||c.role,h=c.display_content??c.content;r.push({id:String(c.id),role:u==="moa"?"system":u,content:h||"",timestamp:Math.round(c.timestamp*1e3),reasoning:c.reasoning?c.reasoning:void 0,systemType:u==="command"?"command":void 0,finishReason:Jo(c),runMarker:yt(c)})}return r}function Oa(e){return Math.max(e.started_at||0,e.ended_at||0,e.last_active||0)}function vn(e){if(!e?.length)return null;for(let t=e.length-1;t>=0;t-=1){const a=e[t];if(!(a.role!=="user"&&a.role!=="assistant")&&String(a.content||"").trim())return a}return null}function Kc(e){const t=vn(e);if(!t)return null;const a=String(t.content||"").replace(/\s+/g," ").trim();return a.length>280?`${a.slice(0,277)}...`:a}function Vc(e){return vn(e)?.role||null}function Ia(e){const t=e.source==="coding_agent"||e.agent==="claude"||e.agent==="codex",a=e.agent==="codex"?"codex":e.agent==="claude"?"claude-code":void 0,n=t?e.agent_mode==="global"||e.agent_mode==="scoped"?e.agent_mode:e.provider==="global"?"global":"scoped":void 0,r=Oa(e);return{id:e.id,profile:e.profile||"default",title:e.title||"",source:e.source||void 0,agent:e.agent||void 0,agentSessionId:e.agent_session_id||void 0,agentNativeSessionId:e.agent_native_session_id||void 0,codingAgentId:a,codingAgentMode:n,messages:[],createdAt:Math.round(e.started_at*1e3),updatedAt:Math.round(r*1e3),model:e.model,provider:e.provider||e.billing_provider||"",messageCount:e.message_count,messageTotal:e.message_count,loadedMessageCount:0,hasMoreBefore:!1,inputTokens:e.input_tokens,outputTokens:e.output_tokens,endedAt:e.ended_at!=null?Math.round(e.ended_at*1e3):null,parentSessionId:e.parent_session_id||null,forkPointMessageId:e.fork_point_message_id!=null?String(e.fork_point_message_id):null,parentTitle:e.parent_title||null,parentLastMessage:e.parent_last_message||null,parentLastMessageRole:e.parent_last_message_role||null,lastActiveAt:e.last_active!=null?Math.round(e.last_active*1e3):void 0,isArchived:!!e.is_archived,workspace:e.workspace||null}}function fn(){try{return Et().activeProfileName||"default"}catch{return"default"}}function Gc(){return xo==="global_agent"?`${Ka}global_agent_`:Ka}function Qo(){return Gc()+fn()}function Ti(){return xo==="default"&&fn()==="default"?na:null}function Yo(e){return e?.source==="coding_agent"||e?.codingAgentId==="claude-code"||e?.codingAgentId==="codex"||e?.agent==="claude"||e?.agent==="codex"}function Ci(e){!e||!Yo(e)||(e.baseUrl=void 0,e.apiKey=void 0)}function jc(e){if(!e||typeof e!="object")return!1;const t=e;return t.name==="QuotaExceededError"||t.code===22||t.code===1014}function $c(){try{const e=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],t=[];for(let a=0;a<localStorage.length;a++){const n=localStorage.key(a);n&&(n===Qo()||n===na||e.some(r=>n.startsWith(r))&&t.push(n))}t.forEach(a=>Wa(a)),t.length>0&&console.log(`Recovered storage: cleared ${t.length} old session cache entries`)}catch{}}function Jc(e,t){try{localStorage.setItem(e,t);return}catch(a){if(!jc(a))return}$c();try{localStorage.setItem(e,t)}catch{}}function _i(e){try{return localStorage.getItem(e)}catch{return null}}function Wa(e){try{localStorage.removeItem(e)}catch{}}var Qc,Yc,jt,Ka,xo,na,$a,bn=Re((()=>{ic(),nn(),rt(),mc(),hc(),Qt(),Oe(),Ho(),Io(),wc(),Ac(),Cc(),xc(),Ic(),Dc(),Qc=150,Yc=300,jt="workspace-run-change:",Ka="hermes_active_session_",xo="default",na="hermes_active_session",$a=ho("chat",()=>{const e=w(xo),t=new WeakSet,a=w([]),n=w(null),r=w(null),c=w(new Map),u=w(new Set),h=w(new Set),S=w(new Set),H=w(null),f=w(new Map),P=w(new Map),V=w(new Map),L=w(new Map),j=ee(()=>{const o=n.value;return o&&L.value.get(o)||null}),z=w(new Map),ue=ee(()=>{const o=n.value;return o&&z.value.get(o)||null}),ne=w(!1);function T(o){ne.value=o}const R=ee(()=>{const o=n.value;return o==null?!1:c.value.has(o)||u.value.has(o)}),B=ee(()=>{const o=n.value;return o!=null&&h.value.has(o)}),ae=w(!1),ge=w(!1),Ie=w(!1),me=ee(()=>R.value);async function I(o){const i=o||void 0;if(e.value==="global_agent")return _o("global_agent",void 0,i);const[d,l]=await Promise.all([_o(void 0,void 0,i),_o("global_agent",void 0,i)]),v=new Map;for(const k of[...d,...l])v.set(k.id,k);return[...v.values()].sort((k,m)=>Oa(m)-Oa(k))}function q(){return e.value==="global_agent"?"global-agent":"chat-run"}function G(o){e.value!==o&&(xo=o,e.value=o,a.value=[],S.value=new Set,f.value=new Map,P.value=new Map,L.value=new Map,z.value=new Map,c.value=new Map,u.value=new Set,h.value=new Set,Ke.value=new Map,ge.value=!1,C())}const E=w(new Map),Q=ee(()=>{const o=n.value;return o&&E.value.get(o)||null});function X(o,i){if(!o)return;const d=new Map(E.value);i?d.set(o,i):d.delete(o),E.value=d}const _e=w(null),J=ee(()=>_e.value?.aborting===!0);function N(o){_e.value=o}const F=w(null),Ae=ee(()=>F.value?.messages||[]),Ke=w(new Map),lt=new Set;function Y(o){return c.value.has(o)||u.value.has(o)}function be(o){return S.value.has(o)}function ie(o){if(!S.value.has(o))return;const i=new Set(S.value);i.delete(o),S.value=i}function D(o,i=!1){if(i)return;if(n.value===o){ie(o);return}const d=new Set(S.value);d.add(o),S.value=d}function Me(o){const i=new Set([...S.value].filter(d=>o.has(d)));i.size!==S.value.size&&(S.value=i)}function C(){const o=n.value;n.value=null,F.value=null,r.value=null,N(null),X(o,null),Wa(Qo())}function x(o){const i=a.value.find(v=>v.id===o);if(!i)return;const d=Ke.value.get(o),l=[];for(const v of i.messages)if(v.role==="tool"&&v.toolCallId&&(v.toolChange=d?.get(v.toolCallId)),v.id.startsWith(jt)){const k=v.id.slice(21);v.toolChange=d?.get(k)}if(d){for(const v of d.values())v?.source==="run"&&l.push(v);Ee(i,l)}}function ce(o){return`${jt}${o}`}function Ce(o){const i=Number(o.finished_at||o.created_at||o.started_at||0);return Number.isFinite(i)&&i>0?Math.round(i*1e3):Date.now()}function Ee(o,i){const d=i.filter(v=>v?.change_id&&v.files?.length>0).sort((v,k)=>{const m=Ce(k)-Ce(v);return m!==0?m:k.change_id.localeCompare(v.change_id)});if(!d.length)return;const l=new Map(o.messages.filter(v=>v.id.startsWith(jt)).map(v=>[v.id,v]));o.messages=o.messages.filter(v=>!v.id.startsWith(jt));for(const v of d){const k=ce(v.change_id),m=l.get(k)||null,M=Ce(v),te=Ve(o.messages,M),U=m||{id:k,role:"tool",content:"",timestamp:M,toolName:"workspace",toolStatus:"done"};U.timestamp=M,U.toolChange=v,o.messages.splice(te+1,0,U)}}function Ve(o,i){for(let d=o.length-1;d>=0;d-=1){const l=o[d];if(!l.id.startsWith(jt)&&l.role==="assistant"&&l.timestamp<=i+1e3)return d}for(let d=o.length-1;d>=0;d-=1)if(!o[d].id.startsWith(jt))return d;return o.length-1}function He(o,i){const d=new Map(Ke.value),l=new Map;for(const v of i)v?.change_id&&l.set(v.change_id,v);d.set(o,l),Ke.value=d,x(o)}function at(o,i){if(!i?.change_id)return;const d=new Map(Ke.value),l=new Map(d.get(o)||[]);l.set(i.change_id,i),d.set(o,l),Ke.value=d,x(o)}function Qe(o,i){at(o,i?.change)}function ze(o,i){at(o,i?.workspace_run_change)}function dt(o){x(o),!(Ke.value.has(o)||lt.has(o))&&(lt.add(o),Rt(o).catch(i=>console.warn("Failed to load workspace run changes:",i)).finally(()=>{lt.delete(o)}))}async function Rt(o){He(o,await nc(o))}async function Ht(o,i,d){return rc(o,i,d)}function At(o){const i=a.value.find(l=>l.id===o.id),d=Ia(o);return i?(Object.assign(i,{...d,messages:i.messages,contextTokens:i.contextTokens,loadedMessageCount:i.loadedMessageCount,hasMoreBefore:i.hasMoreBefore}),i):(a.value.unshift(d),d)}async function Lt(o,i){ae.value=!0;try{const d=(await I(o)).map(Ia),l=new Map(a.value.map(te=>[te.id,{messages:te.messages,contextTokens:te.contextTokens}]));for(const te of d){const U=l.get(te.id);U?.messages?.length&&(te.messages=U.messages),U?.contextTokens!=null&&(te.contextTokens=U.contextTokens)}a.value=d,Me(new Set(a.value.map(te=>te.id)));const v=n.value,k=Ti(),m=_i(Qo())||(k?_i(na):null),M=i&&a.value.some(te=>te.id===i)?i:v&&a.value.some(te=>te.id===v)?v:m&&a.value.some(te=>te.id===m)?m:a.value[0]?.id;M?await Le(M):C()}catch(d){console.error("Failed to load sessions:",d)}finally{ae.value=!1,ge.value=!0}}async function ct(o){if(!R.value&&!ae.value)try{const i=(await I(o??H.value)).map(Ia),d=new Map(a.value.map(m=>[m.id,m])),l=new Set(i.map(m=>m.id)),v=[];for(const m of i){const M=d.get(m.id);M?(M.title=m.title,M.source=m.source,M.updatedAt=m.updatedAt,M.lastActiveAt=m.lastActiveAt,M.endedAt=m.endedAt,M.model=m.model,M.provider=m.provider,M.messageCount=m.messageCount,M.inputTokens=m.inputTokens,M.outputTokens=m.outputTokens,M.workspace=m.workspace,m.messageTotal!=null&&(M.messageTotal=Math.max(m.messageTotal,M.loadedMessageCount||0)),v.push(M)):v.push(m)}const k=n.value;if(k&&!l.has(k)){const m=d.get(k);m&&v.push(m)}if(a.value=v,Me(new Set(v.map(m=>m.id))),k){const m=a.value.find(M=>M.id===k);m&&F.value!==m&&(F.value=m)}}catch(i){console.error("Failed to refresh session list:",i)}}async function Xt(){const o=n.value;if(!o)return!1;try{const i=a.value.find(l=>l.id===o);if(!i)return!1;const d=await wi(o,0,Math.min(Math.max(i.loadedMessageCount||150,150),300),F.value?.profile);return d?(i.messages=Po(d.messages||[]),i.loadedMessageCount=d.messages.length,i.messageTotal=d.total,i.messageCount=d.total,i.hasMoreBefore=d.hasMore,d.session.title&&(i.title=d.session.title),i.parentSessionId=d.session.parent_session_id||i.parentSessionId||null,i.forkPointMessageId=d.session.fork_point_message_id!=null?String(d.session.fork_point_message_id):i.forkPointMessageId||null,i.parentTitle=d.session.parent_title||i.parentTitle||null,i.parentLastMessage=d.session.parent_last_message||i.parentLastMessage||null,i.parentLastMessageRole=d.session.parent_last_message_role||i.parentLastMessageRole||null,dt(o),!0):!1}catch(i){return console.error("Failed to refresh active session:",i),!1}}function Ut(o={}){const i=e.value==="global_agent"?"global_agent":o.source||"cli",d=o.codingAgentId||(o.agent==="codex"?"codex":o.agent==="claude"?"claude-code":void 0),l=d?o.codingAgentMode||"scoped":void 0,v={id:We(),profile:o.profile||Et().activeProfileName||"default",title:"",source:i,agent:o.agent||(d?d==="codex"?"codex":"claude":"hermes"),codingAgentId:d,codingAgentMode:l,messages:[],createdAt:Date.now(),updatedAt:Date.now(),model:o.model||void 0,provider:o.provider||"",workspace:o.workspace||null,baseUrl:o.baseUrl,apiKey:o.apiKey,apiMode:o.apiMode};return a.value.unshift(v),v}function Zt(){const o=new Date,i={id:`${[o.getFullYear(),String(o.getMonth()+1).padStart(2,"0"),String(o.getDate()).padStart(2,"0"),"_",String(o.getHours()).padStart(2,"0"),String(o.getMinutes()).padStart(2,"0"),String(o.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:e.value==="global_agent"?"global_agent":"cli",agent:"hermes",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return a.value.unshift(i),i}async function Le(o,i){oi(o),n.value=o,r.value=i??null,Jc(Qo(),o);const d=Ti();if(d&&Wa(d),F.value=a.value.find(l=>l.id===o)||null,ie(o),!!F.value){Ie.value=!0;try{await new Promise((l,v)=>{const k=setTimeout(()=>v(new Error("resume timeout")),15e3);fi(o,m=>{if(clearTimeout(k),m.session_id!==o||n.value!==o){l();return}const M=a.value.find(te=>te.id===o);if(!M){l();return}if(m.isWorking?u.value.add(o):u.value.delete(o),m.queueLength&&m.queueLength>0?f.value.set(o,m.queueLength):f.value.delete(o),Array.isArray(m.queueMessages)?Bt(o,Do(m.queueMessages)):m.queueLength||Bt(o,[]),m.isAborting?N({aborting:!0,synced:null}):m.isWorking||N(null),m.isWorking||X(o,null),m.inputTokens!=null&&(M.inputTokens=m.inputTokens),m.outputTokens!=null&&(M.outputTokens=m.outputTokens),m.contextTokens!=null&&(M.contextTokens=m.contextTokens),M.parentSessionId=m.parentSessionId||M.parentSessionId||null,M.forkPointMessageId=m.forkPointMessageId!=null?String(m.forkPointMessageId):M.forkPointMessageId||null,M.parentTitle=m.parentTitle||M.parentTitle||null,M.parentLastMessage=m.parentLastMessage||M.parentLastMessage||null,M.parentLastMessageRole=m.parentLastMessageRole||M.parentLastMessageRole||null,m.messages?.length&&(M.messages=Po(m.messages),dt(o),M.loadedMessageCount=m.messageLoadedCount??m.messages.length,M.messageTotal=m.messageTotal??M.messageCount??M.loadedMessageCount,M.messageCount=M.messageTotal,M.hasMoreBefore=m.hasMoreBefore??M.loadedMessageCount<M.messageTotal),!M.title){const te=M.messages.find(U=>U.role==="user");te&&(M.title=te.content.slice(0,40)+(te.content.length>40?"...":""))}if(F.value=M,m.events?.length)for(const te of m.events){const U=te.data;if(U.event==="compression.started")X(o,{compressing:!0,messageCount:U.message_count||0,beforeTokens:U.token_count||0,afterTokens:0,compressed:null});else if(U.event==="compression.completed"){const qe=U.contextTokens||U.afterTokens||0;X(o,{compressing:!1,messageCount:U.totalMessages||0,beforeTokens:U.beforeTokens||0,afterTokens:qe,compressed:U.compressed??!1,error:U.error}),U.contextTokens!=null&&(M.contextTokens=U.contextTokens)}else if(U.event==="abort.started")N({aborting:!0,synced:null});else if(U.event==="abort.timeout")N({aborting:!0,synced:!1,timedOut:!0,message:U.message});else if(U.event==="abort.completed")N({aborting:!1,synced:U.synced??!1});else if(U.event==="approval.requested")Eo({...U,session_id:o});else if(U.event==="approval.resolved")Lo({...U,session_id:o});else if(U.event==="clarify.requested")Uo({...U,session_id:o});else if(U.event==="clarify.resolved")No({...U,session_id:o});else if(U.event==="run.failed")ze(o,U),et(o,U.error),u.value.delete(o),f.value.delete(o);else if(U.event==="agent.event"||U.event==="run.reattach_failed")pt(U);else if(U.event==="workspace.diff.completed")Qe(o,U);else if(U.event==="tool.started"){const qe=he(o),Be=U.tool_call_id,de=Be?qe.find(g=>g.role==="tool"&&g.toolCallId===Be):null;de?xe(o,de.id,{toolName:U.tool||U.name,toolArgs:po(U.arguments)?U.arguments:de.toolArgs,toolPreview:U.preview||de.toolPreview,toolStatus:de.toolStatus||"running"}):Ne(o,{id:We(),role:"tool",content:"",timestamp:Date.now(),toolName:U.tool||U.name,toolCallId:Be,toolPreview:U.preview,toolArgs:Ct(U.arguments),toolStatus:"running"})}else if(U.event==="tool.completed"){const qe=he(o),Be=U.tool_call_id,de=Be?qe.filter(g=>g.role==="tool"&&g.toolCallId===Be):qe.filter(g=>g.role==="tool"&&g.toolStatus==="running");if(de.length>0){const g=Ct(U.output);xe(o,de[de.length-1].id,{toolStatus:U.error===!0||Ha(g)?"error":"done",toolDuration:U.duration,toolResult:g})}}else U.event==="moa.reference"||U.event==="moa.aggregating"?Ue(o,U):String(U.event||"").startsWith("subagent.")&&Z(o,U)}l()},F.value?.profile,q())}),n.value===o&&await Rt(o)}catch(l){console.error("Failed to load session messages via resume:",l)}finally{Ie.value=!1}n.value===o&&eo(o)}}async function pa(o=n.value){if(!o)return!1;const i=a.value.find(v=>v.id===o);if(!i||i.isLoadingOlderMessages||!i.hasMoreBefore)return!1;const d=i.loadedMessageCount||0;if(d>=300)return!1;const l=Math.min(150,300-d);i.isLoadingOlderMessages=!0;try{const v=await wi(o,d,l,i.profile);if(!v||v.messages.length===0)return i.hasMoreBefore=!1,!1;const k=new Set(i.messages.map(M=>M.id)),m=Po(v.messages).filter(M=>!k.has(M.id));return i.messages=[...m,...i.messages],x(o),i.loadedMessageCount=d+v.messages.length,i.messageTotal=v.total,i.messageCount=v.total,i.hasMoreBefore=v.hasMore,m.length>0}catch(v){return console.error("Failed to load older session messages:",v),!1}finally{i.isLoadingOlderMessages=!1}}function ma(o={}){const i=Jt(),d=e.value==="global_agent"?"global_agent":o.source||"cli",l=o.codingAgentId||(o.agent==="codex"?"codex":o.agent==="claude"?"claude-code":void 0),v=!!l&&o.codingAgentMode==="global",k=Ut({profile:o.profile,model:v?void 0:o.model||i.selectedModel||void 0,provider:v?"":o.provider||i.selectedProvider||"",source:d,agent:o.agent,codingAgentId:l,codingAgentMode:o.codingAgentMode,workspace:o.workspace,baseUrl:o.baseUrl,apiKey:o.apiKey,apiMode:o.apiMode});return Le(k.id),k}async function ga(o,i,d,l){const v=d||F.value?.id;if(!v)return!1;const k=a.value.find(te=>te.id===v),m=F.value?.id===v?F.value:null,M=String(k?.provider??m?.provider??"")!==(i||"")&&(Yo(k)||Yo(m));return await dc(v,o,i||"",l)?(k&&(k.model=o,k.provider=i||"",l&&(k.apiMode=l),M&&Ci(k)),m&&(m.model=o,m.provider=i||"",l&&(m.apiMode=l),M&&Ci(m)),!0):!1}async function Fo(o){return await sc(o,a.value.find(i=>i.id===o)?.profile)?(a.value=a.value.filter(i=>i.id!==o),n.value===o&&(a.value.length>0?await Le(a.value[0].id):Le(Ut().id)),!0):!1}async function ha(o){const i=a.value.find(d=>d.id===o);if(!await lc(o))return!1;if(a.value=a.value.filter(d=>d.id!==o),S.value.has(o)){const d=new Set(S.value);d.delete(o),S.value=d}return n.value===o?a.value.length>0?await Le(a.value[0].id):C():i&&await ct(H.value),!0}function he(o){return a.value.find(i=>i.id===o)?.messages||[]}function Ne(o,i){const d=a.value.find(l=>l.id===o);d&&d.messages.push(i)}function kt(o){const i=a.value.findIndex(d=>d.id===o.id);i!==-1?a.value[i]=o:a.value.push(o)}function xe(o,i,d){const l=a.value.find(k=>k.id===o);if(!l)return;const v=l.messages.findIndex(k=>k.id===i);v!==-1&&(l.messages[v]={...l.messages[v],...d})}function It(o,i){const d=he(o);d.forEach((l,v)=>{l.role==="tool"&&l.toolStatus==="running"&&(d[v]={...l,toolStatus:i})})}function va(o){const i=he(o);i.forEach((d,l)=>{d.isStreaming&&xe(o,d.id,{isStreaming:!1}),d.role==="tool"&&d.toolStatus==="running"&&(i[l]={...d,toolStatus:"done"})})}function A(o){const i=a.value.find(d=>d.id===o);i&&(i.messages=i.messages.filter(d=>d.commandAction!=="agent.event"))}function Z(o,i){const d=String(i.event||"");if(!d.startsWith("subagent."))return;const l=String(i.subagent_id||`${i.task_index??0}`),v=`subagent:${i.run_id||"run"}:${l}`,k=Number(i.task_index??0),m=Number(i.task_count??1),M=`${k+1}/${Math.max(1,m||1)}`,te=String(i.tool||i.name||""),U=Number(i.tool_count||0),qe=String(i.goal||"").trim(),Be=String(i.text||i.preview||"").trim(),de=String(i.summary||"").trim(),g=Number(i.duration_seconds??i.duration);let it=Be||de||qe;d==="subagent.start"?it=`subagent ${M} started${qe?`: ${qe}`:""}`:d==="subagent.tool"?it=`${`subagent ${M}${U?` turn ${U}`:""}`}${te?`: ${te}`:""}${Be?` - ${Be}`:""}`:d==="subagent.progress"?it=`subagent ${M}: ${Be||"working"}`:d==="subagent.complete"&&(it=`subagent ${M} ${String(i.status||"completed")}${de?`: ${de}`:""}`);const pe=he(o).find(ve=>ve.role==="tool"&&ve.toolCallId===v),re=d==="subagent.complete"?i.status&&String(i.status)!=="completed"?"error":"done":"running",we={toolName:"delegate_task",toolCallId:v,toolPreview:it.slice(0,220),toolStatus:re,toolDuration:Number.isFinite(g)?g:void 0,toolResult:d==="subagent.complete"?JSON.stringify({status:i.status||"completed",summary:de||Be,api_calls:i.api_calls,input_tokens:i.input_tokens,output_tokens:i.output_tokens},null,2):void 0};if(pe){xe(o,pe.id,we);return}Ne(o,{id:We(),role:"tool",content:"",timestamp:Date.now(),...we})}function Ue(o,i){const d=String(i.event||"");if(d!=="moa.reference"&&d!=="moa.aggregating")return;const l=he(o);if(d==="moa.reference"){const te=Ec(i),U=Number.isFinite(Number(i.index))?Number(i.index):te,qe=`moa:reference:${i.run_id||"run"}:${U}`,Be=typeof i.text=="string"?i.text:typeof i.delta=="string"?i.delta:"",de={toolName:"moa_reference",toolCallId:qe,toolPreview:te.slice(0,220),toolStatus:"done",toolResult:Be},g=l.find(it=>it.role==="tool"&&it.toolCallId===qe);if(g){xe(o,g.id,de);return}Ne(o,{id:We(),role:"tool",content:"",timestamp:Date.now(),...de});return}const v=typeof i.aggregator=="string"&&i.aggregator.trim()?i.aggregator.trim():"aggregator",k=`moa:aggregating:${i.run_id||"run"}`,m={toolName:"moa_aggregating",toolCallId:k,toolPreview:v.slice(0,220),toolStatus:"running",toolArgs:{aggregator:v}},M=l.find(te=>te.role==="tool"&&te.toolCallId===k);if(M){xe(o,M.id,m);return}Ne(o,{id:We(),role:"tool",content:"",timestamp:Date.now(),...m})}function et(o,i){const d=Ba(i),l=d?`Error: ${d}`:"Run failed",v=he(o),k=v[v.length-1];if(k?.isStreaming)if((k.content||"").trim().length>100)xe(o,k.id,{isStreaming:!1});else{xe(o,k.id,{role:"assistant",content:l,isStreaming:!1,systemType:"error"});return}k?.role==="assistant"&&k.systemType==="error"&&k.content===l||Ne(o,{id:We(),role:"assistant",content:l,timestamp:Date.now(),systemType:"error"})}function ut(o){if(t.has(o))return;t.add(o);const i=o.session_id;if(!i)return;const d=a.value.find(m=>m.id===i),l=o.action,v=String(o.command||"").toLowerCase();if(o.started===!0&&o.terminal===!1&&u.value.add(i),o.terminal===!0){c.value.delete(i),u.value.delete(i),h.value.delete(i);const m=he(i);m.forEach((M,te)=>{M.isStreaming&&xe(i,M.id,{isStreaming:!1}),M.role==="tool"&&M.toolStatus==="running"&&(m[te]={...M,toolStatus:o.ok===!1?"error":"done"})})}if(l==="clear"&&v==="clear"){if(d&&(d.messages=[]),P.value.delete(i),f.value.delete(i),o.clearHistory){const m=String(o.message||"");m&&Ne(i,{id:We(),role:"command",content:m,timestamp:Date.now(),systemType:o.ok===!1?"error":"command",commandAction:l,commandData:{...o}})}return}if(l==="title"&&d&&typeof o.title=="string"&&(d.title=o.title,d.updatedAt=Date.now()),l==="usage"&&d&&(d.inputTokens=o.inputTokens,d.outputTokens=o.outputTokens,o.contextTokens!=null&&(d.contextTokens=o.contextTokens)),l==="destroy"&&(c.value.delete(i),u.value.delete(i),f.value.delete(i),P.value.delete(i),N(null),he(i).forEach(m=>{m.isStreaming&&xe(i,m.id,{isStreaming:!1}),m.role==="tool"&&m.toolStatus==="running"&&(m.toolStatus="error")})),l==="branch"&&o.ok!==!1){const m=o.branchSession||{},M=String(o.newSessionId||m.id||"").trim();M&&(a.value.find(te=>te.id===M)||a.value.unshift({id:M,profile:typeof m.profile=="string"?m.profile:void 0,title:String(o.newSessionTitle||m.title||"Branch"),source:typeof m.source=="string"?m.source:"cli",messages:[],createdAt:typeof m.createdAt=="number"?m.createdAt:Date.now(),updatedAt:typeof m.updatedAt=="number"?m.updatedAt:Date.now(),model:typeof m.model=="string"?m.model:void 0,provider:typeof m.provider=="string"?m.provider:void 0,messageCount:typeof m.messageCount=="number"?m.messageCount:void 0,messageTotal:typeof m.messageCount=="number"?m.messageCount:void 0,loadedMessageCount:0,hasMoreBefore:!1,parentSessionId:typeof m.parentSessionId=="string"?m.parentSessionId:typeof o.parentSessionId=="string"?o.parentSessionId:i,forkPointMessageId:m.forkPointMessageId!=null?String(m.forkPointMessageId):null,parentTitle:typeof m.parentTitle=="string"?m.parentTitle:d?.title||null,parentLastMessage:typeof m.parentLastMessage=="string"?m.parentLastMessage:Kc(d?.messages),parentLastMessageRole:typeof m.parentLastMessageRole=="string"?m.parentLastMessageRole:Vc(d?.messages),workspace:typeof m.workspace=="string"?m.workspace:null}),Le(M))}const k=String(o.message||"");k&&Ne(i,{id:We(),role:"command",content:k,timestamp:Date.now(),systemType:o.ok===!1?"error":"command",commandAction:l,commandData:{...o}})}function pt(o){const i=o.session_id;if(!i||o.source==="coding_agent"&&o.kind==="status")return;const d=String(o.text||o.message||"").trim();if(!d)return;const l=he(i),v=l[l.length-1],k={...o};if(v?.role==="system"&&v.commandAction==="agent.event"){if(v.content===d)return;xe(i,v.id,{content:d,timestamp:Date.now(),commandData:k});return}Ne(i,{id:We(),role:"system",content:d,timestamp:Date.now(),commandAction:"agent.event",commandData:k})}function Nt(o,i){const d=P.value.get(o)||[];if(d.some(v=>v.id===i.id))return;const l=new Map(P.value);l.set(o,[...d,{...i,queued:!0}]),P.value=l}function bo(o,i,d){const l=P.value.get(o);if(!l?.length)return;const v=l.map(m=>m.id===i?{...m,...d,queued:!0}:m),k=new Map(P.value);k.set(o,v),P.value=k}function qt(o,i){const d=P.value.get(o);if(!d?.length)return!1;const l=d.filter(k=>k.id!==i);if(l.length===d.length)return!1;const v=new Map(P.value);return l.length>0?(v.set(o,l),f.value.set(o,l.length)):(v.delete(o),f.value.delete(o)),P.value=v,!0}function zt(o,i){qt(o,i)&&xa(q())?.emit("cancel_queued_run",{session_id:o,queue_id:i})}function Do(o){return Array.isArray(o)?o.flatMap(i=>{const d=i,l=typeof d?.content=="string"?d.content:"",v=d?.id!=null?String(d.id):"";if(!v||!l.trim())return[];const k=typeof d?.timestamp=="number"&&Number.isFinite(d.timestamp)?Math.round(d.timestamp*1e3):Date.now(),m=d?.role==="command"?"command":"user";return[{id:v,role:m,content:l,timestamp:k,queued:!0,systemType:m==="command"?"command":void 0}]}):[]}function Bt(o,i){const d=new Map((P.value.get(o)||[]).map(k=>[k.id,k])),l=i.map(k=>({...d.get(k.id)||{},...k,attachments:d.get(k.id)?.attachments||k.attachments,queued:!0})),v=new Map(P.value);l.length>0?v.set(o,l):v.delete(o),P.value=v}function Cn(o,i){const d=new Map(V.value),l=new Set(d.get(o)||[]);l.add(i),d.set(o,l),V.value=d}function _n(o,i){const d=V.value.get(o);if(!d?.has(i))return!1;const l=new Set(d);l.delete(i);const v=new Map(V.value);return l.size>0?v.set(o,l):v.delete(o),V.value=v,!0}function Xa(o,i){const d=Number(i.queue_length||0);d>0?f.value.set(o,d):f.value.delete(o);const l=i.dequeued_queue_id!=null?String(i.dequeued_queue_id):"";if(l){const Be=P.value.get(o)||[],de=Be.find(g=>g.id===l);Array.isArray(i.queued_messages)?Bt(o,Do(i.queued_messages)):Bt(o,Be.filter(g=>g.id!==l)),de&&!he(o).some(g=>g.id===de.id)?(Ne(o,{...de,queued:!1}),Ot(o)):de||Cn(o,l);return}if(Array.isArray(i.queued_messages)){Bt(o,Do(i.queued_messages));return}const v=i.message,k=typeof v?.content=="string"?v.content:"",m=v?.id!=null?String(v.id):"";if(!m||!k.trim()||(P.value.get(o)||[]).some(Be=>Be.id===m))return;const M=typeof v?.timestamp=="number"&&Number.isFinite(v.timestamp)?Math.round(v.timestamp*1e3):Date.now(),te=he(o),U=te.findIndex(Be=>Be.id===m&&Be.role==="user"),qe=U>=0?te[U]:null;U>=0&&te.splice(U,1),Nt(o,{...qe||{},id:m,role:v?.role==="command"?"command":"user",content:k,timestamp:qe?.timestamp||M,attachments:qe?.attachments,queued:!0,systemType:v?.role==="command"?"command":qe?.systemType})}function Eo(o){const i=o.session_id,d=o.approval_id;if(!i||!d)return;const l=String(o.description||""),v=l.trim().toLowerCase().replace(/\s+/g," "),k=!o.allow_permanent&&(v==="save to memory"||v.startsWith("save to memory:")||v.startsWith("save to memory?")),m=(Array.isArray(o.choices)?o.choices:["once","session","deny"]).filter(M=>M==="once"||M==="session"||M==="always"||M==="deny");L.value.set(i,{sessionId:i,approvalId:d,command:String(o.command||""),description:l,choices:k?["once","deny"]:m.length?m:["once","session","deny"],allowPermanent:!!o.allow_permanent,isMemoryWrite:k,requestedAt:Date.now()}),L.value=new Map(L.value)}function Lo(o){const i=o.session_id;if(!i)return;const d=L.value.get(i);if(!d)return;const l=o.approval_id;l&&d.approvalId!==l||(L.value.delete(i),L.value=new Map(L.value))}function Uo(o){const i=o.session_id,d=o.clarify_id;!i||!d||(z.value.set(i,{sessionId:i,clarifyId:d,question:String(o.question||""),choices:Array.isArray(o.choices)?o.choices:null,timeoutMs:Number(o.timeout_ms)||3e5,requestedAt:Date.now()}),z.value=new Map(z.value))}function No(o){const i=o.session_id;if(!i)return;const d=z.value.get(i);if(!d)return;const l=o.clarify_id;l&&d.clarifyId!==l||(z.value.delete(i),z.value=new Map(z.value))}function fa(o){let i=!1;L.value.has(o)&&(L.value.delete(o),i=!0),z.value.has(o)&&(z.value.delete(o),i=!0),i&&(L.value=new Map(L.value),z.value=new Map(z.value))}function xn(o){const i=ue.value;i&&(tc(i.sessionId,i.clarifyId,o,q()),z.value.delete(i.sessionId),z.value=new Map(z.value))}function Mn(o){const i=j.value;i&&(oc(i.sessionId,i.approvalId,o,q()),L.value.delete(i.sessionId),L.value=new Map(L.value))}function Ot(o){const i=a.value.find(d=>d.id===o);if(i){if(!i.title){const d=i.messages.find(l=>l.role==="user");if(d){const l=d.attachments?.length?d.attachments.map(v=>v.name).join(", "):d.content;i.title=l.slice(0,40)+(l.length>40?"...":"")}}i.updatedAt=Date.now()}}function ba(o){const i=o.session_id,d=typeof o.title=="string"?o.title.trim():"";if(!i||!d)return;const l=a.value.find(v=>v.id===i);l&&(l.title=d,l.updatedAt=Date.now()),F.value?.id===i&&(F.value.title=d)}function Rn(){jo().display.bell_on_complete&&yc()}function Za(){jo().display.bell_on_complete&&Sc()}function ei(o,i){const d=o.replace(/\s+/g," ").trim();return d.length<=i?d:`${d.slice(0,Math.max(0,i-3)).trimEnd()}...`}function Hn(o){const i=o.codingAgentId||(o.agent==="codex"?"codex":o.agent==="claude"?"claude-code":void 0);return i==="codex"?{icon:"/coding-agents/codex-openai.png"}:i==="claude-code"?{icon:"/coding-agents/claude-code.svg"}:{icon:"/coding-agents/hermes.png"}}function In(o,i){return ei(i?.content||o.title||"Message complete.",140)}function ti(o,i){if(!jo().display.notify_on_complete)return;const d=a.value.find(k=>k.id===o);if(!d)return;const l=i?d.messages.find(k=>k.id===i):[...d.messages].reverse().find(k=>k.role==="assistant"),v=Hn(d);Tc({title:ei(d.title||"Hermes",80),body:In(d,l),icon:v.icon,tag:`hermes-complete-${o}-${l?.id||Date.now()}`})}async function Fn(o,i){if(!o.trim()&&!(i&&i.length>0))return;Rn();const d=o.trim();F.value||Le(Ut().id);const l=n.value,v=F.value?F.value.messageCount==null||F.value.messageCount===0:!1,k=Yo(F.value),m=!k&&Hc(d),M=m&&/^\/compress(?:\s|$)/i.test(d),te=m&&/^\/plan(?:\s|$)/i.test(d),U=m&&/^\/skill(?:\s|$)/i.test(d),qe=m&&/^\/moa(?:\s|$)/i.test(d),Be=m&&/^\/goal(?:\s|$)/i.test(d),de=m&&/^\/fork(?:\s|$)/i.test(d),g=!k&&!de,it=Y(l);if(de){if(h.value.has(l))return;h.value=new Set(h.value).add(l)}const pe=it&&(!m||te||U||qe);m&&!pe&&!it&&va(l);const re={id:We(),role:m?"command":"user",content:d,timestamp:Date.now(),attachments:i&&i.length>0?i:void 0,queued:pe,systemType:m?"command":void 0};pe?Nt(l,re):(Ne(l,re),Ot(l),g&&u.value.add(l));let we=!1;try{let ve;if(i&&i.length>0){const b=await Uc(i),De=new Map(b.map(oe=>[oe.name,ja(oe.path,oe.name)]));if(pe&&re.attachments)re.attachments=re.attachments.map(oe=>{const O=De.get(oe.name);return O?{...oe,url:O}:oe}),bo(l,re.id,{attachments:re.attachments});else{const oe=he(l).findLast(O=>O.id===re.id);oe?.attachments&&(oe.attachments=oe.attachments.map(O=>{const Pe=De.get(O.name);return Pe?{...O,url:Pe}:O}))}ve=await Nc(o,i,b)}else ve=d;const Fe=Jt();await Fe.waitForModelsForRun();const Ye=F.value?.model||Fe.selectedModel,st=F.value?.provider||Fe.selectedProvider,Kt=F.value?.profile||Et().activeProfileName||void 0,Dt=Kt?Fe.profileModelGroups.find(b=>b.profile===Kt)?.groups:void 0,Pt=Dt?.length?Dt:Fe.modelGroups,So=Pt.find(b=>b.provider===st),Sa=F.value?.source,qo=Sa==="global_agent"?"global_agent":Sa==="workflow"?"workflow":k?"coding_agent":Sa==="api_server"?"api_server":"cli",Ao=qo==="coding_agent"||qo==="workflow"&&k,Bn=F.value?.codingAgentId||(F.value?.agent==="codex"?"codex":"claude-code"),to=F.value?.codingAgentMode||"scoped",On=Ao&&to!=="global"?pc(F.value?.apiMode||So?.api_mode,uc(st||So?.provider,F.value?.baseUrl||So?.base_url)):void 0,Wn={input:ve,session_id:l,profile:Kt,model:Ao?to==="global"?void 0:Ye||void 0:v&&Ye||void 0,provider:Ao?to==="global"?void 0:st||void 0:v&&st||void 0,model_groups:Pt.map(b=>({provider:b.provider,models:b.models})),queue_id:re.id,workspace:F.value?.workspace||void 0,source:qo,...e.value==="global_agent"?{session_source:"global_agent"}:{},...qo==="workflow"?{session_source:"workflow"}:{},...Ao?{coding_agent_id:Bn,mode:to,baseUrl:to==="global"?void 0:F.value?.baseUrl||So?.base_url||void 0,apiKey:to==="global"?void 0:F.value?.apiKey||So?.api_key||void 0,apiMode:On}:{},reasoning_effort:Ao?void 0:F.value?.reasoningEffort||void 0};v&&F.value&&(F.value.messageCount=Math.max(F.value.messageCount||0,1));const oo=()=>{c.value.delete(l),u.value.delete(l)};let ft=!1,ao=!1,Vt=!1,$e=null,mt=null,Tt=null;const Kn=()=>{he(l).forEach(b=>{b.role==="assistant"&&b.isStreaming&&xe(l,b.id,{isStreaming:!1})}),$e=null,mt=null,Tt=null},ai=ac(Wn,b=>{const De=yt(b);switch(De&&(Tt=De),b.event){case"run.started":ie(l),u.value.add(l),A(l),N(null),X(l,null),ft=!1,ao=!1,Vt=!1,Kn(),Tt=yt(b)??null,b.queue_length>0?f.value.set(l,b.queue_length):f.value.delete(l);break;case"run.queued":Xa(l,b);break;case"session.command":ut(b);break;case"agent.event":pt(b);break;case"run.reattach_failed":pt(b);break;case"compression.started":X(l,{compressing:!0,messageCount:b.message_count||0,beforeTokens:b.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const oe=b.contextTokens||b.afterTokens||0;if(X(l,{compressing:!1,messageCount:b.totalMessages||0,beforeTokens:b.beforeTokens||0,afterTokens:oe,compressed:b.compressed??!1,error:b.error}),b.contextTokens!=null){const O=a.value.find(Pe=>Pe.id===l);O&&(O.contextTokens=b.contextTokens)}setTimeout(()=>{const O=E.value.get(l);O&&!O.compressing&&X(l,null)},5e3);break}case"abort.started":N({aborting:!0,synced:null});break;case"abort.timeout":N({aborting:!0,synced:!1,timedOut:!0,message:b.message});break;case"abort.completed":{if(N({aborting:!1,synced:b.synced??!1}),fa(l),b.queue_length>0){f.value.set(l,b.queue_length),N(null);break}const oe=he(l),O=oe[oe.length-1];O?.isStreaming&&xe(l,O.id,{isStreaming:!1}),oe.forEach((Pe,ye)=>{Pe.role==="tool"&&Pe.toolStatus==="running"&&(oe[ye]={...Pe,toolStatus:"done"})}),oo(),N(null);break}case"reasoning.delta":case"thinking.delta":{const oe=b.text||b.delta||"";if(!oe)break;ft=!0;const O=he(l),Pe=mt||$e,ye=Pe?O.find(Je=>Je.id===Pe):null;if(ye?.role==="assistant")ye.reasoning=(ye.reasoning||"")+oe,mt=ye.id,Wt(ye.id);else{const Je=We();Ne(l,{id:Je,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:oe}),$e=Je,mt=Je,Wt(Je)}break}case"moa.reference":Vt=!0,Ue(l,b);break;case"moa.aggregating":Vt=!0,Ue(l,b);break;case"reasoning.available":{const oe=he(l),O=oe[oe.length-1];O?.role==="assistant"&&O.isStreaming&&yo(O.id);break}case"message.delta":{b.delta&&(ft=!0,ao=!0);const oe=he(l),O=$e?oe.find(Pe=>Pe.id===$e):null;if(O?.role==="assistant"&&O.isStreaming){const Pe=O.content,ye=Pe+(b.delta||"");wo(O.id,Pe,ye),O.reasoning&&yo(O.id),O.content=ye}else{const Pe=We(),ye=b.delta||"";wo(Pe,"",ye),Ne(l,{id:Pe,role:"assistant",content:ye,timestamp:Date.now(),isStreaming:!0}),$e=Pe}break}case"session.title.updated":ba(b);break;case"tool.started":{Vt=!0;const oe=he(l),O=b.tool_call_id,Pe=$e?oe.find(Je=>Je.id===$e):oe[oe.length-1];Pe?.isStreaming&&xe(l,Pe.id,{isStreaming:!1}),$e=null;const ye=O?oe.find(Je=>Je.role==="tool"&&Je.toolCallId===O):null;if(ye){xe(l,ye.id,{toolName:b.tool||b.name,toolArgs:po(b.arguments)?b.arguments:ye.toolArgs,toolPreview:b.preview||ye.toolPreview,toolStatus:ye.toolStatus||"running"});break}Ne(l,{id:We(),role:"tool",content:"",timestamp:Date.now(),toolName:b.tool||b.name,toolCallId:O,toolPreview:b.preview,toolArgs:Ct(b.arguments),toolStatus:"running"});break}case"tool.completed":{Vt=!0;const oe=he(l),O=b.tool_call_id,Pe=O?oe.filter(ye=>ye.role==="tool"&&ye.toolCallId===O):oe.filter(ye=>ye.role==="tool"&&ye.toolStatus==="running");if(Pe.length>0){const ye=Pe[Pe.length-1],Je=Ct(b.output),Ge=b.error===!0||Ha(Je),bt=b.duration;xe(l,ye.id,{toolStatus:Ge?"error":"done",toolDuration:bt,toolResult:Je})}break}case"workspace.diff.completed":Qe(l,b);break;case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":Vt=!0,Z(l,b);break;case"approval.requested":Eo(b);break;case"approval.resolved":Lo(b);break;case"clarify.requested":Uo(b);break;case"clarify.resolved":No(b);break;case"run.completed":{ze(l,b),A(l);const oe=he(l),O=$e?oe.find(Ge=>Ge.id===$e):oe[oe.length-1],Pe=O?.role==="assistant"&&O.isStreaming?O.id:null;if(O?.isStreaming&&xe(l,O.id,{isStreaming:!1}),It(l,"done"),b.inputTokens!=null){const Ge=a.value.find(bt=>bt.id===l);Ge&&(Ge.inputTokens=b.inputTokens,Ge.outputTokens=b.outputTokens,b.contextTokens!=null&&(Ge.contextTokens=b.contextTokens))}let ye="";if(b.parsed_content!==void 0){const Ge=he(l),bt=$e?Ge.find(io=>io.id===$e):Pe?Ge.find(io=>io.id===Pe):void 0,Aa=typeof b.parsed_content=="string"?b.parsed_content:"",ko=Aa.trim();if(bt){const io=bt.content?.trim()??"";ko||!io?(xe(l,bt.id,{content:Aa}),ye=ko,ko&&(ft=!0,ao=!0)):(ye=io,ft=!0),b.parsed_reasoning&&xe(l,bt.id,{reasoning:b.parsed_reasoning})}else ko&&(Ne(l,{id:We(),role:"assistant",content:Aa,reasoning:typeof b.parsed_reasoning=="string"?b.parsed_reasoning:void 0,timestamp:Date.now()}),ye=ko,ft=!0,ao=!0)}else{const Ge=typeof b.output=="string"?b.output:"";ye=Ge.trim(),!ft&&ye!==""&&(Ne(l,{id:We(),role:"assistant",content:Ge,timestamp:Date.now()}),ft=!0,ao=!0)}if(!ft&&!Vt&&ye===""?Ne(l,{id:We(),role:"system",content:"Error: Agent returned no output. The model call may have failed (e.g. invalid API key, model not supported by provider, or context exceeded). Check the hermes-agent logs for details.",timestamp:Date.now()}):(Za(),ti(l,Pe)),x(l),ne.value&&ao){const Ge=[...he(l)].reverse().find(bt=>bt.role==="assistant");Ge?.content&&setTimeout(()=>{ya(Ge.id,Ge.content)},300)}const Je=b.queue_remaining>0;D(l,Je),Je?f.value.set(l,b.queue_remaining):oo(),$e=null,mt=null,Tt=null,Ot(l);break}case"run.failed":if(ze(l,b),A(l),b.inputTokens!=null){const oe=a.value.find(O=>O.id===l);oe&&(oe.inputTokens=b.inputTokens,oe.outputTokens=b.outputTokens,b.contextTokens!=null&&(oe.contextTokens=b.contextTokens))}et(l,b.error),It(l,"error"),b.queue_remaining>0?f.value.set(l,b.queue_remaining):oo(),$e=null,mt=null,Tt=null;break;case"usage.updated":{const oe=a.value.find(O=>O.id===l);oe&&(oe.inputTokens=b.inputTokens,oe.outputTokens=b.outputTokens,b.contextTokens!=null&&(oe.contextTokens=b.contextTokens));break}}},()=>{const b=he(l),De=b[b.length-1];De?.isStreaming&&xe(l,De.id,{isStreaming:!1}),oo(),$e=null,mt=null,Tt=null,Ot(l)},b=>{console.warn("Socket.IO run stream error:",b.message),et(l,b.message);const De=he(l);De.forEach((oe,O)=>{oe.role==="tool"&&oe.toolStatus==="running"&&(De[O]={...oe,toolStatus:"error"})}),oo(),$e=null,mt=null,Tt=null},void 0,{onReconnectResume:b=>{if(b.session_id!==l)return;const De=a.value.find(oe=>oe.id===l);if(De){if(b.isWorking?u.value.add(l):u.value.delete(l),b.queueLength&&b.queueLength>0?f.value.set(l,b.queueLength):f.value.delete(l),Array.isArray(b.queueMessages)?Bt(l,Do(b.queueMessages)):b.queueLength||Bt(l,[]),b.isAborting?N({aborting:!0,synced:null}):b.isWorking||N(null),b.isWorking||X(l,null),b.inputTokens!=null&&(De.inputTokens=b.inputTokens),b.outputTokens!=null&&(De.outputTokens=b.outputTokens),b.contextTokens!=null&&(De.contextTokens=b.contextTokens),Array.isArray(b.messages)){const oe=$e,O=mt,Pe=Wc(b.events)??Tt;De.messages=Po(b.messages),De.loadedMessageCount=b.messageLoadedCount??b.messages.length,De.messageTotal=b.messageTotal??De.messageCount??De.loadedMessageCount,De.messageCount=De.messageTotal,De.hasMoreBefore=b.hasMoreBefore??De.loadedMessageCount<De.messageTotal,dt(l);const ye=b.isWorking?Pi(De.messages,{previousActiveAssistantMessageId:oe,previousReasoningAssistantMessageId:O,activeRunMarker:Pe}):{activeAssistant:null,reasoningAssistant:null,runMarker:null,hadVisibleText:!1},Je=ye.activeAssistant,Ge=ye.reasoningAssistant;Tt=ye.runMarker,Je?(Je.isStreaming=!0,$e=Je.id,ye.hadVisibleText&&(ft=!0)):$e=null,Ge?(mt=Ge.id,Ge.reasoning&&Wt(Ge.id)):mt=null}if(b.events?.length)for(const oe of b.events){const O=oe.data;switch(O.event){case"compression.started":X(l,{compressing:!0,messageCount:O.message_count||0,beforeTokens:O.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const Pe=O.contextTokens||O.afterTokens||0;X(l,{compressing:!1,messageCount:O.totalMessages||0,beforeTokens:O.beforeTokens||0,afterTokens:Pe,compressed:O.compressed??!1,error:O.error}),O.contextTokens!=null&&(De.contextTokens=O.contextTokens);break}case"abort.started":N({aborting:!0,synced:null});break;case"abort.timeout":N({aborting:!0,synced:!1,timedOut:!0,message:O.message});break;case"abort.completed":N({aborting:!1,synced:O.synced??!1});break;case"approval.requested":Eo({...O,session_id:l});break;case"approval.resolved":Lo({...O,session_id:l});break;case"clarify.requested":Uo({...O,session_id:l});break;case"clarify.resolved":No({...O,session_id:l});break;case"run.failed":ze(l,O),et(l,O.error);break;case"agent.event":pt(O);break}}n.value===l&&(F.value=De),!b.isWorking&&!(b.queueLength&&b.queueLength>0)&&(A(l),oo(),$e=null,Ot(l))}},transport:q()});we=!0,k?(u.value.add(l),c.value.set(l,ai)):(!m||M||te||Be)&&c.value.set(l,ai)}catch(ve){if(de){const Fe=new Set(h.value);Fe.delete(l),h.value=Fe}pe&&!we&&qt(l,re.id),!pe&&!we&&u.value.delete(l),Ne(l,{id:We(),role:"system",content:`Error: ${ve.message}`,timestamp:Date.now()})}}function eo(o,i=!1){if(c.value.has(o)||!i&&!u.value.has(o))return;let d=!1,l=!1,v=!1,k=!1,m=null,M=null,te=null;const U=()=>{d||(d=!0,c.value.delete(o),u.value.delete(o),Yd(o))},qe=()=>{he(o).forEach(g=>{g.role==="assistant"&&g.isStreaming&&xe(o,g.id,{isStreaming:!1})}),m=null,M=null,te=null};(()=>{const g=Pi(he(o),{activeRunMarker:te});te=g.runMarker,g.activeAssistant&&(g.activeAssistant.isStreaming=!0,m=g.activeAssistant.id,g.hadVisibleText&&(l=!0)),g.reasoningAssistant&&(M=g.reasoningAssistant.id,g.reasoningAssistant.reasoning&&Wt(g.reasoningAssistant.id))})();function de(g){if(d||g.session_id&&g.session_id!==o)return;const it=yt(g);switch(it&&(te=it),g.event){case"run.queued":Xa(o,g);break;case"session.command":ut(g);break;case"agent.event":pt(g);break;case"run.reattach_failed":pt(g);break;case"run.started":ie(o),u.value.add(o),A(o),N(null),X(o,null),l=!1,v=!1,k=!1,qe(),te=yt(g)??null,g.queue_length>0?f.value.set(o,g.queue_length):f.value.delete(o);break;case"compression.started":X(o,{compressing:!0,messageCount:g.message_count||0,beforeTokens:g.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const pe=g.contextTokens||g.afterTokens||0;if(X(o,{compressing:!1,messageCount:g.totalMessages||0,beforeTokens:g.beforeTokens||0,afterTokens:pe,compressed:g.compressed??!1,error:g.error}),g.contextTokens!=null){const re=a.value.find(we=>we.id===o);re&&(re.contextTokens=g.contextTokens)}setTimeout(()=>{const re=E.value.get(o);re&&!re.compressing&&X(o,null)},5e3);break}case"abort.started":N({aborting:!0,synced:null});break;case"abort.timeout":N({aborting:!0,synced:!1,timedOut:!0,message:g.message});break;case"abort.completed":{if(N({aborting:!1,synced:g.synced??!1}),fa(o),g.queue_length>0){f.value.set(o,g.queue_length),N(null);break}const pe=he(o),re=pe[pe.length-1];re?.isStreaming&&xe(o,re.id,{isStreaming:!1}),pe.forEach((we,ve)=>{we.role==="tool"&&we.toolStatus==="running"&&(pe[ve]={...we,toolStatus:"done"})}),U(),N(null);break}case"reasoning.delta":case"thinking.delta":{const pe=g.text||g.delta||"";if(!pe)break;l=!0;const re=he(o),we=M||m,ve=we?re.find(Fe=>Fe.id===we):null;if(ve?.role==="assistant")ve.reasoning=(ve.reasoning||"")+pe,M=ve.id,Wt(ve.id);else{const Fe=We();Ne(o,{id:Fe,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:pe}),m=Fe,M=Fe,Wt(Fe)}break}case"moa.reference":k=!0,Ue(o,g);break;case"moa.aggregating":k=!0,Ue(o,g);break;case"reasoning.available":{const pe=he(o),re=pe[pe.length-1];re?.role==="assistant"&&re.isStreaming&&yo(re.id);break}case"message.delta":{g.delta&&(l=!0,v=!0);const pe=he(o),re=m?pe.find(we=>we.id===m):null;if(re?.role==="assistant"&&re.isStreaming){const we=re.content,ve=we+(g.delta||"");wo(re.id,we,ve),re.reasoning&&yo(re.id),re.content=ve}else{const we=We(),ve=g.delta||"";wo(we,"",ve),Ne(o,{id:we,role:"assistant",content:ve,timestamp:Date.now(),isStreaming:!0}),m=we}break}case"session.title.updated":ba(g);break;case"tool.started":{k=!0;const pe=he(o),re=g.tool_call_id,we=m?pe.find(Fe=>Fe.id===m):pe[pe.length-1];we?.isStreaming&&xe(o,we.id,{isStreaming:!1}),m=null;const ve=re?pe.find(Fe=>Fe.role==="tool"&&Fe.toolCallId===re):null;if(ve){xe(o,ve.id,{toolName:g.tool||g.name,toolArgs:po(g.arguments)?g.arguments:ve.toolArgs,toolPreview:g.preview||ve.toolPreview,toolStatus:ve.toolStatus||"running"});break}Ne(o,{id:We(),role:"tool",content:"",timestamp:Date.now(),toolName:g.tool||g.name,toolCallId:re,toolPreview:g.preview,toolArgs:Ct(g.arguments),toolStatus:"running"});break}case"tool.completed":{k=!0;const pe=he(o),re=g.tool_call_id,we=re?pe.filter(ve=>ve.role==="tool"&&ve.toolCallId===re):pe.filter(ve=>ve.role==="tool"&&ve.toolStatus==="running");if(we.length>0){const ve=Ct(g.output),Fe=g.error===!0||Ha(ve);xe(o,we[we.length-1].id,{toolStatus:Fe?"error":"done",toolDuration:g.duration,toolResult:ve})}break}case"workspace.diff.completed":Qe(o,g);break;case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":k=!0,Z(o,g);break;case"approval.requested":Eo(g);break;case"approval.resolved":Lo(g);break;case"clarify.requested":Uo(g);break;case"clarify.resolved":No(g);break;case"run.completed":{ze(o,g),A(o);const pe=g.queue_remaining>0;pe?f.value.set(o,g.queue_remaining):f.value.delete(o);const re=he(o),we=m?re.find(Ye=>Ye.id===m):re[re.length-1],ve=we?.role==="assistant"&&we.isStreaming?we.id:null;if(we?.isStreaming&&xe(o,we.id,{isStreaming:!1}),It(o,"done"),g.inputTokens!=null){const Ye=a.value.find(st=>st.id===o);Ye&&(Ye.inputTokens=g.inputTokens,Ye.outputTokens=g.outputTokens,g.contextTokens!=null&&(Ye.contextTokens=g.contextTokens))}let Fe="";if(g.parsed_content!==void 0){const Ye=he(o),st=m?Ye.find(Pt=>Pt.id===m):ve?Ye.find(Pt=>Pt.id===ve):void 0,Kt=typeof g.parsed_content=="string"?g.parsed_content:"",Dt=Kt.trim();if(st){const Pt=st.content?.trim()??"";Dt||!Pt?(xe(o,st.id,{content:Kt}),Fe=Dt,Dt&&(l=!0,v=!0)):(Fe=Pt,l=!0),g.parsed_reasoning&&xe(o,st.id,{reasoning:g.parsed_reasoning})}else Dt&&(Ne(o,{id:We(),role:"assistant",content:Kt,reasoning:typeof g.parsed_reasoning=="string"?g.parsed_reasoning:void 0,timestamp:Date.now()}),Fe=Dt,l=!0,v=!0)}else{const Ye=typeof g.output=="string"?g.output:"";Fe=Ye.trim(),!l&&Fe!==""&&(Ne(o,{id:We(),role:"assistant",content:Ye,timestamp:Date.now()}),l=!0,v=!0)}if(!l&&!k&&Fe===""?Ne(o,{id:We(),role:"system",content:"Error: Agent returned no output. The model call may have failed (e.g. invalid API key, model not supported by provider, or context exceeded). Check the hermes-agent logs for details.",timestamp:Date.now()}):(Za(),ti(o,ve)),x(o),ne.value&&v){const Ye=[...he(o)].reverse().find(st=>st.role==="assistant");Ye?.content&&setTimeout(()=>{ya(Ye.id,Ye.content)},300)}pe?(D(o,!0),m=null,M=null,te=null):(D(o),U(),m=null,M=null,te=null),Ot(o);break}case"run.failed":{if(ze(o,g),A(o),g.inputTokens!=null){const re=a.value.find(we=>we.id===o);re&&(re.inputTokens=g.inputTokens,re.outputTokens=g.outputTokens,g.contextTokens!=null&&(re.contextTokens=g.contextTokens))}const pe=g.queue_remaining>0;pe?f.value.set(o,g.queue_remaining):f.value.delete(o),et(o,g.error),It(o,"error"),pe||U(),m=null,M=null,te=null;break}case"usage.updated":{const pe=a.value.find(re=>re.id===o);pe&&(pe.inputTokens=g.inputTokens,pe.outputTokens=g.outputTokens,g.contextTokens!=null&&(pe.contextTokens=g.contextTokens));break}}}Qd(o,{onMessageDelta:g=>de(g),onReasoningDelta:g=>de(g),onThinkingDelta:g=>de(g),onReasoningAvailable:g=>de(g),onToolStarted:g=>de(g),onToolCompleted:g=>de(g),onWorkspaceDiffCompleted:g=>de(g),onSubagentEvent:g=>de(g),onRunStarted:g=>de(g),onRunCompleted:g=>de(g),onRunFailed:g=>de(g),onCompressionStarted:g=>de(g),onCompressionCompleted:g=>de(g),onAbortStarted:g=>de(g),onAbortTimeout:g=>de(g),onAbortCompleted:g=>de(g),onUsageUpdated:g=>de(g),onAgentEvent:g=>de(g),onSessionCommand:g=>de(g),onRunQueued:g=>de(g),onClarifyRequested:g=>de(g),onClarifyResolved:g=>de(g)}),c.value.set(o,{abort:()=>{xa(q())?.emit("abort",{session_id:o})}})}function Dn(o){const i=o.session_id;if(!i||n.value!==i||!F.value)return;const d=o.message,l=typeof d?.content=="string"?d.content:"";if(!l.trim())return;const v=d?.id!=null?String(d.id):"",k=d?.role==="command",m=he(i);if(v&&m.some(qe=>qe.id===v)){u.value.add(i),eo(i,!0);return}if(v&&(P.value.get(i)||[]).some(qe=>qe.id===v))if(k&&!d?.queued)qt(i,v);else{u.value.add(i),eo(i,!0);return}const M=typeof d?.timestamp=="number"&&Number.isFinite(d.timestamp)?Math.round(d.timestamp*1e3):Date.now(),te={id:v||We(),role:k?"command":"user",content:l,timestamp:M,queued:!!d?.queued,systemType:k?"command":void 0},U=v?_n(i,v):!1;d?.queued||!k&&!U&&Y(i)?Nt(i,te):(Ne(i,te),Ot(i)),u.value.add(i),eo(i,!0)}Xd(Dn);function En(o){const i=o.session_id;if(!i||n.value!==i||!F.value)return;const d=o.started===!0&&o.terminal===!1;ut(o),d&&(u.value.add(i),eo(i,!0))}Zd(En),ec(ba);function Ln(){const o=n.value;if(!o||J.value)return;fa(o);const i=c.value.get(o);if(i){N({aborting:!0,synced:null}),i.abort();const d=he(o),l=d[d.length-1];l?.isStreaming&&xe(o,l.id,{isStreaming:!1});return}if(u.value.has(o)){N({aborting:!0,synced:null}),xa(q())?.emit("abort",{session_id:o});const d=he(o),l=d[d.length-1];l?.isStreaming&&xe(o,l.id,{isStreaming:!1})}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&!R.value&&ct(),document.visibilityState==="visible"&&n.value&&!R.value){const o=n.value;o&&!c.value.has(o)&&fi(o,i=>{i.isWorking?u.value.add(o):u.value.delete(o),i.isAborting?N({aborting:!0,synced:null}):i.isWorking||N(null),i.isWorking||X(o,null),i.messages?.length&&F.value&&(F.value.messages=Po(i.messages),F.value.loadedMessageCount=i.messageLoadedCount??i.messages.length,F.value.messageTotal=i.messageTotal??F.value.messageCount??F.value.loadedMessageCount,F.value.messageCount=F.value.messageTotal,F.value.hasMoreBefore=i.hasMoreBefore??F.value.loadedMessageCount<F.value.messageTotal,dt(o)),eo(o)},F.value?.profile,q())}}),typeof window<"u"&&window.setInterval(()=>{typeof document<"u"&&document.visibilityState!=="visible"||R.value||ct()},12e3);const Ft=new Map;function Un(o){return Ft.get(o)}function wo(o,i,d){const{startedAtBoundary:l,endedAtBoundary:v}=_c(i,d);if(!l&&!v)return;const k=Ft.get(o)||{};l&&k.startedAt===void 0&&(k.startedAt=Date.now()),v&&k.endedAt===void 0&&(k.endedAt=Date.now()),Ft.set(o,k)}function Wt(o){const i=Ft.get(o)||{};i.startedAt===void 0&&(i.startedAt=Date.now(),Ft.set(o,i))}function yo(o){const i=Ft.get(o);!i||i.startedAt===void 0||i.endedAt===void 0&&(i.endedAt=Date.now(),Ft.set(o,i))}function Nn(o){if(!o)return;const i=o.toLowerCase();for(const d of a.value)(d.provider||"").toLowerCase()===i&&(d.model=void 0,d.provider="")}const wa="hermes:reasoning_effort:";function qn(o,i){const d=a.value.find(l=>l.id===o);if(d){d.reasoningEffort=i||void 0;try{i?localStorage.setItem(wa+o,i):localStorage.removeItem(wa+o)}catch{}}}function zn(o){try{return localStorage.getItem(wa+o)||void 0}catch{return}}ot(a,o=>{for(const i of o)if(i.reasoningEffort===void 0){const d=zn(i.id);d&&(i.reasoningEffort=d)}},{deep:!1});function oi(o){Ft.clear()}function ya(o,i){const d=new CustomEvent("auto-play-speech",{detail:{messageId:o,content:i}});window.dispatchEvent(d)}return{sessions:a,runtimeMode:e,activeSessionId:n,activeSession:F,focusMessageId:r,messages:Ae,isStreaming:R,isForkPending:B,isRunActive:me,isSessionLive:Y,isSessionCompletedUnread:be,clearSessionCompletedUnread:ie,sessionProfileFilter:H,compressionState:Q,abortState:_e,isAborting:J,queueLengths:f,queuedUserMessages:P,pendingApprovals:L,activePendingApproval:j,activePendingClarify:ue,removeQueuedMessage:zt,isLoadingSessions:ae,sessionsLoaded:ge,isLoadingMessages:Ie,newChat:ma,newCliSession:Zt,switchSession:Le,ensureSessionLoaded:At,loadOlderMessages:pa,switchSessionModel:ga,addOrUpdateSession:kt,clearProviderFromSessions:Nn,deleteSession:Fo,archiveSession:ha,sendMessage:Fn,stopStreaming:Ln,respondApproval:Mn,respondToClarify:xn,loadSessions:Lt,refreshSessionListOnly:ct,refreshActiveSession:Xt,getThinkingObservation:Un,noteThinkingDelta:wo,noteReasoningStart:Wt,noteReasoningEnd:yo,clearThinkingObservationFor:oi,setAutoPlaySpeech:T,playMessageSpeech:ya,loadWorkspaceRunChangeFile:Ht,setSessionReasoningEffort:qn,setRuntimeMode:G}})}));function wn(){function e(){Xo.value=!0}function t(){Xo.value=!1}return{sessionSearchOpen:Xo,openSessionSearch:e,closeSessionSearch:t}}var Xo,yn=Re((()=>{Oe(),Xo=w(!1)}));Oe();vo();bn();yn();function Xc(){const e=da(),t=$a(),{sessionSearchOpen:a,openSessionSearch:n,closeSessionSearch:r}=wn();function c(u){const h=u.ctrlKey||u.metaKey;if(h&&u.key==="n"){u.preventDefault(),t.newChat();return}if(h&&u.key==="j"){u.preventDefault(),e.push({name:"hermes.jobs"});return}if(h&&u.key.toLowerCase()==="k"){if(e.currentRoute.value.name==="login")return;u.preventDefault(),n();return}if(u.key==="Escape"){if(a.value){u.preventDefault(),r();return}const S=document.querySelector(".n-modal-mask");S&&S.querySelector(".n-base-close")?.click()}}go(()=>{window.addEventListener("keydown",c)}),Mo(()=>{window.removeEventListener("keydown",c)})}Oe();vo();Mt();gt();nn();bn();yn();var Zc={class:"session-search-modal"},eu={class:"search-header"},tu={class:"search-title"},ou={class:"search-hint"},au={class:"search-scope"},iu={class:"search-body"},nu={key:0,class:"search-empty"},ru={key:1,class:"result-list"},su=["onClick","onMouseenter"],lu={class:"result-main"},du={class:"result-title-row"},cu={class:"result-title"},uu={class:"result-source"},pu={class:"result-snippet"},mu={class:"result-meta"},gu={class:"result-time"},hu={key:0,class:"result-match"},vu={class:"search-footer"},fu=nt({__name:"SessionSearchModal",setup(e){const{t}=St(),a=Ro(),n=da(),r=$a(),{sessionSearchOpen:c}=wn(),u=w(""),h=w(!1),S=w([]),H=w([]),f=w(0),P=w(null),V=ee(()=>r.sessionProfileFilter||void 0),L=ee(()=>r.runtimeMode==="global_agent"?"global_agent":void 0);let j=null,z=0;const ue=ee(()=>u.value.trim().length>0),ne=ee(()=>ue.value?H.value:S.value.map(E=>({...E,matched_message_id:null,snippet:E.preview||"",rank:0})));function T(E){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat",global_agent:"Global Agent"}[E]||E}function R(E){return E?new Date(E*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function B(E){const Q=E.title?.trim();return Q||(E.preview?.trim()?E.preview.trim():E.id)}async function ae(){const E=++z;h.value=!0;try{const Q=V.value?await _o(L.value,8,V.value):await _o(L.value,8);if(E!==z)return;S.value=Q,H.value=[],f.value=0}catch(Q){if(E!==z)return;a.error(Q instanceof Error?Q.message:t("chat.searchFailed"))}finally{E===z&&(h.value=!1)}}async function ge(E){const Q=++z;h.value=!0;try{const X=E.trim()?V.value?await bi(E.trim(),L.value,10,V.value):await bi(E.trim(),L.value,10):[];if(Q!==z)return;H.value=X,f.value=0}catch(X){if(Q!==z)return;a.error(X instanceof Error?X.message:t("chat.searchFailed"))}finally{Q===z&&(h.value=!1)}}async function Ie(){r.sessions.length===0&&await r.loadSessions(r.sessionProfileFilter)}async function me(E){const Q=E.matched_message_id!=null?String(E.matched_message_id):null;c.value=!1,await Ie(),!r.sessions.some(_e=>_e.id===E.id)&&typeof r.addOrUpdateSession=="function"&&r.addOrUpdateSession({id:E.id,profile:E.profile||"default",title:E.title||"",source:E.source,messages:[],createdAt:Math.round(E.started_at*1e3),updatedAt:Math.round((E.last_active||E.ended_at||E.started_at)*1e3),model:E.model,provider:E.provider||E.billing_provider||"",messageCount:E.message_count,endedAt:E.ended_at!=null?Math.round(E.ended_at*1e3):null,lastActiveAt:E.last_active!=null?Math.round(E.last_active*1e3):void 0,workspace:E.workspace||null}),await r.switchSession(E.id,Q);const X=r.runtimeMode==="global_agent"?"hermes.globalAgentSession":"hermes.session";(n.currentRoute.value.name!==X||n.currentRoute.value.params.sessionId!==E.id)&&await n.push({name:X,params:{sessionId:E.id}})}function I(){c.value=!1}function q(E){const Q=ne.value;Q.length!==0&&(f.value=(f.value+E+Q.length)%Q.length)}async function G(E){if(c.value){if(E.key==="ArrowDown"){E.preventDefault(),q(1);return}if(E.key==="ArrowUp"){E.preventDefault(),q(-1);return}if(E.key==="Enter"){E.preventDefault();const Q=ne.value[f.value];Q&&await me(Q);return}E.key==="Escape"&&(E.preventDefault(),I())}}return ot(()=>c.value,async E=>{if(!E){u.value="",H.value=[],S.value=[],f.value=0;return}u.value="",H.value=[],f.value=0,await ae(),await Oi(),P.value?.focus?.()}),ot(u,E=>{j&&(clearTimeout(j),j=null),j=setTimeout(()=>{c.value&&ge(E)},160)}),ot(ne,()=>{f.value>=ne.value.length&&(f.value=0)}),go(()=>{window.addEventListener("keydown",G)}),Mo(()=>{window.removeEventListener("keydown",G),j&&clearTimeout(j)}),(E,Q)=>(_(),ke(p(mo),{show:p(c),"onUpdate:show":Q[1]||(Q[1]=X=>ar(c)?c.value=X:null),preset:"card",title:p(t)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:W(()=>[s("div",Zc,[s("div",eu,[s("div",tu,y(p(t)("chat.searchSubtitle")),1),s("div",ou,y(p(t)("chat.searchHint")),1)]),s("div",au,y(p(t)("chat.searchScope")),1),se(p(Da),{ref_key:"inputRef",ref:P,value:u.value,"onUpdate:value":Q[0]||(Q[0]=X=>u.value=X),placeholder:p(t)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),s("div",iu,[se(p(Va),{show:h.value},{default:W(()=>[ne.value.length===0?(_(),$("div",nu,y(ue.value?p(t)("chat.searchNoResults"):p(t)("chat.searchEmpty")),1)):(_(),$("div",ru,[(_(!0),$(xt,null,_t(ne.value,(X,_e)=>(_(),$("button",{key:X.id,class:Ze(["result-item",{active:_e===f.value}]),onClick:J=>me(X),onMouseenter:J=>f.value=_e},[s("div",lu,[s("div",du,[s("span",cu,y(B(X)),1),s("span",uu,y(T(X.source)),1)]),s("div",pu,y(ue.value?X.snippet||p(t)("chat.searchNoSnippet"):X.preview||p(t)("chat.searchRecent")),1)]),s("div",mu,[s("span",gu,y(R(X.last_active||X.started_at)),1),ue.value&&X.matched_message_id!=null?(_(),$("span",hu," #"+y(X.matched_message_id),1)):le("",!0)])],42,su))),128))]))]),_:1},8,["show"])]),s("div",vu,[s("span",null,y(p(t)("chat.searchEnterHint")),1),se(p(je),{quaternary:"",size:"small",onClick:I},{default:W(()=>[Te(y(p(t)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});ht();var bu=vt(fu,[["__scopeId","data-v-0a1e0642"]]);Oe();gt();Mt();var wu={style:{display:"none"},"aria-hidden":"true"},yu=nt({__name:"AuthEventListener",setup(e){const t=Ro(),{t:a}=St();let n=0;function r(c){const u=c.detail||{},h=Date.now();if(!(h-n<1200)){if(n=h,u.kind==="forbidden"){t.error(a("login.accessDenied"));return}t.error(a("login.sessionExpired"))}}return go(()=>{window.addEventListener("hermes-auth-notice",r)}),Mo(()=>{window.removeEventListener("hermes-auth-notice",r)}),(c,u)=>(_(),$("span",wu))}}),Su=yu;async function sm(){const e=await fetch("/api/auth/status");if(!e.ok)throw new Error("Failed to fetch auth status");return e.json()}async function lm(e,t){const a=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:e,password:t})});if(!a.ok){const n=await a.json().catch(()=>({})),r=new Error(n.error||"Login failed");throw r.status=a.status,r}return(await a.json()).token}async function Au(){return(await K("/api/auth/me")).user}async function dm(){const e=await K("/api/auth/avatar");if(!e.avatar)return null;try{const t=JSON.parse(e.avatar);return t&&(t.type==="image"||t.type==="default")?t:null}catch{return null}}async function cm(e){const t=JSON.stringify(e);await K("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:t})})}async function um(){await K("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:{type:"default"}})})}async function pm(e,t){return K("/api/auth/change-password",{method:"POST",body:JSON.stringify({currentPassword:e,newPassword:t})})}async function mm(e,t){return K("/api/auth/change-username",{method:"POST",body:JSON.stringify({currentPassword:e,newUsername:t})})}async function Ja(){return K("/api/auth/users")}async function gm(e){const t=await K("/api/auth/users",{method:"POST",body:JSON.stringify(e)});return{...await Ja(),users:t.users}}async function hm(e,t){const a=await K(`/api/auth/users/${e}`,{method:"PUT",body:JSON.stringify(t)});return{...await Ja(),users:a.users}}async function vm(e){const t=await K(`/api/auth/users/${e}`,{method:"DELETE"});return{...await Ja(),users:t.users}}async function fm(){return(await K("/api/auth/locked-ips")).locks}async function bm(e){return K(`/api/auth/locked-ips?ip=${encodeURIComponent(e)}`,{method:"DELETE"})}async function wm(){return(await K("/api/auth/locked-ips",{method:"DELETE"})).count}var ku=Re((()=>{rt()}));Oe();vo();gt();Mt();ku();rt();var Pu={class:"credential-warning-text"},Tu=nt({__name:"DefaultCredentialPrompt",setup(e){const{t}=St(),a=la(),n=da(),r=w(!1),c=w(!1),u=w(""),h=w(null);function S(L){return`hermes_default_credentials_prompt_dismissed_${L}`}function H(){return window.hermesDesktop?.isDesktop===!0}async function f(){if(H()){r.value=!1;return}if(a.name==="login"){r.value=!1;return}const L=Yt();if(!(!L||L===u.value)){u.value=L,c.value=!0;try{const j=await Au();h.value=j.id;const z=sessionStorage.getItem(S(j.id))==="1";r.value=!!j.requiresCredentialChange&&!z}catch{r.value=!1}finally{c.value=!1}}}function P(){h.value!=null&&sessionStorage.setItem(S(h.value),"1"),r.value=!1}function V(){r.value=!1,n.push({name:"hermes.settings",query:{tab:"account"}})}return ot(()=>a.fullPath,()=>{f()},{immediate:!0}),(L,j)=>(_(),ke(p(mo),{show:r.value,"onUpdate:show":j[0]||(j[0]=z=>r.value=z),preset:"dialog",title:p(t)("login.defaultCredentialTitle"),"mask-closable":!1},{action:W(()=>[se(p(je),{disabled:c.value,onClick:P},{default:W(()=>[Te(y(p(t)("login.defaultCredentialLater")),1)]),_:1},8,["disabled"]),se(p(je),{type:"primary",loading:c.value,onClick:V},{default:W(()=>[Te(y(p(t)("login.defaultCredentialAction")),1)]),_:1},8,["loading"])]),default:W(()=>[s("p",Pu,y(p(t)("login.defaultCredentialMessage")),1)]),_:1},8,["show","title"]))}});ht();var Cu=vt(Tu,[["__scopeId","data-v-3a600c1f"]]),_u,xu=Re((()=>{_u="/icons/pet-resize.svg"}));async function Mu(){return(await K("/api/hermes/pets/active")).pet}async function Ru(e){return(await K("/api/hermes/pets/adopt",{method:"POST",body:JSON.stringify({slug:e})})).pet}async function Hu(e){return(await K("/api/hermes/pets/active",{method:"PATCH",body:JSON.stringify(e)})).pet}var Iu=Re((()=>{rt()})),Sn,Fu=Re((()=>{Oe(),Qt(),Iu(),Sn=ho("pets",()=>{const e=w(null),t=w(!1),a=w(!1),n=w(""),r=ee(()=>!!e.value?.enabled);async function c(){t.value=!0,n.value="";try{return e.value=await Mu(),e.value}catch(f){return n.value=f?.message||"Failed to load active pet",e.value=null,null}finally{t.value=!1}}async function u(f){a.value=!0,n.value="";try{return e.value=await Ru(f),e.value}catch(P){throw n.value=P?.message||"Failed to adopt pet",P}finally{a.value=!1}}async function h(f){if(e.value){e.value={...e.value,...typeof f.scale=="number"?{scale:f.scale}:{},...f.position?{position:f.position}:{},...typeof f.enabled=="boolean"?{enabled:f.enabled}:{}},a.value=!0;try{const P=await Hu(f);P?e.value=P:f.enabled===!1&&(e.value=null)}finally{a.value=!1}}}async function S(){await h({enabled:!1})}function H(){e.value=null,n.value=""}return{activePet:e,loading:t,saving:a,error:n,hasActivePet:r,loadActivePet:c,adopt:u,savePreferences:h,hideActivePet:S,clear:H}})}));function Du(e){return e||Ga()||"default"}function Qa(e){const t=Du(e);return wt&&ra===t||(wt&&(wt.disconnect(),wt=null),ra=t,wt=Ki(`${fo()}/pet-state`,{auth:{token:Yt()},query:{profile:t},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4})),wt}function Eu(){wt?.disconnect(),wt=null,ra=null}function Lu(e,t){const a=Qa(t);return a.on("pet.state.snapshot",e),a.on("pet.state.updated",e),()=>{a.off("pet.state.snapshot",e),a.off("pet.state.updated",e)}}function Uu(e){const t=Qa(e);return new Promise((a,n)=>{t.timeout(1e4).emit("pet.state.get",(r,c)=>{if(r){n(r);return}a(c)})})}var wt,ra,Nu=Re((()=>{Vi(),rt(),wt=null,ra=null}));function qu(e="default"){return{profile:e,state:"idle",activity:{},updatedAt:Date.now(),activeTools:[],awaiting:[]}}var An,zu=Re((()=>{Oe(),Qt(),Nu(),An=ho("petState",()=>{const e=w(qu()),t=w(!1),a=w("");let n=null;const r=ee(()=>e.value.state),c=ee(()=>e.value.activity);async function u(S){h(),a.value="";const H=Qa(S);H.on("connect",()=>{t.value=!0,a.value=""}),H.on("disconnect",()=>{t.value=!1}),H.on("connect_error",f=>{t.value=!1,a.value=f.message}),n=Lu(f=>{e.value=f},S);try{e.value=await Uu(S)}catch(f){a.value=f instanceof Error?f.message:String(f)}}function h(){n?.(),n=null,Eu(),t.value=!1}return{activity:c,connect:u,connected:t,disconnect:h,error:a,snapshot:e,state:r}})}));function sa(){return window.hermesDesktop}var Ya=Re((()=>{})),xi,Mi,Oo,Wo,Ri,Hi,Ii,Fi,ro,kn,Di=Re((()=>{Oe(),xu(),vo(),gt(),Fu(),zu(),Io(),Ya(),xi=["aria-label"],Mi=["aria-label","title"],Oo=.18,Wo=1.2,Ri=.06,Hi=350,Ii=180,Fi=520,ro=80,kn=nt({__name:"WebPet",props:{desktopWindow:{type:Boolean}},setup(e){const t=e,a=la(),{t:n}=St(),r=Sn(),c=An(),u=Et(),h=sa(),S=w(null),H=w(null),f=w(0),P=w({x:0,y:0}),V=w(.33),L=w(!1),j=w(!1),z=w({x:0,y:0}),ue=w({pointerX:0,width:0}),ne=w({width:0,height:0,dpr:0}),T=w(0),R=w("idle"),B=w("");let ae=null,ge=null,Ie=null,me=null,I=0,q="",G=null,E=null;const Q=ee(()=>t.desktopWindow===!0),X=ee(()=>!Q.value&&a.name==="login"),_e=ee(()=>r.activePet),J=ee(()=>!X.value&&!!_e.value?.enabled&&!!H.value),N=ee(()=>_e.value?.frameW||192),F=ee(()=>_e.value?.frameH||208),Ae=ee(()=>Math.round(N.value*V.value)),Ke=ee(()=>Math.round(F.value*V.value)),lt=ee(()=>{const A=_e.value;if(!A)return 0;if(B.value){const ut=A.stateRows.indexOf(B.value);if(ut>=0)return ut}const Z=R.value,Ue=Z==="run"?"running":Z==="wave"?"waving":Z==="jump"?"jumping":Z,et=A.stateRows.indexOf(Ue);return et>=0?et:0}),Y=ee(()=>Q.value?{left:`${ro/2}px`,top:`${ro/2}px`,width:`${Ae.value}px`,height:`${Ke.value}px`}:{left:`${P.value.x}px`,top:`${P.value.y}px`,width:`${Ae.value}px`,height:`${Ke.value}px`});function be(A,Z,Ue){return Math.min(Ue,Math.max(Z,A))}function ie(A){if(Q.value)return{x:Math.round(A.x),y:Math.round(A.y)};const Z=Math.max(0,window.innerWidth-Ae.value),Ue=Math.max(0,window.innerHeight-Ke.value);return{x:Math.round(be(A.x,0,Z)),y:Math.round(be(A.y,0,Ue))}}function D(){return Q.value?{x:Math.round(window.screenX||0),y:Math.round(window.screenY||0)}:ie({x:window.innerWidth-Ae.value-28,y:window.innerHeight-Ke.value-28})}function Me(A){V.value=be(A.scale||.33,Oo,Wo),P.value=A.position?ie(A.position):D(),Q.value&&ce(!1)}function C(){return{x:P.value.x,y:P.value.y,width:Ae.value+ro,height:Ke.value+ro}}function x(){return Q.value?ro/2:0}async function ce(A=J.value){if(!Q.value||!h?.setPetWindowBounds)return;const Z=await h.setPetWindowBounds(C());P.value={x:Z.bounds.x,y:Z.bounds.y},A&&h.setPetWindowVisible&&await h.setPetWindowVisible(!0)}async function Ce(A){!Q.value||!h?.setPetWindowVisible||await h.setPetWindowVisible(A)}async function Ee(){if(!Q.value||!h?.getPetWindowState||_e.value?.position)return;const A=await h.getPetWindowState();P.value={x:A.bounds.x,y:A.bounds.y}}async function Ve(){if(!Q.value||localStorage.getItem("hermes_api_key"))return;const A=await h?.getToken?.().catch(()=>"");if(A)try{localStorage.setItem("AUTH_TOKEN",A);const Z=await(await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${A}`},body:JSON.stringify({username:"admin",password:"123456"})})).json().catch(()=>null),Ue=Z?.token||Z?.jwt;Ue&&localStorage.setItem("hermes_api_key",Ue)}catch{}for(let Z=0;Z<20&&!localStorage.getItem("hermes_api_key");Z+=1)await new Promise(Ue=>window.setTimeout(Ue,100))}function He(){const A=S.value,Z=_e.value,Ue=H.value;if(!A||!Z||!Ue)return;const et=window.devicePixelRatio||1,ut=Ae.value,pt=Ke.value,Nt=Math.max(1,Math.round(ut*et)),bo=Math.max(1,Math.round(pt*et)),qt=ne.value;(qt.width!==Nt||qt.height!==bo||qt.dpr!==et)&&(A.width=Nt,A.height=bo,A.style.width=`${ut}px`,A.style.height=`${pt}px`,ne.value={width:Nt,height:bo,dpr:et});const zt=A.getContext("2d");zt&&(zt.setTransform(et,0,0,et,0,0),zt.clearRect(0,0,ut,pt),zt.imageSmoothingEnabled=!0,zt.drawImage(Ue,T.value*Z.frameW,lt.value*Z.frameH,Z.frameW,Z.frameH,0,0,ut,pt))}function at(){Qe();const A=_e.value;if(!A)return;const Z=Math.max(80,Math.round(A.loopMs/A.framesPerState));ae=window.setInterval(()=>{T.value=(T.value+1)%A.framesPerState,He()},Z)}function Qe(){ae!=null&&(window.clearInterval(ae),ae=null)}function ze(){ge!=null&&window.clearTimeout(ge),ge=window.setTimeout(()=>{r.savePreferences({scale:V.value,position:P.value})},Hi)}function dt(){Ie!=null&&(window.clearTimeout(Ie),Ie=null)}function Rt(){me!=null&&(window.clearTimeout(me),me=null)}function Ht(A){R.value!==A&&(B.value="",R.value=A,I=Date.now(),T.value=0,He())}function At(A,Z){dt(),Rt(),Ht(A),Z&&(me=window.setTimeout(()=>{me=null,ct(c.state)},Z))}function Lt(A){const Z=_e.value?.loopMs||1100;return A==="jump"?Z+40:Z}function ct(A){if(me!=null)return;if(R.value===A){dt();return}dt();const Z=A==="failed"||A==="waiting"||A==="wave"||A==="jump",Ue=Date.now()-I,et=Z?0:Math.max(Ii,Fi-Ue);Ie=window.setTimeout(()=>{Ie=null,c.state===A&&Ht(A)},et)}function Xt(A){!J.value||j.value||(L.value=!0,At("run"),B.value="",z.value={x:(Q.value?A.screenX:A.clientX)-P.value.x-x(),y:(Q.value?A.screenY:A.clientY)-P.value.y-x()},A.currentTarget.setPointerCapture(A.pointerId))}function Ut(A){if(!L.value||j.value)return;const Z=P.value.x;P.value=ie({x:(Q.value?A.screenX:A.clientX)-z.value.x-x(),y:(Q.value?A.screenY:A.clientY)-z.value.y-x()});const Ue=P.value.x-Z;Math.abs(Ue)>=1&&(B.value=Ue<0?"running-left":"running-right",He()),Q.value&&ce(!1),ze()}function Zt(A){L.value&&(L.value=!1,B.value="",A.currentTarget.releasePointerCapture(A.pointerId),ze(),ct(c.state))}function Le(){J.value&&At("jump",Lt("jump"))}function pa(A){const Z={...P.value};V.value=be(A,Oo,Wo),P.value=ie(Z),He(),Q.value&&ce(),ze()}function ma(A){J.value&&(j.value=!0,L.value=!1,ue.value={pointerX:Q.value?A.screenX:A.clientX,width:Ae.value},A.currentTarget.setPointerCapture(A.pointerId))}function ga(A){if(!j.value)return;const Z=Q.value?A.screenX:A.clientX;V.value=be((ue.value.width+Z-ue.value.pointerX)/N.value,Oo,Wo),P.value=ie(P.value),He(),Q.value&&ce(),ze()}function Fo(A){j.value&&(j.value=!1,A.currentTarget.releasePointerCapture(A.pointerId),ze())}function ha(A){A.preventDefault(),pa(V.value+(A.deltaY<0?Ri:-.06))}async function he(){L.value=!1,j.value=!1,await r.hideActivePet(),await Ce(!1)}function Ne(){if(Q.value){He();return}P.value=_e.value?.position?ie(P.value):D(),He(),ze()}function kt(){c.disconnect(),G=null}async function xe(A){const Z=A||u.activeProfileName||localStorage.getItem("hermes_active_profile_name")||"default";G!==Z&&(kt(),G=Z,await c.connect(Z))}async function It(A){X.value||(kt(),await Ve(),await Ee(),(await r.loadActivePet())?.enabled&&await xe(A))}function va(){Q.value&&It(u.activeProfileName||localStorage.getItem("hermes_active_profile_name")||"default")}return ot(()=>u.activeProfileName,A=>{!A||X.value||It(A)}),ot(X,A=>{if(A){c.disconnect(),r.clear();return}It(u.activeProfileName||localStorage.getItem("hermes_active_profile_name")||"default")},{immediate:!0}),ot(_e,A=>{if(!A){Qe(),H.value=null,q="",kt();return}const Z=`${A.slug}:${A.spritesheetRevision}`;if(Me(A),A.enabled&&!X.value&&xe(),Z===q&&H.value){He();return}Qe(),H.value=null,q=Z;const Ue=new Image;Ue.onload=()=>{H.value=Ue,f.value=A.spritesheetRevision,T.value=0,Oi(()=>{He(),at()})},Ue.src=A.spritesheetDataUrl},{immediate:!0}),ot([lt,V],()=>He()),ot(()=>c.state,A=>ct(A),{immediate:!0}),ot(J,A=>{Q.value&&(A?ce(!0):Ce(!1))},{immediate:!0}),go(()=>{I=Date.now(),E=h?.onPetWindowRefresh?.(va)||null,window.addEventListener("resize",Ne),window.addEventListener("pagehide",kt),window.addEventListener("beforeunload",kt)}),Mo(()=>{E?.(),E=null,Qe(),ge!=null&&window.clearTimeout(ge),dt(),Rt(),c.disconnect(),Ce(!1),window.removeEventListener("resize",Ne),window.removeEventListener("pagehide",kt),window.removeEventListener("beforeunload",kt)}),(A,Z)=>lo((_(),$("div",{class:Ze(["web-pet",{dragging:L.value,resizing:j.value,"desktop-window":Q.value}]),style:zi(Y.value),onPointerdown:Xt,onPointermove:Ut,onPointerup:Zt,onPointercancel:Zt,onWheel:ha,onDblclick:Le},[s("canvas",{ref_key:"canvasRef",ref:S,class:"web-pet-canvas","aria-label":_e.value?.displayName||"Pet"},null,8,xi),s("button",{type:"button",class:"web-pet-close","aria-label":p(n)("common.delete"),title:p(n)("common.delete"),onClick:tt(he,["stop"]),onPointerdown:Z[0]||(Z[0]=tt(()=>{},["stop"])),onPointermove:Z[1]||(Z[1]=tt(()=>{},["stop"])),onPointerup:Z[2]||(Z[2]=tt(()=>{},["stop"])),onPointercancel:Z[3]||(Z[3]=tt(()=>{},["stop"]))}," × ",40,Mi),s("button",{type:"button",class:"web-pet-resize","aria-label":"Resize pet",onPointerdown:tt(ma,["stop"]),onPointermove:tt(ga,["stop"]),onPointerup:tt(Fo,["stop"]),onPointercancel:tt(Fo,["stop"])},[...Z[4]||(Z[4]=[s("img",{src:"/icons/pet-resize.svg",alt:"",draggable:"false"},null,-1)])],32)],38)),[[so,J.value]])}})})),Bu=Re((()=>{})),Pn,Ou=Re((()=>{Di(),Di(),Bu(),ht(),Pn=vt(kn,[["__scopeId","data-v-1ae1f020"]])}));Oe();Xi();vo();Mt();gt();en();Ho();Ou();Ya();var Wu={key:1,class:"node-warning-bar"},Ku={class:"app-main"},Vu=nt({__name:"App",setup(e){const{isDark:t,isComic:a}=Zi(),{t:n}=St(),r=Jt(),c=la(),u=ee(()=>Nr(t.value,a.value)),h=ee(()=>t.value?nr:null),S=ee(()=>c.name==="login"),H=ee(()=>["hermes.chat","hermes.session","hermes.history","hermes.historySession","hermes.globalAgent","hermes.globalAgentSession","hermes.groupChat","hermes.groupChatRoom","hermes.workflow"].includes(c.name)),f=ee(()=>!S.value&&!H.value),P=ee(()=>!S.value&&(f.value||H.value)),V=ee(()=>{const T=r.nodeVersion,R=parseInt(T.split(".")[0],10);return!isNaN(R)&&R<23}),L=ee(()=>sa()?.isDesktop===!0),j=ee(()=>c.name==="desktop.pet"),z=ee(()=>!S.value&&!L.value&&!j.value),ue=ee(()=>{const T=sa()?.platform;return L.value&&(T==="darwin"||T==="win32")});function ne(){if(H.value){window.dispatchEvent(new CustomEvent("hermes:open-page-sidebar"));return}r.toggleSidebar()}return ot(S,T=>{if(T){r.stopHealthPolling();return}r.loadModels(),r.startHealthPolling()},{immediate:!0}),Mo(()=>{r.stopHealthPolling()}),Xc(),(T,R)=>{const B=Ni("router-view");return _(),ke(p(rr),{theme:h.value,"theme-overrides":u.value},{default:W(()=>[se(p(Jn),null,{default:W(()=>[se(Su),se(p(or),null,{default:W(()=>[se(p(er),null,{default:W(()=>[j.value?(_(),ke(B,{key:0})):(_(),$("div",{key:1,class:Ze(["app-shell",{desktop:L.value,"desktop-titlebar-host":ue.value}])},[L.value?(_(),ke(Td,{key:0})):le("",!0),V.value?(_(),$("div",Wu,y(p(n)("sidebar.nodeVersionWarning",{version:p(r).nodeVersion})),1)):le("",!0),s("div",{class:Ze(["app-layout",{"no-sidebar":S.value||!f.value}])},[P.value?(_(),$("button",{key:0,class:"hamburger-btn",onClick:ne},[...R[1]||(R[1]=[s("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])):le("",!0),!S.value&&f.value&&p(r).sidebarOpen?(_(),$("div",{key:1,class:"mobile-backdrop",onClick:R[0]||(R[0]=(...ae)=>p(r).closeSidebar&&p(r).closeSidebar(...ae))})):le("",!0),!S.value&&f.value?(_(),ke(yd,{key:2})):le("",!0),s("main",Ku,[se(B)])],2)],2)),z.value?(_(),ke(Pn,{key:2})):le("",!0),j.value?le("",!0):(_(),ke(bu,{key:3})),j.value?le("",!0):(_(),ke(Cu,{key:4}))]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});ht();var Gu=vt(Vu,[["__scopeId","data-v-b394e862"]]);Oe();Qt();Ya();var Ei=localStorage.getItem("hermes_brightness")||"system",ju=localStorage.getItem("hermes_style")||"ink",$u=window.matchMedia("(prefers-color-scheme: dark)").matches,Ju=Ei==="dark"||Ei==="system"&&$u,Qu=ju==="comic",Tn=sa(),Yu=Tn?.isDesktop===!0,Xu=Tn?.windowKind==="pet"||window.location.hash.startsWith("#/desktop-pet");Ju&&document.documentElement.classList.add("dark");Qu&&document.documentElement.classList.add("comic");Yu&&document.documentElement.classList.add("hermes-desktop-shell");Xu&&document.documentElement.classList.add("hermes-desktop-pet-window");var Zu=new URLSearchParams(window.location.search),Li=window.location.hash.split("?")[1],Ui=Zu.get("token")||(Li?new URLSearchParams(Li).get("token"):null);Ui&&(window.__LOGIN_TOKEN__=Ui);var ua=ir(Gu);ua.use(lr());ua.use(Yi);ua.use(Wi);Wi.isReady().finally(()=>{ua.mount("#app")});export{Bp as $,Ic as A,en as At,Xp as B,yn as C,Mp as Ct,Dc as D,Et as Dt,$a as E,Io as Et,im as F,em as G,bc as H,Tc as I,$p as J,Zp as K,wc as L,xc as M,Xi as Mt,nm as N,Er as Nt,Fc as O,Ho as Ot,Cc as P,Wp as Q,jo as R,cm as S,Lp as St,bn as T,Ms as Tt,om as U,tm as V,Yp as W,ja as X,Jp as Y,hc as Z,lm as _,Fp as _t,Fu as a,Gp as at,bm as b,Ep as bt,mm as c,Dp as ct,sm as d,zp as dt,uc as et,Au as f,Ip as ft,ku as g,qp as gt,dm as h,wi as ht,Ya as i,pc as it,rm as j,Zi as jt,ki as k,Jt as kt,gm as l,sc as lt,Ja as m,Hp as mt,Ou as n,Op as nt,Sn as o,Kp as ot,fm as p,Rp as pt,am as q,sa as r,jp as rt,pm as s,Vp as st,Pn as t,mc as tt,vm as u,Np as ut,um as v,nn as vt,wn as w,Ko as wt,hm as x,Up as xt,wm as y,xp as yt,Qp as z};
|