@quanthermes/hermes-web-ui 0.6.12 → 0.6.13

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.
Files changed (41) hide show
  1. package/bin/hermes-web-ui.mjs +7 -0
  2. package/dist/client/assets/js/{ChannelsView-BAbGxkKW.js → ChannelsView-BduiL1-M.js} +1 -1
  3. package/dist/client/assets/js/{ChatView-hdWG7dhS.js → ChatView-C-84i0a3.js} +1 -1
  4. package/dist/client/assets/js/{CodingAgentsView-BB79rLb_.js → CodingAgentsView-Cu5bfdCo.js} +1 -1
  5. package/dist/client/assets/js/{DevicesView-DEdHwkrV.js → DevicesView-BwVqTyuH.js} +1 -1
  6. package/dist/client/assets/js/{FileRenameModal-CdKXqr0a.js → FileRenameModal-DMqVjoLN.js} +1 -1
  7. package/dist/client/assets/js/{FilesView-C49jsfxy.js → FilesView-Ce30F1_8.js} +1 -1
  8. package/dist/client/assets/js/{GroupChatView-DwL-zIjT.js → GroupChatView-BQqM5noE.js} +1 -1
  9. package/dist/client/assets/js/{HistoryMessageList-B1ORl6-d.js → HistoryMessageList-B3TsU-9g.js} +1 -1
  10. package/dist/client/assets/js/{HistoryView-CdlRAUh5.js → HistoryView-qhTXEU5G.js} +1 -1
  11. package/dist/client/assets/js/{JobsView-BPZ4Wv0y.js → JobsView-BszCmau_.js} +1 -1
  12. package/dist/client/assets/js/{KanbanView-UHzayv3c.js → KanbanView-BMa_FMqS.js} +1 -1
  13. package/dist/client/assets/js/{LoginView-BYrZGFRC.js → LoginView-v4Lvgu2R.js} +1 -1
  14. package/dist/client/assets/js/{LogsView-CyfCeIeY.js → LogsView-CuwioOCX.js} +1 -1
  15. package/dist/client/assets/js/{MarkdownRenderer-D-IgakCO.js → MarkdownRenderer-2bwbBjlK.js} +1 -1
  16. package/dist/client/assets/js/{McpManagerView-DMbmKtiH.js → McpManagerView-BDJSjkHx.js} +1 -1
  17. package/dist/client/assets/js/{MemoryView-iYE-K13x.js → MemoryView-rYoZbfMb.js} +1 -1
  18. package/dist/client/assets/js/{MessageItem-Be7fqF3P.js → MessageItem-OSBjfS2l.js} +1 -1
  19. package/dist/client/assets/js/{ModelsView-XRIIk2f7.js → ModelsView-DGPA2heM.js} +1 -1
  20. package/dist/client/assets/js/{OutlinePanel-BSPx9YaI.js → OutlinePanel-CN0TVZ0B.js} +1 -1
  21. package/dist/client/assets/js/{PerformanceView-m3deuRba.js → PerformanceView-0GmZ2GXR.js} +1 -1
  22. package/dist/client/assets/js/{PluginsView-BBrFPfSn.js → PluginsView-D6XEulKx.js} +1 -1
  23. package/dist/client/assets/js/{ProfilesView-G_eYB34O.js → ProfilesView-CCPI-DaB.js} +1 -1
  24. package/dist/client/assets/js/{SettingRow-wqcLQ0FL.js → SettingRow-B0WJ-Iqa.js} +1 -1
  25. package/dist/client/assets/js/{SettingsView-DMOWr41T.js → SettingsView-BaZ_P8Wu.js} +1 -1
  26. package/dist/client/assets/js/{SkillsUsageView-fn3jivrH.js → SkillsUsageView-BJVHpo4D.js} +1 -1
  27. package/dist/client/assets/js/{SkillsView-CXDdZj7R.js → SkillsView-vhxQVIz8.js} +1 -1
  28. package/dist/client/assets/js/{TerminalPanel-CqIASgSb.js → TerminalPanel-C50X3--t.js} +1 -1
  29. package/dist/client/assets/js/{TerminalView-ycEOrgth.js → TerminalView-1qIvfZKj.js} +1 -1
  30. package/dist/client/assets/js/{UsageView-BhNclgOH.js → UsageView-CLUP9AqF.js} +1 -1
  31. package/dist/client/assets/js/{VersionPreviewView-DoG0hdD2.js → VersionPreviewView-C9I3ZH13.js} +1 -1
  32. package/dist/client/assets/js/{VirtualMessageList-B_teFrlt.js → VirtualMessageList-D6BvQLbe.js} +1 -1
  33. package/dist/client/assets/js/{_plugin-vue_export-helper-D4mtpdbl.js → _plugin-vue_export-helper-CtZk2OSc.js} +2 -2
  34. package/dist/client/assets/js/{index-BHU-82RO.js → index-DyLZQAQu.js} +1 -1
  35. package/dist/client/assets/js/{models-BX7pr_Gd.js → models-CjHxxDse.js} +1 -1
  36. package/dist/client/assets/js/{session-browser-prefs-OR-qaA1z.js → session-browser-prefs-kGpZZDQo.js} +1 -1
  37. package/dist/client/assets/js/{skills-fBzB8FGc.js → skills-CDjYTDMo.js} +1 -1
  38. package/dist/client/assets/js/{system-vQTkarwT.js → system-Pg8JEuA6.js} +1 -1
  39. package/dist/client/index.html +3 -3
  40. package/dist/server/index.js +3 -3
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- import{a as qt,i as Ot,n as Ie,r as Bt}from"./rolldown-runtime-M0oDzQ_3.js";import{$n as C,$t as r,An as Y,At as ya,B as Wt,Bn as b,Bt as xe,Cn as Po,H as jt,I as Gt,In as Vt,Jn as c,Jt as Kt,Kt as yo,On as ro,Qn as Qt,Qt as me,Tn as rt,Ut as Jt,W as Ao,Xn as De,Yt as _o,an as Re,bn as aa,en as Oe,ft as st,g as lt,hn as $t,in as dt,jn as So,mt as Zt,n as Yt,nn as B,on as Q,qt as Xt,sn as Le,t as Ye,tn as Ce,wn as ei,wt as qe,xn as D,yn as Fo,z as xa,zn as oi}from"./ui-vendor-DNWaqYj5.js";import{_ as Lo,c as Ve,f as No,g as ta,h as ai,l as Xe,m as Uo,p as Ta,s as ti}from"./vue-vendor-VX6KvV1_.js";import{a as ct,c as Na,d as ee,i as ii,l as Be,n as eo,o as xo,r as ni,s as zo,t as oo,u as ri}from"./_plugin-vue_export-helper-D4mtpdbl.js";import{M as si,N as li,j as di}from"./vendor-B1Lfatlz.js";import{_ as ci,b as ui,i as pi,l as mi,p as gi,r as hi,t as vi,v as fi,y as bi}from"./system-vQTkarwT.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))l(s);new MutationObserver(s=>{for(const d of s)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&l(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const d={};return s.integrity&&(d.integrity=s.integrity),s.referrerPolicy&&(d.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?d.credentials="include":s.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function l(s){if(s.ep)return;s.ep=!0;const d=a(s);fetch(s.href,d)}})();xe();Lo();No();Be();ni();Ve();var ut={login:{title:"Quanta Hermes",description:"Enter your access token to continue. Find it in the server startup logs.",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: quanthermes. Default password: 12345678. Change them after the first sign-in.",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 quanthermes 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",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",search:"Search",apiRelay:"API Relay",history:"History",jobs:"Jobs",kanban:"Kanban",models:"Models",profiles:"Profiles",skills:"Skills",plugins:"Plugins",mcp:"MCP",memory:"Memory",logs:"Logs",usage:"Usage",performance:"Performance",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",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",networkConfig:"Switch WiFi",connected:"Connected",disconnected:"Disconnected",collapse:"Collapse menu",expand:"Expand menu",updateTip:"In customized builds, upgrades are managed by your internal release process",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, restart it manually.",updateFailed:"Update failed. Check your internal update source configuration.",updateSource:"Update source: {source}",updateManagedInternally:"Customized build: upgrades are managed through your internal release process",logout:"Sign Out",nodeVersionWarning:"Detected Node.js v{version}. Please upgrade to version 23 or later.",changelog:"Changelog",noChangelog:"No changelog available"},devices:{title:"Devices",count:"{count} devices",lastScanned:"Last scanned: {time}",refresh:"Refresh",empty:"No devices found",computer:"Computer",endpointLabel:"Endpoint",statusLabel:"Status",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",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 Quanthermes Agent",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)",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",plan:"Write a markdown implementation plan",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",steer:"Send steering text to the active bridge run",destroy:"Release the bridge agent for this session",reloadMcp:"Reload MCP servers"},attachFiles:"Attach files",autoPlaySpeech:"Auto-play voice",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:"QuantHermes History",historyScopeHint:"Read-only QuantHermes history sessions 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",approvalKicker:"Terminal permission",approvalTitle:"Review command before running",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",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",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",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"},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",ready:"Ready",running:"Running",blocked:"Blocked",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..."},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"},action:{title:"Actions",complete:"Complete",completeSummary:"Completion summary (optional)",block:"Block",blockReason:"Reason for blocking",unblock:"Unblock",assign:"Assign",assignTo:"Assign to..."},message:{taskCreated:"Task created",taskCompleted:"Task completed",taskBlocked:"Task blocked",taskUnblocked:"Task unblocked",taskAssigned:"Task assigned",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.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Refresh",notice:"Read-only inventory of discoverable QuantHermes plugin manifests. Discovery metadata is read without loading plugin code. Management actions stay in CLI for v1; changes take effect in new QuantHermes sessions.",loadFailed:"Failed to load plugins",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"Project plugins"}},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...",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",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 QuantHermes.",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 QuantHermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.",copilotDeleteHintAppsJson:"Copilot will be hidden from QuantHermes. Your VS Code Copilot extension login is not affected.",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",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",auxiliaryTitle:"Auxiliary Models",auxiliarySubtitle:"Side-task model overrides for compression, vision, approvals, MCP, and background maintenance.",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",builtIn:"Built-in",customType:"Custom",provider:"Provider",contextLength:"Context Length",contextLengthPlaceholder:"e.g. 256000 (optional)",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",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",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",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"},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.",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"},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"},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"},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:{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",installNow:"Install",installing:"Installing",installSuccess:"Installed",installFailed:"Install failed",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",accessToken:"Access Token",accessTokenHint:"Matrix access token",homeserver:"Homeserver URL",homeserverHint:"Matrix homeserver URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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",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)",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 QuantHermes 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_11_1:"LAN device discovery now includes pairing approvals, request history, duplicate request handling, status sync, and cleanup when device access is revoked",new_0_6_11_2:"LAN peer access is available through MCP with bundled MCP startup, command shims, reconnecting peer sockets, local connection listing, and capped terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis and MiMo voice cloning settings are now available, including playback support before saving settings",new_0_6_11_4:"Gateway autostart settings now expose profile filtering with multi-select controls, whitelist behavior, and focused tests for startup profile selection",new_0_6_11_5:"Chat scrolling and motion are steadier with bottom-follow tuning, initial bottom scroll fixes, scroll lock updates, and reduced-motion fade handling",new_0_6_11_6:"Agent Bridge and runtime flows are more reliable with abort timeout handling, resume startup guards, execute-code approval memory, Windows gateway recovery, and dev terminal proxy fixes",new_0_6_11_7:"Security is tighter with Web UI origin policy and security header hardening plus server-token loopback access guards",new_0_6_11_8:"Group chat and tool output rendering are more stable with room rejoin after reconnect, preserved reasoning/tool boundaries, safer tool payload rendering, and improved diff display",new_0_6_11_9:"Skills and workspace flows now support external skill directories, import/delete refresh, source-path grouping, localized folder picker text, and mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs, and OpenRouter attribution text received UI polish",new_0_6_10_1:"Desktop runtime startup is more resilient with download source selection, safer archive extraction, corrected runtime cache paths, Windows CLI launch fixes, and localized progress/error screens",new_0_6_10_2:"Auxiliary compression model settings let each Profile choose a dedicated provider/model for chat context compression instead of always using the active chat model",new_0_6_10_3:"Provider model catalogs can now be refreshed from the UI",new_0_6_10_4:"Users can upload profile avatars, and group chat members now sync and display account avatars consistently",new_0_6_10_5:"Workspace file browsing now supports richer text previews and context-menu coverage for source and document files",new_0_6_10_6:"Agent Bridge is more reliable with refreshed tool approval allowlists and Windows tasklist/taskkill output decoding that avoids UnicodeDecodeError crashes",new_0_6_10_7:"Website copy now consistently presents the product as Hermes Studio while keeping npm package, CLI, repository, and environment variable identifiers unchanged",new_0_6_10_8:"OpenAPI docs now include avatar, auxiliary model config, provider model cache refresh, and Hermes session import endpoints",new_0_6_10_9:"Memory notes can now be saved with empty content, making it possible to clear personal notes without a failed save",new_0_6_10_10:"Repository harness docs now track chat-chain changes so bridge and chat-runtime updates are documented before CI passes",new_0_6_9_1:"The app is now branded as Hermes Studio across the browser title, sidebar, website title, package metadata, and official homepage links",new_0_6_9_2:"Desktop update checks are more reliable with release-feed fallback handling when GitHub API requests are rate-limited or tag-scoped metadata is missing",new_0_6_9_3:"macOS desktop update install now stops the local Web UI server before letting electron-updater handle quit and install, so Restart installs the downloaded version",new_0_6_9_4:"Provider credentials and auth now respect Profile scoping more consistently, and gateway/runtime startup is more compatible with packaged desktop launches",new_0_6_9_5:"Browser Web Speech playback now pauses and resumes the current message in Chrome instead of restarting from the beginning",new_0_6_9_6:"Russian localization is now available in the language switcher, with translated client UI messages added by the community",new_0_6_8_1:"Desktop builds gained tray controls, manual update checks, update notifications, and local-browser launch support for the packaged Web UI",new_0_6_8_2:"Windows desktop startup is quieter and more reliable, with hidden Python/bridge subprocesses, fixed terminal popups, tray icon sizing, and browser packaging fixes",new_0_6_8_3:"Desktop packaging is more stable across platforms with macOS signing file-limit fixes, Linux writable paths, runtime cold-start handling, and workflow checkout fixes",new_0_6_8_4:"Official website and release distribution improved with download mirrors, sequenced website deploys after desktop releases, and desktop smoke-check cleanup",new_0_6_8_5:"Runtime usability improved with provider context-length preferences, unsent chat draft preservation, mobile layout overflow fixes, SSH file-provider custom ports, and nonblocking preview actions",new_0_6_7_1:"The desktop app now defaults to port 8748, supports LAN access, and can be opened directly from a local browser",new_0_6_7_9:"Desktop download links are now available on the official website at https://hermes-studio.ai/, and the latest installers remain available from GitHub Releases",new_0_6_7_2:"MCP tooling is more complete with bridge tool discovery fixes, MCP management lifecycle fixes, and per-model tool visibility controls in the manager",new_0_6_7_3:"Message lists now center empty states correctly, reduce scroll jitter, avoid leaking live chat messages into History while loading, preserve per-session scroll positions, and fade in over 1.5 seconds on session switches",new_0_6_7_4:"Bridge and runtime stability improved by preserving text/tool-call ordering, fixing Profile runtime status loading, improving Node/npm detection, and skipping production data directory creation",new_0_6_7_5:"Desktop distribution now covers Electron packaging, app naming, preload builds, release artifact uploads, Windows Hermes CLI launch, Linux icons and writable data paths, macOS unsigned release handling, and hidden Windows startup subprocesses",new_0_6_7_6:"The website now has downloads and deploy workflows, with deploys fixed for environments that do not provide rsync",new_0_6_7_7:"Server and auth fixes use dirname for Windows credential directories and raise the avatar upload body limit to avoid 413 errors on larger images",new_0_6_7_8:"Repository harness, validation docs, and agent guidance were added for coding agents, while stale setup script docs were removed"}},yi={login:{title:"Quanta Hermes",description:"输入访问令牌以继续。令牌在服务端启动日志中查看。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",defaultCredentialsHint:"默认登录名:quanthermes,默认密码:12345678。建议首次登录后立即修改。",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",lockResetHint:"如果这是你的服务器,可以执行以下命令清除登录锁定:",defaultLoginResetHint:"如需重置默认 quanthermes 密码,可以执行:",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:"重试",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:"对话",search:"搜索",apiRelay:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",mcp:"MCP",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",performance:"性能监控",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",devices:"设备",groupConversation:"对话",groupConversationShort:"对话",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系统",groupSystemShort:"系统",groupMonitoring:"监控",groupMonitoringShort:"监控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"编程工具",versionPreview:"版本预览",settings:"设置",networkConfig:"切换 WiFi",connected:"已连接",disconnected:"未连接",collapse:"收起菜单",expand:"展开菜单",updateTip:"定制版升级由内部发布流程管理",updateVersion:"升级版本 v{version}",reloadClientVersion:"刷新到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,请稍后刷新页面,如长时间未启动,请手动重启服务",updateFailed:"更新失败,请检查内部更新源配置",updateSource:"更新源:{source}",updateManagedInternally:"当前为定制版,升级由内部发布流程管理",logout:"退出登录",nodeVersionWarning:"检测到 Node.js v{version},请升级到23以上版本。",changelog:"更新日志",noChangelog:"暂无更新日志"},devices:{title:"设备",count:"{count} 台设备",lastScanned:"上次扫描:{time}",refresh:"刷新",empty:"暂无设备",computer:"电脑",endpointLabel:"端",statusLabel:"状态",address:"地址",os:"系统",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延迟",lastSeen:"最后发现",open:"打开",never:"从未",unknown:"未知",loadFailed:"加载设备失败",scanFailed:"扫描设备失败",updateFailed:"更新设备失败",duplicateRequest:"已存在待处理的配对申请",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:"开始与 Quanthermes Agent 对话",cliEmptyState:"开始 CLI 对话",outlineTitle:"会话大纲",outlineEmpty:"暂无会话内容",outlineUserQuestion:"用户问题",inputPlaceholder:"输入消息... (Enter 发送,Shift+Enter 换行)",slashCommandArgs:{message:"<消息>",title:"<标题>",text:"<文本>"},slashCommands:{usage:"计算当前会话用量",status:"查看会话状态和队列",abort:"停止当前 Bridge 运行",queue:"把消息加入当前运行后的队列",plan:"生成一份 Markdown 实施计划",goal:"设置一个跨轮次持续推进的目标",goalStatus:"查看当前目标状态",goalPause:"暂停当前目标循环",goalResume:"继续已暂停的目标循环",goalDone:"完成并清除当前目标",goalClear:"清除当前目标",subgoal:"为当前目标追加验收条件",clear:"清空当前显示内容",clearHistory:"删除当前会话已入库的消息历史",title:"重命名当前会话",compress:"空闲时触发上下文压缩",steer:"向当前 Bridge 运行发送引导文本",destroy:"释放当前会话的 Bridge Agent",reloadMcp:"重载 MCP 服务器"},attachFiles:"添加附件",autoPlaySpeech:"自动播放语音",showToolCalls:"显示工具调用",hideToolCalls:"隐藏工具调用",messageQueue:"消息队列",removeQueuedMessage:"移除队列消息",stop:"停止",start:"启动",stopGateway:"停止网关",send:"发送",contextUsed:"上下文已用:",sessions:"会话",webUiSessions:"会话",allProfiles:"全部配置",profileMissingModelsTip:"该会话所属配置「{profile}」没有可用的 provider 或模型",sessionScopeHint:"这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。",openHistory:"打开历史",hermesHistory:"QuantHermes 历史",historyScopeHint:"这里按来源只读查看 QuantHermes 历史会话。",noSessions:"暂无会话",searchTitle:"搜索会话",searchSubtitle:"按标题或消息内容搜索",searchScope:"搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜索会话...",searchEmpty:"最近会话",searchRecent:"最近会话",searchNoResults:"没有匹配的会话",searchNoSnippet:"没有可显示的摘要",searchEnterHint:"Enter 打开 · Esc 关闭",searchFailed:"搜索会话失败",newChat:"新建对话",approvalKicker:"终端授权",approvalTitle:"运行前请确认命令",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:"重命名",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:"重命名失败",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:"结果",truncated:"... (已截断)",unchangedLines:"{count} 行未修改",executionDuration:"执行时长",thinkingLabel:"思考过程",thinkingInProgress:"思考中…",thinkingShow:"展开思考过程",thinkingHide:"收起思考过程",thinkingDuration:"已观察 {duration}",thinkingChars:"{count} 字",copyBubble:"复制消息",copiedBubble:"已复制",copyFailed:"复制失败",playSpeech:"播放语音",pauseSpeech:"暂停",resumeSpeech:"继续",stopSpeech:"停止",speechNotSupported:"此浏览器不支持语音播放"},kanban:{title:"看板",createTask:"新建任务",noTasks:"暂无任务",allStatuses:"全部状态",allAssignees:"全部负责人",board:{create:"新建看板",archive:"归档看板",slugPlaceholder:"看板标识,例如 project-a",namePlaceholder:"显示名称(可选)",slugRequired:"看板标识不能为空",created:"看板已创建",archived:"看板已归档",archiveConfirm:"确定归档当前看板?"},columns:{triage:"待分拣",todo:"待办",ready:"就绪",running:"进行中",blocked:"阻塞",done:"已完成",archived:"已归档"},form:{title:"标题",titlePlaceholder:"任务标题",titleRequired:"标题不能为空",body:"描述",bodyPlaceholder:"任务描述(可选)",assignee:"负责人",selectAssignee:"选择负责人...",priority:"优先级",selectPriority:"选择优先级..."},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:"关键信息"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(可选)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"分配",assignTo:"分配给..."},message:{taskCreated:"任务已创建",taskCompleted:"任务已完成",taskBlocked:"任务已阻塞",taskUnblocked:"任务已解除阻塞",taskAssigned:"任务已分配",loadFailed:"加载任务失败"},stats:{total:"总计",tasks:"任务数"}},jobs:{title:"定时任务",createJob:"创建任务",editJob:"编辑任务",noJobs:"暂无定时任务,创建一个开始吧。",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:"要执行的内容",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:"技能",searchPlaceholder:"搜索技能...",noMatch:"没有匹配的技能",noSkills:"暂无技能",backTo:"返回",attachedFiles:"附件文件",loadFailed:"加载技能失败",fileLoadFailed:"加载文件失败",modified:"用户已修改",archived:"已归档",pinned:"已置顶",pin:"置顶技能",unpin:"取消置顶",pinFailed:"更改置顶状态失败",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;新会话会自动加载。"},plugins:{title:"插件",refresh:"刷新",notice:"只读展示可发现的 QuantHermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 QuantHermes 会话生效。",loadFailed:"加载插件失败",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:"路径 / 入口",cli:"CLI"},capabilities:{tools:"{count} 个工具",hooks:"{count} 个 hook",env:"{count} 个环境变量"},metadata:{agentRoot:"Agent 根目录",python:"Python",scanCwd:"扫描 cwd",projectPlugins:"项目插件"}},memory:{title:"记忆",refresh:"刷新",loadFailed:"加载记忆失败",myNotes:"我的笔记",noNotes:"暂无笔记。",notesPlaceholder:"输入笔记内容...",userProfile:"用户画像",noProfile:"暂无画像。",profilePlaceholder:"输入用户画像...",soul:"灵魂",noSoul:"暂无灵魂配置。",soulPlaceholder:"输入灵魂配置..."},models:{title:"模型",searchPlaceholder:"搜索模型...",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 已删除",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 凭证,点击「添加」即可在 QuantHermes 中启用 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 将从 QuantHermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。",copilotDeleteHintAppsJson:"Copilot 将从 QuantHermes 列表移除。不会影响 VS Code Copilot 插件的登录。",customBadge:"自定义",previewBadge:"预览",disabledBadge:"不可用",disabledTooltip:"此模型当前账号不可用",customModelPlaceholder:"未列出的模型 ID",customModelHint:"仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。",removeCustomModel:"移除这个未列出的模型",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:"取消全选",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:"默认",builtIn:"内置",customType:"自定义",provider:"Provider",contextLength:"上下文长度",contextLengthPlaceholder:"例如 256000(可选)",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:"删除",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:"代理",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 回复完成时播放提示音",busyInputMode:"忙碌输入模式",busyInputModeHint:"AI 处理中仍可输入",theme:"主题",themeHint:"选择浅色、暗色或跟随系统",themeLight:"浅色",themeDark:"暗色",themeSystem:"跟随系统"},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。",mode:"Profile 策略",modeHint:"启动所有发现到的 profiles,或只启动白名单内的 profiles。",modeAll:"所有发现到的 profiles",modeInclude:"仅白名单 profiles",include:"白名单 profiles",includeHint:"逗号分隔 profile 名。白名单模式下留空表示不自动启动任何 profile。",exclude:"排除 profiles",excludeHint:"逗号分隔 profile 名;会在白名单/全量策略之后再排除。",profileListPlaceholder:"default, reviewer"},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:"修改会话操作是否授权"},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"},userAvatar:{title:"用户头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB,会自动压缩到 500KB 以下",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},voice:{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:"未安装",installNow:"一键安装",installing:"安装中",installSuccess:"安装完成",installFailed:"安装失败",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",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 服务器地址",appId:"App ID",appIdHint:"飞书 App ID",appSecret:"App Secret",appSecretHint:"飞书 App Secret",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:"智能体已添加",agentAlreadyInRoom:"该智能体已在房间中",agentAddFailedCount:"{count} 个智能体未添加:{details}",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",copyRoomLink:"复制房间链接",deleteRoomConfirm:"确定删除这个房间吗?",clearContext:"清理上下文",clearContextConfirm:"确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房间",joinFailed:"加入房间失败",inputPlaceholder:"输入消息... (Enter 发送)",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:"跟踪 QuantHermes 会话中的技能加载和编辑",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_11_1:"LAN 设备发现新增配对审批、申请历史、重复申请处理、状态同步,以及撤销设备权限时的清理逻辑",new_0_6_11_2:"LAN Peer 已接入 MCP,包含内置 MCP 启动、命令 shim、Peer Socket 重连、本地连接列表,以及终端会话数量限制",new_0_6_11_3:"统一后端 TTS 合成和 MiMo 音色复刻设置已可用,并支持保存设置前试听",new_0_6_11_4:"Gateway 自动启动配置现在支持按 Profile 多选过滤、白名单行为和启动 Profile 选择测试",new_0_6_11_5:"聊天滚动和动效更稳定,修复初次进入滚动到底部、滚动锁定、底部跟随时机和 reduced-motion 淡入处理",new_0_6_11_6:"Agent Bridge 和运行时流程更可靠,修复 abort 超时、恢复时误启动、execute-code 授权记忆、Windows Gateway 恢复和开发终端代理",new_0_6_11_7:"安全性增强:加固 Web UI Origin 策略、安全响应头,并限制 server token 只能走本地回环访问",new_0_6_11_8:"群聊和工具结果渲染更稳定,支持重连后重新加入房间、保留 reasoning/tool 边界、加固工具 payload 渲染并优化 diff 展示",new_0_6_11_9:"技能和 Workspace 流程支持外部技能目录、导入/删除自动刷新、按 sourcePath 分组、本地化文件夹选择文案和移动端技能操作图标",new_0_6_11_10:"设备页布局、原生会话标题、浏览器标签标题、Kanban 父任务 ID 和 OpenRouter 归属文案做了界面优化",new_0_6_10_1:"桌面运行时启动更可靠,支持下载源选择、更安全的压缩包解压、修正运行时缓存路径、Windows CLI 启动修复,以及本地化进度和错误界面",new_0_6_10_2:"辅助压缩模型设置允许每个 Profile 为聊天上下文压缩选择专用 provider/model,不再只能使用当前聊天模型",new_0_6_10_3:"Provider 模型目录现在可在界面中手动刷新",new_0_6_10_4:"用户可以上传账号头像,群聊成员也会一致同步并展示账号头像",new_0_6_10_5:"Workspace 文件浏览支持更完整的文本预览,并扩展源码和文档文件的右键菜单覆盖",new_0_6_10_6:"Agent Bridge 更可靠:会刷新工具审批 allowlist,并兼容 Windows tasklist/taskkill 输出解码,避免 UnicodeDecodeError 崩溃",new_0_6_10_7:"官网文案统一展示为 Hermes Studio,同时保留 npm package、CLI、仓库和环境变量等技术标识不变",new_0_6_10_8:"OpenAPI 文档补充头像、辅助模型配置、Provider 模型缓存刷新和 Hermes 会话导入端点",new_0_6_10_9:"记忆备注现在可以保存为空内容,清空个人备注时不会再保存失败",new_0_6_10_10:"仓库 harness 文档现在会追踪 Chat 链路变更,bridge 和 chat runtime 更新需要先记录后才能通过 CI",new_0_6_9_1:"应用品牌统一为 Hermes Studio,覆盖浏览器标题、侧边栏、官网标题、package metadata 和官网链接",new_0_6_9_2:"桌面端检查更新更可靠:GitHub API 被限流或 tag 路径缺少 metadata 时会走 release feed 兜底",new_0_6_9_3:"macOS 桌面端安装更新时会先停止本地 Web UI server,再交给 electron-updater 退出安装,修复点击重启不安装的问题",new_0_6_9_4:"Provider 凭据和认证更严格遵循 Profile 作用域,gateway/runtime 启动也更兼容桌面端打包环境",new_0_6_9_5:"浏览器 Web Speech 播放现在会在 Chrome 中暂停/恢复当前消息,不再点击暂停后从头重播",new_0_6_9_6:"语言切换器新增俄语,本次合入社区贡献的俄语客户端界面翻译",new_0_6_8_1:"桌面端补齐托盘控制、手动检查更新、更新提示,以及从本机浏览器打开打包 Web UI 的能力",new_0_6_8_2:"Windows 桌面端启动更安静也更稳定:隐藏 Python/bridge 子进程,修复终端弹窗、托盘图标尺寸和浏览器打包问题",new_0_6_8_3:"跨平台桌面打包更稳定:修复 macOS 签名文件数量限制、Linux 可写路径、runtime 冷启动和 workflow checkout 问题",new_0_6_8_4:"官网与发布链路改进:新增下载镜像,桌面 release 后再部署官网,并清理桌面 smoke check 流程",new_0_6_8_5:"运行体验继续优化:优先使用 provider 上下文长度、保留未发送草稿、修复移动端布局溢出、SSH 文件 Provider 自定义端口和非阻塞预览操作",new_0_6_7_1:"桌面版默认使用 8748 端口,支持局域网内访问,也可以直接用本机浏览器打开 Web UI",new_0_6_7_9:"桌面端下载入口已补充到官网 https://hermes-studio.ai/,也可以继续从 GitHub Releases 获取最新安装包",new_0_6_7_2:"MCP 工具链继续完善:修复 bridge 工具发现与 MCP 管理生命周期,并在管理页支持按模型控制工具可见性",new_0_6_7_3:"消息列表体验优化:修复空状态居中、滚动抖动、历史会话加载串消息,并在切换会话时保留滚动位置与 1.5 秒淡入效果",new_0_6_7_4:"Bridge 与运行态更稳定:保持文本和 tool-call 顺序、修复 Profile runtime 状态加载、改进 Node/npm 检测,并避免生产环境自动创建数据目录",new_0_6_7_5:"Desktop 分发链路补齐 Electron 打包、应用命名、preload 构建、release artifact 上传、Windows Hermes CLI 启动、Linux 图标与可写数据路径、macOS 无证书跳过签名和 Windows 启动无窗口体验",new_0_6_7_6:"官网发布支持下载页和部署工作流,并修复没有 rsync 的环境下部署失败的问题",new_0_6_7_7:"服务端与认证修复:Windows 凭据目录使用 dirname 解析,头像上传 body 限制提高,避免大图触发 413",new_0_6_7_8:"补充 coding agents 仓库 harness、验证文档和 agent 指南,同时移除过期 setup script 文档"}},Si={login:{title:"QuantHermes Web UI",description:"輸入存取權杖以繼續。權杖可在伺服器啟動日誌中查看。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",defaultCredentialsHint:"預設登入名:quanthermes,預設密碼:12345678",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",lockResetHint:"如果這是你的伺服器,可以執行以下命令清除登入鎖定:",defaultLoginResetHint:"如需重置預設 quanthermes 密碼,可以執行:",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:"重試",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:"對話",search:"搜尋",apiRelay:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",mcp:"MCP",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",performance:"效能監控",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",devices:"裝置",groupConversation:"對話",groupConversationShort:"對話",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系統",groupSystemShort:"系統",groupMonitoring:"監控",groupMonitoringShort:"監控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"編程工具",versionPreview:"版本預覽",settings:"設定",connected:"已連線",disconnected:"未連線",collapse:"收起選單",expand:"展開選單",updateTip:"定製版升級由內部發布流程管理",updateVersion:"升級版本 v{version}",reloadClientVersion:"重新整理到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,請稍後重新整理頁面,如長時間未啟動,請手動重新啟動服務",updateFailed:"更新失敗,請檢查內部更新源配置",updateSource:"更新源:{source}",updateManagedInternally:"目前為定製版,升級由內部發布流程管理",logout:"登出",nodeVersionWarning:"偵測到 Node.js v{version},請升級至 23 以上版本。",changelog:"更新日誌",noChangelog:"目前無更新日誌"},devices:{title:"裝置",count:"{count} 台裝置",lastScanned:"上次掃描:{time}",refresh:"重新整理",empty:"暫無裝置",computer:"電腦",endpointLabel:"端",statusLabel:"狀態",address:"位址",os:"系統",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延遲",lastSeen:"最後發現",open:"開啟",never:"從未",unknown:"未知",loadFailed:"載入裝置失敗",scanFailed:"掃描裝置失敗",updateFailed:"更新裝置失敗",duplicateRequest:"已存在待處理的配對申請",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:"開始與 Quanthermes Agent 對話",outlineTitle:"會話大綱",outlineEmpty:"暫無會話內容",outlineUserQuestion:"使用者問題",inputPlaceholder:"輸入訊息... (Enter 發送,Shift+Enter 換行)",slashCommandArgs:{message:"<訊息>",title:"<標題>",text:"<文字>"},slashCommands:{usage:"計算目前會話用量",status:"查看會話狀態和佇列",abort:"停止目前 Bridge 執行",queue:"將訊息加入目前執行後的佇列",plan:"產生一份 Markdown 實作計畫",goal:"設定一個跨輪次持續推進的目標",goalStatus:"查看目前目標狀態",goalPause:"暫停目前目標循環",goalResume:"繼續已暫停的目標循環",goalDone:"完成並清除目前目標",goalClear:"清除目前目標",subgoal:"為目前目標追加驗收條件",clear:"清空目前顯示內容",clearHistory:"刪除目前會話已儲存的訊息歷史",title:"重新命名目前會話",compress:"空閒時觸發上下文壓縮",steer:"向目前 Bridge 執行傳送引導文字",destroy:"釋放目前會話的 Bridge Agent",reloadMcp:"重載 MCP 伺服器"},attachFiles:"新增附件",autoPlaySpeech:"自動播放語音",showToolCalls:"顯示工具呼叫",hideToolCalls:"隱藏工具呼叫",messageQueue:"訊息佇列",removeQueuedMessage:"移除佇列訊息",stop:"停止",start:"啟動",stopGateway:"停止閘道",send:"發送",contextUsed:"上下文已用:",sessions:"工作階段",webUiSessions:"工作階段",allProfiles:"全部設定",profileMissingModelsTip:"此工作階段所屬設定「{profile}」沒有可用的 provider 或模型",sessionScopeHint:"這裡只顯示目前工作階段;CLI、Telegram、Discord、Cron 等頻道工作階段在歷史中以唯讀方式查看。",openHistory:"開啟歷史",hermesHistory:"QuantHermes 歷史",historyScopeHint:"這裡按來源以唯讀方式查看 QuantHermes 歷史工作階段。",noSessions:"目前無工作階段",searchTitle:"搜尋工作階段",searchSubtitle:"依標題或訊息內容搜尋",searchScope:"搜尋範圍:僅 Web UI 本地工作階段資料庫;不包含唯讀 Hermes 歷史工作階段。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜尋工作階段...",searchEmpty:"最近工作階段",searchRecent:"最近工作階段",searchNoResults:"沒有符合的工作階段",searchNoSnippet:"沒有可顯示的摘要",searchEnterHint:"Enter 開啟 · Esc 關閉",searchFailed:"搜尋工作階段失敗",newChat:"新增對話",approvalKicker:"終端授權",approvalTitle:"執行前請確認命令",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:"重新命名",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:"重新命名失敗",renameSession:"重新命名工作階段",sessionNotFound:"找不到工作階段",enterNewTitle:"輸入新標題",workspace:"工作區",setWorkspace:"設定工作區",setWorkspaceTitle:"設定工作階段工作區",workspacePlaceholder:"輸入專案路徑,例如 /home/user/project",folderPickerEmpty:"(空)",folderPickerNoFolders:"暫無工作區資料夾",folderPickerSelected:"已選擇:",workspaceSet:"工作區已設定",workspaceSetFailed:"設定工作區失敗",other:"其他",runFailed:"執行失敗",error:"錯誤",tool:"工具",arguments:"參數",result:"結果",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 對話"},kanban:{title:"看板",createTask:"新增任務",noTasks:"目前無任務",allStatuses:"所有狀態",allAssignees:"所有負責人",board:{create:"新增看板",archive:"封存看板",slugPlaceholder:"看板識別碼,例如 project-a",namePlaceholder:"顯示名稱(選填)",slugRequired:"看板識別碼不能為空",created:"看板已建立",archived:"看板已封存",archiveConfirm:"確定封存目前看板?"},columns:{triage:"待分類",todo:"待辦",ready:"就緒",running:"進行中",blocked:"阻塞",done:"已完成",archived:"已封存"},form:{title:"標題",titlePlaceholder:"任務標題",titleRequired:"標題不能為空",body:"描述",bodyPlaceholder:"任務描述(選填)",assignee:"負責人",selectAssignee:"選擇負責人...",priority:"優先級",selectPriority:"選擇優先級..."},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:"關鍵資訊"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(選填)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"指派",assignTo:"指派給..."},message:{taskCreated:"任務已建立",taskCompleted:"任務已完成",taskBlocked:"任務已阻塞",taskUnblocked:"任務已解除阻塞",taskAssigned:"任務已指派",loadFailed:"載入任務失敗"},stats:{total:"總計",tasks:"任務數"}},jobs:{title:"排程任務",createJob:"建立任務",editJob:"編輯任務",noJobs:"目前無排程任務,建立一個開始吧。",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:"要執行的內容",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:"技能",searchPlaceholder:"搜尋技能...",noMatch:"沒有符合的技能",noSkills:"目前無技能",backTo:"返回",attachedFiles:"附件檔案",loadFailed:"載入技能失敗",fileLoadFailed:"載入檔案失敗",modified:"使用者已修改",archived:"已封存",pinned:"已釘選",pin:"釘選技能",unpin:"取消釘選",pinFailed:"變更釘選狀態失敗",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;新會話會自動載入。"},plugins:{title:"插件",refresh:"重新整理",notice:"唯讀顯示可發現的 QuantHermes 插件 manifest。發現元資料讀取不會載入插件程式碼。v1 管理動作仍保留在 CLI,新 QuantHermes 工作階段生效。",loadFailed:"載入插件失敗",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:"路徑 / 入口",cli:"CLI"},capabilities:{tools:"{count} 個工具",hooks:"{count} 個 hook",env:"{count} 個環境變數"},metadata:{agentRoot:"Agent 根目錄",python:"Python",scanCwd:"掃描 cwd",projectPlugins:"專案插件"}},memory:{title:"記憶",refresh:"重新整理",loadFailed:"載入記憶失敗",myNotes:"我的筆記",noNotes:"目前無筆記。",notesPlaceholder:"輸入筆記內容...",userProfile:"使用者畫像",noProfile:"目前無畫像。",profilePlaceholder:"輸入使用者畫像...",soul:"靈魂",noSoul:"目前無靈魂設定。",soulPlaceholder:"輸入靈魂設定..."},models:{title:"模型",searchPlaceholder:"搜尋模型...",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 已刪除",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 憑證,點擊「新增」即可在 QuantHermes 中啟用 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 將從 QuantHermes 清單移除。不會影響 gh CLI —— `gh auth status` 仍顯示已登入。",copilotDeleteHintAppsJson:"Copilot 將從 QuantHermes 清單移除。不會影響 VS Code Copilot 插件的登入。",customBadge:"自訂",previewBadge:"預覽",disabledBadge:"不可用",disabledTooltip:"此模型目前帳號不可用",customModelPlaceholder:"自訂模型名稱",customModelHint:"按 Enter 載入",removeCustomModel:"移除這個未列出的模型",noProviders:"目前無 Provider,新增一個開始吧。",models:"模型清單",count:"個模型",more:"個更多",builtIn:"內建",customType:"自訂",provider:"Provider",contextLength:"上下文長度",contextLengthPlaceholder:"例如 256000(選填)",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:"取消全選",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:"預設",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:"登入成功!"},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:"代理",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 回覆完成時播放提示音",busyInputMode:"忙碌輸入模式",busyInputModeHint:"AI 處理中仍可輸入",theme:"主題",themeHint:"選擇淺色、暗色或跟隨系統",themeLight:"淺色",themeDark:"暗色",themeSystem:"跟隨系統"},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。",mode:"Profile 策略",modeHint:"啟動所有發現到的 profiles,或只啟動白名單內的 profiles。",modeAll:"所有發現到的 profiles",modeInclude:"僅白名單 profiles",include:"白名單 profiles",includeHint:"逗號分隔 profile 名。白名單模式下留空表示不自動啟動任何 profile。",exclude:"排除 profiles",excludeHint:"逗號分隔 profile 名;會在白名單/全量策略之後再排除。",profileListPlaceholder:"default, reviewer"},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:"修改工作階段操作是否授權"},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"},userAvatar:{title:"使用者頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB,會自動壓縮到 500KB 以下",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},voice:{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:"未安裝",installNow:"安裝",installing:"安裝中",installSuccess:"安裝完成",installFailed:"安裝失敗",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",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 伺服器位址",appId:"App ID",appIdHint:"飛書 App ID",appSecret:"App Secret",appSecretHint:"飛書 App Secret",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:"智慧代理已新增",agentAlreadyInRoom:"該智慧代理已在房間中",agentAddFailedCount:"{count} 個智慧代理未新增:{details}",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",copyRoomLink:"複製房間連結",deleteRoomConfirm:"確定刪除這個房間嗎?",clearContext:"清理上下文",clearContextConfirm:"確定清理目前房間上下文嗎?訊息和壓縮快照會被刪除,智慧代理和成員會保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房間",joinFailed:"加入房間失敗",inputPlaceholder:"輸入訊息... (Enter 發送)",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:"追蹤 QuantHermes 工作階段中的技能載入與編輯",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_11_1:"LAN 裝置發現新增配對審批、申請歷史、重複申請處理、狀態同步,以及撤銷裝置權限時的清理邏輯",new_0_6_11_2:"LAN Peer 已接入 MCP,包含內建 MCP 啟動、命令 shim、Peer Socket 重連、本地連線列表,以及終端會話數量限制",new_0_6_11_3:"統一後端 TTS 合成和 MiMo 音色複刻設定已可用,並支援保存設定前試聽",new_0_6_11_4:"Gateway 自動啟動設定現在支援按 Profile 多選過濾、白名單行為和啟動 Profile 選擇測試",new_0_6_11_5:"聊天滾動和動效更穩定,修復初次進入滾動到底部、滾動鎖定、底部跟隨時機和 reduced-motion 淡入處理",new_0_6_11_6:"Agent Bridge 和運行時流程更可靠,修復 abort 超時、恢復時誤啟動、execute-code 授權記憶、Windows Gateway 恢復和開發終端代理",new_0_6_11_7:"安全性增強:加固 Web UI Origin 策略、安全回應標頭,並限制 server token 只能走本地回環訪問",new_0_6_11_8:"群聊和工具結果渲染更穩定,支援重連後重新加入房間、保留 reasoning/tool 邊界、加固工具 payload 渲染並優化 diff 展示",new_0_6_11_9:"技能和 Workspace 流程支援外部技能目錄、匯入/刪除自動刷新、按 sourcePath 分組、本地化資料夾選擇文案和移動端技能操作圖示",new_0_6_11_10:"裝置頁布局、原生會話標題、瀏覽器分頁標題、Kanban 父任務 ID 和 OpenRouter 歸屬文案做了介面優化",new_0_6_10_1:"桌面運行時啟動更可靠,支援下載來源選擇、更安全的壓縮包解壓、修正運行時快取路徑、Windows CLI 啟動修復,以及本地化進度和錯誤介面",new_0_6_10_2:"輔助壓縮模型設定允許每個 Profile 為聊天上下文壓縮選擇專用 provider/model,不再只能使用目前聊天模型",new_0_6_10_3:"Provider 模型目錄現在可在介面中手動刷新",new_0_6_10_4:"使用者可以上傳帳號頭像,群聊成員也會一致同步並展示帳號頭像",new_0_6_10_5:"Workspace 文件瀏覽支援更完整的文字預覽,並擴展源碼和文件檔案的右鍵選單覆蓋",new_0_6_10_6:"Agent Bridge 更可靠:會刷新工具審批 allowlist,並相容 Windows tasklist/taskkill 輸出解碼,避免 UnicodeDecodeError 崩潰",new_0_6_10_7:"官網文案統一展示為 Hermes Studio,同時保留 npm package、CLI、倉庫和環境變數等技術標識不變",new_0_6_10_8:"OpenAPI 文件補充頭像、輔助模型配置、Provider 模型快取刷新和 Hermes 會話匯入端點",new_0_6_10_9:"記憶備註現在可以保存為空內容,清空個人備註時不會再保存失敗",new_0_6_10_10:"倉庫 harness 文件現在會追蹤 Chat 鏈路變更,bridge 和 chat runtime 更新需要先記錄後才能通過 CI",new_0_6_9_1:"應用品牌統一為 Hermes Studio,涵蓋瀏覽器標題、側邊欄、官網標題、package metadata 和官網連結",new_0_6_9_2:"桌面端檢查更新更可靠:GitHub API 被限流或 tag 路徑缺少 metadata 時會走 release feed 備援",new_0_6_9_3:"macOS 桌面端安裝更新時會先停止本機 Web UI server,再交給 electron-updater 退出安裝,修復點擊重啟不安裝的問題",new_0_6_9_4:"Provider 憑證與認證更嚴格遵循 Profile 作用域,gateway/runtime 啟動也更相容桌面端打包環境",new_0_6_9_5:"瀏覽器 Web Speech 播放現在會在 Chrome 中暫停/恢復目前訊息,不再點擊暫停後從頭重播",new_0_6_9_6:"語言切換器新增俄語,本次合入社群貢獻的俄語用戶端介面翻譯",new_0_6_8_1:"桌面端補齊托盤控制、手動檢查更新、更新提示,以及從本機瀏覽器開啟打包 Web UI 的能力",new_0_6_8_2:"Windows 桌面端啟動更安靜也更穩定:隱藏 Python/bridge 子程序,修復終端機彈窗、托盤圖示尺寸和瀏覽器打包問題",new_0_6_8_3:"跨平台桌面打包更穩定:修復 macOS 簽名檔案數量限制、Linux 可寫路徑、runtime 冷啟動和 workflow checkout 問題",new_0_6_8_4:"官網與發佈鏈路改進:新增下載鏡像,桌面 release 後再部署官網,並清理桌面 smoke check 流程",new_0_6_8_5:"執行體驗繼續優化:優先使用 provider 上下文長度、保留未送出草稿、修復行動端版面溢出、SSH 檔案 Provider 自訂連接埠和非阻塞預覽操作",new_0_6_7_1:"桌面版預設使用 8748 連接埠,支援區域網路內存取,也可以直接用本機瀏覽器開啟 Web UI",new_0_6_7_9:"桌面端下載入口已補充到官網 https://hermes-studio.ai/,也可以繼續從 GitHub Releases 取得最新安裝包",new_0_6_7_2:"MCP 工具鏈繼續完善:修復 bridge 工具發現與 MCP 管理生命週期,並在管理頁支援按模型控制工具可見性",new_0_6_7_3:"訊息列表體驗優化:修復空狀態置中、捲動抖動、歷史會話載入串訊息,並在切換會話時保留捲動位置與 1.5 秒淡入效果",new_0_6_7_4:"Bridge 與執行狀態更穩定:保持文字和 tool-call 順序、修復 Profile runtime 狀態載入、改進 Node/npm 偵測,並避免正式環境自動建立資料目錄",new_0_6_7_5:"Desktop 發佈鏈路補齊 Electron 打包、應用命名、preload 建置、release artifact 上傳、Windows Hermes CLI 啟動、Linux 圖示與可寫資料路徑、macOS 無憑證跳過簽名和 Windows 啟動無視窗體驗",new_0_6_7_6:"官網發佈支援下載頁和部署工作流,並修復沒有 rsync 的環境下部署失敗的問題",new_0_6_7_7:"服務端與認證修復:Windows 憑據目錄使用 dirname 解析,頭像上傳 body 限制提高,避免大圖觸發 413",new_0_6_7_8:"補充 coding agents 倉庫 harness、驗證文件和 agent 指南,同時移除過期 setup script 文件"}},ki={login:{title:"QuantHermes Web UI",description:"アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",defaultCredentialsHint:"既定のユーザー名:quanthermes、既定のパスワード:12345678",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",lockResetHint:"自分のサーバーの場合は、次のコマンドでログインロックを解除できます:",defaultLoginResetHint:"既定の quanthermes パスワードをリセットするには、次を実行してください:",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:"再試行",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:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",mcp:"MCP",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",performance:"パフォーマンス",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",devices:"デバイス",groupChat:"グループチャット",groupConversation:"会話",groupConversationShort:"会話",groupAgent:"エージェント",groupAgentShort:"エージェント",groupSystem:"システム",groupSystemShort:"シス",groupMonitoring:"監視",groupMonitoringShort:"監視",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:"カスタム版の更新は社内リリース手順で管理されます",updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました。内部更新ソース設定を確認してください。",updateSource:"更新元: {source}",updateManagedInternally:"カスタム版: 更新は内部リリース手順で管理されます",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません",kanban:"カンバン",groupTools:"ツール",groupToolsShort:"ツール",codingAgents:"コーディングエージェント",versionPreview:"バージョンプレビュー",groupPlatform:"プラットフォーム",gateways:"ゲートウェイ",expand:"メニューを展開",collapse:"メニューを折りたたむ"},devices:{title:"デバイス",count:"{count} 台のデバイス",lastScanned:"最終スキャン: {time}",refresh:"更新",empty:"デバイスが見つかりません",computer:"コンピューター",endpointLabel:"エンドポイント",statusLabel:"ステータス",address:"アドレス",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"レイテンシ",lastSeen:"最終検出",open:"開く",never:"なし",unknown:"不明",loadFailed:"デバイスの読み込みに失敗しました",scanFailed:"デバイスのスキャンに失敗しました",updateFailed:"デバイスの更新に失敗しました",duplicateRequest:"保留中のペアリング申請がすでにあります",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:"Quanthermes Agent と会話を開始しましょう",outlineTitle:"会話アウトライン",outlineEmpty:"会話内容はありません",outlineUserQuestion:"ユーザーの質問",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",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 サーバーを再読み込み"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",allProfiles:"すべてのプロファイル",profileMissingModelsTip:"このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"QuantHermes 履歴",historyScopeHint:"ソース別にグループ化された QuantHermes 履歴セッションを読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",approvalKicker:"ターミナル権限",approvalTitle:"実行前にコマンドを確認",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:"名前変更",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:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",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:"音声を自動再生"},jobs:{title:"スケジュールジョブ",createJob:"ジョブを作成",editJob:"ジョブを編集",noJobs:"スケジュールジョブがありません。作成して始めましょう。",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:"実行するプロンプト",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:"スキル",searchPlaceholder:"スキルを検索...",noMatch:"検索に一致するスキルがありません",noSkills:"スキルがありません",backTo:"戻る",attachedFiles:"添付ファイル",loadFailed:"スキルの読み込みに失敗しました",fileLoadFailed:"ファイルの読み込みに失敗しました",modified:"ユーザー変更あり",archived:"アーカイブ済み",pinned:"ピン留め",pin:"スキルをピン留め",unpin:"ピン留めを解除",pinFailed:"ピン留め状態の変更に失敗しました",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 を実行してください。新規セッションは自動で読み込みます。"},plugins:{title:"プラグイン",refresh:"更新",notice:"検出可能な QuantHermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい QuantHermes セッションで有効になります。",loadFailed:"プラグインの読み込みに失敗しました",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"エージェントルート",python:"Python",scanCwd:"cwd をスキャン",projectPlugins:"プロジェクトプラグイン"}},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:"プロバイダーを削除しました",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 トークンを検出しました。「追加」をクリックして QuantHermes で 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 は QuantHermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。",copilotDeleteHintAppsJson:"Copilot は QuantHermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。",customBadge:"カスタム",previewBadge:"プレビュー",disabledBadge:"利用不可",disabledTooltip:"このモデルは現在のアカウントでは利用できません。",customModelPlaceholder:"未掲載のモデル ID",customModelHint:"プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。",noProviders:"プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。",clearVisibleModels:"選択をクリア",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:"デフォルト",builtIn:"組み込み",customType:"カスタム",provider:"プロバイダー",contextLength:"コンテキスト長",contextLengthPlaceholder:"例: 256000(任意)",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:"ログイン成功!",visibilitySelectOne:"少なくとも 1 つの表示モデルを残してください",visibilitySaved:"表示モデルを保存しました",visibilitySaveFailed:"表示モデルの保存に失敗しました",visibilityHint:"Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。",showAllModels:"すべてのモデルを表示",searchPlaceholder:"モデルを検索...",removeCustomModel:"この一覧外モデルを削除",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:"エージェント",memory:"メモリ",compression:"圧縮",session:"セッション",privacy:"プライバシー",apiServer:"API サーバー",models:"モデル",voice:"音声"},display:{streaming:"ストリームレスポンス",streamingHint:"AI の返信をリアルタイムで表示",compact:"コンパクトモード",compactHint:"メッセージの間隔を狭める",showReasoning:"推論過程を表示",showReasoningHint:"モデルの思考プロセスを表示",showCost:"コストを表示",showCostHint:"返信にトークン使用量を表示",inlineDiffs:"インライン差分",inlineDiffsHint:"コード変更をインラインで表示",bellOnComplete:"完了通知音",bellOnCompleteHint:"AI の応答完了時に通知音を再生",busyInputMode:"処理中入力モード",busyInputModeHint:"AI 処理中でも入力を許可",theme:"テーマ",themeHint:"ライト、ダーク、またはシステム設定に従う",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム"},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 を自動起動しません。",mode:"Profile ポリシー",modeHint:"検出されたすべての profiles を起動するか、明示的な許可リストだけを起動します。",modeAll:"検出されたすべての profiles",modeInclude:"含めた profiles のみ",include:"含める profiles",includeHint:"カンマ区切りの profile 名。include モードで空リストの場合は何も起動しません。",exclude:"除外する profiles",excludeHint:"include/all ポリシー適用後にスキップする profile 名をカンマ区切りで指定します。",profileListPlaceholder:"default, reviewer"},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:"セッション操作に認証を必要とする"},privacy:{redactPii:"個人情報のマスキング",redactPiiHint:"機密情報を自動検出して隠す(パスワード、キーなど)"},apiServer:{enable:"有効化",enableHint:"API サーバーを有効にする",host:"ホスト",hostHint:"リッスンアドレス",port:"ポート",portHint:"リッスンポート",key:"キー",keyHint:"API アクセスキー",cors:"CORS 許可元",corsHint:"許可するクロスオリジン"},voice:{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をロック解除しました"},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:"未インストール",installNow:"インストール",installing:"インストール中",installSuccess:"インストールしました",installFailed:"インストールに失敗しました",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:"開発者ポータルから取得したボットトークン",accessToken:"アクセストークン",accessTokenHint:"Matrix アクセストークン",homeserver:"Homeserver URL",homeserverHint:"Matrix ホームサーバー URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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:"Account 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:"QuantHermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_6_11_1:"LAN device discovery に pairing approvals、request history、duplicate request handling、status sync、device access revoke 時の cleanup を追加しました",new_0_6_11_2:"LAN peer access は MCP から利用でき、bundled MCP startup、command shims、reconnecting peer sockets、local connection listing、terminal session caps に対応しました",new_0_6_11_3:"Unified backend TTS synthesis と MiMo voice cloning settings が利用可能になり、保存前の playback に対応しました",new_0_6_11_4:"Gateway autostart settings は Profile の multi-select filtering、whitelist behavior、startup profile selection tests に対応しました",new_0_6_11_5:"Chat scrolling と motion は bottom-follow tuning、initial bottom scroll fixes、scroll lock updates、reduced-motion fade handling により安定しました",new_0_6_11_6:"Agent Bridge と runtime flows は abort timeout handling、resume startup guards、execute-code approval memory、Windows Gateway recovery、dev terminal proxy fixes により安定しました",new_0_6_11_7:"Web UI origin policy、security headers、server-token loopback access guards により security を強化しました",new_0_6_11_8:"Group chat と tool output rendering は reconnect 後の room rejoin、reasoning/tool boundaries の保持、より安全な tool payload rendering、改善された diff display により安定しました",new_0_6_11_9:"Skills と Workspace flows は external skill directories、import/delete refresh、sourcePath grouping、localized folder picker text、mobile skill action icons に対応しました",new_0_6_11_10:"Device layout、session titles、browser tab titles、Kanban parent task IDs、OpenRouter attribution text を改善しました",new_0_6_10_1:"公式サイトの文言を Hermes Studio に統一し、npm package、CLI、repository、環境変数の識別子はそのまま保持しました",new_0_6_10_2:"Desktop の起動と runtime download 画面が、service startup、source selection、progress、error state のローカライズ文言に対応しました",new_0_6_10_3:"Windows Agent Bridge の process check がローカライズされた tasklist/taskkill 出力を許容し、非 UTF-8 system command output による UnicodeDecodeError crash を回避します",new_0_6_10_4:"OpenAPI docs に avatar、auxiliary model config、provider model cache refresh、Hermes session import endpoints を追加しました",new_0_6_10_5:"Workspace file browser がより充実した text preview と source/document files の context menu coverage に対応しました",new_0_6_10_6:"Agent Bridge は tool approval allowlist の更新と Windows tasklist/taskkill output decoding により、より安定しました",new_0_6_10_7:"ユーザーは profile avatar をアップロードでき、group chat members は account avatar を一貫して同期・表示します",new_0_6_10_8:"Provider model catalog を UI から refresh できるようになりました",new_0_6_10_9:"Memory notes は空の内容でも保存できるようになり、personal notes の clear が保存失敗になりません",new_0_6_10_10:"Repository harness docs が chat-chain changes を追跡し、bridge と chat-runtime updates は CI 通過前に文書化されます",new_0_6_9_1:"アプリのブランドを Hermes Studio に統一し、ブラウザタイトル、サイドバー、Web サイトタイトル、package metadata、公式サイトリンクに反映しました",new_0_6_9_2:"GitHub API の rate limit や tag 別 metadata 欠落時に release feed fallback を使い、Desktop の更新チェックがより安定しました",new_0_6_9_3:"macOS Desktop の更新インストールは先にローカル Web UI server を停止し、electron-updater に終了とインストールを任せるため Restart で正しく適用されます",new_0_6_9_4:"Provider 認証情報と auth は Profile scope をより一貫して扱い、gateway/runtime 起動も packaged Desktop により適合しました",new_0_6_9_5:"Browser Web Speech は Chrome で現在のメッセージを一時停止/再開し、停止ボタンで先頭から再生し直さないようになりました",new_0_6_9_6:"言語切り替えにロシア語を追加し、community による client UI message 翻訳を取り込みました",new_0_6_8_1:"Desktop build に tray control、手動 update check、update notification、packaged Web UI の local browser open を追加しました",new_0_6_8_2:"Windows Desktop は Python/bridge subprocess 非表示、terminal popup 修正、tray icon sizing、browser packaging 修正でより静かで安定した起動になりました",new_0_6_8_3:"Desktop packaging は macOS signing file limit、Linux writable path、runtime cold start、workflow checkout 修正で各 platform の安定性が向上しました",new_0_6_8_4:"公式サイトと release 配布は download mirrors、Desktop release 後の website deploy、desktop smoke check cleanup により改善しました",new_0_6_8_5:"Provider context length 優先、未送信 chat draft 保持、mobile layout overflow 修正、SSH File Provider custom port、nonblocking preview actions で runtime 体験を改善しました",new_0_6_7_1:"Desktop アプリは既定で port 8748 を使用し、LAN アクセスとローカルブラウザからの直接アクセスに対応しました",new_0_6_7_9:"Desktop のダウンロードリンクを公式サイト https://hermes-studio.ai/ に追加し、最新インストーラーは引き続き GitHub Releases からも取得できます",new_0_6_7_2:"MCP ツールは bridge の tool discovery 修正、MCP 管理ライフサイクル修正、管理画面のモデル別 tool visibility によりさらに整備されました",new_0_6_7_3:"メッセージ一覧は empty state の中央揃え、scroll jitter、History 読み込み中のライブチャット混入を修正し、セッション別スクロール位置保持と 1.5 秒のフェードインに対応しました",new_0_6_7_4:"Bridge と runtime は text/tool-call の順序保持、Profile runtime status loading 修正、Node/npm 検出改善、本番 data directory 作成スキップで安定しました",new_0_6_7_5:"Desktop 配布は Electron packaging、アプリ名、preload build、release artifact upload、Windows Hermes CLI 起動、Linux icon と書き込み可能 data path、macOS 未署名対応、Windows 起動時の非表示 subprocess に対応しました",new_0_6_7_6:"Web サイトに downloads と deploy workflow を追加し、rsync がない環境での deploy 失敗を修正しました",new_0_6_7_7:"Server と auth は Windows credential directory に dirname を使い、大きな avatar 画像で 413 にならないよう body limit を引き上げました",new_0_6_7_8:"Coding Agents 向けに repository harness、validation docs、agent guidance を追加し、古い setup script docs を削除しました"},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:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",agentAddFailedCount:"{count} 件のエージェントを追加できませんでした: {details}",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",copyRoomLink:"ルームリンクをコピー",deleteRoomConfirm:"このルームを削除しますか?",clearContext:"コンテキストを削除",clearContextConfirm:"このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。",contextCleared:"コンテキストを削除しました",you:"あなた",joined:"ルームに参加しました",joinFailed:"ルームへの参加に失敗しました",inputPlaceholder:"メッセージを入力... (Enterで送信)",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 の停止に失敗しました"},kanban:{title:"Kanban ボード",createTask:"新規タスク",noTasks:"タスクはありません",allStatuses:"すべての状態",allAssignees:"すべての担当者",columns:{triage:"振り分け待ち",todo:"未着手",ready:"準備完了",running:"進行中",blocked:"ブロック中",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:"優先度を選択..."},detail:{status:"状態",priority:"優先度",assignee:"担当者",tenant:"テナント",createdAt:"作成時刻",startedAt:"開始時刻",completedAt:"完了時刻",comments:"コメント",events:"イベント",runs:"実行履歴",artifacts:"成果物",result:"完了結果",highlights:"重要情報",sources:"データソース",sessions:"関連セッション",sessionMessages:"セッション記録",noSessions:"関連セッションが見つかりません。"},action:{title:"操作",assign:"割り当て",assignTo:"割り当て先...",block:"ブロック",blockReason:"ブロック理由",unblock:"ブロック解除",complete:"完了",completeSummary:"完了サマリー(任意)"},message:{loadFailed:"タスクの読み込みに失敗しました",taskCreated:"タスクを作成しました",taskAssigned:"タスクを割り当てました",taskBlocked:"タスクをブロックしました",taskUnblocked:"タスクのブロックを解除しました",taskCompleted:"タスクを完了しました"},stats:{total:"合計",tasks:"タスク数"}}},wi={login:{title:"QuantHermes Web UI",description:"계속하려면 액세스 토큰을 입력하세요. 서버 시작 로그에서 확인할 수 있습니다.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",defaultCredentialsHint:"기본 로그인 이름: quanthermes, 기본 비밀번호: 12345678",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",lockResetHint:"본인 서버라면 다음 명령으로 로그인 잠금을 해제할 수 있습니다:",defaultLoginResetHint:"기본 quanthermes 비밀번호를 재설정하려면 다음을 실행하세요:",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:"재시도",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:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",mcp:"MCP",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",performance:"성능 모니터링",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",devices:"기기",groupChat:"그룹 채팅",groupConversation:"대화",groupConversationShort:"대화",groupAgent:"에이전트",groupAgentShort:"에전",groupSystem:"시스템",groupSystemShort:"시스템",groupMonitoring:"모니터링",groupMonitoringShort:"모니터",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:"커스텀 빌드 업데이트는 내부 배포 절차로 관리됩니다",updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트에 실패했습니다. 내부 업데이트 소스 구성을 확인하세요.",updateSource:"업데이트 소스: {source}",updateManagedInternally:"커스텀 빌드: 업데이트는 내부 배포 절차로 관리됩니다",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다",kanban:"칸반",groupTools:"도구",groupToolsShort:"도구",codingAgents:"코딩 에이전트",versionPreview:"버전 미리보기",groupPlatform:"플랫폼",gateways:"게이트웨이",expand:"메뉴 펼치기",collapse:"메뉴 접기"},devices:{title:"기기",count:"기기 {count}개",lastScanned:"마지막 스캔: {time}",refresh:"새로고침",empty:"기기를 찾을 수 없습니다",computer:"컴퓨터",endpointLabel:"엔드포인트",statusLabel:"상태",address:"주소",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"지연 시간",lastSeen:"마지막 발견",open:"열기",never:"없음",unknown:"알 수 없음",loadFailed:"기기를 불러오지 못했습니다",scanFailed:"기기 스캔에 실패했습니다",updateFailed:"기기를 업데이트하지 못했습니다",duplicateRequest:"대기 중인 페어링 요청이 이미 있습니다",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:"Quanthermes Agent와 대화를 시작하세요",outlineTitle:"대화 개요",outlineEmpty:"대화 내용이 없습니다",outlineUserQuestion:"사용자 질문",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",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 서버 다시 로드"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",allProfiles:"모든 프로필",profileMissingModelsTip:'이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"QuantHermes 기록",historyScopeHint:"소스별로 그룹화된 QuantHermes 기록 세션을 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",approvalKicker:"터미널 권한",approvalTitle:"실행 전에 명령 확인",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:"이름 변경",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:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",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:"음성 자동 재생"},jobs:{title:"예약 작업",createJob:"작업 생성",editJob:"작업 편집",noJobs:"예약된 작업이 없습니다. 새로 만들어 시작하세요.",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:"실행할 프롬프트",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:"스킬",searchPlaceholder:"스킬 검색...",noMatch:"검색과 일치하는 스킬이 없습니다",noSkills:"스킬을 찾을 수 없습니다",backTo:"돌아가기",attachedFiles:"첨부 파일",loadFailed:"스킬을 불러오지 못했습니다",fileLoadFailed:"파일을 불러오지 못했습니다",modified:"사용자 수정됨",archived:"보관됨",pinned:"고정됨",pin:"스킬 고정",unpin:"고정 해제",pinFailed:"고정 상태 변경 실패",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 실행. 새 세션은 자동 로드됩니다."},plugins:{title:"플러그인",refresh:"새로고침",notice:"탐색 가능한 QuantHermes 플러그인 manifest의 읽기 전용 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. v1의 관리 작업은 CLI에 유지되며, 변경 사항은 새 QuantHermes 세션에서 적용됩니다.",loadFailed:"플러그인을 불러오지 못했습니다",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"에이전트 루트",python:"Python",scanCwd:"cwd 스캔",projectPlugins:"프로젝트 플러그인"}},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가 삭제되었습니다",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 토큰이 감지되었습니다. 추가를 클릭하여 QuantHermes에서 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이 QuantHermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.",copilotDeleteHintAppsJson:"Copilot이 QuantHermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.",customBadge:"커스텀",previewBadge:"프리뷰",disabledBadge:"사용 불가",disabledTooltip:"이 모델은 현재 계정에서 사용할 수 없습니다.",customModelPlaceholder:"목록에 없는 모델 ID",customModelHint:"제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.",noProviders:"Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.",clearVisibleModels:"선택 지우기",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:"기본값",builtIn:"내장",customType:"사용자 지정",provider:"공급자",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 256000 (선택사항)",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:"로그인 성공!",visibilitySelectOne:"최소 하나의 표시 모델을 유지하세요",visibilitySaved:"표시 모델이 저장되었습니다",visibilitySaveFailed:"표시 모델 저장 실패",visibilityHint:"Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.",showAllModels:"모든 모델 표시",searchPlaceholder:"모델 검색...",removeCustomModel:"목록에 없는 이 모델 제거",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:"에이전트",memory:"메모리",compression:"압축",session:"세션",privacy:"개인정보",apiServer:"API 서버",models:"모델",voice:"음성"},display:{streaming:"스트리밍 응답",streamingHint:"AI 응답을 실시간으로 표시",compact:"컴팩트 모드",compactHint:"메시지 간격 줄이기",showReasoning:"추론 과정 표시",showReasoningHint:"모델의 생각 과정 표시",showCost:"비용 표시",showCostHint:"응답에 토큰 사용량 표시",inlineDiffs:"인라인 변경사항",inlineDiffsHint:"코드 변경사항을 인라인으로 표시",bellOnComplete:"완료 알림음",bellOnCompleteHint:"AI 응답 완료 시 알림음 재생",busyInputMode:"바쁨 입력 모드",busyInputModeHint:"AI 처리 중에도 입력 허용",theme:"테마",themeHint:"라이트, 다크 또는 시스템 설정 따르기",themeLight:"라이트",themeDark:"다크",themeSystem:"시스템"},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도 자동으로 실행하지 않습니다.",mode:"Profile 정책",modeHint:"발견된 모든 profiles를 시작하거나 명시적으로 포함한 목록만 시작합니다.",modeAll:"발견된 모든 profiles",modeInclude:"포함된 profiles만",include:"포함할 profiles",includeHint:"쉼표로 구분한 profile 이름입니다. 포함 모드에서 빈 목록은 아무것도 시작하지 않습니다.",exclude:"제외할 profiles",excludeHint:"include/all 정책 적용 후 건너뛸 profile 이름을 쉼표로 구분해 입력합니다.",profileListPlaceholder:"default, reviewer"},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:"세션 작업에 인증 필요"},privacy:{redactPii:"개인정보 마스킹",redactPiiHint:"민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)"},apiServer:{enable:"활성화",enableHint:"API 서버 활성화",host:"호스트",hostHint:"수신 주소",port:"포트",portHint:"수신 포트",key:"키",keyHint:"API 접근 키",cors:"CORS 출처",corsHint:"허용된 교차 출처"},voice:{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 잠금 해제됨"},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:"설치되지 않음",installNow:"설치",installing:"설치 중",installSuccess:"설치됨",installFailed:"설치 실패",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:"Bot Token",botTokenHint:"개발자 포털에서 발급받은 Bot Token",accessToken:"Access Token",accessTokenHint:"Matrix 액세스 토큰",homeserver:"Homeserver URL",homeserverHint:"Matrix 홈서버 URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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 Token",weixinTokenHint:"weixin CLI QR 로그인에서 가져오기 (hermes weixin)",accountId:"Account ID",accountIdHint:"Weixin Account 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:"QuantHermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_6_11_1:"LAN device discovery 에 pairing approvals, request history, duplicate request handling, status sync, device access revoke 시 cleanup 이 추가되었습니다",new_0_6_11_2:"LAN peer access 는 MCP 에서 사용할 수 있으며 bundled MCP startup, command shims, reconnecting peer sockets, local connection listing, terminal session caps 를 지원합니다",new_0_6_11_3:"Unified backend TTS synthesis 와 MiMo voice cloning settings 를 사용할 수 있고 저장 전 playback 을 지원합니다",new_0_6_11_4:"Gateway autostart settings 가 Profile multi-select filtering, whitelist behavior, startup profile selection tests 를 지원합니다",new_0_6_11_5:"Chat scrolling 과 motion 이 bottom-follow tuning, initial bottom scroll fixes, scroll lock updates, reduced-motion fade handling 으로 더 안정적입니다",new_0_6_11_6:"Agent Bridge 와 runtime flows 가 abort timeout handling, resume startup guards, execute-code approval memory, Windows Gateway recovery, dev terminal proxy fixes 로 더 안정적입니다",new_0_6_11_7:"Web UI origin policy, security headers, server-token loopback access guards 로 security 가 강화되었습니다",new_0_6_11_8:"Group chat 과 tool output rendering 이 reconnect 후 room rejoin, reasoning/tool boundaries 보존, 더 안전한 tool payload rendering, 개선된 diff display 로 안정화되었습니다",new_0_6_11_9:"Skills 와 Workspace flows 가 external skill directories, import/delete refresh, sourcePath grouping, localized folder picker text, mobile skill action icons 를 지원합니다",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs, OpenRouter attribution text 가 개선되었습니다",new_0_6_10_1:"공식 사이트 문구를 Hermes Studio 로 일관되게 표시하며 npm package, CLI, repository, 환경 변수 식별자는 그대로 유지합니다",new_0_6_10_2:"Desktop 시작 및 runtime download 화면이 service startup, source selection, progress, error state 에 대한 현지화 문구를 사용합니다",new_0_6_10_3:"Windows Agent Bridge process check 가 현지화된 tasklist/taskkill 출력을 허용하여 비 UTF-8 system command output 으로 인한 UnicodeDecodeError crash 를 방지합니다",new_0_6_10_4:"OpenAPI docs 에 avatar, auxiliary model config, provider model cache refresh, Hermes session import endpoints 가 추가되었습니다",new_0_6_10_5:"Workspace file browser 가 더 풍부한 text preview 와 source/document files 용 context menu coverage 를 지원합니다",new_0_6_10_6:"Agent Bridge 는 tool approval allowlist 갱신과 Windows tasklist/taskkill output decoding 으로 더 안정적입니다",new_0_6_10_7:"사용자가 profile avatar 를 업로드할 수 있고 group chat members 가 account avatar 를 일관되게 동기화하고 표시합니다",new_0_6_10_8:"Provider model catalog 를 UI 에서 refresh 할 수 있습니다",new_0_6_10_9:"Memory notes 를 빈 내용으로 저장할 수 있어 personal notes 를 저장 실패 없이 비울 수 있습니다",new_0_6_10_10:"Repository harness docs 가 chat-chain changes 를 추적하여 bridge 와 chat-runtime updates 가 CI 통과 전에 문서화됩니다",new_0_6_9_1:"앱 브랜드를 Hermes Studio 로 통일하고 브라우저 제목, 사이드바, 웹사이트 제목, package metadata, 공식 사이트 링크에 반영했습니다",new_0_6_9_2:"GitHub API rate limit 이나 tag metadata 누락 시 release feed fallback 을 사용해 Desktop 업데이트 확인이 더 안정적입니다",new_0_6_9_3:"macOS Desktop 업데이트 설치는 먼저 로컬 Web UI server 를 중지한 뒤 electron-updater 가 종료와 설치를 처리해 Restart 로 다운로드 버전을 적용합니다",new_0_6_9_4:"Provider 자격 증명과 auth 는 Profile scope 를 더 일관되게 따르며 gateway/runtime 시작도 패키징된 Desktop 실행과 더 호환됩니다",new_0_6_9_5:"Browser Web Speech 는 Chrome 에서 현재 메시지를 일시정지/재개하며 일시정지 클릭 시 처음부터 다시 재생하지 않습니다",new_0_6_9_6:"언어 전환기에 러시아어가 추가되었으며 커뮤니티가 번역한 client UI 메시지를 포함합니다",new_0_6_8_1:"Desktop build 에 tray control, 수동 update check, update notification, 패키징된 Web UI 의 local browser open 을 추가했습니다",new_0_6_8_2:"Windows Desktop 은 숨김 Python/bridge subprocess, terminal popup 수정, tray icon 크기 수정, browser packaging 수정으로 더 조용하고 안정적으로 시작합니다",new_0_6_8_3:"Desktop packaging 은 macOS signing file limit, Linux writable path, runtime cold start, workflow checkout 수정으로 플랫폼 전반의 안정성이 향상되었습니다",new_0_6_8_4:"공식 사이트와 release 배포는 download mirrors, Desktop release 이후 website deploy, desktop smoke check 정리로 개선되었습니다",new_0_6_8_5:"Provider context length 우선 사용, 미전송 chat draft 보존, mobile layout overflow 수정, SSH File Provider custom port, nonblocking preview actions 로 runtime 경험을 개선했습니다",new_0_6_7_1:"Desktop 앱은 기본적으로 8748 포트를 사용하며 LAN 접근과 로컬 브라우저 직접 열기를 지원합니다",new_0_6_7_9:"Desktop 다운로드 링크가 공식 웹사이트 https://hermes-studio.ai/ 에 추가되었으며 최신 설치 파일은 GitHub Releases 에서도 계속 받을 수 있습니다",new_0_6_7_2:"MCP 도구는 bridge tool discovery 수정, MCP 관리 라이프사이클 수정, 관리자 화면의 모델별 tool visibility 제어로 더 완성되었습니다",new_0_6_7_3:"메시지 목록은 빈 상태 중앙 정렬, 스크롤 튐, History 로딩 중 라이브 채팅 메시지 노출을 수정하고 세션별 스크롤 위치 보존과 1.5초 페이드인을 지원합니다",new_0_6_7_4:"Bridge 와 runtime 은 text/tool-call 순서 보존, Profile runtime status loading 수정, Node/npm 감지 개선, 운영 데이터 디렉터리 생성 생략으로 더 안정적입니다",new_0_6_7_5:"Desktop 배포는 Electron packaging, 앱 이름, preload build, release artifact upload, Windows Hermes CLI 시작, Linux 아이콘과 쓰기 가능한 데이터 경로, macOS 서명 인증서 없음 처리, Windows 시작 시 숨김 subprocess 를 포함합니다",new_0_6_7_6:"웹사이트에 downloads 와 deploy workflow 를 추가하고 rsync 가 없는 환경의 deploy 실패를 수정했습니다",new_0_6_7_7:"Server 와 auth 는 Windows credential directory 에 dirname 을 사용하고 큰 avatar 이미지의 413 오류를 피하도록 body limit 를 높였습니다",new_0_6_7_8:"Coding Agents 를 위한 repository harness, validation docs, agent guidance 를 추가하고 오래된 setup script docs 를 제거했습니다"},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:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",agentAddFailedCount:"{count}개의 에이전트를 추가하지 못했습니다: {details}",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",copyRoomLink:"방 링크 복사",deleteRoomConfirm:"이 방을 삭제하시겠습니까?",clearContext:"컨텍스트 지우기",clearContextConfirm:"이 방의 컨텍스트를 지우시겠습니까? 메시지와 압축 스냅샷은 삭제되고 에이전트와 멤버는 유지됩니다.",contextCleared:"컨텍스트가 지워졌습니다",you:"나",joined:"방에 참여했습니다",joinFailed:"방 참여에 실패했습니다",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송)",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 중지 실패"},kanban:{title:"Kanban 보드",createTask:"새 작업",noTasks:"작업 없음",allStatuses:"모든 상태",allAssignees:"모든 담당자",columns:{triage:"분류 대기",todo:"할 일",ready:"준비됨",running:"진행 중",blocked:"차단됨",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:"우선순위 선택..."},detail:{status:"상태",priority:"우선순위",assignee:"담당자",tenant:"테넌트",createdAt:"생성 시간",startedAt:"시작 시간",completedAt:"완료 시간",comments:"댓글",events:"이벤트",runs:"실행 기록",artifacts:"산출 파일",result:"완료 결과",highlights:"핵심 정보",sources:"데이터 소스",sessions:"관련 세션",sessionMessages:"세션 기록",noSessions:"관련 세션을 찾을 수 없습니다."},action:{title:"작업",assign:"할당",assignTo:"할당 대상...",block:"차단",blockReason:"차단 이유",unblock:"차단 해제",complete:"완료",completeSummary:"완료 요약 (선택)"},message:{loadFailed:"작업 로드 실패",taskCreated:"작업이 생성되었습니다",taskAssigned:"작업이 할당되었습니다",taskBlocked:"작업이 차단되었습니다",taskUnblocked:"작업 차단이 해제되었습니다",taskCompleted:"작업이 완료되었습니다"},stats:{total:"합계",tasks:"작업 수"}}},Ci={login:{title:"QuantHermes Web UI",description:"Entrez votre jeton d'acces pour continuer. Retrouvez-le dans les journaux de demarrage du serveur.",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 : quanthermes. Mot de passe par defaut : 12345678.",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 par defaut de quanthermes, 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",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",search:"Rechercher",apiRelay:"API Relay",history:"Historique",jobs:"Taches planifiees",models:"Modeles",profiles:"Profils",plugins:"Plugins",mcp:"MCP",skills:"Competences",memory:"Memoire",logs:"Journaux",usage:"Utilisation",performance:"Performance",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",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:"Les mises a jour des builds personnalises sont gerees en interne",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. Verifiez la source interne.",updateSource:"Source de mise a jour : {source}",updateManagedInternally:"Build personnalise : les mises a jour sont gerees en interne",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible",kanban:"Kanban",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"},devices:{title:"Appareils",count:"{count} appareils",lastScanned:"Dernier scan : {time}",refresh:"Actualiser",empty:"Aucun appareil trouvé",computer:"Ordinateur",endpointLabel:"Point de terminaison",statusLabel:"Statut",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Joindre des fichiers",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 QuantHermes",historyScopeHint:"Sessions d’historique QuantHermes en lecture seule, regroupées par source.",noSessions:"Aucune session",newChat:"Nouvelle discussion",approvalKicker:"Permission terminal",approvalTitle:"Vérifier la commande avant exécution",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",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",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",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",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"},jobs:{title:"Taches planifiees",createJob:"Creer une tache",editJob:"Modifier la tache",noJobs:"Aucune tache planifiee. Creez-en une pour commencer.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Actualiser",notice:"Inventaire en lecture seule des manifests de plugins QuantHermes détectables. Les métadonnées de découverte sont lues sans charger le code des plugins. En v1, la gestion reste dans le CLI; les changements prennent effet dans les nouvelles sessions QuantHermes.",loadFailed:"Échec du chargement des plugins",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",cli:"CLI"},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"}},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",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 QuantHermes.",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 QuantHermes. 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",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",builtIn:"Integre",customType:"Personnalise",provider:"Fournisseur",contextLength:"Longueur du contexte",contextLengthPlaceholder:"ex. 256000 (facultatif)",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 !",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...",removeCustomModel:"Retirer ce modèle non listé",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",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",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"},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.",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"},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:"Requiere l'autorisation pour les operations de session"},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:{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"},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é",installNow:"Installer",installing:"Installation",installSuccess:"Installé",installFailed:"Échec de l’installation",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",accessToken:"Jeton d'acces",accessTokenHint:"Jeton d'acces Matrix",homeserver:"URL du serveur domestique",homeserverHint:"URL du serveur domestique Matrix",appId:"ID de l'application",appIdHint:"ID de l'application Feishu",appSecret:"Secret de l'application",appSecretHint:"Secret de l'application 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 QuantHermes",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_11_1:"La decouverte des appareils LAN inclut maintenant les approbations de pairing, l historique des demandes, la gestion des doublons, la synchronisation de statut et le nettoyage lors de la revocation d acces",new_0_6_11_2:"L acces LAN peer est disponible via MCP avec demarrage MCP integre, command shims, peer sockets avec reconnexion, liste des connexions locales et sessions terminal limitees",new_0_6_11_3:"La synthese TTS backend unifiee et les reglages de clonage vocal MiMo sont disponibles, avec lecture avant enregistrement",new_0_6_11_4:"Les reglages Gateway autostart exposent le filtrage Profile via controles multi-select, le comportement whitelist et des tests de selection du Profile de demarrage",new_0_6_11_5:"Le scroll et les animations du chat sont plus stables avec bottom-follow tuning, initial bottom scroll fixes, scroll lock updates et gestion du fade reduced-motion",new_0_6_11_6:"Agent Bridge et les flux runtime sont plus fiables avec abort timeout handling, resume startup guards, memoire d approbation execute-code, recuperation Windows Gateway et fixes du proxy terminal dev",new_0_6_11_7:"La securite est renforcee avec Web UI origin policy, security headers et guards d acces loopback pour server token",new_0_6_11_8:"Group chat et le rendu tool output sont plus stables avec rejoin apres reconnect, preservation des reasoning/tool boundaries, rendu tool payload plus sur et meilleure vue diff",new_0_6_11_9:"Skills et Workspace prennent en charge external skill directories, refresh import/delete, groupement par sourcePath, texte localise du folder picker et icones mobiles d actions skill",new_0_6_11_10:"Le layout Devices, les titres de session, les titres browser tab, les Kanban parent task IDs et le texte d attribution OpenRouter ont ete polis",new_0_6_10_1:"Les textes du site presentent maintenant Hermes Studio de facon coherente, tout en conservant les identifiants npm package, CLI, depot et variables d environnement",new_0_6_10_2:"Les ecrans desktop de demarrage et de telechargement runtime utilisent maintenant des textes localises pour le demarrage des services, le choix de source, la progression et les erreurs",new_0_6_10_3:"Les verifications de processus Windows Agent Bridge tolerent les sorties tasklist/taskkill localisees, evitant les crashs UnicodeDecodeError dus aux sorties non UTF-8",new_0_6_10_4:"La documentation OpenAPI inclut maintenant les endpoints avatar, configuration des modeles auxiliaires, refresh du cache des modeles provider et import de session Hermes",new_0_6_10_5:"Le navigateur de fichiers Workspace propose des previews texte plus completes et une meilleure couverture du menu contextuel pour les fichiers source et documents",new_0_6_10_6:"Agent Bridge est plus fiable avec des allowlists d approbation d outils rafraichies et le decodage des sorties Windows tasklist/taskkill",new_0_6_10_7:"Les utilisateurs peuvent televerser des avatars de profil, et les membres de group chat synchronisent et affichent les avatars de compte de facon coherente",new_0_6_10_8:"Les catalogues de modeles provider peuvent maintenant etre rafraichis depuis l UI",new_0_6_10_9:"Les notes de memoire peuvent maintenant etre enregistrees avec un contenu vide afin de vider les notes personnelles sans echec",new_0_6_10_10:"La documentation harness suit maintenant les changements de chaine Chat afin que les mises a jour bridge et chat runtime soient documentees avant le passage CI",new_0_6_9_1:"L application utilise maintenant la marque Hermes Studio dans le titre du navigateur, la barre laterale, le titre du site, les metadonnees package et les liens officiels",new_0_6_9_2:"La verification des mises a jour desktop est plus fiable avec fallback release feed quand l API GitHub est limitee ou que les metadonnees par tag manquent",new_0_6_9_3:"Sur macOS, l installation de mise a jour arrete d abord le serveur Web UI local puis laisse electron-updater gerer la fermeture et l installation",new_0_6_9_4:"Les identifiants provider et l auth respectent mieux les scopes Profile, et le demarrage gateway/runtime est plus compatible avec les builds desktop packages",new_0_6_9_5:"Web Speech du navigateur met maintenant en pause et reprend le message courant dans Chrome au lieu de redemarrer depuis le debut",new_0_6_9_6:"La localisation russe est maintenant disponible dans le selecteur de langue, avec les messages UI client traduits par la communaute",new_0_6_8_1:"Les builds desktop ajoutent controles tray, verification manuelle des updates, notifications de mise a jour et ouverture locale dans le navigateur",new_0_6_8_2:"Le desktop Windows demarre plus discretement et plus fiablement avec subprocesses Python/bridge caches, popups terminal corriges, taille icone tray et packaging navigateur",new_0_6_8_3:"Le packaging desktop est plus stable entre plateformes avec fixes de limite de fichiers de signature macOS, chemins Linux inscriptibles, cold start runtime et workflow checkout",new_0_6_8_4:"Le site officiel et la distribution progressent avec mirrors de telechargement, deploy du site apres les releases desktop et nettoyage des desktop smoke checks",new_0_6_8_5:"L experience runtime progresse avec longueurs de contexte provider, brouillons non envoyes conserves, fixes overflow mobile, ports personnalises SSH File Provider et actions preview non bloquantes",new_0_6_7_1:"L application desktop utilise maintenant le port 8748 par défaut, prend en charge l accès LAN et peut être ouverte directement depuis un navigateur local",new_0_6_7_9:"Les liens de téléchargement desktop sont maintenant disponibles sur le site officiel https://hermes-studio.ai/, et les derniers installateurs restent disponibles via GitHub Releases",new_0_6_7_2:"Les outils MCP sont plus complets avec des corrections de découverte bridge, de cycle de vie MCP et des contrôles de visibilité par modèle dans le gestionnaire",new_0_6_7_3:"Les listes de messages centrent mieux les états vides, réduisent les sauts de scroll, évitent d afficher le chat actif pendant le chargement de History, conservent la position par session et ajoutent un fondu de 1,5 seconde au changement de session",new_0_6_7_4:"Bridge et runtime sont plus stables avec ordre texte/tool-call préservé, chargement du statut runtime de Profile corrigé, meilleure détection Node/npm et création du dossier de données production évitée",new_0_6_7_5:"La distribution Desktop couvre packaging Electron, nom d application, builds preload, uploads des artifacts, lancement Hermes CLI sous Windows, icônes Linux et chemins de données inscriptibles, macOS sans certificat de signature et sous-processus Windows masqués au démarrage",new_0_6_7_6:"Le site web ajoute les téléchargements et le workflow de déploiement, avec déploiement corrigé pour les environnements sans rsync",new_0_6_7_7:"Les corrections serveur et auth utilisent dirname pour les dossiers de credentials Windows et augmentent la limite d upload avatar afin d éviter les erreurs 413 sur les grandes images",new_0_6_7_8:"Le harness du dépôt, les docs de validation et les guides agent pour Coding Agents ont été ajoutés, tandis que les anciens docs de setup script ont été retirés"},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",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)",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"},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",ready:"Prêt",running:"En cours",blocked:"Bloqué",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é..."},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."},action:{title:"Actions",assign:"Assigner",assignTo:"Assigner à...",block:"Bloquer",blockReason:"Raison du blocage",unblock:"Débloquer",complete:"Terminer",completeSummary:"Résumé de fin (facultatif)"},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"},stats:{total:"Total",tasks:"Tâches"}}},Pi={login:{title:"QuantHermes Web UI",description:"Introduce tu token de acceso para continuar. Encuentralo en los registros de inicio del servidor.",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: quanthermes. Contrasena predeterminada: 12345678.",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 predeterminada de quanthermes, 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",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",search:"Buscar",apiRelay:"API Relay",history:"Historial",jobs:"Tareas programadas",models:"Modelos",profiles:"Perfiles",plugins:"Plugins",mcp:"MCP",skills:"Habilidades",memory:"Memoria",logs:"Registros",usage:"Uso",performance:"Rendimiento",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",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:"Las actualizaciones del build personalizado se gestionan internamente",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. Revisa la configuracion de la fuente interna.",updateSource:"Origen de actualizacion: {source}",updateManagedInternally:"Build personalizado: las actualizaciones se gestionan internamente",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",kanban:"Kanban",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ú"},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Último escaneo: {time}",refresh:"Actualizar",empty:"No se encontraron dispositivos",computer:"Equipo",endpointLabel:"Extremo",statusLabel:"Estado",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Adjuntar archivos",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 QuantHermes",historyScopeHint:"Sesiones del historial de QuantHermes, de solo lectura y agrupadas por origen.",noSessions:"Sin sesiones",newChat:"Nuevo chat",approvalKicker:"Permiso de terminal",approvalTitle:"Revisar comando antes de ejecutar",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",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",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",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",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"},jobs:{title:"Tareas programadas",createJob:"Crear tarea",editJob:"Editar tarea",noJobs:"No hay tareas programadas aun. Crea una para comenzar.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Actualizar",notice:"Inventario de solo lectura de manifests de plugins QuantHermes detectables. Los metadatos de descubrimiento se leen sin cargar código de plugins. En v1, la gestión permanece en CLI; los cambios se aplican en nuevas sesiones QuantHermes.",loadFailed:"No se pudieron cargar los plugins",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",cli:"CLI"},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"}},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",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 QuantHermes.",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 QuantHermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.",copilotDeleteHintAppsJson:"Copilot se ocultará de QuantHermes. 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",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",builtIn:"Integrado",customType:"Personalizado",provider:"Proveedor",contextLength:"Longitud del contexto",contextLengthPlaceholder:"ej. 256000 (opcional)",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!",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...",removeCustomModel:"Eliminar este modelo no listado",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",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",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"},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.",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"},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:"Autorización de sesión",requireAuthHint:"Requiere autorización para operaciones de sesión"},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:{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"},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",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Error de instalación",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",accessToken:"Token de acceso",accessTokenHint:"Token de acceso de Matrix",homeserver:"URL del homeserver",homeserverHint:"URL del homeserver de Matrix",appId:"ID de aplicacion",appIdHint:"ID de aplicacion de Feishu",appSecret:"Secreto de aplicacion",appSecretHint:"Secreto de aplicacion 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 QuantHermes",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_11_1:"El descubrimiento de dispositivos LAN ahora incluye aprobaciones de emparejamiento, historial de solicitudes, manejo de duplicados, sincronizacion de estado y limpieza al revocar acceso",new_0_6_11_2:"El acceso LAN peer esta disponible mediante MCP con inicio MCP integrado, command shims, sockets peer con reconexion, lista de conexiones locales y sesiones de terminal limitadas",new_0_6_11_3:"La sintesis TTS backend unificada y los ajustes de clonacion de voz MiMo ya estan disponibles, con reproduccion antes de guardar",new_0_6_11_4:"Los ajustes de autostart de Gateway ahora exponen filtrado por Profile con controles multi-select, comportamiento whitelist y pruebas de seleccion de Profile de inicio",new_0_6_11_5:"El scroll y las animaciones del chat son mas estables con ajustes de bottom-follow, scroll inicial al final, scroll lock y manejo de fade con reduced-motion",new_0_6_11_6:"Agent Bridge y runtime flows son mas fiables con manejo de abort timeout, guards de inicio al reanudar, memoria de aprobacion execute-code, recuperacion de Windows Gateway y fixes del proxy terminal dev",new_0_6_11_7:"La seguridad mejora con hardening de Web UI origin policy, security headers y guards de acceso loopback para server token",new_0_6_11_8:"Group chat y renderizado de tool output son mas estables con rejoin tras reconnect, preservacion de reasoning/tool boundaries, tool payload rendering mas seguro y mejor vista diff",new_0_6_11_9:"Skills y Workspace soportan external skill directories, refresh tras import/delete, agrupacion por sourcePath, texto localizado del selector de carpetas e iconos moviles de acciones",new_0_6_11_10:"Se pulieron layout de dispositivos, titulos de sesion, titulos de browser tab, Kanban parent task IDs y texto de atribucion OpenRouter",new_0_6_10_1:"Los textos del sitio ahora presentan Hermes Studio de forma consistente, manteniendo sin cambios los identificadores de npm package, CLI, repositorio y variables de entorno",new_0_6_10_2:"Las pantallas desktop de inicio y descarga del runtime ahora usan textos localizados para inicio de servicios, seleccion de fuente, progreso y errores",new_0_6_10_3:"Las comprobaciones de procesos de Windows Agent Bridge toleran salidas localizadas de tasklist/taskkill y evitan bloqueos UnicodeDecodeError por salidas no UTF-8",new_0_6_10_4:"La documentacion OpenAPI ahora incluye endpoints de avatar, configuracion de modelos auxiliares, refresh de cache de modelos provider e importacion de sesiones Hermes",new_0_6_10_5:"El explorador de archivos de Workspace ahora ofrece previews de texto mas completos y mejor cobertura del menu contextual para archivos fuente y documentos",new_0_6_10_6:"Agent Bridge es mas fiable con allowlists de aprobacion de herramientas actualizadas y decodificacion de salida tasklist/taskkill en Windows",new_0_6_10_7:"Los usuarios pueden subir avatares de perfil, y los miembros de group chat sincronizan y muestran avatares de cuenta de forma consistente",new_0_6_10_8:"Los catalogos de modelos provider ahora se pueden refrescar desde la UI",new_0_6_10_9:"Las notas de memoria ahora se pueden guardar vacias, permitiendo limpiar notas personales sin fallos de guardado",new_0_6_10_10:"La documentacion del harness ahora rastrea cambios de la cadena Chat para que actualizaciones de bridge y chat runtime se documenten antes de pasar CI",new_0_6_9_1:"La app ahora usa la marca Hermes Studio en el titulo del navegador, la barra lateral, el titulo del sitio, los metadatos del paquete y los enlaces oficiales",new_0_6_9_2:"La comprobacion de actualizaciones de escritorio es mas fiable con fallback al release feed cuando la API de GitHub tiene rate limit o faltan metadatos por tag",new_0_6_9_3:"En macOS, la instalacion de actualizaciones detiene primero el servidor Web UI local y luego deja que electron-updater gestione el cierre y la instalacion",new_0_6_9_4:"Las credenciales de proveedores y la autenticacion respetan mejor el scope de Profile, y el arranque de gateway/runtime es mas compatible con builds de escritorio",new_0_6_9_5:"Web Speech del navegador ahora pausa y reanuda el mensaje actual en Chrome en vez de reiniciarlo desde el principio",new_0_6_9_6:"La localizacion rusa ya esta disponible en el selector de idioma, con mensajes de UI del cliente traducidos por la comunidad",new_0_6_8_1:"Los builds de escritorio incorporan controles de tray, comprobacion manual de actualizaciones, notificaciones de update y apertura local en navegador",new_0_6_8_2:"El escritorio de Windows arranca de forma mas silenciosa y fiable con subprocesses Python/bridge ocultos, popups de terminal corregidos, tamano de icono de tray y packaging del navegador",new_0_6_8_3:"El packaging de escritorio es mas estable entre plataformas con fixes de limite de archivos de firma en macOS, rutas escribibles en Linux, cold start de runtime y workflow checkout",new_0_6_8_4:"El sitio oficial y la distribucion mejoran con mirrors de descarga, deploy del sitio secuenciado despues del release de escritorio y limpieza de desktop smoke checks",new_0_6_8_5:"La experiencia runtime mejora con longitudes de contexto preferidas por provider, borradores sin enviar preservados, fixes de overflow movil, puertos personalizados en SSH File Provider y acciones de preview no bloqueantes",new_0_6_7_1:"La app de escritorio ahora usa el puerto 8748 por defecto, permite acceso desde la red local y puede abrirse directamente desde un navegador local",new_0_6_7_9:"Los enlaces de descarga de escritorio ya están disponibles en el sitio oficial https://hermes-studio.ai/, y los instaladores más recientes siguen disponibles en GitHub Releases",new_0_6_7_2:"Las herramientas MCP quedan más completas con arreglos de discovery en bridge, ciclo de vida de gestión MCP y controles de visibilidad por modelo en el gestor",new_0_6_7_3:"Las listas de mensajes centran mejor el estado vacío, reducen saltos de scroll, evitan mostrar mensajes del chat activo mientras carga History, preservan la posición por sesión y hacen fade-in de 1,5 segundos al cambiar de sesión",new_0_6_7_4:"Bridge y runtime son más estables al preservar el orden texto/tool-call, corregir la carga de estado runtime de Profile, mejorar detección Node/npm y evitar crear directorios de datos en producción",new_0_6_7_5:"La distribución Desktop cubre empaquetado Electron, nombre de app, builds preload, subida de artifacts, inicio Hermes CLI en Windows, iconos Linux y rutas de datos escribibles, macOS sin certificados de firma y subprocesos ocultos al iniciar en Windows",new_0_6_7_6:"El sitio web suma página de descargas y workflow de deploy, con deploy corregido en entornos sin rsync",new_0_6_7_7:"Arreglos de servidor y auth usan dirname para credenciales en Windows y suben el límite de avatar para evitar errores 413 con imágenes grandes",new_0_6_7_8:"Se agregan harness del repositorio, documentación de validación y guías de agentes para Coding Agents, y se eliminan docs antiguas de setup scripts"},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",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)",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"},kanban:{title:"Tablero Kanban",createTask:"Nueva tarea",noTasks:"Sin tareas",allStatuses:"Todos los estados",allAssignees:"Todos los responsables",columns:{triage:"Clasificación",todo:"Pendiente",ready:"Listo",running:"En curso",blocked:"Bloqueado",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..."},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."},action:{title:"Acciones",assign:"Asignar",assignTo:"Asignar a...",block:"Bloquear",blockReason:"Motivo del bloqueo",unblock:"Desbloquear",complete:"Completar",completeSummary:"Resumen de finalización (opcional)"},message:{loadFailed:"No se pudo cargar la tarea",taskCreated:"Tarea creada",taskAssigned:"Tarea asignada",taskBlocked:"Tarea bloqueada",taskUnblocked:"Tarea desbloqueada",taskCompleted:"Tarea completada"},stats:{total:"Total",tasks:"Tareas"}}},Ai={login:{title:"QuantHermes Web UI",description:"Geben Sie Ihren Zugangs-Token ein, um fortzufahren. Finden Sie ihn in den Server-Startprotokollen.",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: quanthermes. Standard-Passwort: 12345678.",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",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",search:"Suche",apiRelay:"API-Relay",history:"Verlauf",jobs:"Geplante Aufgaben",models:"Modelle",profiles:"Profile",plugins:"Plugins",mcp:"MCP",skills:"Fahigkeiten",memory:"Gedachtnis",logs:"Protokolle",usage:"Nutzung",performance:"Leistung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Konsole",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:"Aktualisierungen fur angepasste Builds werden intern bereitgestellt",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. Prufen Sie die interne Update-Quelle.",updateSource:"Update-Quelle: {source}",updateManagedInternally:"Angepasster Build: Aktualisierungen werden intern verwaltet",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar",kanban:"Kanban",groupTools:"Werkzeuge",groupToolsShort:"Tools",codingAgents:"Coding Agents",versionPreview:"Versionsvorschau",groupPlatform:"Plattform",gateways:"Gateways",expand:"Menü ausklappen",collapse:"Menü einklappen"},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",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",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 Quanthermes Agent",outlineTitle:"Konversationsübersicht",outlineEmpty:"Kein Konversationsinhalt",outlineUserQuestion:"Benutzerfrage",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)",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",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"},attachFiles:"Dateien anhangen",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:"QuantHermes-Verlauf",historyScopeHint:"Schreibgeschützte QuantHermes-Verlaufssitzungen, nach Quelle gruppiert.",noSessions:"Keine Sitzungen",newChat:"Neuer Chat",approvalKicker:"Terminal-Berechtigung",approvalTitle:"Befehl vor dem Ausführen prüfen",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",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",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",renameSession:"Sitzung umbenennen",sessionNotFound:"Sitzung nicht gefunden",enterNewTitle:"Neuen Titel eingeben",other:"Sonstige",runFailed:"Ausfuhrung fehlgeschlagen",error:"Fehler",tool:"Werkzeug",arguments:"Argumente",result:"Ergebnis",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"},jobs:{title:"Geplante Aufgaben",createJob:"Aufgabe erstellen",editJob:"Aufgabe bearbeiten",noJobs:"Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Aktualisieren",notice:"Schreibgeschütztes Inventar erkennbarer QuantHermes-Plugin-Manifeste. Discovery-Metadaten werden gelesen, ohne Plugin-Code zu laden. Verwaltungsaktionen bleiben in v1 im CLI; Änderungen gelten für neue QuantHermes-Sitzungen.",loadFailed:"Plugins konnten nicht geladen werden",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",cli:"CLI"},capabilities:{tools:"{count} Tools",hooks:"{count} Hooks",env:"{count} env"},metadata:{agentRoot:"Agent-Stammverzeichnis",python:"Python",scanCwd:"Arbeitsverzeichnis scannen",projectPlugins:"Projekt-Plugins"}},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",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 QuantHermes 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 QuantHermes ausgeblendet. Ihre gh CLI-Anmeldung bleibt erhalten — `gh auth status` zeigt weiterhin als angemeldet.",copilotDeleteHintAppsJson:"Copilot wird aus QuantHermes 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",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",builtIn:"Integriert",customType:"Benutzerdefiniert",provider:"Anbieter",contextLength:"Kontextlange",contextLengthPlaceholder:"z.B. 256000 (optional)",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!",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...",removeCustomModel:"Dieses nicht gelistete Modell entfernen",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",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",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"},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.",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"},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"},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:{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"},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",installNow:"Installieren",installing:"Installiere",installSuccess:"Installiert",installFailed:"Installation fehlgeschlagen",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",accessToken:"Zugangs-Token",accessTokenHint:"Matrix-Zugangs-Token",homeserver:"Homeserver-URL",homeserverHint:"Matrix-Homeserver-URL",appId:"App-ID",appIdHint:"Feishu App-ID",appSecret:"App-Geheimnis",appSecretHint:"Feishu App-Geheimnis",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:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",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 QuantHermes-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_11_1:"LAN device discovery umfasst jetzt pairing approvals, request history, duplicate request handling, status sync und cleanup beim Entzug von device access",new_0_6_11_2:"LAN peer access ist ueber MCP verfuegbar, mit bundled MCP startup, command shims, reconnecting peer sockets, local connection listing und begrenzten terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis und MiMo voice cloning settings sind jetzt verfuegbar, inklusive playback vor dem Speichern",new_0_6_11_4:"Gateway autostart settings zeigen profile filtering mit multi-select controls, whitelist behavior und Tests fuer startup profile selection",new_0_6_11_5:"Chat scrolling und motion sind stabiler durch bottom-follow tuning, initial bottom scroll fixes, scroll lock updates und reduced-motion fade handling",new_0_6_11_6:"Agent Bridge und runtime flows sind zuverlaessiger mit abort timeout handling, resume startup guards, execute-code approval memory, Windows gateway recovery und dev terminal proxy fixes",new_0_6_11_7:"Security ist haerter durch Web UI origin policy, security headers und server-token loopback access guards",new_0_6_11_8:"Group chat und tool output rendering sind stabiler mit room rejoin nach reconnect, erhaltenen reasoning/tool boundaries, sichererem tool payload rendering und besserer diff display",new_0_6_11_9:"Skills und Workspace flows unterstuetzen jetzt external skill directories, import/delete refresh, source-path grouping, lokalisierte folder picker text und mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs und OpenRouter attribution text wurden verbessert",new_0_6_10_1:"Website-Texte zeigen das Produkt jetzt konsistent als Hermes Studio, waehrend npm package, CLI, Repository und Umgebungsvariablen unveraendert bleiben",new_0_6_10_2:"Desktop-Startup- und Runtime-Download-Screens nutzen jetzt lokalisierte Texte fuer Service-Start, Quellenauswahl, Fortschritt und Fehler",new_0_6_10_3:"Windows Agent Bridge Prozesspruefungen tolerieren lokalisierte tasklist/taskkill-Ausgaben und vermeiden UnicodeDecodeError-Abstuerze durch nicht-UTF-8-Systemausgaben",new_0_6_10_4:"OpenAPI-Dokumente enthalten jetzt Avatar-, Auxiliary-Model-Config-, Provider-Model-Cache-Refresh- und Hermes-Session-Import-Endpunkte",new_0_6_10_5:"Workspace-Dateibrowser bietet jetzt umfangreichere Textvorschauen und Kontextmenue-Abdeckung fuer Quellcode- und Dokumentdateien",new_0_6_10_6:"Agent Bridge ist zuverlaessiger durch aktualisierte Tool-Approval-Allowlists und Windows tasklist/taskkill-Ausgabedekodierung",new_0_6_10_7:"Nutzer koennen Profil-Avatare hochladen, und Group Chat Mitglieder synchronisieren und zeigen Account-Avatare konsistent an",new_0_6_10_8:"Provider-Modellkataloge koennen jetzt in der UI aktualisiert werden",new_0_6_10_9:"Memory-Notizen koennen jetzt mit leerem Inhalt gespeichert werden, sodass persoenliche Notizen sauber geloescht werden koennen",new_0_6_10_10:"Repository-Harness-Dokumentation verfolgt jetzt Chat-Chain-Aenderungen, damit Bridge- und Chat-Runtime-Updates vor erfolgreichem CI dokumentiert sind",new_0_6_9_1:"Die App ist jetzt als Hermes Studio gebrandet, inklusive Browser-Titel, Sidebar, Website-Titel, Package-Metadaten und offiziellen Website-Links",new_0_6_9_2:"Desktop-Update-Pruefungen sind robuster mit Release-Feed-Fallbacks, wenn GitHub API Requests rate-limited sind oder tag-spezifische Metadaten fehlen",new_0_6_9_3:"macOS Desktop-Updates stoppen vor der Installation den lokalen Web UI Server und lassen dann electron-updater Quit und Installation ausfuehren, sodass Restart die geladene Version installiert",new_0_6_9_4:"Provider-Zugangsdaten und Auth respektieren Profile-Scopes konsistenter, und Gateway/Runtime-Start ist kompatibler mit paketierten Desktop-Starts",new_0_6_9_5:"Browser Web Speech pausiert und setzt die aktuelle Nachricht in Chrome jetzt fort, statt beim Pausieren von vorne neu zu starten",new_0_6_9_6:"Russische Lokalisierung ist jetzt im Sprachumschalter verfuegbar, inklusive von der Community uebersetzter Client-UI-Texte",new_0_6_8_1:"Desktop-Builds erhalten Tray-Steuerung, manuelle Update-Pruefung, Update-Hinweise und lokales Browser-Oeffnen fuer die paketierte Web UI",new_0_6_8_2:"Windows Desktop startet leiser und zuverlaessiger mit versteckten Python/bridge-Subprozessen, korrigierten Terminal-Popups, Tray-Icon-Groessen und Browser-Packaging",new_0_6_8_3:"Desktop-Packaging ist plattformuebergreifend stabiler mit macOS Signing-Dateilimit-Fixes, Linux beschreibbaren Pfaden, Runtime-Cold-Start-Handling und Workflow-Checkout-Fixes",new_0_6_8_4:"Website und Release-Verteilung wurden mit Download-Mirrors, sequenziertem Website-Deploy nach Desktop-Releases und Desktop-Smoke-Check-Cleanup verbessert",new_0_6_8_5:"Die Runtime-Nutzung wurde verbessert mit Provider-Kontextlaengen, erhaltenen ungesendeten Chat-Entwuerfen, Mobile-Layout-Overflow-Fixes, SSH File Provider Custom Ports und nicht-blockierenden Preview-Aktionen",new_0_6_7_1:"Die Desktop-App nutzt jetzt standardmäßig Port 8748, unterstützt Zugriff im lokalen Netzwerk und kann direkt im lokalen Browser geöffnet werden",new_0_6_7_9:"Desktop-Download-Links sind jetzt auf der offiziellen Website https://hermes-studio.ai/ verfügbar, aktuelle Installer bleiben außerdem über GitHub Releases verfügbar",new_0_6_7_2:"MCP-Tools sind vollständiger: Bridge Tool Discovery, MCP-Management-Lifecycle und Tool-Sichtbarkeit pro Modell im Manager wurden verbessert",new_0_6_7_3:"Nachrichtenlisten zentrieren leere Zustände korrekt, reduzieren Scroll-Jitter, zeigen beim Laden von History keine Live-Chat-Nachrichten mehr, behalten Scrollpositionen pro Session und blenden beim Session-Wechsel 1,5 Sekunden ein",new_0_6_7_4:"Bridge und Runtime sind stabiler durch erhaltene Text/tool-call-Reihenfolge, korrektes Profile runtime status loading, bessere Node/npm-Erkennung und übersprungene Produktionsdatenverzeichnis-Erstellung",new_0_6_7_5:"Desktop-Distribution umfasst Electron-Packaging, App-Naming, Preload-Builds, Release-Artifact-Uploads, Windows Hermes CLI Start, Linux-Icons und beschreibbare Datenpfade, macOS ohne Signing-Zertifikate und versteckte Windows-Startup-Subprozesse",new_0_6_7_6:"Die Website hat Download- und Deploy-Workflows, und Deploys funktionieren auch in Umgebungen ohne rsync",new_0_6_7_7:"Server- und Auth-Fixes nutzen dirname für Windows-Credential-Verzeichnisse und erhöhen das Avatar-Upload-Limit gegen 413-Fehler bei größeren Bildern",new_0_6_7_8:"Repository-Harness, Validierungsdokumente und Agent-Guides für Coding Agents wurden ergänzt, alte Setup-Script-Dokumente entfernt"},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",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)",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"},kanban:{title:"Kanban-Board",createTask:"Neue Aufgabe",noTasks:"Keine Aufgaben",allStatuses:"Alle Status",allAssignees:"Alle Verantwortlichen",columns:{triage:"Sichtung",todo:"Zu erledigen",ready:"Bereit",running:"In Arbeit",blocked:"Blockiert",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..."},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."},action:{title:"Aktionen",assign:"Zuweisen",assignTo:"Zuweisen an...",block:"Blockieren",blockReason:"Blockierungsgrund",unblock:"Blockierung aufheben",complete:"Abschließen",completeSummary:"Abschlusszusammenfassung (optional)"},message:{loadFailed:"Aufgabe konnte nicht geladen werden",taskCreated:"Aufgabe erstellt",taskAssigned:"Aufgabe zugewiesen",taskBlocked:"Aufgabe blockiert",taskUnblocked:"Blockierung aufgehoben",taskCompleted:"Aufgabe abgeschlossen"},stats:{total:"Gesamt",tasks:"Aufgaben"}}},_i={login:{title:"QuantHermes Web UI",description:"Insira seu token de acesso para continuar. Encontre-o nos logs de inicializacao do servidor.",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: quanthermes. Senha padrao: 12345678.",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 padrao de quanthermes, 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",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",search:"Pesquisar",apiRelay:"API Relay",history:"Historico",jobs:"Tarefas agendadas",models:"Modelos",profiles:"Perfis",plugins:"Plugins",mcp:"MCP",skills:"Habilidades",memory:"Memoria",logs:"Logs",usage:"Uso",performance:"Desempenho",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",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:"As atualizacoes do build personalizado sao gerenciadas internamente",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. Verifique a fonte interna.",updateSource:"Fonte de atualizacao: {source}",updateManagedInternally:"Build personalizado: as atualizacoes sao gerenciadas internamente",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel",kanban:"Kanban",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"},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Última varredura: {time}",refresh:"Atualizar",empty:"Nenhum dispositivo encontrado",computer:"Computador",endpointLabel:"Ponto de acesso",statusLabel:"Estado",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Anexar arquivos",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 QuantHermes",historyScopeHint:"Sessões do histórico QuantHermes somente leitura, agrupadas por origem.",noSessions:"Sem sessoes",newChat:"Novo chat",approvalKicker:"Permissão do terminal",approvalTitle:"Revisar comando antes de executar",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",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",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",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",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"},jobs:{title:"Tarefas agendadas",createJob:"Criar tarefa",editJob:"Editar tarefa",noJobs:"Nenhuma tarefa agendada ainda. Crie uma para comecar.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Atualizar",notice:"Inventário somente leitura dos manifests de plugins QuantHermes detectáveis. Os metadados de descoberta são lidos sem carregar código de plugin. No v1, ações de gerenciamento ficam na CLI; mudanças entram em vigor em novas sessões QuantHermes.",loadFailed:"Falha ao carregar plugins",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",cli:"CLI"},capabilities:{tools:"{count} ferramentas",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Raiz do agente",python:"Python",scanCwd:"Verificar cwd",projectPlugins:"Plugins do projeto"}},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",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 QuantHermes.",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 QuantHermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.",copilotDeleteHintAppsJson:"O Copilot ficará oculto no QuantHermes. 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",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",builtIn:"Integrado",customType:"Personalizado",provider:"Provedor",contextLength:"Tamanho do contexto",contextLengthPlaceholder:"ex: 256000 (opcional)",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!",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...",removeCustomModel:"Remover este modelo não listado",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",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",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"},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.",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"},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:"Autorização de sessão",requireAuthHint:"Requer autorização para operações de sessão"},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:{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"},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",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Falha na instalação",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",accessToken:"Token de acesso",accessTokenHint:"Token de acesso Matrix",homeserver:"URL do homeserver",homeserverHint:"URL do homeserver Matrix",appId:"ID do aplicativo",appIdHint:"ID do aplicativo Feishu",appSecret:"Segredo do aplicativo",appSecretHint:"Segredo do aplicativo 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 QuantHermes",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_11_1:"A descoberta de dispositivos LAN agora inclui aprovacoes de pairing, historico de requests, tratamento de duplicados, sync de status e limpeza ao revogar acesso",new_0_6_11_2:"O acesso LAN peer esta disponivel via MCP com startup MCP integrado, command shims, peer sockets com reconexao, lista de conexoes locais e sessoes de terminal limitadas",new_0_6_11_3:"A sintese TTS backend unificada e as configuracoes de clonagem de voz MiMo estao disponiveis, com playback antes de salvar",new_0_6_11_4:"As configuracoes Gateway autostart agora exibem filtragem por Profile com controles multi-select, comportamento whitelist e testes de selecao de Profile inicial",new_0_6_11_5:"O scroll e as animacoes do chat estao mais estaveis com bottom-follow tuning, initial bottom scroll fixes, scroll lock updates e tratamento de fade reduced-motion",new_0_6_11_6:"Agent Bridge e runtime flows estao mais confiaveis com abort timeout handling, resume startup guards, memoria de aprovacao execute-code, recuperacao Windows Gateway e fixes do proxy terminal dev",new_0_6_11_7:"A seguranca foi reforcada com Web UI origin policy, security headers e guards de acesso loopback para server token",new_0_6_11_8:"Group chat e renderizacao de tool output estao mais estaveis com rejoin apos reconnect, preservacao de reasoning/tool boundaries, tool payload rendering mais seguro e melhor diff display",new_0_6_11_9:"Skills e Workspace agora suportam external skill directories, refresh apos import/delete, agrupamento por sourcePath, texto localizado do folder picker e icones moveis de acoes",new_0_6_11_10:"Layout de dispositivos, titulos de sessao, titulos de browser tab, Kanban parent task IDs e texto de atribuicao OpenRouter receberam polimento de UI",new_0_6_10_1:"Os textos do site agora apresentam Hermes Studio de forma consistente, mantendo identificadores de npm package, CLI, repositorio e variaveis de ambiente inalterados",new_0_6_10_2:"As telas desktop de inicio e download do runtime agora usam textos localizados para inicio de servicos, selecao de fonte, progresso e erros",new_0_6_10_3:"As verificacoes de processo do Windows Agent Bridge toleram saidas localizadas de tasklist/taskkill e evitam crashes UnicodeDecodeError por saidas nao UTF-8",new_0_6_10_4:"A documentacao OpenAPI agora inclui endpoints de avatar, configuracao de modelos auxiliares, refresh de cache de modelos provider e importacao de sessoes Hermes",new_0_6_10_5:"O navegador de arquivos Workspace agora tem previews de texto mais completos e melhor cobertura do menu de contexto para arquivos de codigo e documentos",new_0_6_10_6:"Agent Bridge esta mais confiavel com allowlists de aprovacao de ferramentas atualizadas e decodificacao de saida tasklist/taskkill no Windows",new_0_6_10_7:"Usuarios podem enviar avatares de perfil, e membros do group chat agora sincronizam e exibem avatares de conta de forma consistente",new_0_6_10_8:"Catalogos de modelos provider agora podem ser atualizados pela UI",new_0_6_10_9:"Notas de memoria agora podem ser salvas com conteudo vazio, permitindo limpar notas pessoais sem falha de salvamento",new_0_6_10_10:"A documentacao do harness agora rastreia mudancas da cadeia Chat para que updates de bridge e chat runtime sejam documentados antes do CI passar",new_0_6_9_1:"O app agora usa a marca Hermes Studio no titulo do navegador, sidebar, titulo do site, metadados do pacote e links oficiais",new_0_6_9_2:"A verificacao de atualizacoes desktop ficou mais confiavel com fallback para release feed quando a API do GitHub sofre rate limit ou faltam metadados por tag",new_0_6_9_3:"No macOS, a instalacao de updates para primeiro o servidor Web UI local e depois deixa o electron-updater cuidar do quit e install",new_0_6_9_4:"Credenciais de providers e auth respeitam melhor o escopo de Profile, e o startup de gateway/runtime ficou mais compativel com builds desktop empacotados",new_0_6_9_5:"Browser Web Speech agora pausa e retoma a mensagem atual no Chrome em vez de reiniciar do comeco",new_0_6_9_6:"A localizacao russa agora esta disponivel no seletor de idioma, com mensagens da UI cliente traduzidas pela comunidade",new_0_6_8_1:"Builds desktop ganharam controles de tray, verificacao manual de updates, notificacoes de update e abertura local no navegador",new_0_6_8_2:"O desktop Windows inicia de forma mais silenciosa e confiavel com subprocesses Python/bridge ocultos, popups de terminal corrigidos, tamanho de icone tray e packaging de navegador",new_0_6_8_3:"O packaging desktop ficou mais estavel entre plataformas com fixes de limite de arquivos de assinatura no macOS, caminhos gravaveis no Linux, runtime cold start e workflow checkout",new_0_6_8_4:"Site oficial e distribuicao melhoraram com mirrors de download, deploy do site apos releases desktop e limpeza dos desktop smoke checks",new_0_6_8_5:"A experiencia runtime melhorou com comprimentos de contexto por provider, rascunhos nao enviados preservados, fixes de overflow mobile, portas customizadas no SSH File Provider e acoes preview nao bloqueantes",new_0_6_7_1:"O app desktop agora usa a porta 8748 por padrão, permite acesso pela rede local e pode ser aberto diretamente em um navegador local",new_0_6_7_9:"Links de download do desktop agora estão disponíveis no site oficial https://hermes-studio.ai/, e os instaladores mais recentes continuam disponíveis no GitHub Releases",new_0_6_7_2:"As ferramentas MCP ficam mais completas com correções de discovery no bridge, ciclo de vida de gestão MCP e controles de visibilidade por modelo no gestor",new_0_6_7_3:"Listas de mensagens centralizam melhor estados vazios, reduzem saltos de rolagem, evitam mostrar o chat ativo enquanto History carrega, preservam posição por sessão e fazem fade-in de 1,5 segundo ao trocar sessão",new_0_6_7_4:"Bridge e runtime ficam mais estáveis preservando a ordem texto/tool-call, corrigindo carregamento de status runtime de Profile, melhorando detecção Node/npm e evitando criação de diretório de dados em produção",new_0_6_7_5:"A distribuição Desktop cobre empacotamento Electron, nome do app, builds preload, upload de artifacts, início do Hermes CLI no Windows, ícones Linux e caminhos de dados graváveis, macOS sem certificado de assinatura e subprocessos Windows ocultos no início",new_0_6_7_6:"O site agora tem página de downloads e workflow de deploy, com deploy corrigido em ambientes sem rsync",new_0_6_7_7:"Correções de servidor e auth usam dirname para diretórios de credenciais no Windows e aumentam o limite de upload de avatar para evitar erros 413 com imagens grandes",new_0_6_7_8:"Harness do repositório, docs de validação e guias de agente para Coding Agents foram adicionados, enquanto docs antigos de setup script foram removidos"},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",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)",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"},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",ready:"Pronto",running:"Em andamento",blocked:"Bloqueado",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..."},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."},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)"},message:{loadFailed:"Falha ao carregar tarefa",taskCreated:"Tarefa criada",taskAssigned:"Tarefa atribuída",taskBlocked:"Tarefa bloqueada",taskUnblocked:"Tarefa desbloqueada",taskCompleted:"Tarefa concluída"},stats:{total:"Total",tasks:"Tarefas"}}},xi={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:"Повторить",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:"Чат",search:"Поиск",apiRelay:"Ретранслятор API",history:"История",jobs:"Задачи",kanban:"Канбан",models:"Модели",profiles:"Пользователи",plugins:"Плагины",skills:"Навыки",memory:"Память",logs:"Логи",usage:"Использование",performance:"Мониторинг производительности",skillsUsage:"Использование навыков",channels:"Каналы",gateways:"Шлюзы",terminal:"Терминал",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:"Нет списка изменений"},devices:{title:"Устройства",count:"Устройств: {count}",lastScanned:"Последнее сканирование: {time}",refresh:"Обновить",empty:"Устройства не найдены",computer:"Компьютер",endpointLabel:"Точка доступа",statusLabel:"Статус",address:"Адрес",os:"ОС",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Задержка",lastSeen:"Последний раз обнаружено",open:"Открыть",never:"Никогда",unknown:"Неизвестно",loadFailed:"Не удалось загрузить устройства",scanFailed:"Не удалось просканировать устройства",updateFailed:"Не удалось обновить устройство",duplicateRequest:"Уже есть ожидающий запрос на сопряжение",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",cliEmptyState:"Начните CLI-диалог",outlineTitle:"План беседы",outlineEmpty:"Нет содержимого беседы",outlineUserQuestion:"Вопрос пользователя",inputPlaceholder:"Введите сообщение... (Enter — отправить, Shift+Enter — новая строка)",slashCommandArgs:{message:"<сообщение>",title:"<заголовок>",text:"<текст>"},slashCommands:{usage:"Рассчитать использование текущего сеанса",status:"Показать статус сеанса и очередь",abort:"Остановить текущий запуск Bridge",queue:"Добавить сообщение в очередь после текущего запуска",clear:"Очистить текущее отображение",clearHistory:"Удалить сохранённую историю сообщений текущего сеанса",title:"Переименовать текущий сеанс",compress:"Запустить сжатие контекста в простое",steer:"Отправить направляющий текст текущему запуску Bridge",destroy:"Освободить Bridge Agent текущего сеанса"},attachFiles:"Прикрепить файлы",autoPlaySpeech:"Автовоспроизведение речи",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:"Новый диалог",approvalKicker:"Авторизация в терминале",approvalTitle:"Подтвердите команду перед выполнением",approvalAllowOnce:"Разрешить однократно",approvalAllowSession:"Разрешить для этого сеанса",approvalAlways:"Разрешить всегда",approvalDeny:"Отказать",newCliChat:"Новый CLI",deleteSession:"Удалить этот сеанс?",sessionDeleted:"Сеанс удалён",toggleBatchMode:"Пакетный выбор",selectAll:"Выбрать всё",confirmBatchDelete:"Удалить выбранные сеансы ({count})?",batchDeleteSuccess:"Удалено сеансов: {count}",batchDeletePartial:"Не удалось удалить сеансов: {failed}",batchDeleteFailed:"Ошибка пакетного удаления",rename:"Переименовать",pin:"Закрепить",unpin:"Открепить",pinned:"Закреплено",chatMode:"Чат",liveMode:"В реальном времени",liveSessions:"Сеансы в реальном времени",recentBadge:"Недавние",linkedSessions:"Связано сеансов: {count}",noVisibleMessages:"Нет видимых человеку сообщений.",monitorRoleUser:"Пользователь",monitorRoleAssistant:"Ассистент",copySessionLink:"Копировать ссылку на сеанс",copySessionId:"Копировать ID сеанса",export:"Экспорт",exportFull:"Полный экспорт (JSON)",exportCompressed:"Сжатый экспорт (TXT)",exportCompressing:"Сжатие контекста, подождите...",exportSuccess:"Сеанс экспортирован",exportFailed:"Ошибка экспорта",renamed:"Переименовано",renameFailed:"Ошибка переименования",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:"Результат",truncated:"... (обрезано)",unchangedLines:"{count} строк без изменений",executionDuration:"Длительность выполнения",thinkingLabel:"Процесс размышления",thinkingInProgress:"Размышление…",thinkingShow:"Развернуть процесс размышления",thinkingHide:"Свернуть процесс размышления",thinkingDuration:"Наблюдается {duration}",thinkingChars:"{count} зн.",copyBubble:"Копировать сообщение",copiedBubble:"Скопировано",copyFailed:"Ошибка копирования",playSpeech:"Воспроизвести речь",pauseSpeech:"Пауза",resumeSpeech:"Продолжить",stopSpeech:"Остановить",speechNotSupported:"Этот браузер не поддерживает воспроизведение речи"},kanban:{title:"Канбан",createTask:"Создать задачу",noTasks:"Нет задач",allStatuses:"Все статусы",allAssignees:"Все ответственные",board:{create:"Создать канбан",archive:"Архивировать канбан",slugPlaceholder:"Идентификатор канбана, например project-a",namePlaceholder:"Отображаемое имя (необязательно)",slugRequired:"Идентификатор канбана не может быть пустым",created:"Канбан создан",archived:"Канбан архивирован",archiveConfirm:"Архивировать текущий канбан?"},columns:{triage:"На сортировку",todo:"К выполнению",ready:"Готово",running:"В работе",blocked:"Заблокировано",done:"Выполнено",archived:"В архиве"},form:{title:"Заголовок",titlePlaceholder:"Заголовок задачи",titleRequired:"Заголовок не может быть пустым",body:"Описание",bodyPlaceholder:"Описание задачи (необязательно)",assignee:"Ответственный",selectAssignee:"Выберите ответственного...",priority:"Приоритет",selectPriority:"Выберите приоритет..."},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:"Ключевая информация"},action:{title:"Действие",complete:"Завершить",completeSummary:"Краткое описание завершения (необязательно)",block:"Заблокировать",blockReason:"Причина блокировки",unblock:"Разблокировать",assign:"Назначить",assignTo:"Назначить..."},message:{taskCreated:"Задача создана",taskCompleted:"Задача завершена",taskBlocked:"Задача заблокирована",taskUnblocked:"Задача разблокирована",taskAssigned:"Задача назначена",loadFailed:"Ошибка загрузки задач"},stats:{total:"Всего",tasks:"задач"}},jobs:{title:"Периодические задачи",createJob:"Создать задачу",editJob:"Редактировать задачу",noJobs:"Нет периодических задач. Создайте первую.",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:"Содержимое для выполнения",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:"Навыки",searchPlaceholder:"Поиск навыков...",noMatch:"Нет подходящих навыков",noSkills:"Нет навыков",backTo:"Назад",attachedFiles:"Прикреплённые файлы",loadFailed:"Ошибка загрузки навыков",fileLoadFailed:"Ошибка загрузки файла",modified:"Пользователь изменил",archived:"В архиве",pinned:"Закреплено",pin:"Закрепить навык",unpin:"Открепить",pinFailed:"Ошибка изменения статуса закрепления",toggleFailed:"Ошибка переключения статуса навыка",source:{builtin:"Встроенный",hub:"Установленный из Hub",local:"Локально установленный"}},plugins:{title:"Плагины",refresh:"Обновить",notice:"Только для чтения: отображаются манифесты обнаруживаемых плагинов Hermes. Чтение метаданных не загружает код плагинов. Действия управления v1 по-прежнему доступны в CLI, новые сеансы Hermes вступают в силу.",loadFailed:"Ошибка загрузки плагинов",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:"Путь / Точка входа",cli:"CLI"},capabilities:{tools:"{count} инструментов",hooks:"{count} хуков",env:"{count} переменных окружения"},metadata:{agentRoot:"Корневая директория агента",python:"Python",scanCwd:"Сканировать cwd",projectPlugins:"Плагины проекта"}},memory:{title:"Память",refresh:"Обновить",loadFailed:"Ошибка загрузки памяти",myNotes:"Мои заметки",noNotes:"Нет заметок.",notesPlaceholder:"Введите текст заметки...",userProfile:"Профиль пользователя",noProfile:"Нет профиля.",profilePlaceholder:"Введите профиль пользователя...",soul:"Душа",noSoul:"Нет конфигурации души.",soulPlaceholder:"Введите конфигурацию души..."},models:{title:"Модели",searchPlaceholder:"Поиск моделей...",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:"Провайдер удалён",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:"Срок действия ссылки истёк. Повторите попытку.",customBadge:"Пользовательская",previewBadge:"Предварительная",disabledBadge:"Недоступна",disabledTooltip:"Эта модель недоступна для текущей учётной записи",customModelPlaceholder:"ID модели, отсутствующей в списке",customModelHint:"Используйте, если провайдер поддерживает модель, но она не возвращена. Не переименование. Нажмите Enter для загрузки.",removeCustomModel:"Удалить эту модель из списка",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:"Снять все",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:"По умолч.",builtIn:"Встроенный",customType:"Пользовательский",provider:"Провайдер",contextLength:"Длина контекста",contextLengthPlaceholder:"Например, 200000 (необязательно)",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:"Агент",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",busyInputMode:"Режим ввода во время занятости",busyInputModeHint:"Разрешить ввод, пока AI обрабатывает запрос",theme:"Тема",themeHint:"Выберите светлую, тёмную или системную тему",themeLight:"Светлая",themeDark:"Тёмная",themeSystem:"Системная"},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 профиля.",mode:"Политика профилей",modeHint:"Запускать все найденные профили или только явный список включения.",modeAll:"Все найденные профили",modeInclude:"Только включенные профили",include:"Включенные профили",includeHint:"Имена профилей через запятую. В режиме включения пустой список не запускает ничего.",exclude:"Исключенные профили",excludeHint:"Имена профилей через запятую, которые нужно пропустить после применения политики.",profileListPlaceholder:"default, reviewer"},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:"Требовать авторизацию для изменения сеанса"},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}"},userAvatar:{title:"Аватар пользователя",upload:"Загрузить изображение",random:"Сгенерировать случайный",reset:"Сбросить по умолчанию",hint:"Поддерживаются PNG, JPEG и WebP до 1 МБ; автоматически сжимается до менее 500 КБ.",invalidType:"Выберите изображение PNG, JPEG или WebP",tooLarge:"Изображение аватара должно быть не больше 1 МБ",saveSuccess:"Аватар сохранён",saveFailed:"Не удалось сохранить аватар",resetSuccess:"Аватар сброшен",resetFailed:"Не удалось сбросить аватар"},voice:{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:"Токен бота, полученный на портале разработчика",accessToken:"Токен доступа",accessTokenHint:"Токен доступа Matrix",homeserver:"URL домашнего сервера",homeserverHint:"Адрес сервера Matrix",appId:"ID приложения",appIdHint:"ID приложения Feishu",appSecret:"Секрет приложения",appSecretHint:"Секрет приложения Feishu",clientId:"ID клиента",clientIdHint:"ID клиента DingTalk",clientSecret:"Секрет клиента",clientSecretHint:"Секрет клиента DingTalk",allowedUsers:"Разрешённые пользователи",allowedUsersHint:"Белый список ID пользователей или OpenID (через запятую)",allowAllUsers:"Разрешить всех пользователей",allowAllUsersHint:"Разрешить любым пользователям отправлять сообщения; при отключении используется белый список",botId:"ID бота",botIdHint:"ID бота WeChat Work",wecomSecretHint:"Секрет бота WeChat Work",waEnabled:"Включить WhatsApp",waEnabledHint:"Включить WhatsApp с помощью пары по QR-коду",weixinToken:"Токен WeChat",weixinTokenHint:"Получите с помощью CLI (hermes weixin) при входе по QR-коду",accountId:"ID учётной записи",accountIdHint:"ID учётной записи WeChat",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:"Агент добавлен",agentAlreadyInRoom:"Агент уже в комнате",agentAddFailedCount:"Не добавлено агентов: {count} — {details}",noAgents:"В комнате нет агентов",members:"Участники",roomCreated:"Комната создана",roomDeleted:"Комната удалена",roomCloned:"Комната клонирована",cloneRoom:"Клонировать комнату",copyRoomLink:"Копировать ссылку на комнату",deleteRoomConfirm:"Удалить эту комнату?",clearContext:"Очистить контекст",clearContextConfirm:"Очистить контекст текущей комнаты? Сообщения и сжатые снимки будут удалены, агенты и участники останутся.",contextCleared:"Контекст очищен",you:"Вы",joined:"Вы присоединились к комнате",joinFailed:"Не удалось присоединиться к комнате",inputPlaceholder:"Введите сообщение... (Enter — отправить)",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_11_1:"LAN device discovery теперь включает pairing approvals, request history, обработку duplicate requests, status sync и cleanup при отзыве device access",new_0_6_11_2:"LAN peer access доступен через MCP: bundled MCP startup, command shims, reconnecting peer sockets, local connection listing и лимиты terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis и настройки MiMo voice cloning теперь доступны, включая playback перед сохранением",new_0_6_11_4:"Gateway autostart settings теперь показывают profile filtering с multi-select controls, whitelist behavior и tests для startup profile selection",new_0_6_11_5:"Chat scrolling и motion стали стабильнее благодаря bottom-follow tuning, initial bottom scroll fixes, scroll lock updates и reduced-motion fade handling",new_0_6_11_6:"Agent Bridge и runtime flows стали надежнее: abort timeout handling, resume startup guards, execute-code approval memory, Windows Gateway recovery и dev terminal proxy fixes",new_0_6_11_7:"Security усилена через Web UI origin policy, security headers и server-token loopback access guards",new_0_6_11_8:"Group chat и tool output rendering стали стабильнее: room rejoin после reconnect, сохранение reasoning/tool boundaries, более безопасный tool payload rendering и улучшенный diff display",new_0_6_11_9:"Skills и Workspace flows поддерживают external skill directories, import/delete refresh, sourcePath grouping, localized folder picker text и mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs и OpenRouter attribution text получили UI polish",new_0_6_10_1:"Тексты сайта теперь последовательно используют название Hermes Studio, сохраняя неизменными идентификаторы npm package, CLI, репозитория и переменных окружения",new_0_6_10_2:"Экраны запуска desktop и загрузки runtime теперь используют локализованные тексты для запуска сервисов, выбора источника, прогресса и ошибок",new_0_6_10_3:"Проверки процессов Windows Agent Bridge допускают локализованный вывод tasklist/taskkill и предотвращают сбои UnicodeDecodeError из-за не-UTF-8 вывода системных команд",new_0_6_10_4:"Документация OpenAPI теперь включает endpoints для avatar, auxiliary model config, provider model cache refresh и импорта Hermes sessions",new_0_6_10_5:"Workspace file browser теперь поддерживает более полные text previews и coverage контекстного меню для source и document files",new_0_6_10_6:"Agent Bridge стал надежнее благодаря обновлению tool approval allowlists и декодированию Windows tasklist/taskkill output",new_0_6_10_7:"Пользователи могут загружать profile avatars, а group chat members теперь синхронизируют и отображают account avatars единообразно",new_0_6_10_8:"Provider model catalogs теперь можно refresh из UI",new_0_6_10_9:"Memory notes теперь можно сохранять с пустым содержимым, чтобы очищать personal notes без ошибки сохранения",new_0_6_10_10:"Repository harness docs теперь отслеживают chat-chain changes, чтобы bridge и chat-runtime updates были документированы до прохождения CI",new_0_6_9_1:"Приложение теперь использует бренд Hermes Studio в заголовке браузера, боковой панели, заголовке сайта, метаданных пакетов и официальных ссылках",new_0_6_9_2:"Проверка обновлений desktop стала надёжнее благодаря fallback через release feed, когда GitHub API ограничен rate limit или отсутствуют metadata для tag",new_0_6_9_3:"На macOS установка обновления сначала останавливает локальный Web UI server, затем electron-updater выполняет quit и install, поэтому Restart применяет скачанную версию",new_0_6_9_4:"Provider credentials и auth теперь последовательнее учитывают Profile scope, а запуск gateway/runtime лучше совместим с packaged desktop",new_0_6_9_5:"Browser Web Speech теперь ставит на паузу и возобновляет текущее сообщение в Chrome вместо повторного запуска с начала",new_0_6_9_6:"Русская локализация теперь доступна в переключателе языка, включая переведённые сообществом сообщения клиентского интерфейса",new_0_6_8_1:"Desktop builds получили tray controls, ручную проверку обновлений, уведомления об обновлениях и открытие packaged Web UI в локальном браузере",new_0_6_8_2:"Windows desktop запускается тише и надёжнее: скрыты Python/bridge subprocesses, исправлены terminal popups, размер tray icon и browser packaging",new_0_6_8_3:"Desktop packaging стал стабильнее на разных платформах благодаря исправлениям macOS signing file limit, writable paths в Linux, runtime cold start и workflow checkout",new_0_6_8_4:"Официальный сайт и release distribution улучшены download mirrors, последовательным deploy сайта после desktop release и очисткой desktop smoke checks",new_0_6_8_5:"Runtime usability улучшена за счёт provider context-length preferences, сохранения unsent chat drafts, исправлений mobile layout overflow, custom ports в SSH file provider и nonblocking preview actions",new_0_6_7_1:"Desktop app теперь по умолчанию использует порт 8748, поддерживает LAN access и может открываться напрямую из локального браузера",new_0_6_7_9:"Desktop download links теперь доступны на официальном сайте https://hermes-studio.ai/, а последние installers остаются доступными в GitHub Releases",new_0_6_7_2:"MCP tooling стал полнее благодаря исправлениям bridge tool discovery, lifecycle управления MCP и per-model tool visibility controls в manager",new_0_6_7_3:"Message lists теперь корректно центрируют empty states, уменьшают scroll jitter, не пропускают live chat messages в History при загрузке, сохраняют scroll positions по session и используют fade in 1.5 секунды при переключении sessions",new_0_6_7_4:"Bridge и runtime stability улучшены за счёт сохранения порядка text/tool-call, исправления загрузки Profile runtime status, улучшения Node/npm detection и пропуска создания production data directory",new_0_6_7_5:"Desktop distribution теперь покрывает Electron packaging, app naming, preload builds, release artifact uploads, Windows Hermes CLI launch, Linux icons and writable data paths, macOS unsigned release handling и скрытые Windows startup subprocesses",new_0_6_7_6:"Website получил downloads и deploy workflows, а deploy исправлен для окружений без rsync",new_0_6_7_7:"Server и auth fixes используют dirname для Windows credential directories и повышают avatar upload body limit, чтобы избежать 413 errors на крупных изображениях",new_0_6_7_8:"Repository harness, validation docs и agent guidance добавлены для coding agents, а устаревшие setup script docs удалены"}},da=["en","zh","zh-TW","ja","ko","fr","es","de","pt","ru"];function Ua(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function pt(o,e){const a={...o};for(const[l,s]of Object.entries(e)){const d=o[l];a[l]=Ua(d)&&Ua(s)?pt(d,s):s}return a}var Ti={en:ut,zh:yi,"zh-TW":Si,ja:ki,ko:wi,fr:Ci,es:Pi,de:Ai,pt:_i,ru:xi},mt={};for(const[o,e]of Object.entries(Ti))mt[o]=o==="en"?e:pt({...ut},{...e});var Mi=localStorage.getItem("hermes_locale");function Ii(o){if(o&&da.includes(o))return o;function e(a){const l=a.toLowerCase();if(l.startsWith("zh"))return l.includes("hant")||l.includes("-tw")||l.includes("-hk")||l.includes("-mo")?"zh-TW":"zh";const s=a.slice(0,2);return da.includes(a)?a:da.includes(s)?s:null}for(const a of navigator.languages){const l=e(a);if(l)return l}return"en"}function gt(o){document.documentElement.lang=o}var ht=Ii(Mi);gt(ht);var vt=ti({legacy:!1,locale:ht,fallbackLocale:"en",messages:mt});function Hi(o){vt.global.locale.value=o,gt(o)}var Di,Ri=Ie((()=>{Di="/logo.png"}));Ri();Ye();var Ei={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",placeholderColor:"#999999",caretColor:"#1a1a1a"},Card:{color:"#ffffff",borderColor:"#e0e0e0"},Modal:{color:"#ffffff"},Tag:{borderRadius:"6px"}},Fi={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 #3a3a3a",borderHover:"1px solid #666666",borderFocus:"1px solid #e0e0e0",placeholderColor:"#666666",caretColor:"#e0e0e0"},Card:{color:"#2a2a2a",borderColor:"#3a3a3a"},Modal:{color:"#2a2a2a"},Tag:{borderRadius:"6px"},Switch:{railColor:"#3a3a3a",railColorActive:"#66bb6a",loadingColor:"#e0e0e0",opacityDisabled:.4}};function Li(o,e){const a=o?Fi:Ei;return e?{...a,common:{...a.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:a}function Ni(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function Bo(){const o=Ni(so.value);Eo.value=o,wo.value=ko.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",wo.value)}function ft(){const o=me(()=>{const d=Eo.value?"dark":"light";return wo.value?`comic-${d}`:d});function e(d){so.value=d}function a(d){ko.value=d}function l(){so.value=Eo.value?"light":"dark"}function s(){ko.value=wo.value?"ink":"comic"}return{brightness:so,style:ko,isDark:Eo,isComic:wo,themeName:o,setBrightness:e,setStyle:a,toggleBrightness:l,toggleStyle:s}}var ca,ua,so,ko,Eo,wo,bt=Ie((()=>{ca="hermes_brightness",ua="hermes_style",so=b(localStorage.getItem(ca)||"system"),ko=b(localStorage.getItem(ua)||"ink"),Eo=b(!1),wo=b(!1),Bo(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{so.value==="system"&&Bo()}),ro(so,o=>{localStorage.setItem(ca,o),Bo()}),ro(ko,o=>{localStorage.setItem(ua,o),Bo()})})),pa,ma,za,qa,Oa,Ba,lo,qo=Ie((()=>{xe(),mi(),pa="0.6.12",ma="hermes_sidebar_collapsed",za="hermes_active_profile_name",qa=3e4,Oa=120*1e3,Ba=3e3,lo=ta("app",()=>{const o=b(!1),e=b(localStorage.getItem(ma)==="1"),a=b(!1),l=b(pa),s=b(""),d=b(!1),u=b(!1),g=b(""),P=b(!1),q=b(!1),w=b([]),W=b([]),_=b(""),G=b(""),z=b({}),V=b({}),re=b({}),ae=b(),k=b(""),I=b(!0),O=b(!0),J=b(4096);let y=null,X=0;function te(x){return new Promise(ie=>setTimeout(ie,x))}async function j(){if(q.value||!d.value)return!1;q.value=!0;try{await ci(),u.value=!1,s.value="";const x=Date.now()+Oa;for(;Date.now()<x;)if(await te(Ba),await A(),P.value)return fe(),!0;return!0}catch(x){return console.error("Failed to update Hermes Web UI:",x),!1}finally{q.value=!1}}async function A(){try{const x=await hi();a.value=x.status==="ok",x.webui_version&&(l.value=x.webui_version),P.value=!!x.webui_version&&x.webui_version!==pa,x.webui_latest?s.value=x.webui_latest:s.value="",d.value=!!x.webui_update_enabled,g.value=x.webui_update_source_label||"",u.value=!!x.webui_update_enabled&&!!x.webui_update_available,x.node_version&&(k.value=x.node_version)}catch{a.value=!1,P.value=!1,d.value=!1,u.value=!1,g.value=""}}function p(x){w.value=x.groups,W.value=x.profiles||[],V.value=x.model_aliases||{},re.value=x.model_visibility||{},z.value=x.custom_models||{};const ie=localStorage.getItem(za)||"",he=(ie?W.value.find(Me=>Me.profile===ie):void 0)||x,be=he.groups||[],ve=he.default||"",ye=he.default_provider||"",Ee=be.find(Me=>Me.provider===ye&&Me.models.includes(ve)),Ne=be.find(Me=>Me.models.includes(ve)),Io=be.find(Me=>Me.models.length>0),po=ye?be.find(Me=>Me.provider===ye):void 0,mo=ye?x.allProviders.find(Me=>Me.provider===ye):void 0,to=po?.available_models?.length?po.available_models:mo?.available_models?.length?mo.available_models:mo?.models||[],io=ye?re.value[ye]:void 0,go=!!(ve&&io?.mode==="include"&&!io.models.includes(ve)&&(to.length===0||to.includes(ve))),ho=!!(ve&&ye&&po&&!po.models.includes(ve)&&!go);if(Ee||Ne){const Me=Ee||Ne;_.value=ve,G.value=Me.provider}else ho?(_.value=ve,G.value=ye,z.value={...z.value,[ye]:Array.from(new Set([...z.value[ye]||[],ve]))}):Io?(_.value=Io.models[0],G.value=Io.provider):(_.value="",G.value="")}async function H(x=!1){if(Na()){if(!x&&y)return y;if(!(!x&&X>0&&Date.now()-X<qa))return X=Date.now(),y=(async()=>{try{p(await pi())}catch{}finally{y=null}})(),y}}async function $(x=15e3){if(!Na())return;const ie=y||(X===0?H():null);ie&&await Promise.race([ie,new Promise(he=>setTimeout(he,x))])}async function Fe(){return H(!0)}function Ke(x,ie){if(ie)return V.value[ie]?.[x]||"";for(const he of Object.values(V.value))if(he[x])return he[x];return""}function To(x,ie){return Ke(x,ie)||x}function Qe(x,ie,he){return x.map(be=>be.provider!==ie?be:{...be,models:be.models.filter(ve=>ve!==he),available_models:be.available_models?.filter(ve=>ve!==he)})}function K(x,ie){w.value=Qe(w.value,x,ie),W.value=W.value.map(he=>({...he,groups:Qe(he.groups,x,ie)}))}async function de(x,ie,he){const be=he.trim();await bi({provider:ie,model:x,alias:be});const ve={...V.value},ye={...ve[ie]||{}};be?(ye[x]=be,ve[ie]=ye):(delete ye[x],Object.keys(ye).length>0?ve[ie]=ye:delete ve[ie]),V.value=ve}async function Z(x,ie){try{const he=w.value.find(ve=>ve.models.includes(x)),be=ie||he?.provider||"";await fi({default:x,provider:be}),_.value=x,G.value=be||"",be&&!w.value.find(ve=>ve.provider===be)?.models.includes(x)&&(z.value=(await vi({provider:be,model:x})).custom_models||{})}catch(he){console.error("Failed to switch model:",he)}}async function We(x,ie){const he=z.value[ie]||[];if(!he.includes(x))return;const be={...z.value},ve=he.filter(ye=>ye!==x);ve.length>0?be[ie]=ve:delete be[ie];try{z.value=(await gi({provider:ie,model:x})).custom_models||be}catch(ye){console.error("Failed to remove custom model:",ye),z.value=be}if(K(ie,x),_.value===x&&G.value===ie){const ye=w.value.find(Ee=>Ee.provider===ie&&Ee.models.length>0)||w.value.find(Ee=>Ee.models.length>0);ye?await Z(ye.models[0],ye.provider):(_.value="",G.value="")}}function uo(x){return re.value[x]||{mode:"all",models:[]}}function je(x,ie){const he=uo(x);return he.mode!=="include"||he.models.includes(ie)}async function ce(x,ie){re.value=(await ui({provider:x,mode:ie.mode,models:ie.models})).model_visibility||{},await Fe()}function we(x=3e4){Oo(),A(),ae.value=setInterval(A,x)}function Oo(){ae.value&&(clearInterval(ae.value),ae.value=void 0)}function fe(){const x=new URL(window.location.href);x.searchParams.set("__hwui_reload",Date.now().toString()),window.location.replace(x.toString())}function Ge(){o.value=!o.value}function Mo(){o.value=!1}function ao(){e.value=!e.value;try{localStorage.setItem(ma,e.value?"1":"0")}catch{}}return{sidebarOpen:o,sidebarCollapsed:e,toggleSidebar:Ge,closeSidebar:Mo,toggleSidebarCollapsed:ao,connected:a,serverVersion:l,latestVersion:s,nodeVersion:k,updateEnabled:d,updateAvailable:u,updateSourceLabel:g,clientOutdated:P,updating:q,doUpdate:j,reloadClient:fe,modelGroups:w,profileModelGroups:W,customModels:z,modelAliases:V,modelVisibility:re,selectedModel:_,selectedProvider:G,streamEnabled:I,sessionPersistence:O,maxTokens:J,checkConnection:A,loadModels:H,waitForModelsForRun:$,reloadModels:Fe,applyAvailableModelsResponse:p,switchModel:Z,removeCustomModel:We,getModelAlias:Ke,displayModelName:To,setModelAlias:de,getProviderVisibility:uo,isModelVisible:je,setModelVisibility:ce,startHealthPolling:we,stopHealthPolling:Oo}})}));async function Wa(){return(await ee("/api/hermes/profiles")).profiles}async function Ui(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}`)).profile}async function zi(o={}){return ee(`/api/hermes/profiles/runtime-statuses${o.refresh===!1?"?refresh=0":""}`)}async function qi(o,e){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/avatar`,{method:"PUT",body:JSON.stringify(e)})).avatar}async function Oi(o){await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/avatar`,{method:"DELETE"})}async function Bi(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/gateway/restart`,{method:"POST"})).gateway}async function Wi(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/restart`,{method:"POST"})).status}async function ji(o,e){try{const a=await ee("/api/hermes/profiles",{method:"POST",body:JSON.stringify({name:o,clone:e})});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 Gi(o){try{return await ee(`/api/hermes/profiles/${encodeURIComponent(o)}`,{method:"DELETE"}),!0}catch{return!1}}async function Vi(o,e){try{return await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/rename`,{method:"POST",body:JSON.stringify({new_name:e})}),!0}catch{return!1}}async function Ki(o){return!!o}async function Qi(o){try{return await ee("/api/hermes/profiles/active",{method:"PUT",body:JSON.stringify({name:o})}),!0}catch{return!1}}async function Ji(o){try{const e=zo(),a=xo(),l={};a&&(l.Authorization=`Bearer ${a}`);const s=await fetch(`${e}/api/hermes/profiles/${encodeURIComponent(o)}/export`,{method:"POST",headers:l});if(!s.ok)throw new Error;const d=await s.blob(),u=URL.createObjectURL(d),g=document.createElement("a");return g.href=u,g.download=`hermes-profile-${o}.tar.gz`,g.click(),URL.revokeObjectURL(u),!0}catch{return!1}}async function $i(o){try{const e=zo(),a=xo(),l={};a&&(l.Authorization=`Bearer ${a}`);const s=new FormData;return s.append("file",o),(await fetch(`${e}/api/hermes/profiles/import`,{method:"POST",headers:l,body:s})).ok}catch{return!1}}var yt=Ie((()=>{Be()})),Zi=Bt({useProfilesStore:()=>co}),bo,co,ia=Ie((()=>{Lo(),xe(),yt(),qo(),bo="hermes_active_profile_name",co=ta("profiles",()=>{const o=b([]),e=b(localStorage.getItem(bo)),a=b(null),l=b({}),s=b(!1),d=b(!1);async function u(){s.value=!0;try{o.value=await Wa();const I=e.value||localStorage.getItem(bo);let O=o.value.find(J=>J.name===I)??null;!O&&o.value.length>0&&(O=o.value[0],e.value=O.name,localStorage.setItem(bo,O.name)),o.value=o.value.map(J=>({...J,active:!!O&&J.name===O.name})),a.value=O,O?e.value=O.name:(e.value=null,localStorage.removeItem(bo))}catch(I){console.error("Failed to fetch profiles:",I)}finally{s.value=!1}}async function g(){s.value=!0;try{o.value=await Wa(),a.value=o.value.find(I=>I.active)??null}catch(I){console.error("Failed to fetch Hermes profiles:",I)}finally{s.value=!1}}async function P(I){if(l.value[I])return l.value[I];try{const O=await Ui(I);return l.value[I]=O,O}catch{return null}}async function q(I,O){const J=await qi(I,O);return o.value=o.value.map(y=>y.name===I?{...y,avatar:J}:y),l.value[I]&&(l.value[I]={...l.value[I],avatar:J}),a.value?.name===I&&(a.value={...a.value,avatar:J}),J}async function w(I){await Oi(I),o.value=o.value.map(O=>O.name===I?{...O,avatar:null}:O),l.value[I]&&(l.value[I]={...l.value[I],avatar:null}),a.value?.name===I&&(a.value={...a.value,avatar:null})}async function W(I,O){const J=await ji(I,O);return J.success&&await u(),J}async function _(I){const O=await Gi(I);return O&&(delete l.value[I],await u()),O}function G(){}async function z(I,O){const J=await Vi(I,O);return J&&(delete l.value[I],await u()),J}async function V(I){d.value=!0;try{const O=await Ki(I);return O&&(e.value=I,localStorage.setItem(bo,I),o.value=o.value.map(J=>({...J,active:J.name===I})),a.value=o.value.find(J=>J.name===I)??null,await lo().reloadModels()),O}finally{d.value=!1}}async function re(I){d.value=!0;try{const O=await Qi(I);return O&&await g(),O}finally{d.value=!1}}async function ae(I){return Ji(I)}async function k(I){const O=await $i(I);return O&&await u(),O}return{profiles:o,activeProfile:a,activeProfileName:e,detailMap:l,loading:s,switching:d,fetchProfiles:u,fetchHermesProfiles:g,fetchProfileDetail:P,createProfile:W,deleteProfile:_,renameProfile:z,switchProfile:V,switchHermesProfile:re,exportProfile:ae,importProfile:k,updateAvatar:q,deleteAvatar:w,clearAllSessionCaches:G}})}));bt();xe();qo();ia();Ve();var Yi={class:"model-selector"},Xi={class:"model-label"},en=["title"],on={class:"model-list"},an=["onClick"],tn={class:"model-group-label"},nn={class:"model-group-count"},rn={class:"model-group-items"},sn=["title","onClick"],ln={class:"model-item-label"},dn={class:"model-item-name"},cn={key:0,class:"model-item-id"},un={key:0,class:"model-badge-preview"},pn={key:1,class:"model-badge-disabled"},mn={key:2,class:"model-badge-custom"},gn=["title","onClick"],hn={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"},vn={key:0,class:"model-empty"},fn={class:"model-custom"},bn={class:"model-custom-row"},yn={class:"model-custom-hint"},Sn=Le({__name:"ModelSelector",setup(o){const{t:e}=Xe(),a=lo(),l=co(),s=b(!1),d=b(""),u=b({}),g=b(""),P=b(""),q=me(()=>l.activeProfileName||"default"),w=me(()=>a.profileModelGroups.find(A=>A.profile===q.value)?.groups||[]),W=me(()=>(P.value=a.selectedProvider,w.value.map(A=>({label:A.label,value:A.provider})))),_=me(()=>w.value.map(A=>({...A,models:[...A.models,...(a.customModels[A.provider]||[]).filter(p=>!A.models.includes(p))]}))),G=me(()=>_.value.some(A=>A.provider===a.selectedProvider&&A.models.includes(a.selectedModel))),z=me(()=>G.value?a.displayModelName(a.selectedModel,a.selectedProvider):"");function V(A,p){return(a.customModels[p]||[]).includes(A)}async function re(A,p){await a.removeCustomModel(A,p)}function ae(A){return typeof A=="string"?A.toLowerCase():""}const k=me(()=>{const A=ae(d.value).trim();return A?_.value.map(p=>({...p,models:p.models.filter(H=>{const $=a.displayModelName(H,p.provider);return ae(H).includes(A)||ae($).includes(A)})})).filter(p=>p.models.length>0||ae(p.label).includes(A)):_.value});function I(A){u.value[A]=!u.value[A]}function O(A){return!!u.value[A]}function J(A,p){w.value.find(H=>H.provider===p)?.model_meta?.[A]?.disabled||(a.switchModel(A,p),s.value=!1,d.value="")}function y(A,p){return a.displayModelName(A,p)}function X(A,p){return a.getModelAlias(A,p)}function te(){const A=g.value.trim();!A||!P.value||w.value.find(p=>p.provider===P.value)?.model_meta?.[A]?.disabled||(a.switchModel(A,P.value),s.value=!1,d.value="",g.value="")}function j(){u.value={},d.value="",g.value="",P.value=a.selectedProvider,s.value=!0}return(A,p)=>(D(),B("div",Yi,[r("div",Xi,C(c(e)("models.title")),1),r("button",{class:"model-trigger",onClick:j},[r("span",{class:"model-name",title:c(a).selectedModel},C(z.value||"—"),9,en),p[4]||(p[4]=r("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"},[r("polyline",{points:"6 9 12 15 18 9"})],-1))]),Q(c(Ao),{show:s.value,"onUpdate:show":p[3]||(p[3]=H=>s.value=H),preset:"card",title:c(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:Y(()=>[Q(c(ya),{value:d.value,"onUpdate:value":p[0]||(p[0]=H=>d.value=H),placeholder:c(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),r("div",on,[(D(!0),B(_o,null,Po(k.value,H=>(D(),B("div",{key:H.provider,class:"model-group"},[r("div",{class:"model-group-header",onClick:$=>I(H.provider)},[(D(),B("svg",{class:De(["model-group-arrow",{collapsed:O(H.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[5]||(p[5]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),r("span",tn,C(H.label),1),r("span",nn,C(H.models.length),1)],8,an),So(r("div",rn,[(D(!0),B(_o,null,Po(H.models,$=>(D(),B("div",{key:$,class:De(["model-item",{active:$===c(a).selectedModel&&H.provider===c(a).selectedProvider,disabled:!!H.model_meta?.[$]?.disabled}]),title:H.model_meta?.[$]?.disabled?c(e)("models.disabledTooltip"):"",onClick:Fe=>J($,H.provider)},[r("span",ln,[r("span",dn,C(y($,H.provider)),1),X($,H.provider)?(D(),B("span",cn,C(c(e)("models.aliasCanonical",{model:$})),1)):Ce("",!0)]),H.model_meta?.[$]?.preview?(D(),B("span",un,C(c(e)("models.previewBadge")),1)):Ce("",!0),H.model_meta?.[$]?.disabled?(D(),B("span",pn,C(c(e)("models.disabledBadge")),1)):Ce("",!0),V($,H.provider)?(D(),B("span",mn,C(c(e)("models.customBadge")),1)):Ce("",!0),V($,H.provider)?(D(),B("button",{key:3,class:"model-custom-remove",type:"button",title:c(e)("models.removeCustomModel"),onClick:Kt(Fe=>re($,H.provider),["stop"])}," × ",8,gn)):Ce("",!0),$===c(a).selectedModel&&H.provider===c(a).selectedProvider?(D(),B("svg",hn,[...p[6]||(p[6]=[r("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):Ce("",!0)],10,sn))),128))],512),[[yo,!O(H.provider)]])]))),128)),k.value.length===0?(D(),B("div",vn,C(d.value?"No results":"No models"),1)):Ce("",!0),r("div",fn,[r("div",bn,[Q(c(st),{value:P.value,"onUpdate:value":p[1]||(p[1]=H=>P.value=H),options:W.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),Q(c(ya),{value:g.value,"onUpdate:value":p[2]||(p[2]=H=>g.value=H),placeholder:c(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:Xt(te,["enter"])},null,8,["value","placeholder"])]),r("div",yn,C(c(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});eo();var kn=oo(Sn,[["__scopeId","data-v-72b95fdf"]]),ja,Ga,Va,St,Ka=Ie((()=>{xe(),ja=qt(li()),Ga=["src"],Va=["innerHTML"],St=Le({__name:"ProfileAvatar",props:{name:{},avatar:{},size:{default:24}},setup(o){const e=o,a=me(()=>e.name||"default"),l=me(()=>(0,ja.default)(e.avatar?.seed||a.value)),s=me(()=>({width:`${e.size}px`,height:`${e.size}px`,flexBasis:`${e.size}px`}));return(d,u)=>(D(),B("span",{class:"profile-avatar-view",style:Qt(s.value)},[o.avatar?.type==="image"&&o.avatar.dataUrl?(D(),B("img",{key:0,class:"profile-avatar-image",src:o.avatar.dataUrl,alt:"",draggable:"false"},null,8,Ga)):(D(),B("span",{key:1,class:"profile-avatar-svg",innerHTML:l.value},null,8,Va))],4))}})})),wn=Ie((()=>{})),Go,Cn=Ie((()=>{Ka(),Ka(),wn(),eo(),Go=oo(St,[["__scopeId","data-v-6a9a551b"]])}));xe();Ye();ia();yt();Cn();Ve();var Pn={class:"profile-selector"},An={class:"selector-label"},_n={class:"profile-name"},xn={class:"profile-modal-header"},Tn={class:"profile-popover-title"},Mn={class:"profile-popover-name"},In={class:"profile-popover-subtitle"},Hn={class:"profile-runtime-list"},Dn={class:"profile-runtime-main"},Rn={class:"profile-runtime-info"},En={class:"profile-runtime-name-row"},Fn={class:"profile-runtime-name"},Ln={key:0,class:"active-badge"},Nn={class:"runtime-status-grid"},Un={class:"runtime-row compact"},zn={class:"runtime-label"},qn={class:"runtime-row compact"},On={class:"runtime-label"},Bn={key:0,class:"runtime-detail"},Wn={class:"profile-runtime-actions"},jn={key:0,class:"avatar-editor"},Gn={class:"avatar-editor-meta"},Vn={class:"avatar-editor-name"},Kn={class:"avatar-editor-hint"},Qn={class:"avatar-editor-actions"},Jn=Le({__name:"ProfileSelector",setup(o){const{t:e}=Xe(),a=xa(),l=co(),s=me(()=>l.activeProfileName??""),d=me(()=>s.value||"default"),u=me(()=>l.profiles.find(K=>K.name===d.value)),g=b([]),P=b(!1),q=b(!1),w=b(!1),W=b(null),_=b(!1),G=b(null),z=b({}),V=b({}),re=b({}),ae=me(()=>new Map(g.value.map(K=>[K.profile,K])));let k=0;async function I(K={}){const de=++k;K.background||(P.value=g.value.length===0);try{const Z=await zi({refresh:!K.background});return de!==k?!1:(g.value=Z.profiles,!!Z.refreshing)}catch{return g.value=[],!1}finally{de===k&&(P.value=!1)}}function O(){q.value=!0,I().then(K=>{K&&J()})}function J(K=0){K>=12||typeof window>"u"||window.setTimeout(()=>{q.value&&I({background:!0}).then(de=>{de&&J(K+1)})},K===0?700:1200)}function y(K){W.value=K,w.value=!0}function X(){return`profile-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}async function te(K){if(W.value){_.value=!0;try{await l.updateAvatar(W.value.name,K),a.success(e("profiles.avatar.saveSuccess")),w.value=!1}catch(de){a.error(de?.message||e("profiles.avatar.saveFailed"))}finally{_.value=!1}}}async function j(){await te({type:"generated",seed:X()})}async function A(){if(W.value){_.value=!0;try{await l.deleteAvatar(W.value.name),a.success(e("profiles.avatar.resetSuccess")),w.value=!1}catch(K){a.error(K?.message||e("profiles.avatar.resetFailed"))}finally{_.value=!1}}}function p(){G.value?.click()}async function H(K){const de=K.target,Z=de.files?.[0];if(de.value="",!!Z){if(!["image/png","image/jpeg","image/webp"].includes(Z.type)){a.warning(e("profiles.avatar.invalidType"));return}if(Z.size>1024*1024){a.warning(e("profiles.avatar.tooLarge"));return}await te({type:"image",dataUrl:await new Promise((We,uo)=>{const je=new FileReader;je.onload=()=>We(String(je.result||"")),je.onerror=()=>uo(je.error||new Error("Failed to read file")),je.readAsDataURL(Z)})})}}function $(K){return K==null?e("profiles.runtime.checking"):e(K?"profiles.runtime.running":"profiles.runtime.stopped")}function Fe(K){return K==null?e("profiles.runtime.checking"):e(K?"profiles.runtime.active":"profiles.runtime.idle")}async function Ke(K){z.value={...z.value,[K]:!0};try{const de=await Bi(K);ae.value.get(K)&&(g.value=g.value.map(Z=>Z.profile===K?{...Z,gateway:de}:Z)),a.success(e("profiles.runtime.gatewayRestarted",{name:K}))}catch(de){a.error(de?.message||e("profiles.runtime.gatewayRestartFailed"))}finally{z.value={...z.value,[K]:!1}}}async function To(K){V.value={...V.value,[K]:!0};try{const de=await Wi(K);g.value=g.value.map(Z=>Z.profile===K?de:Z),a.success(e("profiles.runtime.profileRestarted",{name:K}))}catch(de){a.error(de?.message||e("profiles.runtime.profileRestartFailed"))}finally{V.value={...V.value,[K]:!1}}}async function Qe(K){if(K!==d.value){re.value={...re.value,[K]:!0};try{if(!await l.switchProfile(K))throw new Error(e("profiles.switchFailed"));a.success(e("profiles.switchSuccess",{name:K})),window.location.reload()}catch(de){a.error(de?.message||e("profiles.switchFailed"))}finally{re.value={...re.value,[K]:!1}}}}return Fo(()=>{l.profiles.length===0&&l.fetchProfiles()}),(K,de)=>(D(),B("div",Pn,[r("div",An,C(c(e)("sidebar.profiles")),1),r("div",{class:"profile-display","data-testid":"profile-selector-select",onClick:O},[Q(Go,{class:"profile-avatar",name:d.value,avatar:u.value?.avatar,size:24},null,8,["name","avatar"]),r("span",_n,C(d.value),1)]),Q(c(Ao),{show:q.value,"onUpdate:show":de[0]||(de[0]=Z=>q.value=Z),preset:"card",bordered:!1,style:{width:"720px",maxWidth:"calc(100vw - 32px)"},class:"profile-manager-modal"},{header:Y(()=>[r("div",xn,[r("div",Tn,[r("span",Mn,C(c(e)("sidebar.profiles")),1),r("span",In,C(c(e)("profiles.runtime.activeProfile",{name:d.value})),1)])])]),default:Y(()=>[Q(c(lt),{show:P.value,size:"small"},{default:Y(()=>[r("div",Hn,[(D(!0),B(_o,null,Po(c(l).profiles,Z=>(D(),B("div",{key:Z.name,class:De(["profile-runtime-item",{active:Z.name===d.value}])},[r("div",Dn,[Q(Go,{class:"profile-runtime-avatar",name:Z.name,avatar:Z.avatar,size:34},null,8,["name","avatar"]),r("div",Rn,[r("div",En,[r("span",Fn,C(Z.name),1),Z.name===d.value?(D(),B("span",Ln,C(c(e)("profiles.runtime.activeTag")),1)):Ce("",!0)]),r("div",Nn,[r("div",Un,[r("span",zn,C(c(e)("profiles.runtime.bridgeWorker")),1),r("span",{class:De(["runtime-value",{running:ae.value.get(Z.name)?.bridge.running}])},[de[2]||(de[2]=r("span",{class:"runtime-dot"},null,-1)),Re(" "+C(Fe(ae.value.get(Z.name)?.bridge.running)),1)],2)]),r("div",qn,[r("span",On,C(c(e)("profiles.runtime.gateway")),1),r("span",{class:De(["runtime-value",{running:ae.value.get(Z.name)?.gateway.running}])},[de[3]||(de[3]=r("span",{class:"runtime-dot"},null,-1)),Re(" "+C($(ae.value.get(Z.name)?.gateway.running)),1)],2)])]),!ae.value.get(Z.name)?.gateway.running&&(ae.value.get(Z.name)?.gateway.diagnostics?.reason||ae.value.get(Z.name)?.gateway.error)?(D(),B("div",Bn,C(ae.value.get(Z.name)?.gateway.diagnostics?.reason||ae.value.get(Z.name)?.gateway.error),1)):Ce("",!0)])]),r("div",Wn,[Q(c(qe),{size:"small",type:"primary",onClick:We=>y(Z)},{default:Y(()=>[Re(C(c(e)("profiles.avatar.customize")),1)]),_:1},8,["onClick"]),Q(c(qe),{size:"small",type:"primary",loading:z.value[Z.name],onClick:We=>Ke(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.restartGateway")),1)]),_:1},8,["loading","onClick"]),Q(c(qe),{size:"small",type:"primary",loading:V.value[Z.name],onClick:We=>To(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.restartProfile")),1)]),_:1},8,["loading","onClick"]),Q(c(qe),{size:"small",type:"primary",disabled:Z.name===d.value,loading:re.value[Z.name],onClick:We=>Qe(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.switchProfile")),1)]),_:1},8,["disabled","loading","onClick"])])],2))),128))])]),_:1},8,["show"])]),_:1},8,["show"]),Q(c(Ao),{show:w.value,"onUpdate:show":de[1]||(de[1]=Z=>w.value=Z),preset:"card",title:c(e)("profiles.avatar.title"),bordered:!1,style:{width:"420px",maxWidth:"calc(100vw - 32px)"}},{default:Y(()=>[W.value?(D(),B("div",jn,[Q(Go,{name:W.value.name,avatar:W.value.avatar,size:72},null,8,["name","avatar"]),r("div",Gn,[r("div",Vn,C(W.value.name),1),r("div",Kn,C(c(e)("profiles.avatar.hint")),1)]),r("input",{ref_key:"fileInputRef",ref:G,class:"avatar-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:H},null,544),r("div",Qn,[Q(c(qe),{type:"primary",loading:_.value,onClick:p},{default:Y(()=>[Re(C(c(e)("profiles.avatar.upload")),1)]),_:1},8,["loading"]),Q(c(qe),{type:"primary",loading:_.value,onClick:j},{default:Y(()=>[Re(C(c(e)("profiles.avatar.random")),1)]),_:1},8,["loading"]),Q(c(qe),{loading:_.value,onClick:A},{default:Y(()=>[Re(C(c(e)("profiles.avatar.reset")),1)]),_:1},8,["loading"])])])):Ce("",!0)]),_:1},8,["show","title"])]))}});eo();var $n=oo(Jn,[["__scopeId","data-v-7b6f9840"]]);xe();Ve();Ye();var Zn=Le({__name:"LanguageSwitch",setup(o){const{locale:e}=Xe(),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 l(s){Hi(s),localStorage.setItem("hermes_locale",s)}return(s,d)=>(D(),Oe(c(st),{value:c(e),options:a,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":l},null,8,["value"]))}}),Yn=Zn;xe();var Xn={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},er=["title"],or={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ar={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},tr=["title"],ir={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},nr={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},rr=Le({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:a,toggleBrightness:l,toggleStyle:s}=ft();return(d,u)=>(D(),B("div",Xn,[r("button",{class:"theme-switch",title:c(a)?"Ink style":"Comic style",onClick:u[0]||(u[0]=(...g)=>c(s)&&c(s)(...g))},[c(a)?(D(),B("svg",or,[...u[2]||(u[2]=[r("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(D(),B("svg",ar,[...u[3]||(u[3]=[r("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,er),r("button",{class:"theme-switch",title:c(e)?"Light mode":"Dark mode",onClick:u[1]||(u[1]=(...g)=>c(l)&&c(l)(...g))},[c(e)?(D(),B("svg",ir,[...u[4]||(u[4]=[dt('<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)])])):(D(),B("svg",nr,[...u[5]||(u[5]=[r("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,tr)]))}});eo();var sr=oo(rr,[["__scopeId","data-v-4c30f4bd"]]);xe();var ga=b(!1);function Ma(){function o(){ga.value=!0}function e(){ga.value=!1}return{sessionSearchOpen:ga,openSessionSearch:o,closeSessionSearch:e}}xe();function lr(o){let e={};if(typeof window<"u")try{const s=window.localStorage.getItem(o);s&&(e=JSON.parse(s))}catch{e={}}const a=oi({...e});function l(){typeof window>"u"||window.localStorage.setItem(o,JSON.stringify({...a}))}return{record:a,persist:l}}xe();var dr=["href","title","aria-current","onClick"],cr=Le({__name:"RouteLinkItem",props:{to:{},active:{type:Boolean,default:void 0},exact:{type:Boolean,default:!1},title:{}},setup(o){const e=o;return(a,l)=>{const s=rt("RouterLink");return D(),Oe(s,{to:e.to,custom:""},{default:Y(d=>[r("a",{class:De(["route-link-item",{active:e.active??(e.exact?!!d?.isExactActive:!!d?.isActive)}]),href:d?.href||"#",title:e.title,"aria-current":e.active??(e.exact?!!d?.isExactActive:!!d?.isActive)?"page":void 0,onClick:d?.navigate},[ei(a.$slots,"default")],10,dr)]),_:3},8,["to"])}}}),Pe=cr,ur=[{version:"0.6.11",date:"2026-06-06",changes:["changelog.new_0_6_11_1","changelog.new_0_6_11_2","changelog.new_0_6_11_3","changelog.new_0_6_11_4","changelog.new_0_6_11_5","changelog.new_0_6_11_6","changelog.new_0_6_11_7","changelog.new_0_6_11_8","changelog.new_0_6_11_9","changelog.new_0_6_11_10"]},{version:"0.6.10",date:"2026-06-03",changes:["changelog.new_0_6_10_1","changelog.new_0_6_10_2","changelog.new_0_6_10_3","changelog.new_0_6_10_4","changelog.new_0_6_10_5","changelog.new_0_6_10_6","changelog.new_0_6_10_7","changelog.new_0_6_10_8","changelog.new_0_6_10_9","changelog.new_0_6_10_10"]},{version:"0.6.9",date:"2026-06-02",changes:["changelog.new_0_6_9_1","changelog.new_0_6_9_2","changelog.new_0_6_9_3","changelog.new_0_6_9_4","changelog.new_0_6_9_5","changelog.new_0_6_9_6"]},{version:"0.6.8",date:"2026-06-01",changes:["changelog.new_0_6_8_1","changelog.new_0_6_8_2","changelog.new_0_6_8_3","changelog.new_0_6_8_4","changelog.new_0_6_8_5"]},{version:"0.6.7",date:"2026-05-31",changes:["changelog.new_0_6_7_1","changelog.new_0_6_7_9","changelog.new_0_6_7_2","changelog.new_0_6_7_3","changelog.new_0_6_7_4","changelog.new_0_6_7_5","changelog.new_0_6_7_6","changelog.new_0_6_7_7","changelog.new_0_6_7_8"]}],Qa="http:";function pr(o){return(o||"").trim()||"localhost"}function mr(o){const e=pr(o||(typeof window<"u"?window.location.hostname:"localhost"));return{provisioningUrl:`${Qa}//${e}/`,businessUrl:`${Qa}//${e}:6060/`}}xe();Ve();Ye();qo();Be();var gr=["title"],hr={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},vr={key:0,points:"9 18 15 12 9 6"},fr={key:1,points:"15 18 9 12 15 6"},br={class:"sidebar-nav"},yr={class:"nav-group"},Sr={class:"nav-group-items"},kr={class:"nav-group"},wr={class:"nav-group-items"},Cr={class:"nav-group"},Pr={class:"nav-group-items"},Ar={class:"nav-group"},_r={class:"nav-group-items"},xr={class:"nav-group"},Tr={class:"nav-group-items"},Mr=["href"],Ir={class:"sidebar-footer"},Hr={class:"status-row"},Dr={class:"status-text"},Rr={class:"version-info"},Er={key:0,class:"sidebar-update-action"},Fr=["disabled"],Lr={class:"sidebar-update-label"},Nr={key:1,class:"sidebar-update-action"},Ur=["disabled"],zr={class:"sidebar-update-label"},qr={key:2,class:"sidebar-update-action sidebar-update-progress"},Or={class:"sidebar-update-label"},Br={key:3,class:"update-source"},Wr={key:4,class:"update-source"},jr={class:"changelog-list"},Gr={class:"changelog-version-header"},Vr={class:"changelog-version-tag"},Kr={class:"changelog-date"},Qr={class:"changelog-changes"},Jr="/logo.png",ha="Quanta Hermes",$r=Le({__name:"AppSidebar",setup(o){const{t:e}=Xe(),a=Ta(),l=Uo(),s=lo(),{openSessionSearch:d}=Ma(),u=me(()=>a.name==="hermes.session"?"hermes.chat":a.name==="hermes.historySession"?"hermes.history":a.name==="hermes.groupChatRoom"?"hermes.groupChat":a.name),g=me(()=>ri());function P(...J){return J.includes(u.value)}function q(J){return l.hasRoute(J)}const{record:w,persist:W}=lr("hermes.sidebar.collapsedGroups");function _(J){return e(`sidebar.group${J}${s.sidebarCollapsed?"Short":""}`)}const G=me(()=>mr().provisioningUrl);function z(J){w[J]=!w[J],W()}function V(J){return!!w[J]}function re(){localStorage.clear(),l.replace({name:"login"})}const ae=b(!1);function k(){ae.value=!0}async function I(){await s.doUpdate()}async function O(){typeof window<"u"&&window.location.reload()}return(J,y)=>(D(),B("aside",{class:De(["sidebar",{open:c(s).sidebarOpen,collapsed:c(s).sidebarCollapsed}])},[Q(Pe,{class:"sidebar-logo",to:{name:"hermes.chat"}},{default:Y(()=>[r("img",{src:Jr,alt:ha,class:"logo-img"}),r("span",{class:"logo-text"},C(ha))]),_:1}),r("button",{class:"collapse-btn",onClick:y[0]||(y[0]=X=>c(s).toggleSidebarCollapsed()),title:c(s).sidebarCollapsed?c(e)("sidebar.expand"):c(e)("sidebar.collapse")},[(D(),B("svg",hr,[c(s).sidebarCollapsed?(D(),B("polyline",vr)):(D(),B("polyline",fr))]))],8,gr),r("nav",br,[r("div",yr,[r("div",{class:"nav-group-label",onClick:y[1]||(y[1]=X=>z("conversation"))},[r("span",null,C(_("Conversation")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[8]||(y[8]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Sr,[Q(Pe,{class:"nav-item",to:{name:"hermes.chat"},active:P("hermes.chat","hermes.session")},{default:Y(()=>[y[9]||(y[9]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})],-1)),r("span",null,C(c(e)("sidebar.chat")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.history"},active:P("hermes.history","hermes.historySession")},{default:Y(()=>[y[10]||(y[10]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"10"}),r("polyline",{points:"12 6 12 12 16 14"})],-1)),r("span",null,C(c(e)("sidebar.history")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.groupChat"},active:P("hermes.groupChat","hermes.groupChatRoom")},{default:Y(()=>[y[12]||(y[12]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),r("circle",{cx:"9",cy:"7",r:"4"}),r("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),r("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})],-1)),r("span",null,[Re(C(c(e)("sidebar.groupChat")),1),y[11]||(y[11]=r("span",{class:"beta-tag"},"(beta)",-1))])]),_:1},8,["active"]),r("button",{class:"nav-item",onClick:y[2]||(y[2]=(...X)=>c(d)&&c(d)(...X))},[y[13]||(y[13]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"11",cy:"11",r:"7"}),r("path",{d:"m20 20-3.5-3.5"})],-1)),r("span",null,C(c(e)("sidebar.search")),1)])],512),[[yo,!V("conversation")]])]),r("div",kr,[r("div",{class:"nav-group-label",onClick:y[3]||(y[3]=X=>z("agent"))},[r("span",null,C(_("Agent")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[14]||(y[14]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",wr,[Q(Pe,{class:"nav-item",to:{name:"hermes.jobs"},active:u.value==="hermes.jobs"},{default:Y(()=>[y[15]||(y[15]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),r("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),r("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),r("line",{x1:"3",y1:"10",x2:"21",y2:"10"})],-1)),r("span",null,C(c(e)("sidebar.jobs")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.kanban"},active:u.value==="hermes.kanban"},{default:Y(()=>[y[16]||(y[16]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),r("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),r("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),r("span",null,C(c(e)("sidebar.kanban")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.channels"},active:u.value==="hermes.channels"},{default:Y(()=>[y[17]||(y[17]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),r("span",null,C(c(e)("sidebar.channels")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.skills"},active:u.value==="hermes.skills"},{default:Y(()=>[y[18]||(y[18]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),r("polyline",{points:"2 17 12 22 22 17"}),r("polyline",{points:"2 12 12 17 22 12"})],-1)),r("span",null,C(c(e)("sidebar.skills")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.plugins"},active:u.value==="hermes.plugins"},{default:Y(()=>[y[19]||(y[19]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("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"}),r("path",{d:"M5 19l1-1"})],-1)),r("span",null,C(c(e)("sidebar.plugins")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.mcp"},active:u.value==="hermes.mcp"},{default:Y(()=>[y[20]||(y[20]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M4 7V4h16v3"}),r("path",{d:"M9 20h6"}),r("path",{d:"M12 7v13"}),r("rect",{x:"4",y:"7",width:"16",height:"7",rx:"2"})],-1)),r("span",null,C(c(e)("sidebar.mcp")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.memory"},active:u.value==="hermes.memory"},{default:Y(()=>[y[21]||(y[21]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M9 18h6"}),r("path",{d:"M10 22h4"}),r("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),r("span",null,C(c(e)("sidebar.memory")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.models"},active:u.value==="hermes.models"},{default:Y(()=>[y[22]||(y[22]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"3"}),r("path",{d:"M12 1v4"}),r("path",{d:"M12 19v4"}),r("path",{d:"M1 12h4"}),r("path",{d:"M19 12h4"}),r("path",{d:"M4.22 4.22l2.83 2.83"}),r("path",{d:"M16.95 16.95l2.83 2.83"}),r("path",{d:"M4.22 19.78l2.83-2.83"}),r("path",{d:"M16.95 7.05l2.83-2.83"})],-1)),r("span",null,C(c(e)("sidebar.models")),1)]),_:1},8,["active"])],512),[[yo,!V("agent")]])]),r("div",Cr,[r("div",{class:"nav-group-label",onClick:y[4]||(y[4]=X=>z("monitoring"))},[r("span",null,C(_("Monitoring")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[23]||(y[23]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Pr,[Q(Pe,{class:"nav-item",to:{name:"hermes.logs"},active:u.value==="hermes.logs"},{default:Y(()=>[y[24]||(y[24]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),r("polyline",{points:"14 2 14 8 20 8"}),r("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),r("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),r("polyline",{points:"10 9 9 9 8 9"})],-1)),r("span",null,C(c(e)("sidebar.logs")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.usage"},active:u.value==="hermes.usage"},{default:Y(()=>[y[25]||(y[25]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),r("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),r("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),r("span",null,C(c(e)("sidebar.usage")),1)]),_:1},8,["active"]),g.value?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.performance"},active:u.value==="hermes.performance"},{default:Y(()=>[y[26]||(y[26]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),r("span",null,C(c(e)("sidebar.performance")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.skillsUsage"},active:u.value==="hermes.skillsUsage"},{default:Y(()=>[y[27]||(y[27]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21.21 15.89A10 10 0 1 1 8.11 2.79"}),r("path",{d:"M22 12A10 10 0 0 0 12 2v10z"})],-1)),r("span",null,C(c(e)("sidebar.skillsUsage")),1)]),_:1},8,["active"])],512),[[yo,!V("monitoring")]])]),r("div",Ar,[r("div",{class:"nav-group-label",onClick:y[5]||(y[5]=X=>z("tools"))},[r("span",null,C(_("Tools")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("tools")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[28]||(y[28]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",_r,[q("hermes.codingAgents")?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.codingAgents"},active:u.value==="hermes.codingAgents"},{default:Y(()=>[y[29]||(y[29]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polyline",{points:"16 18 22 12 16 6"}),r("polyline",{points:"8 6 2 12 8 18"}),r("line",{x1:"12",y1:"20",x2:"14",y2:"4"})],-1)),r("span",null,C(c(e)("sidebar.codingAgents")),1)]),_:1},8,["active"])):Ce("",!0),q("hermes.versionPreview")&&g.value?(D(),Oe(Pe,{key:1,class:"nav-item",to:{name:"hermes.versionPreview"},active:u.value==="hermes.versionPreview"},{default:Y(()=>[y[30]||(y[30]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("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"}),r("polyline",{points:"7.5 4.21 12 6.81 16.5 4.21"}),r("polyline",{points:"7.5 19.79 7.5 14.6 3 12"}),r("polyline",{points:"21 12 16.5 14.6 16.5 19.79"}),r("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"}),r("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"})],-1)),r("span",null,C(c(e)("sidebar.versionPreview")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.devices"},active:u.value==="hermes.devices"},{default:Y(()=>[y[31]||(y[31]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),r("path",{d:"M8 20h8"}),r("path",{d:"M12 16v4"}),r("path",{d:"M6 8h.01"}),r("path",{d:"M10 8h.01"})],-1)),r("span",null,C(c(e)("sidebar.devices")),1)]),_:1},8,["active"])],512),[[yo,!V("tools")]])]),r("div",xr,[r("div",{class:"nav-group-label",onClick:y[6]||(y[6]=X=>z("system"))},[r("span",null,C(_("System")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[32]||(y[32]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Tr,[r("a",{class:"nav-item",href:G.value,target:"_blank",rel:"noopener noreferrer"},[y[33]||(y[33]=dt('<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" data-v-271355f9><rect x="16" y="16" width="6" height="6" rx="1" data-v-271355f9></rect><path d="M32 22h-8" data-v-271355f9></path><path d="M22 22h-2" data-v-271355f9></path><path d="M32 16h-12" data-v-271355f9></path><path d="M18 16H2" data-v-271355f9></path><path d="M32 10H12" data-v-271355f9></path><path d="M18 10H2" data-v-271355f9></path><path d="M22 4H2" data-v-271355f9></path></svg>',1)),r("span",null,C(c(e)("sidebar.networkConfig")),1)],8,Mr),g.value?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.profiles"},active:u.value==="hermes.profiles"},{default:Y(()=>[y[34]||(y[34]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),r("circle",{cx:"12",cy:"7",r:"4"})],-1)),r("span",null,C(c(e)("sidebar.profiles")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.settings"},active:u.value==="hermes.settings"},{default:Y(()=>[y[35]||(y[35]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"3"}),r("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)),r("span",null,C(c(e)("sidebar.settings")),1)]),_:1},8,["active"])],512),[[yo,!V("system")]])])]),Q($n),Q(kn),r("div",Ir,[r("button",{class:"nav-item logout-item",onClick:re},[y[36]||(y[36]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),r("polyline",{points:"16 17 21 12 16 7"}),r("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),r("span",null,C(c(e)("sidebar.logout")),1)]),r("div",Hr,[r("div",{class:De(["status-indicator",{connected:c(s).connected,disconnected:!c(s).connected}])},[y[37]||(y[37]=r("span",{class:"status-dot"},null,-1)),r("span",Dr,C(c(s).connected?c(e)("sidebar.connected"):c(e)("sidebar.disconnected")),1)],2),Q(Yn)]),r("div",Rr,[r("span",{class:"version-text",onClick:k},C(ha)+" v"+C(c(s).serverVersion||"0.1.0"),1),Q(sr)]),c(s).updateEnabled&&c(s).updateAvailable&&!c(s).updating?(D(),B("div",Er,[r("button",{class:"sidebar-update-btn",disabled:c(s).updating,onClick:I},[r("span",Lr,C(c(e)("sidebar.updateVersion",{version:c(s).latestVersion||c(s).serverVersion})),1)],8,Fr)])):c(s).updateEnabled&&c(s).clientOutdated&&!c(s).updating?(D(),B("div",Nr,[r("button",{class:"sidebar-update-btn",disabled:c(s).updating,onClick:O},[r("span",zr,C(c(e)("sidebar.reloadClientVersion",{version:c(s).serverVersion})),1)],8,Ur)])):c(s).updating?(D(),B("div",qr,[r("span",Or,C(c(e)("sidebar.updating")),1)])):Ce("",!0),c(s).updateEnabled&&c(s).updateSourceLabel?(D(),B("div",Br,C(c(e)("sidebar.updateSource",{source:c(s).updateSourceLabel})),1)):c(s).updateEnabled?Ce("",!0):(D(),B("div",Wr,C(c(e)("sidebar.updateManagedInternally")),1))]),Q(c(Ao),{show:ae.value,"onUpdate:show":y[7]||(y[7]=X=>ae.value=X),preset:"dialog",title:c(e)("sidebar.changelog"),style:{width:"520px"}},{default:Y(()=>[r("div",jr,[(D(!0),B(_o,null,Po(c(ur),X=>(D(),B("div",{key:X.version,class:"changelog-version-block"},[r("div",Gr,[r("span",Vr,"v"+C(X.version),1),r("span",Kr,C(X.date),1)]),r("ul",Qr,[(D(!0),B(_o,null,Po(X.changes,(te,j)=>(D(),B("li",{key:j},C(c(e)(te)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});eo();var Zr=oo($r,[["__scopeId","data-v-271355f9"]]);function Yr(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onMessageDelta&&a.onMessageDelta(o)}function Xr(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onReasoningDelta&&a.onReasoningDelta(o)}function es(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onThinkingDelta&&a.onThinkingDelta(o)}function os(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onReasoningAvailable&&a.onReasoningAvailable(o)}function as(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onToolStarted&&a.onToolStarted(o)}function ts(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onToolCompleted&&a.onToolCompleted(o)}function Wo(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onSubagentEvent&&a.onSubagentEvent(o)}function is(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunStarted&&a.onRunStarted(o)}function ns(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunCompleted&&a.onRunCompleted(o),!(o.queue_remaining>0)&&pe.delete(e)}function rs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunFailed&&a.onRunFailed(o),!(o.queue_remaining>0)&&pe.delete(e)}function ss(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunQueued&&a.onRunQueued(o)}function ls(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onCompressionStarted&&a.onCompressionStarted(o)}function ds(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onCompressionCompleted&&a.onCompressionCompleted(o)}function cs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortStarted&&a.onAbortStarted(o)}function us(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortTimeout&&a.onAbortTimeout(o)}function ps(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortCompleted&&a.onAbortCompleted(o),!(o.queue_length>0)&&pe.delete(e)}function ms(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onUsageUpdated&&a.onUsageUpdated(o)}function gs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onSessionCommand&&a.onSessionCommand(o);for(const l of Zo)l(o)}function hs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a&&a.onSessionTitleUpdated?.(o);for(const l of Yo)l(o)}function vs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAgentEvent&&a.onAgentEvent(o)}function fs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onApprovalRequested&&a.onApprovalRequested(o)}function bs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onApprovalResolved&&a.onApprovalResolved(o)}function ys(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onPeerUserMessage&&a.onPeerUserMessage(o);for(const l of $o)l(o)}function Ss(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onClarifyRequested&&a.onClarifyRequested(o)}function ks(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onClarifyResolved&&a.onClarifyResolved(o)}function ws(o,e){return pe.set(o,e),()=>{pe.delete(o)}}function Cs(o){pe.delete(o)}function Ps(o){return $o.add(o),()=>{$o.delete(o)}}function As(o){return Zo.add(o),()=>{Zo.delete(o)}}function _s(o){return Yo.add(o),()=>{Yo.delete(o)}}function xs(o,e,a){na().emit("clarify.respond",{session_id:o,clarify_id:e,response:a})}function Ts(o,e,a){na().emit("approval.respond",{session_id:o,approval_id:e,choice:a})}function Ja(){return ue}function na(o){const e=o?.trim()||null;if(ue?.connected&&(!e||Ko===e))return ue;ue&&(ue.removeAllListeners(),ue.disconnect(),Vo=!1,Ko=null);const a=zo(),l=xo();let s=e||"default";try{if(!e){const{useProfilesStore:d}=(ia(),Ot(Zi));s=d().activeProfileName||"default"}}catch{s=e||localStorage.getItem("hermes_active_profile_name")||"default"}return Ko=s,ue=si(`${a}/chat-run`,{auth:{token:l},query:{profile:s},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),Vo||(ue.on("message.delta",Yr),ue.on("reasoning.delta",Xr),ue.on("thinking.delta",es),ue.on("reasoning.available",os),ue.on("tool.started",as),ue.on("tool.completed",ts),ue.on("subagent.start",Wo),ue.on("subagent.tool",Wo),ue.on("subagent.progress",Wo),ue.on("subagent.complete",Wo),ue.on("run.started",is),ue.on("run.failed",rs),ue.on("run.completed",ns),ue.on("run.queued",ss),ue.on("approval.requested",fs),ue.on("approval.resolved",bs),ue.on("run.peer_user_message",ys),ue.on("clarify.requested",Ss),ue.on("clarify.resolved",ks),ue.on("compression.started",ls),ue.on("compression.completed",ds),ue.on("abort.started",cs),ue.on("abort.timeout",us),ue.on("abort.completed",ps),ue.on("usage.updated",ms),ue.on("agent.event",vs),ue.on("session.command",gs),ue.on("session.title.updated",hs),Vo=!0),ue}function jo(o,e,a){const l=o;if(typeof l.off=="function"){l.off(e,a);return}l.removeListener?.(e,a)}function $a(o,e,a){const l=na(a);return l.once("resumed",e),l.emit("resume",{session_id:o,...a?{profile:a}:{}}),l}function Ms(o,e,a,l,s,d){const u=o.session_id;if(!u)throw new Error("session_id is required for startRunViaSocket");let g=!1;const P=na(o.profile);if(pe.has(u))return P.emit("run",o),{abort:()=>{g||P.emit("abort",{session_id:u})}};let q=!1,w=()=>{},W=null;const _=()=>{W&&(jo(P,"resumed",W),W=null)},G=()=>{_(),d?.onReconnectResume&&(W=k=>{_(),!(g||k.session_id!==u)&&d.onReconnectResume?.(k)},P.on("resumed",W)),P.emit("resume",{session_id:u,...o.profile?{profile:o.profile}:{}})},z=k=>{g||(g=!0,w(),pe.delete(u),l(k))},V=k=>{g||q||z(k)};P.on("connect_error",V);const re=k=>{if(!(g||k==="io client disconnect")){if(kt.has(k)){q=!0;return}z(new Error(`Socket disconnected: ${k}`))}};P.on("disconnect",re);const ae=()=>{g||!q||(q=!1,G())};return P.on("connect",ae),w=()=>{_(),jo(P,"connect_error",V),jo(P,"disconnect",re),jo(P,"connect",ae)},pe.set(u,{onMessageDelta:k=>{g||e(k)},onReasoningDelta:k=>{g||e(k)},onThinkingDelta:k=>{g||e(k)},onReasoningAvailable:k=>{g||e(k)},onToolStarted:k=>{g||e(k)},onToolCompleted:k=>{g||e(k)},onSubagentEvent:k=>{g||e(k)},onRunStarted:k=>{g||(e(k),s?.(k.run_id||""))},onRunCompleted:k=>{g||(e(k),!(k.queue_remaining>0)&&(g=!0,w(),a()))},onRunFailed:k=>{g||(e(k),!(k.queue_remaining>0)&&(g=!0,w(),a()))},onCompressionStarted:k=>{g||e(k)},onCompressionCompleted:k=>{g||e(k)},onAbortStarted:k=>{g||e(k)},onAbortTimeout:k=>{g||e(k)},onAbortCompleted:k=>{g||(e(k),!(k.queue_length>0)&&(g=!0,w(),a()))},onUsageUpdated:k=>{g||e(k)},onAgentEvent:k=>{g||e(k)},onSessionCommand:k=>{g||(e(k),k.terminal!==!1&&(g=!0,w(),pe.delete(u),a()))},onSessionTitleUpdated:k=>{e(k)},onRunQueued:k=>{g||e(k)},onApprovalRequested:k=>{g||e(k)},onApprovalResolved:k=>{g||e(k)},onClarifyRequested:k=>{g||e(k)},onClarifyResolved:k=>{g||e(k)}}),P.emit("run",o),{abort:()=>{g||P.emit("abort",{session_id:u})}}}var ue,Vo,Ko,kt,pe,$o,Zo,Yo,Is=Ie((()=>{di(),Be(),ue=null,Vo=!1,Ko=null,kt=new Set(["transport close","transport error","ping timeout"]),pe=new Map,$o=new Set,Zo=new Set,Yo=new Set}));async function Sa(o,e,a){const l=new URLSearchParams;o&&l.set("source",o),e&&l.set("limit",String(e)),a&&l.set("profile",a);const s=l.toString();return(await ee(`/api/hermes/sessions${s?`?${s}`:""}`)).sessions}async function ad(o,e,a){const l=new URLSearchParams;o&&l.set("source",o),e&&l.set("limit",String(e)),a&&l.set("profile",a);const s=l.toString();return(await ee(`/api/hermes/sessions/hermes${s?`?${s}`:""}`)).sessions}async function Za(o,e,a,l){const s=new URLSearchParams;return s.set("q",o),e&&s.set("source",e),a&&s.set("limit",String(a)),l&&s.set("profile",l),(await ee(`/api/hermes/search/sessions?${s.toString()}`)).results}async function Ya(o,e,a=300,l){try{const s=new URLSearchParams;return s.set("offset",String(e)),s.set("limit",String(a)),l&&s.set("profile",l),await ee(`/api/hermes/sessions/conversations/${encodeURIComponent(o)}/messages/paginated?${s}`)}catch{return null}}async function td(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return(await ee(`/api/hermes/sessions/hermes/${o}${l?`?${l}`:""}`)).session}catch{return null}}async function Hs(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return await ee(`/api/hermes/sessions/${o}${l?`?${l}`:""}`,{method:"DELETE"}),!0}catch{return!1}}async function id(o,e){const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return ee(`/api/hermes/sessions/hermes/${encodeURIComponent(o)}/import${l?`?${l}`:""}`,{method:"POST"})}async function nd(o){try{const e=o.map(a=>typeof a=="string"?{id:a}:{id:a.id,profile:a.profile||void 0});return await ee("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:e.map(a=>a.id),sessions:e})})}catch(e){throw e}}async function rd(o,e){try{return await ee(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function sd(o,e){try{return await ee(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Ds(o,e,a){try{return await ee(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:a})}),!0}catch{return!1}}async function ld(o,e="full",a="json"){const l=zo(),s=xo(),d=`${l}/api/hermes/sessions/${o}/export?mode=${e}&ext=${a}&token=${encodeURIComponent(s)}`,u=await fetch(d);if(!u.ok)throw new Error("Export failed");const g=await u.blob(),P=u.headers.get("Content-Disposition")||"";let q=`session_${o}.${a}`;const w=P.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);w&&(q=decodeURIComponent(w[1].replace(/"/g,"")));const W=document.createElement("a");W.href=URL.createObjectURL(g),W.download=q,W.click(),URL.revokeObjectURL(W.href)}async function dd(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,a=new URLSearchParams;return a.set("days",String(e)),ee(`/api/hermes/usage/stats?${a}`)}async function cd(o,e,a){const l=new URLSearchParams;o&&l.set("profile",o),e&&l.set("provider",e),a&&l.set("model",a);const s=l.toString();return(await ee(`/api/hermes/sessions/context-length${s?`?${s}`:""}`)).context_length}var wt=Ie((()=>{Be()}));function Ia(o,e){const a=zo();if(o.startsWith("/api/hermes/download?"))try{const u=new URL(o,"http://localhost").searchParams.get("path");u&&(o=u)}catch{}const l=new URLSearchParams({path:decodeURIComponent(o)});if(e){const u=decodeURIComponent(e);l.set("name",u)}const s=ct();s&&l.set("profile",s);const d=xo();return d&&l.set("token",d),`${a}/api/hermes/download?${l.toString()}`}async function ud(o,e){const a=Ia(o,e),l=await fetch(a);if(!l.ok){const g=await l.json().catch(()=>({error:`HTTP ${l.status}`}));throw new Error(g.error||`Download failed: ${l.status}`)}const s=await l.blob(),d=URL.createObjectURL(s),u=document.createElement("a");u.href=d,u.download=e||o.split("/").pop()||"download",document.body.appendChild(u),u.click(),document.body.removeChild(u),URL.revokeObjectURL(d)}async function pd(o,e){const a=Ia(o,e),l=await fetch(a);if(!l.ok){const s=await l.json().catch(()=>({error:`HTTP ${l.status}`}));throw new Error(s.error||`Preview failed: ${l.status}`)}return l.text()}var Rs=Ie((()=>{Be()}));async function Es(o){return ee(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function Fs(o,e,a){await ee("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e,...a})})}async function md(){return ee("/api/hermes/config/auxiliary-models")}async function gd(o){return ee("/api/hermes/config/auxiliary-models",{method:"PUT",body:JSON.stringify({auxiliary:o})})}async function hd(o,e){await ee("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function vd(){return ee("/api/hermes/weixin/qrcode")}async function fd(o){return ee(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function bd(o){await ee("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var Ls=Ie((()=>{Be()}));function Xa(o){if(!Array.isArray(o))return[];const e=new Set,a=[];for(const l of o){const s=String(l||"").trim();!s||e.has(s)||(e.add(s),a.push(s))}return a}function et(o,e){const a={...o};return"enabled"in e&&(typeof e.enabled=="boolean"?a.enabled=e.enabled:delete a.enabled),"include"in e&&(Array.isArray(e.include)?a.include=Xa(e.include):delete a.include),"exclude"in e&&(Array.isArray(e.exclude)?a.exclude=Xa(e.exclude):delete a.exclude),a}var ka,Ns=Ie((()=>{Lo(),xe(),Ls(),ka=ta("settings",()=>{const o=b(!1),e=b(!1),a=b({}),l=b({}),s=b({}),d=b({}),u=b({}),g=b({}),P=b({}),q=b({}),w=b({}),W=b({}),_=b({}),G=b({}),z=b({}),V=b({}),re=b({}),ae=b({}),k=b({}),I=b({}),O=b({});async function J(){o.value=!0;try{const te=await Es();a.value=te.display||{},l.value=te.agent||{},s.value=te.memory||{},d.value=te.compression||{},u.value=te.session_reset||{},g.value=te.privacy||{},P.value=te.approvals||{},q.value=te.gatewayAutoStart||{},w.value=te.telegram||{},W.value=te.discord||{},_.value=te.slack||{},G.value=te.whatsapp||{},z.value=te.matrix||{},V.value=te.wecom||{},re.value=te.feishu||{},ae.value=te.dingtalk||{},k.value=te.qqbot||{},I.value=te.weixin||{},O.value=te.platforms||{}}catch(te){console.error("Failed to fetch settings:",te)}finally{o.value=!1}}function y(te,j){switch(te){case"display":a.value={...a.value,...j};break;case"agent":l.value={...l.value,...j};break;case"memory":s.value={...s.value,...j};break;case"compression":d.value={...d.value,...j};break;case"session_reset":u.value={...u.value,...j};break;case"privacy":g.value={...g.value,...j};break;case"approvals":P.value={...P.value,...j};break;case"gatewayAutoStart":q.value=et(q.value,j);break;case"telegram":w.value={...w.value,...j};break;case"discord":W.value={...W.value,...j};break;case"slack":_.value={..._.value,...j};break;case"whatsapp":G.value={...G.value,...j};break;case"matrix":z.value={...z.value,...j};break;case"wecom":V.value={...V.value,...j};break;case"feishu":re.value={...re.value,...j};break;case"dingtalk":ae.value={...ae.value,...j};break;case"qqbot":k.value={...k.value,...j};break;case"weixin":I.value={...I.value,...j};break;case"platforms":for(const[A,p]of Object.entries(j))O.value={...O.value,[A]:{...O.value[A]||{},...p}};break}}async function X(te,j,A){e.value=!0;try{switch(await Fs(te,j,A),te){case"display":a.value={...a.value,...j};break;case"agent":l.value={...l.value,...j};break;case"memory":s.value={...s.value,...j};break;case"compression":d.value={...d.value,...j};break;case"session_reset":u.value={...u.value,...j};break;case"privacy":g.value={...g.value,...j};break;case"approvals":P.value={...P.value,...j};break;case"gatewayAutoStart":q.value=et(q.value,j);break;case"telegram":w.value={...w.value,...j};break;case"discord":W.value={...W.value,...j};break;case"slack":_.value={..._.value,...j};break;case"whatsapp":G.value={...G.value,...j};break;case"matrix":z.value={...z.value,...j};break;case"wechat":case"wecom":V.value={...V.value,...j};break;case"feishu":re.value={...re.value,...j};break;case"dingtalk":ae.value={...ae.value,...j};break;case"qqbot":k.value={...k.value,...j};break;case"weixin":I.value={...I.value,...j};break;case"platforms":for(const[p,H]of Object.entries(j))O.value={...O.value,[p]:{...O.value[p]||{},...H}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:a,agent:l,memory:s,compression:d,sessionReset:u,privacy:g,approvals:P,gatewayAutoStart:q,telegram:w,discord:W,slack:_,whatsapp:G,matrix:z,wecom:V,feishu:re,dingtalk:ae,qqbot:k,weixin:I,platforms:O,fetchSettings:J,saveSection:X,updateLocal:y}})}));function Ct(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(Qo||(Qo=new o),Qo):null}function Us(){const o=Ct();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function zs(){const o=Ct();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,a=.16,l=o.createOscillator(),s=o.createGain();return l.type="sine",l.frequency.setValueAtTime(880,e),l.frequency.exponentialRampToValueAtTime(660,e+a),s.gain.setValueAtTime(1e-4,e),s.gain.exponentialRampToValueAtTime(.18,e+.015),s.gain.exponentialRampToValueAtTime(1e-4,e+a),l.connect(s),s.connect(o.destination),l.start(e),l.stop(e+a),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var Qo,qs=Ie((()=>{Qo=null}));function wa(o){const e=[];let a=o.replace(Pt,l=>(e.push(l),`${Xo}${e.length-1}${ea}`));return a=a.replace(At,l=>(e.push(l),`${Xo}${e.length-1}${ea}`)),{masked:a,blocks:e}}function va(o,e){if(e.length===0)return o;const a=new RegExp(`${Xo}(\\d+)${ea}`,"g");let l=o;for(let s=0;s<e.length;s+=1){const d=l.replace(a,(u,g)=>e[Number(g)]??"");if(d===l)break;l=d}return l}function yd(o,e){const{masked:a,blocks:l}=wa(o),s=[];let d=null,u="",g=0;Ca.lastIndex=0;let P;for(;(P=Ca.exec(a))!==null;)u+=a.slice(g,P.index),s.push(P[2]),g=P.index+P[0].length;const q=a.slice(g),w=q.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return w?(u+=q.slice(0,w.index),e.streaming?d=w[2]:u+=q.slice(w.index)):u+=q,{segments:s.map(W=>va(W,l)),pending:d===null?null:va(d,l),body:va(u,l),hasThinking:s.length>0||d!==null}}function Sd(o){const e=a=>[...a].length;return o.segments.reduce((a,l)=>a+e(l),0)+e(o.pending||"")}function Os(o,e){const a=wa(o).masked,l=wa(e).masked;return{startedAtBoundary:!Pa.test(a)&&Pa.test(l),endedAtBoundary:!Aa.test(a)&&Aa.test(l)}}var Ca,Xo,ea,Pt,At,Pa,Aa,Bs=Ie((()=>{Ca=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,Xo="\0THKCODE",ea="\0",Pt=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,At=/`[^`\n]*`/g,Pa=/<(think|thinking|reasoning)>/i,Aa=/<\/(think|thinking|reasoning)>/i}));function _e(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Ws(o){if(typeof o!="string"||!o.trim())return!1;try{const e=JSON.parse(o);if(e&&typeof e=="object"){const a=e;if(a.success===!1||a.error!=null&&String(a.error).trim()!=="")return!0}}catch{return!1}return!1}async function js(o){if(o.length===0)return[];const e=new FormData;for(const u of o)u.file&&e.append("file",u.file,u.name);const a=localStorage.getItem("hermes_api_key")||"",l=ct(),s={};a&&(s.Authorization=`Bearer ${a}`),l&&(s["X-Hermes-Profile"]=l);const d=await fetch("/upload",{method:"POST",body:e,headers:s});if(!d.ok)throw new Error(`Upload failed: ${d.status}`);return(await d.json()).files}async function Gs(o,e,a){const l=[];if(o.trim()&&l.push({type:"text",text:o.trim()}),e&&e.length>0&&a)for(let s=0;s<a.length;s++){const d=a[s],u=e[s];u?.type.startsWith("image/")?l.push({type:"image",name:d.name,path:d.path,media_type:u.type}):l.push({type:"file",name:d.name,path:d.path,media_type:u?.type})}return l}function Co(o){return o!=null&&o!==""}function Ze(o){return Co(o)?o:void 0}function fa(o){if(!Co(o))return"";if(typeof o=="string")return o;try{const e=JSON.stringify(o);if(e!==void 0)return e}catch{}return String(o)}function ba(o){return typeof o=="string"&&Ws(o)}function Ro(o){const e=o.filter(d=>d.role==="assistant"?(d.tool_calls?.length||0)>0||fa(d.content).trim()!=="":!0),a=new Map,l=new Map;for(const d of e)if(d.role==="assistant"&&d.tool_calls)for(const u of d.tool_calls)u.id&&(u.function?.name&&a.set(u.id,u.function.name),Co(u.function?.arguments)&&l.set(u.id,u.function.arguments));const s=[];for(const d of e){if(d.role==="assistant"&&d.tool_calls?.length&&!fa(d.content).trim()){for(const u of d.tool_calls)s.push({id:String(d.id)+"_"+u.id,role:"tool",content:"",timestamp:Math.round(d.timestamp*1e3),toolName:u.function?.name||void 0,toolCallId:u.id,toolArgs:Ze(u.function?.arguments),toolStatus:"done"});continue}if(d.role==="tool"){const u=d.tool_call_id||"",g=d.tool_name||a.get(u)||void 0,P=l.has(u)?l.get(u):void 0;let q="";const w=fa(d.content);if(w)try{const _=typeof d.content=="string"?JSON.parse(w):d.content;q=_?.url||_?.title||_?.preview||_?.summary||""}catch{q=w.slice(0,80)}const W=s.findIndex(_=>_.role==="tool"&&_.toolName===g&&!_.toolResult&&_.id.includes("_"+u));W!==-1&&s.splice(W,1),s.push({id:String(d.id),role:"tool",content:"",timestamp:Math.round(d.timestamp*1e3),toolName:g,toolCallId:u||void 0,toolArgs:P,toolPreview:typeof q=="string"&&q.slice(0,100)||void 0,toolResult:Ze(d.content),toolStatus:"done"});continue}s.push({id:String(d.id),role:d.role,content:d.content||"",timestamp:Math.round(d.timestamp*1e3),reasoning:d.reasoning?d.reasoning:void 0,systemType:d.role==="command"?"command":void 0})}return s}function Vs(o){return{id:o.id,profile:o.profile||"default",title:o.title||"",source:o.source||void 0,messages:[],createdAt:Math.round(o.started_at*1e3),updatedAt:Math.round((o.last_active||o.ended_at||o.started_at)*1e3),model:o.model,provider:o.provider||o.billing_provider||"",messageCount:o.message_count,messageTotal:o.message_count,loadedMessageCount:0,hasMoreBefore:!1,inputTokens:o.input_tokens,outputTokens:o.output_tokens,endedAt:o.ended_at!=null?Math.round(o.ended_at*1e3):null,lastActiveAt:o.last_active!=null?Math.round(o.last_active*1e3):void 0,workspace:o.workspace||null}}function _t(){try{return co().activeProfileName||"default"}catch{return"default"}}function Jo(){return xt+_t()}function ot(){return _t()==="default"?oa:null}function Ks(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function Qs(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let a=0;a<localStorage.length;a++){const l=localStorage.key(a);l&&(l===Jo()||l===oa||o.some(s=>l.startsWith(s))&&e.push(l))}e.forEach(a=>_a(a)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function Js(o,e){try{localStorage.setItem(o,e);return}catch(a){if(!Ks(a))return}Qs();try{localStorage.setItem(o,e)}catch{}}function at(o){try{return localStorage.getItem(o)}catch{return null}}function _a(o){try{localStorage.removeItem(o)}catch{}}var xt,oa,Ha,Tt=Ie((()=>{Is(),wt(),Be(),Rs(),Lo(),xe(),qo(),ia(),Ns(),qs(),Bs(),xt="hermes_active_session_",oa="hermes_active_session",Ha=ta("chat",()=>{const o=new WeakSet,e=b([]),a=b(null),l=b(null),s=b(new Map),d=b(new Set),u=b(null),g=b(new Map),P=b(new Map),q=b(new Map),w=b(new Map),W=me(()=>{const t=a.value;return t&&w.value.get(t)||null}),_=b(new Map),G=me(()=>{const t=a.value;return t&&_.value.get(t)||null}),z=b(!1);function V(t){z.value=t}const re=me(()=>{const t=a.value;return t==null?!1:s.value.has(t)||d.value.has(t)}),ae=b(!1),k=b(!1),I=b(!1),O=me(()=>re.value),J=b(new Map),y=me(()=>{const t=a.value;return t&&J.value.get(t)||null});function X(t,i){if(!t)return;const n=new Map(J.value);i?n.set(t,i):n.delete(t),J.value=n}const te=b(null),j=me(()=>te.value?.aborting===!0);function A(t){te.value=t}const p=b(null),H=me(()=>p.value?.messages||[]);function $(t){return s.value.has(t)||d.value.has(t)}function Fe(){const t=a.value;a.value=null,p.value=null,l.value=null,A(null),X(t,null),_a(Jo())}async function Ke(t,i){ae.value=!0;try{const n=(await Sa(void 0,void 0,t||void 0)).map(Vs),v=new Map(e.value.map(se=>[se.id,{messages:se.messages,contextTokens:se.contextTokens}]));for(const se of n){const S=v.get(se.id);S?.messages?.length&&(se.messages=S.messages),S?.contextTokens!=null&&(se.contextTokens=S.contextTokens)}e.value=n;const f=a.value,E=ot(),M=at(Jo())||(E?at(oa):null),ne=i&&e.value.some(se=>se.id===i)?i:f&&e.value.some(se=>se.id===f)?f:M&&e.value.some(se=>se.id===M)?M:e.value[0]?.id;ne?await de(ne):Fe()}catch(n){console.error("Failed to load sessions:",n)}finally{ae.value=!1,k.value=!0}}async function To(){const t=a.value;if(!t)return!1;try{const i=e.value.find(v=>v.id===t);if(!i)return!1;const n=await Ya(t,0,Math.max(i.loadedMessageCount||300,300),p.value?.profile);return n?(i.messages=Ro(n.messages||[]),i.loadedMessageCount=n.messages.length,i.messageTotal=n.total,i.messageCount=n.total,i.hasMoreBefore=n.hasMore,n.session.title&&(i.title=n.session.title),!0):!1}catch(i){return console.error("Failed to refresh active session:",i),!1}}function Qe(t={}){const i={id:_e(),profile:t.profile||co().activeProfileName||"default",title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now(),model:t.model||void 0,provider:t.provider||""};return e.value.unshift(i),i}function K(){const t=new Date,i={id:`${[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0"),"_",String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return e.value.unshift(i),i}async function de(t,i){Ea(t),a.value=t,l.value=i??null,Js(Jo(),t);const n=ot();if(n&&_a(n),p.value=e.value.find(v=>v.id===t)||null,!!p.value){I.value=!0;try{await new Promise((v,f)=>{const E=setTimeout(()=>f(new Error("resume timeout")),15e3);$a(t,M=>{if(clearTimeout(E),M.session_id!==t||a.value!==t){v();return}const ne=e.value.find(se=>se.id===t);if(!ne){v();return}if(M.isWorking?d.value.add(t):d.value.delete(t),M.queueLength&&M.queueLength>0?g.value.set(t,M.queueLength):g.value.delete(t),Array.isArray(M.queueMessages)?Ne(t,Ee(M.queueMessages)):M.queueLength||Ne(t,[]),M.isAborting?A({aborting:!0,synced:null}):M.isWorking||A(null),M.isWorking||X(t,null),M.inputTokens!=null&&(ne.inputTokens=M.inputTokens),M.outputTokens!=null&&(ne.outputTokens=M.outputTokens),M.contextTokens!=null&&(ne.contextTokens=M.contextTokens),M.messages?.length&&(ne.messages=Ro(M.messages),ne.loadedMessageCount=M.messageLoadedCount??M.messages.length,ne.messageTotal=M.messageTotal??ne.messageCount??ne.loadedMessageCount,ne.messageCount=ne.messageTotal,ne.hasMoreBefore=M.hasMoreBefore??ne.loadedMessageCount<ne.messageTotal),!ne.title){const se=ne.messages.find(S=>S.role==="user");se&&(ne.title=se.content.slice(0,40)+(se.content.length>40?"...":""))}if(p.value=ne,M.events?.length)for(const se of M.events){const S=se.data;if(S.event==="compression.started")X(t,{compressing:!0,messageCount:S.message_count||0,beforeTokens:S.token_count||0,afterTokens:0,compressed:null});else if(S.event==="compression.completed"){const m=S.contextTokens||S.afterTokens||0;X(t,{compressing:!1,messageCount:S.totalMessages||0,beforeTokens:S.beforeTokens||0,afterTokens:m,compressed:S.compressed??!1,error:S.error}),S.contextTokens!=null&&(ne.contextTokens=S.contextTokens)}else if(S.event==="abort.started")A({aborting:!0,synced:null});else if(S.event==="abort.timeout")A({aborting:!0,synced:!1,timedOut:!0,message:S.message});else if(S.event==="abort.completed")A({aborting:!1,synced:S.synced??!1});else if(S.event==="approval.requested")to({...S,session_id:t});else if(S.event==="approval.resolved")io({...S,session_id:t});else if(S.event==="clarify.requested")go({...S,session_id:t});else if(S.event==="clarify.resolved")ho({...S,session_id:t});else if(S.event==="run.failed")ao(t,S.error),d.value.delete(t),g.value.delete(t);else if(S.event==="tool.started"){const m=ce(t),U=S.tool_call_id,F=U?m.find(L=>L.role==="tool"&&L.toolCallId===U):null;F?fe(t,F.id,{toolName:S.tool||S.name,toolArgs:Co(S.arguments)?S.arguments:F.toolArgs,toolPreview:S.preview||F.toolPreview,toolStatus:F.toolStatus||"running"}):we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:S.tool||S.name,toolCallId:U,toolPreview:S.preview,toolArgs:Ze(S.arguments),toolStatus:"running"})}else if(S.event==="tool.completed"){const m=ce(t),U=S.tool_call_id,F=U?m.filter(L=>L.role==="tool"&&L.toolCallId===U):m.filter(L=>L.role==="tool"&&L.toolStatus==="running");if(F.length>0){const L=Ze(S.output);fe(t,F[F.length-1].id,{toolStatus:S.error===!0||ba(L)?"error":"done",toolDuration:S.duration,toolResult:L})}}else String(S.event||"").startsWith("subagent.")&&Mo(t,S)}v()},p.value?.profile)})}catch(v){console.error("Failed to load session messages via resume:",v)}finally{I.value=!1}a.value===t&&vo(t)}}async function Z(t=a.value){if(!t)return!1;const i=e.value.find(f=>f.id===t);if(!i||i.isLoadingOlderMessages||!i.hasMoreBefore)return!1;const n=i.loadedMessageCount||0,v=300;i.isLoadingOlderMessages=!0;try{const f=await Ya(t,n,v,i.profile);if(!f||f.messages.length===0)return i.hasMoreBefore=!1,!1;const E=new Set(i.messages.map(ne=>ne.id)),M=Ro(f.messages).filter(ne=>!E.has(ne.id));return i.messages=[...M,...i.messages],i.loadedMessageCount=n+f.messages.length,i.messageTotal=f.total,i.messageCount=f.total,i.hasMoreBefore=f.hasMore,M.length>0}catch(f){return console.error("Failed to load older session messages:",f),!1}finally{i.isLoadingOlderMessages=!1}}function We(t={}){const i=lo(),n=Qe({profile:t.profile,model:t.model||i.selectedModel||void 0,provider:t.provider||i.selectedProvider||""});return de(n.id),n}async function uo(t,i,n){const v=n||p.value?.id;if(!v||!await Ds(v,t,i||""))return!1;const f=e.value.find(E=>E.id===v);return f&&(f.model=t,f.provider=i||""),p.value?.id===v&&(p.value.model=t,p.value.provider=i||""),!0}async function je(t){await Hs(t,e.value.find(i=>i.id===t)?.profile),e.value=e.value.filter(i=>i.id!==t),a.value===t&&(e.value.length>0?await de(e.value[0].id):de(Qe().id))}function ce(t){return e.value.find(i=>i.id===t)?.messages||[]}function we(t,i){const n=e.value.find(v=>v.id===t);n&&n.messages.push(i)}function Oo(t){const i=e.value.findIndex(n=>n.id===t.id);i!==-1?e.value[i]=t:e.value.push(t)}function fe(t,i,n){const v=e.value.find(E=>E.id===t);if(!v)return;const f=v.messages.findIndex(E=>E.id===i);f!==-1&&(v.messages[f]={...v.messages[f],...n})}function Ge(t){const i=e.value.find(n=>n.id===t);i&&(i.messages=i.messages.filter(n=>n.commandAction!=="agent.event"))}function Mo(t,i){const n=String(i.event||"");if(!n.startsWith("subagent."))return;const v=String(i.subagent_id||`${i.task_index??0}`),f=`subagent:${i.run_id||"run"}:${v}`,E=Number(i.task_index??0),M=Number(i.task_count??1),ne=`${E+1}/${Math.max(1,M||1)}`,se=String(i.tool||i.name||""),S=Number(i.tool_count||0),m=String(i.goal||"").trim(),U=String(i.text||i.preview||"").trim(),F=String(i.summary||"").trim(),L=Number(i.duration_seconds??i.duration);let oe=U||F||m;n==="subagent.start"?oe=`subagent ${ne} started${m?`: ${m}`:""}`:n==="subagent.tool"?oe=`${`subagent ${ne}${S?` turn ${S}`:""}`}${se?`: ${se}`:""}${U?` - ${U}`:""}`:n==="subagent.progress"?oe=`subagent ${ne}: ${U||"working"}`:n==="subagent.complete"&&(oe=`subagent ${ne} ${String(i.status||"completed")}${F?`: ${F}`:""}`);const ke=ce(t).find(He=>He.role==="tool"&&He.toolCallId===f),Se=n==="subagent.complete"?i.status&&String(i.status)!=="completed"?"error":"done":"running",Te={toolName:"delegate_task",toolCallId:f,toolPreview:oe.slice(0,220),toolStatus:Se,toolDuration:Number.isFinite(L)?L:void 0,toolResult:n==="subagent.complete"?JSON.stringify({status:i.status||"completed",summary:F||U,api_calls:i.api_calls,input_tokens:i.input_tokens,output_tokens:i.output_tokens},null,2):void 0};if(ke){fe(t,ke.id,Te);return}we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),...Te})}function ao(t,i){const n=i?`Error: ${i}`:"Run failed",v=ce(t),f=v[v.length-1];if(f?.isStreaming){fe(t,f.id,{role:"assistant",content:n,isStreaming:!1,systemType:"error"});return}f?.role==="assistant"&&f.systemType==="error"&&f.content===n||we(t,{id:_e(),role:"assistant",content:n,timestamp:Date.now(),systemType:"error"})}function x(t){if(o.has(t))return;o.add(t);const i=t.session_id;if(!i)return;const n=e.value.find(M=>M.id===i),v=t.action,f=String(t.command||"").toLowerCase();if(t.started===!0&&t.terminal===!1&&d.value.add(i),v==="clear"&&f==="clear"){if(n&&(n.messages=[]),P.value.delete(i),g.value.delete(i),t.clearHistory){const M=String(t.message||"");M&&we(i,{id:_e(),role:"command",content:M,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}return}v==="title"&&n&&typeof t.title=="string"&&(n.title=t.title,n.updatedAt=Date.now()),v==="usage"&&n&&(n.inputTokens=t.inputTokens,n.outputTokens=t.outputTokens,t.contextTokens!=null&&(n.contextTokens=t.contextTokens)),v==="destroy"&&(s.value.delete(i),d.value.delete(i),g.value.delete(i),P.value.delete(i),A(null),ce(i).forEach(M=>{M.isStreaming&&fe(i,M.id,{isStreaming:!1}),M.role==="tool"&&M.toolStatus==="running"&&(M.toolStatus="error")}));const E=String(t.message||"");E&&we(i,{id:_e(),role:"command",content:E,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}function ie(t){const i=t.session_id;if(!i)return;const n=String(t.text||t.message||"").trim();if(!n)return;const v=ce(i),f=v[v.length-1],E={...t};if(f?.role==="system"&&f.commandAction==="agent.event"){if(f.content===n)return;fe(i,f.id,{content:n,timestamp:Date.now(),commandData:E});return}we(i,{id:_e(),role:"system",content:n,timestamp:Date.now(),systemType:"command",commandAction:"agent.event",commandData:E})}function he(t,i){const n=P.value.get(t)||[];if(n.some(f=>f.id===i.id))return;const v=new Map(P.value);v.set(t,[...n,{...i,queued:!0}]),P.value=v}function be(t,i,n){const v=P.value.get(t);if(!v?.length)return;const f=v.map(M=>M.id===i?{...M,...n,queued:!0}:M),E=new Map(P.value);E.set(t,f),P.value=E}function ve(t,i){const n=P.value.get(t);if(!n?.length)return!1;const v=n.filter(E=>E.id!==i);if(v.length===n.length)return!1;const f=new Map(P.value);return v.length>0?(f.set(t,v),g.value.set(t,v.length)):(f.delete(t),g.value.delete(t)),P.value=f,!0}function ye(t,i){ve(t,i)&&Ja()?.emit("cancel_queued_run",{session_id:t,queue_id:i})}function Ee(t){return Array.isArray(t)?t.flatMap(i=>{const n=i,v=typeof n?.content=="string"?n.content:"",f=n?.id!=null?String(n.id):"";if(!f||!v.trim())return[];const E=typeof n?.timestamp=="number"&&Number.isFinite(n.timestamp)?Math.round(n.timestamp*1e3):Date.now(),M=n?.role==="command"?"command":"user";return[{id:f,role:M,content:v,timestamp:E,queued:!0,systemType:M==="command"?"command":void 0}]}):[]}function Ne(t,i){const n=new Map((P.value.get(t)||[]).map(E=>[E.id,E])),v=i.map(E=>({...n.get(E.id)||{},...E,attachments:n.get(E.id)?.attachments||E.attachments,queued:!0})),f=new Map(P.value);v.length>0?f.set(t,v):f.delete(t),P.value=f}function Io(t,i){const n=new Map(q.value),v=new Set(n.get(t)||[]);v.add(i),n.set(t,v),q.value=n}function po(t,i){const n=q.value.get(t);if(!n?.has(i))return!1;const v=new Set(n);v.delete(i);const f=new Map(q.value);return v.size>0?f.set(t,v):f.delete(t),q.value=f,!0}function mo(t,i){const n=Number(i.queue_length||0);n>0?g.value.set(t,n):g.value.delete(t);const v=i.dequeued_queue_id!=null?String(i.dequeued_queue_id):"";if(v){const U=P.value.get(t)||[],F=U.find(L=>L.id===v);Array.isArray(i.queued_messages)?Ne(t,Ee(i.queued_messages)):Ne(t,U.filter(L=>L.id!==v)),F&&!ce(t).some(L=>L.id===F.id)?(we(t,{...F,queued:!1}),no(t)):F||Io(t,v);return}if(Array.isArray(i.queued_messages)){Ne(t,Ee(i.queued_messages));return}const f=i.message,E=typeof f?.content=="string"?f.content:"",M=f?.id!=null?String(f.id):"";if(!M||!E.trim()||(P.value.get(t)||[]).some(U=>U.id===M))return;const ne=typeof f?.timestamp=="number"&&Number.isFinite(f.timestamp)?Math.round(f.timestamp*1e3):Date.now(),se=ce(t),S=se.findIndex(U=>U.id===M&&U.role==="user"),m=S>=0?se[S]:null;S>=0&&se.splice(S,1),he(t,{...m||{},id:M,role:f?.role==="command"?"command":"user",content:E,timestamp:m?.timestamp||ne,attachments:m?.attachments,queued:!0,systemType:f?.role==="command"?"command":m?.systemType})}function to(t){const i=t.session_id,n=t.approval_id;if(!i||!n)return;const v=(Array.isArray(t.choices)?t.choices:["once","session","deny"]).filter(f=>f==="once"||f==="session"||f==="always"||f==="deny");w.value.set(i,{sessionId:i,approvalId:n,command:String(t.command||""),description:String(t.description||""),choices:v.length?v:["once","session","deny"],allowPermanent:!!t.allow_permanent,requestedAt:Date.now()}),w.value=new Map(w.value)}function io(t){const i=t.session_id;if(!i)return;const n=w.value.get(i);if(!n)return;const v=t.approval_id;v&&n.approvalId!==v||(w.value.delete(i),w.value=new Map(w.value))}function go(t){const i=t.session_id,n=t.clarify_id;!i||!n||(_.value.set(i,{sessionId:i,clarifyId:n,question:String(t.question||""),choices:Array.isArray(t.choices)?t.choices:null,timeoutMs:Number(t.timeout_ms)||3e5,requestedAt:Date.now()}),_.value=new Map(_.value))}function ho(t){const i=t.session_id;if(!i)return;const n=_.value.get(i);if(!n)return;const v=t.clarify_id;v&&n.clarifyId!==v||(_.value.delete(i),_.value=new Map(_.value))}function Me(t){let i=!1;w.value.has(t)&&(w.value.delete(t),i=!0),_.value.has(t)&&(_.value.delete(t),i=!0),i&&(w.value=new Map(w.value),_.value=new Map(_.value))}function Mt(t){const i=G.value;i&&(xs(i.sessionId,i.clarifyId,t),_.value.delete(i.sessionId),_.value=new Map(_.value))}function It(t){const i=W.value;i&&(Ts(i.sessionId,i.approvalId,t),w.value.delete(i.sessionId),w.value=new Map(w.value))}function no(t){const i=e.value.find(n=>n.id===t);if(i){if(!i.title){const n=i.messages.find(v=>v.role==="user");if(n){const v=n.attachments?.length?n.attachments.map(f=>f.name).join(", "):n.content;i.title=v.slice(0,40)+(v.length>40?"...":"")}}i.updatedAt=Date.now()}}function sa(t){const i=t.session_id,n=typeof t.title=="string"?t.title.trim():"";if(!i||!n)return;const v=e.value.find(f=>f.id===i);v&&(v.title=n,v.updatedAt=Date.now()),p.value?.id===i&&(p.value.title=n)}function Ht(){ka().display.bell_on_complete&&Us()}function Ra(){ka().display.bell_on_complete&&zs()}async function Dt(t,i){if(!t.trim()&&!(i&&i.length>0))return;Ht(),p.value||de(Qe().id);const n=a.value,v=p.value?p.value.messageCount==null||p.value.messageCount===0:!1,f=t.trim().startsWith("/"),E=f&&/^\/compress(?:\s|$)/i.test(t.trim()),M=f&&/^\/plan(?:\s|$)/i.test(t.trim()),ne=f&&/^\/goal(?:\s|$)/i.test(t.trim()),se=$(n)&&(!f||M),S={id:_e(),role:f?"command":"user",content:t.trim(),timestamp:Date.now(),attachments:i&&i.length>0?i:void 0,queued:se,systemType:f?"command":void 0};se?he(n,S):(we(n,S),no(n),d.value.add(n));let m=!1;try{let U;if(i&&i.length>0){const h=await js(i),N=new Map(h.map(T=>[T.name,Ia(T.path,T.name)]));if(se&&S.attachments)S.attachments=S.attachments.map(T=>{const R=N.get(T.name);return R?{...T,url:R}:T}),be(n,S.id,{attachments:S.attachments});else{const T=ce(n).findLast(R=>R.id===S.id);T?.attachments&&(T.attachments=T.attachments.map(R=>{const le=N.get(R.name);return le?{...R,url:le}:R}))}U=await Gs(t,i,h)}else U=t.trim();const F=lo();await F.waitForModelsForRun();const L=p.value?.model||F.selectedModel,oe=p.value?.provider||F.selectedProvider,ke={input:U,session_id:n,profile:p.value?.profile||co().activeProfileName||void 0,model:v&&L||void 0,provider:v&&oe||void 0,model_groups:F.modelGroups.map(h=>({provider:h.provider,models:h.models})),queue_id:S.id,source:"cli"};v&&p.value&&(p.value.messageCount=Math.max(p.value.messageCount||0,1));const Se=()=>{s.value.delete(n),d.value.delete(n)};let Te=!1,He=!1,Ae=null,Ue=null;const Ut=()=>{ce(n).forEach(h=>{h.role==="assistant"&&h.isStreaming&&fe(n,h.id,{isStreaming:!1})}),Ae=null,Ue=null},zt=Ms(ke,h=>{switch(h.event){case"run.started":Ge(n),A(null),X(n,null),Te=!1,He=!1,Ut(),h.queue_length>0?g.value.set(n,h.queue_length):g.value.delete(n);break;case"run.queued":mo(n,h);break;case"session.command":x(h);break;case"agent.event":ie(h);break;case"compression.started":X(n,{compressing:!0,messageCount:h.message_count||0,beforeTokens:h.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const N=h.contextTokens||h.afterTokens||0;if(X(n,{compressing:!1,messageCount:h.totalMessages||0,beforeTokens:h.beforeTokens||0,afterTokens:N,compressed:h.compressed??!1,error:h.error}),h.contextTokens!=null){const T=e.value.find(R=>R.id===n);T&&(T.contextTokens=h.contextTokens)}setTimeout(()=>{const T=J.value.get(n);T&&!T.compressing&&X(n,null)},5e3);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:h.message});break;case"abort.completed":{if(A({aborting:!1,synced:h.synced??!1}),Me(n),h.queue_length>0){g.value.set(n,h.queue_length),A(null);break}const N=ce(n),T=N[N.length-1];T?.isStreaming&&fe(n,T.id,{isStreaming:!1}),N.forEach((R,le)=>{R.role==="tool"&&R.toolStatus==="running"&&(N[le]={...R,toolStatus:"done"})}),Se(),A(null);break}case"reasoning.delta":case"thinking.delta":{const N=h.text||h.delta||"";if(!N)break;Te=!0;const T=ce(n),R=Ue||Ae,le=R?T.find(ge=>ge.id===R):null;if(le?.role==="assistant")le.reasoning=(le.reasoning||"")+N,Ue=le.id,fo(le.id);else{const ge=_e();we(n,{id:ge,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:N}),Ae=ge,Ue=ge,fo(ge)}break}case"reasoning.available":{const N=ce(n),T=N[N.length-1];T?.role==="assistant"&&T.isStreaming&&Do(T.id);break}case"message.delta":{h.delta&&(Te=!0);const N=ce(n),T=Ae?N.find(R=>R.id===Ae):null;if(T?.role==="assistant"&&T.isStreaming){const R=T.content,le=R+(h.delta||"");Ho(T.id,R,le),T.reasoning&&Do(T.id),T.content=le}else{const R=_e(),le=h.delta||"";Ho(R,"",le),we(n,{id:R,role:"assistant",content:le,timestamp:Date.now(),isStreaming:!0}),Ae=R}break}case"session.title.updated":sa(h);break;case"tool.started":{He=!0;const N=ce(n),T=h.tool_call_id,R=Ae?N.find(ge=>ge.id===Ae):N[N.length-1];R?.isStreaming&&fe(n,R.id,{isStreaming:!1}),Ae=null;const le=T?N.find(ge=>ge.role==="tool"&&ge.toolCallId===T):null;if(le){fe(n,le.id,{toolName:h.tool||h.name,toolArgs:Co(h.arguments)?h.arguments:le.toolArgs,toolPreview:h.preview||le.toolPreview,toolStatus:le.toolStatus||"running"});break}we(n,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:h.tool||h.name,toolCallId:T,toolPreview:h.preview,toolArgs:Ze(h.arguments),toolStatus:"running"});break}case"tool.completed":{He=!0;const N=ce(n),T=h.tool_call_id,R=T?N.filter(le=>le.role==="tool"&&le.toolCallId===T):N.filter(le=>le.role==="tool"&&le.toolStatus==="running");if(R.length>0){const le=R[R.length-1],ge=Ze(h.output),ze=h.error===!0||ba(ge),$e=h.duration;fe(n,le.id,{toolStatus:ze?"error":"done",toolDuration:$e,toolResult:ge})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":He=!0,Mo(n,h);break;case"approval.requested":to(h);break;case"approval.resolved":io(h);break;case"clarify.requested":go(h);break;case"clarify.resolved":ho(h);break;case"run.completed":{Ge(n);const N=ce(n),T=Ae?N.find(ge=>ge.id===Ae):N[N.length-1],R=T?.role==="assistant"&&T.isStreaming?T.id:null;if(T?.isStreaming&&fe(n,T.id,{isStreaming:!1}),h.inputTokens!=null){const ge=e.value.find(ze=>ze.id===n);ge&&(ge.inputTokens=h.inputTokens,ge.outputTokens=h.outputTokens,h.contextTokens!=null&&(ge.contextTokens=h.contextTokens))}let le="";if(h.parsed_content!==void 0){const ge=ce(n),ze=Ae?ge.find($e=>$e.id===Ae):R?ge.find($e=>$e.id===R):void 0;if(ze){const $e=typeof h.parsed_content=="string"?h.parsed_content:"",Fa=$e.trim(),La=ze.content?.trim()??"";Fa||!La?(fe(n,ze.id,{content:$e}),le=Fa):(le=La,Te=!0),h.parsed_reasoning&&fe(n,ze.id,{reasoning:h.parsed_reasoning})}}else{const ge=typeof h.output=="string"?h.output:"";le=ge.trim(),!Te&&le!==""&&(we(n,{id:_e(),role:"assistant",content:ge,timestamp:Date.now()}),Te=!0)}if(!Te&&!He&&le===""?we(n,{id:_e(),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()}):Ra(),z.value){const ge=[...ce(n)].reverse().find(ze=>ze.role==="assistant");ge?.content&&setTimeout(()=>{la(ge.id,ge.content)},300)}h.queue_remaining>0?g.value.set(n,h.queue_remaining):Se(),Ae=null,Ue=null,no(n);break}case"run.failed":{if(Ge(n),h.inputTokens!=null){const T=e.value.find(R=>R.id===n);T&&(T.inputTokens=h.inputTokens,T.outputTokens=h.outputTokens,h.contextTokens!=null&&(T.contextTokens=h.contextTokens))}ao(n,h.error);const N=ce(n);N.forEach((T,R)=>{T.role==="tool"&&T.toolStatus==="running"&&(N[R]={...T,toolStatus:"error"})}),h.queue_remaining>0?g.value.set(n,h.queue_remaining):Se();break}case"usage.updated":{const N=e.value.find(T=>T.id===n);N&&(N.inputTokens=h.inputTokens,N.outputTokens=h.outputTokens,h.contextTokens!=null&&(N.contextTokens=h.contextTokens));break}}},()=>{const h=ce(n),N=h[h.length-1];N?.isStreaming&&fe(n,N.id,{isStreaming:!1}),Se(),no(n)},h=>{console.warn("Socket.IO run stream error:",h.message),ao(n,h.message);const N=ce(n);N.forEach((T,R)=>{T.role==="tool"&&T.toolStatus==="running"&&(N[R]={...T,toolStatus:"error"})}),Se()},void 0,{onReconnectResume:h=>{if(h.session_id!==n)return;const N=e.value.find(T=>T.id===n);if(N){if(h.isWorking?d.value.add(n):d.value.delete(n),h.queueLength&&h.queueLength>0?g.value.set(n,h.queueLength):g.value.delete(n),Array.isArray(h.queueMessages)?Ne(n,Ee(h.queueMessages)):h.queueLength||Ne(n,[]),h.isAborting?A({aborting:!0,synced:null}):h.isWorking||A(null),h.isWorking||X(n,null),h.inputTokens!=null&&(N.inputTokens=h.inputTokens),h.outputTokens!=null&&(N.outputTokens=h.outputTokens),h.contextTokens!=null&&(N.contextTokens=h.contextTokens),Array.isArray(h.messages)){N.messages=Ro(h.messages),N.loadedMessageCount=h.messageLoadedCount??h.messages.length,N.messageTotal=h.messageTotal??N.messageCount??N.loadedMessageCount,N.messageCount=N.messageTotal,N.hasMoreBefore=h.hasMoreBefore??N.loadedMessageCount<N.messageTotal;const T=[...N.messages].reverse().find(R=>R.role==="assistant");h.isWorking&&T?(T.isStreaming=!0,Ae=T.id,Ue=T.id,T.reasoning&&fo(T.id)):(Ae=null,Ue=null)}if(h.events?.length)for(const T of h.events){const R=T.data;switch(R.event){case"compression.started":X(n,{compressing:!0,messageCount:R.message_count||0,beforeTokens:R.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const le=R.contextTokens||R.afterTokens||0;X(n,{compressing:!1,messageCount:R.totalMessages||0,beforeTokens:R.beforeTokens||0,afterTokens:le,compressed:R.compressed??!1,error:R.error}),R.contextTokens!=null&&(N.contextTokens=R.contextTokens);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:R.message});break;case"abort.completed":A({aborting:!1,synced:R.synced??!1});break;case"approval.requested":to({...R,session_id:n});break;case"approval.resolved":io({...R,session_id:n});break;case"clarify.requested":go({...R,session_id:n});break;case"clarify.resolved":ho({...R,session_id:n});break;case"run.failed":ao(n,R.error);break;case"agent.event":ie(R);break}}a.value===n&&(p.value=N),!h.isWorking&&!(h.queueLength&&h.queueLength>0)&&(Ge(n),Se(),Ae=null,no(n))}}});m=!0,(!f||E||M||ne)&&s.value.set(n,zt)}catch(U){se&&!m&&ve(n,S.id),!se&&!m&&d.value.delete(n),we(n,{id:_e(),role:"system",content:`Error: ${U.message}`,timestamp:Date.now()})}}function vo(t,i=!1){if(s.value.has(t)||!i&&!d.value.has(t))return;let n=!1,v=!1,f=!1,E=null,M=null;const ne=()=>{n||(n=!0,s.value.delete(t),d.value.delete(t),Cs(t))},se=()=>{ce(t).forEach(m=>{m.role==="assistant"&&m.isStreaming&&fe(t,m.id,{isStreaming:!1})}),E=null,M=null};function S(m){if(!n&&!(m.session_id&&m.session_id!==t))switch(m.event){case"run.queued":mo(t,m);break;case"session.command":x(m);break;case"agent.event":ie(m);break;case"run.started":Ge(t),A(null),X(t,null),v=!1,f=!1,se(),m.queue_length>0?g.value.set(t,m.queue_length):g.value.delete(t);break;case"compression.started":X(t,{compressing:!0,messageCount:m.message_count||0,beforeTokens:m.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const U=m.contextTokens||m.afterTokens||0;if(X(t,{compressing:!1,messageCount:m.totalMessages||0,beforeTokens:m.beforeTokens||0,afterTokens:U,compressed:m.compressed??!1,error:m.error}),m.contextTokens!=null){const F=e.value.find(L=>L.id===t);F&&(F.contextTokens=m.contextTokens)}setTimeout(()=>{const F=J.value.get(t);F&&!F.compressing&&X(t,null)},5e3);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:m.message});break;case"abort.completed":{if(A({aborting:!1,synced:m.synced??!1}),Me(t),m.queue_length>0){g.value.set(t,m.queue_length),A(null);break}const U=ce(t),F=U[U.length-1];F?.isStreaming&&fe(t,F.id,{isStreaming:!1}),U.forEach((L,oe)=>{L.role==="tool"&&L.toolStatus==="running"&&(U[oe]={...L,toolStatus:"done"})}),ne(),A(null);break}case"reasoning.delta":case"thinking.delta":{const U=m.text||m.delta||"";if(!U)break;v=!0;const F=ce(t),L=M||E,oe=L?F.find(ke=>ke.id===L):null;if(oe?.role==="assistant")oe.reasoning=(oe.reasoning||"")+U,M=oe.id,fo(oe.id);else{const ke=_e();we(t,{id:ke,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:U}),E=ke,M=ke,fo(ke)}break}case"reasoning.available":{const U=ce(t),F=U[U.length-1];F?.role==="assistant"&&F.isStreaming&&Do(F.id);break}case"message.delta":{m.delta&&(v=!0);const U=ce(t),F=E?U.find(L=>L.id===E):null;if(F?.role==="assistant"&&F.isStreaming){const L=F.content,oe=L+(m.delta||"");Ho(F.id,L,oe),F.reasoning&&Do(F.id),F.content=oe}else{const L=_e(),oe=m.delta||"";Ho(L,"",oe),we(t,{id:L,role:"assistant",content:oe,timestamp:Date.now(),isStreaming:!0}),E=L}break}case"session.title.updated":sa(m);break;case"tool.started":{f=!0;const U=ce(t),F=m.tool_call_id,L=E?U.find(ke=>ke.id===E):U[U.length-1];L?.isStreaming&&fe(t,L.id,{isStreaming:!1}),E=null;const oe=F?U.find(ke=>ke.role==="tool"&&ke.toolCallId===F):null;if(oe){fe(t,oe.id,{toolName:m.tool||m.name,toolArgs:Co(m.arguments)?m.arguments:oe.toolArgs,toolPreview:m.preview||oe.toolPreview,toolStatus:oe.toolStatus||"running"});break}we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:m.tool||m.name,toolCallId:F,toolPreview:m.preview,toolArgs:Ze(m.arguments),toolStatus:"running"});break}case"tool.completed":{f=!0;const U=ce(t),F=m.tool_call_id,L=F?U.filter(oe=>oe.role==="tool"&&oe.toolCallId===F):U.filter(oe=>oe.role==="tool"&&oe.toolStatus==="running");if(L.length>0){const oe=Ze(m.output),ke=m.error===!0||ba(oe);fe(t,L[L.length-1].id,{toolStatus:ke?"error":"done",toolDuration:m.duration,toolResult:oe})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":f=!0,Mo(t,m);break;case"approval.requested":to(m);break;case"approval.resolved":io(m);break;case"clarify.requested":go(m);break;case"clarify.resolved":ho(m);break;case"run.completed":{Ge(t);const U=m.queue_remaining>0;U?g.value.set(t,m.queue_remaining):g.value.delete(t);const F=ce(t),L=E?F.find(Se=>Se.id===E):F[F.length-1],oe=L?.role==="assistant"&&L.isStreaming?L.id:null;if(L?.isStreaming&&fe(t,L.id,{isStreaming:!1}),m.inputTokens!=null){const Se=e.value.find(Te=>Te.id===t);Se&&(Se.inputTokens=m.inputTokens,Se.outputTokens=m.outputTokens,m.contextTokens!=null&&(Se.contextTokens=m.contextTokens))}let ke="";if(m.parsed_content!==void 0){const Se=ce(t),Te=E?Se.find(He=>He.id===E):oe?Se.find(He=>He.id===oe):void 0;if(Te){const He=typeof m.parsed_content=="string"?m.parsed_content:"",Ae=He.trim(),Ue=Te.content?.trim()??"";Ae||!Ue?(fe(t,Te.id,{content:He}),ke=Ae):(ke=Ue,v=!0),m.parsed_reasoning&&fe(t,Te.id,{reasoning:m.parsed_reasoning})}}else{const Se=typeof m.output=="string"?m.output:"";ke=Se.trim(),!v&&ke!==""&&we(t,{id:_e(),role:"assistant",content:Se,timestamp:Date.now()})}if(!v&&!f&&ke===""?we(t,{id:_e(),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()}):Ra(),z.value){const Se=[...ce(t)].reverse().find(Te=>Te.role==="assistant");Se?.content&&setTimeout(()=>{la(Se.id,Se.content)},300)}U?(E=null,M=null):(ne(),E=null,M=null),no(t);break}case"run.failed":{if(Ge(t),m.inputTokens!=null){const L=e.value.find(oe=>oe.id===t);L&&(L.inputTokens=m.inputTokens,L.outputTokens=m.outputTokens,m.contextTokens!=null&&(L.contextTokens=m.contextTokens))}const U=m.queue_remaining>0;U?g.value.set(t,m.queue_remaining):g.value.delete(t),ao(t,m.error);const F=ce(t);F.forEach((L,oe)=>{L.role==="tool"&&L.toolStatus==="running"&&(F[oe]={...L,toolStatus:"error"})}),U||ne();break}case"usage.updated":{const U=e.value.find(F=>F.id===t);U&&(U.inputTokens=m.inputTokens,U.outputTokens=m.outputTokens,m.contextTokens!=null&&(U.contextTokens=m.contextTokens));break}}}ws(t,{onMessageDelta:m=>S(m),onReasoningDelta:m=>S(m),onThinkingDelta:m=>S(m),onReasoningAvailable:m=>S(m),onToolStarted:m=>S(m),onToolCompleted:m=>S(m),onSubagentEvent:m=>S(m),onRunStarted:m=>S(m),onRunCompleted:m=>S(m),onRunFailed:m=>S(m),onCompressionStarted:m=>S(m),onCompressionCompleted:m=>S(m),onAbortStarted:m=>S(m),onAbortTimeout:m=>S(m),onAbortCompleted:m=>S(m),onUsageUpdated:m=>S(m),onAgentEvent:m=>S(m),onSessionCommand:m=>S(m),onRunQueued:m=>S(m),onClarifyRequested:m=>S(m),onClarifyResolved:m=>S(m)}),s.value.set(t,{abort:()=>{Ja()?.emit("abort",{session_id:t})}})}function Rt(t){const i=t.session_id;if(!i||a.value!==i||!p.value)return;const n=t.message,v=typeof n?.content=="string"?n.content:"";if(!v.trim())return;const f=n?.id!=null?String(n.id):"",E=ce(i);if(f&&E.some(S=>S.id===f)){d.value.add(i),vo(i,!0);return}if(f&&(P.value.get(i)||[]).some(S=>S.id===f)){d.value.add(i),vo(i,!0);return}const M=typeof n?.timestamp=="number"&&Number.isFinite(n.timestamp)?Math.round(n.timestamp*1e3):Date.now(),ne={id:f||_e(),role:n?.role==="command"?"command":"user",content:v,timestamp:M,queued:!!n?.queued,systemType:n?.role==="command"?"command":void 0},se=f?po(i,f):!1;n?.queued||!se&&$(i)?he(i,ne):(we(i,ne),no(i)),d.value.add(i),vo(i,!0)}Ps(Rt);function Et(t){const i=t.session_id;if(!i||a.value!==i||!p.value)return;const n=t.started===!0&&t.terminal===!1;x(t),n&&(d.value.add(i),vo(i,!0))}As(Et),_s(sa);function Ft(){const t=a.value;if(!t||j.value)return;Me(t);const i=s.value.get(t);if(i){A({aborting:!0,synced:null}),i.abort();const n=ce(t),v=n[n.length-1];v?.isStreaming&&fe(t,v.id,{isStreaming:!1})}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&a.value&&!re.value){const t=a.value;t&&!s.value.has(t)&&$a(t,i=>{i.isWorking?d.value.add(t):d.value.delete(t),i.isAborting?A({aborting:!0,synced:null}):i.isWorking||A(null),i.isWorking||X(t,null),i.messages?.length&&p.value&&(p.value.messages=Ro(i.messages),p.value.loadedMessageCount=i.messageLoadedCount??i.messages.length,p.value.messageTotal=i.messageTotal??p.value.messageCount??p.value.loadedMessageCount,p.value.messageCount=p.value.messageTotal,p.value.hasMoreBefore=i.hasMoreBefore??p.value.loadedMessageCount<p.value.messageTotal),vo(t)},p.value?.profile)}});const Je=new Map;function Lt(t){return Je.get(t)}function Ho(t,i,n){const{startedAtBoundary:v,endedAtBoundary:f}=Os(i,n);if(!v&&!f)return;const E=Je.get(t)||{};v&&E.startedAt===void 0&&(E.startedAt=Date.now()),f&&E.endedAt===void 0&&(E.endedAt=Date.now()),Je.set(t,E)}function fo(t){const i=Je.get(t)||{};i.startedAt===void 0&&(i.startedAt=Date.now(),Je.set(t,i))}function Do(t){const i=Je.get(t);!i||i.startedAt===void 0||i.endedAt===void 0&&(i.endedAt=Date.now(),Je.set(t,i))}function Nt(t){if(!t)return;const i=t.toLowerCase();for(const n of e.value)(n.provider||"").toLowerCase()===i&&(n.model=void 0,n.provider="")}function Ea(t){Je.clear()}function la(t,i){const n=new CustomEvent("auto-play-speech",{detail:{messageId:t,content:i}});window.dispatchEvent(n)}return{sessions:e,activeSessionId:a,activeSession:p,focusMessageId:l,messages:H,isStreaming:re,isRunActive:O,isSessionLive:$,sessionProfileFilter:u,compressionState:y,abortState:te,isAborting:j,queueLengths:g,queuedUserMessages:P,pendingApprovals:w,activePendingApproval:W,activePendingClarify:G,removeQueuedMessage:ye,isLoadingSessions:ae,sessionsLoaded:k,isLoadingMessages:I,newChat:We,newCliSession:K,switchSession:de,loadOlderMessages:Z,switchSessionModel:uo,addOrUpdateSession:Oo,clearProviderFromSessions:Nt,deleteSession:je,sendMessage:Dt,stopStreaming:Ft,respondApproval:It,respondToClarify:Mt,loadSessions:Ke,refreshActiveSession:To,getThinkingObservation:Lt,noteThinkingDelta:Ho,noteReasoningStart:fo,noteReasoningEnd:Do,clearThinkingObservationFor:Ea,setAutoPlaySpeech:V,playMessageSpeech:la}})}));xe();No();Tt();function $s(){const o=Uo(),e=Ha(),{sessionSearchOpen:a,openSessionSearch:l,closeSessionSearch:s}=Ma();function d(u){const g=u.ctrlKey||u.metaKey;if(g&&u.key==="n"){u.preventDefault(),e.newChat();return}if(g&&u.key==="j"){u.preventDefault(),o.push({name:"hermes.jobs"});return}if(g&&u.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;u.preventDefault(),l();return}if(u.key==="Escape"){if(a.value){u.preventDefault(),s();return}const P=document.querySelector(".n-modal-mask");P&&P.querySelector(".n-base-close")?.click()}}Fo(()=>{window.addEventListener("keydown",d)}),aa(()=>{window.removeEventListener("keydown",d)})}xe();No();Ye();Ve();wt();Tt();var Zs={class:"session-search-modal"},Ys={class:"search-header"},Xs={class:"search-title"},el={class:"search-hint"},ol={class:"search-scope"},al={class:"search-body"},tl={key:0,class:"search-empty"},il={key:1,class:"result-list"},nl=["onClick","onMouseenter"],rl={class:"result-main"},sl={class:"result-title-row"},ll={class:"result-title"},dl={class:"result-source"},cl={class:"result-snippet"},ul={class:"result-meta"},pl={class:"result-time"},ml={key:0,class:"result-match"},gl={class:"search-footer"},hl=Le({__name:"SessionSearchModal",setup(o){const{t:e}=Xe(),a=xa(),l=Uo(),s=Ha(),{sessionSearchOpen:d}=Ma(),u=b(""),g=b(!1),P=b([]),q=b([]),w=b(0),W=b(null),_=me(()=>s.sessionProfileFilter||void 0);let G=null,z=0;const V=me(()=>u.value.trim().length>0),re=me(()=>V.value?q.value:P.value.map(p=>({...p,matched_message_id:null,snippet:p.preview||"",rank:0})));function ae(p){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[p]||p}function k(p){return p?new Date(p*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function I(p){const H=p.title?.trim();return H||(p.preview?.trim()?p.preview.trim():p.id)}async function O(){const p=++z;g.value=!0;try{const H=_.value?await Sa(void 0,8,_.value):await Sa(void 0,8);if(p!==z)return;P.value=H,q.value=[],w.value=0}catch(H){if(p!==z)return;a.error(H instanceof Error?H.message:e("chat.searchFailed"))}finally{p===z&&(g.value=!1)}}async function J(p){const H=++z;g.value=!0;try{const $=p.trim()?_.value?await Za(p.trim(),void 0,10,_.value):await Za(p.trim(),void 0,10):[];if(H!==z)return;q.value=$,w.value=0}catch($){if(H!==z)return;a.error($ instanceof Error?$.message:e("chat.searchFailed"))}finally{H===z&&(g.value=!1)}}async function y(){s.sessions.length===0&&await s.loadSessions(s.sessionProfileFilter)}async function X(p){const H=p.matched_message_id!=null?String(p.matched_message_id):null;d.value=!1,await y(),!s.sessions.some($=>$.id===p.id)&&typeof s.addOrUpdateSession=="function"&&s.addOrUpdateSession({id:p.id,profile:p.profile||"default",title:p.title||"",source:p.source,messages:[],createdAt:Math.round(p.started_at*1e3),updatedAt:Math.round((p.last_active||p.ended_at||p.started_at)*1e3),model:p.model,provider:p.provider||p.billing_provider||"",messageCount:p.message_count,endedAt:p.ended_at!=null?Math.round(p.ended_at*1e3):null,lastActiveAt:p.last_active!=null?Math.round(p.last_active*1e3):void 0,workspace:p.workspace||null}),await s.switchSession(p.id,H),l.currentRoute.value.name!=="hermes.chat"&&await l.push({name:"hermes.chat"})}function te(){d.value=!1}function j(p){const H=re.value;H.length!==0&&(w.value=(w.value+p+H.length)%H.length)}async function A(p){if(d.value){if(p.key==="ArrowDown"){p.preventDefault(),j(1);return}if(p.key==="ArrowUp"){p.preventDefault(),j(-1);return}if(p.key==="Enter"){p.preventDefault();const H=re.value[w.value];H&&await X(H);return}p.key==="Escape"&&(p.preventDefault(),te())}}return ro(()=>d.value,async p=>{if(!p){u.value="",q.value=[],P.value=[],w.value=0;return}u.value="",q.value=[],w.value=0,await O(),await $t(),W.value?.focus?.()}),ro(u,p=>{G&&(clearTimeout(G),G=null),G=setTimeout(()=>{d.value&&J(p)},160)}),ro(re,()=>{w.value>=re.value.length&&(w.value=0)}),Fo(()=>{window.addEventListener("keydown",A)}),aa(()=>{window.removeEventListener("keydown",A),G&&clearTimeout(G)}),(p,H)=>(D(),Oe(c(Ao),{show:c(d),"onUpdate:show":H[1]||(H[1]=$=>Vt(d)?d.value=$:null),preset:"card",title:c(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:Y(()=>[r("div",Zs,[r("div",Ys,[r("div",Xs,C(c(e)("chat.searchSubtitle")),1),r("div",el,C(c(e)("chat.searchHint")),1)]),r("div",ol,C(c(e)("chat.searchScope")),1),Q(c(ya),{ref_key:"inputRef",ref:W,value:u.value,"onUpdate:value":H[0]||(H[0]=$=>u.value=$),placeholder:c(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),r("div",al,[Q(c(lt),{show:g.value},{default:Y(()=>[re.value.length===0?(D(),B("div",tl,C(V.value?c(e)("chat.searchNoResults"):c(e)("chat.searchEmpty")),1)):(D(),B("div",il,[(D(!0),B(_o,null,Po(re.value,($,Fe)=>(D(),B("button",{key:$.id,class:De(["result-item",{active:Fe===w.value}]),onClick:Ke=>X($),onMouseenter:Ke=>w.value=Fe},[r("div",rl,[r("div",sl,[r("span",ll,C(I($)),1),r("span",dl,C(ae($.source)),1)]),r("div",cl,C(V.value?$.snippet||c(e)("chat.searchNoSnippet"):$.preview||c(e)("chat.searchRecent")),1)]),r("div",ul,[r("span",pl,C(k($.last_active||$.started_at)),1),V.value&&$.matched_message_id!=null?(D(),B("span",ml," #"+C($.matched_message_id),1)):Ce("",!0)])],42,nl))),128))]))]),_:1},8,["show"])]),r("div",gl,[r("span",null,C(c(e)("chat.searchEnterHint")),1),Q(c(qe),{quaternary:"",size:"small",onClick:te},{default:Y(()=>[Re(C(c(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});eo();var vl=oo(hl,[["__scopeId","data-v-971921f4"]]);xe();Ve();Ye();var fl={style:{display:"none"},"aria-hidden":"true"},bl=Le({__name:"AuthEventListener",setup(o){const e=xa(),{t:a}=Xe();let l=0;function s(d){const u=d.detail||{},g=Date.now();if(!(g-l<1200)){if(l=g,u.kind==="forbidden"){e.error(a("login.accessDenied"));return}e.error(a("login.sessionExpired"))}}return Fo(()=>{window.addEventListener("hermes-auth-notice",s)}),aa(()=>{window.removeEventListener("hermes-auth-notice",s)}),(d,u)=>(D(),B("span",fl))}}),yl=bl;async function kd(){const o=await fetch("/api/auth/status");if(!o.ok)throw new Error("Failed to fetch auth status");return o.json()}async function wd(o,e){const a=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:o,password:e})});if(!a.ok){const l=await a.json().catch(()=>({})),s=new Error(l.error||"Login failed");throw s.status=a.status,s}return(await a.json()).token}async function Sl(){return(await ee("/api/auth/me")).user}async function Cd(){const o=await ee("/api/auth/avatar");if(!o.avatar)return null;try{const e=JSON.parse(o.avatar);return e&&(e.type==="image"||e.type==="default")?e:null}catch{return null}}async function Pd(o){const e=JSON.stringify(o);await ee("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:e})})}async function Ad(){await ee("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:{type:"default"}})})}async function _d(o,e){return ee("/api/auth/change-password",{method:"POST",body:JSON.stringify({currentPassword:o,newPassword:e})})}async function xd(o,e){return ee("/api/auth/change-username",{method:"POST",body:JSON.stringify({currentPassword:o,newUsername:e})})}async function Da(){return ee("/api/auth/users")}async function Td(o){const e=await ee("/api/auth/users",{method:"POST",body:JSON.stringify(o)});return{...await Da(),users:e.users}}async function Md(o,e){const a=await ee(`/api/auth/users/${o}`,{method:"PUT",body:JSON.stringify(e)});return{...await Da(),users:a.users}}async function Id(o){const e=await ee(`/api/auth/users/${o}`,{method:"DELETE"});return{...await Da(),users:e.users}}async function Hd(){return(await ee("/api/auth/locked-ips")).locks}async function Dd(o){return ee(`/api/auth/locked-ips?ip=${encodeURIComponent(o)}`,{method:"DELETE"})}async function Rd(){return(await ee("/api/auth/locked-ips",{method:"DELETE"})).count}var kl=Ie((()=>{Be()}));xe();No();Ve();Ye();kl();Be();var wl={class:"credential-warning-text"},Cl=Le({__name:"DefaultCredentialPrompt",setup(o){const{t:e}=Xe(),a=Ta(),l=Uo(),s=b(!1),d=b(!1),u=b(""),g=b(null);function P(G){return`hermes_default_credentials_prompt_dismissed_${G}`}function q(){return window.hermesDesktop?.isDesktop===!0}async function w(){if(q()){s.value=!1;return}if(a.name==="login"){s.value=!1;return}const G=xo();if(!(!G||G===u.value)){u.value=G,d.value=!0;try{const z=await Sl();g.value=z.id;const V=sessionStorage.getItem(P(z.id))==="1";s.value=!!z.requiresCredentialChange&&!V}catch{s.value=!1}finally{d.value=!1}}}function W(){g.value!=null&&sessionStorage.setItem(P(g.value),"1"),s.value=!1}function _(){s.value=!1,l.push({name:"hermes.settings",query:{tab:"account"}})}return ro(()=>a.fullPath,()=>{w()},{immediate:!0}),(G,z)=>(D(),Oe(c(Ao),{show:s.value,"onUpdate:show":z[0]||(z[0]=V=>s.value=V),preset:"dialog",title:c(e)("login.defaultCredentialTitle"),"mask-closable":!1},{action:Y(()=>[Q(c(qe),{disabled:d.value,onClick:W},{default:Y(()=>[Re(C(c(e)("login.defaultCredentialLater")),1)]),_:1},8,["disabled"]),Q(c(qe),{type:"primary",loading:d.value,onClick:_},{default:Y(()=>[Re(C(c(e)("login.defaultCredentialAction")),1)]),_:1},8,["loading"])]),default:Y(()=>[r("p",wl,C(c(e)("login.defaultCredentialMessage")),1)]),_:1},8,["show","title"]))}});eo();var Pl=oo(Cl,[["__scopeId","data-v-3a600c1f"]]);xe();No();Ye();Ve();bt();qo();var Al={key:0,class:"node-warning-bar"},_l={class:"app-main"},xl=Le({__name:"App",setup(o){const{isDark:e,isComic:a}=ft(),{t:l}=Xe(),s=lo(),d=Ta(),u=Uo(),g=b(!1),P=me(()=>Li(e.value,a.value)),q=me(()=>e.value?Yt:null),w=me(()=>d.name==="login"),W=me(()=>{const _=s.nodeVersion,G=parseInt(_.split(".")[0],10);return!isNaN(G)&&G<23});return ro(()=>d.path,()=>{s.closeSidebar()}),u.isReady().then(()=>{g.value=!0}),Fo(()=>{w.value||(s.loadModels(),s.startHealthPolling())}),aa(()=>{s.stopHealthPolling()}),$s(),(_,G)=>{const z=rt("router-view");return D(),Oe(c(Zt),{theme:q.value,"theme-overrides":P.value},{default:Y(()=>[Q(c(Wt),null,{default:Y(()=>[Q(yl),Q(c(jt),null,{default:Y(()=>[Q(c(Gt),null,{default:Y(()=>[W.value&&g.value?(D(),B("div",Al,C(c(l)("sidebar.nodeVersionWarning",{version:c(s).nodeVersion})),1)):Ce("",!0),g.value?(D(),B("div",{key:1,class:De(["app-layout",{"no-sidebar":w.value}])},[w.value?Ce("",!0):(D(),B("button",{key:0,class:"hamburger-btn",onClick:G[0]||(G[0]=(...V)=>c(s).toggleSidebar&&c(s).toggleSidebar(...V))},[...G[2]||(G[2]=[r("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!w.value&&c(s).sidebarOpen?(D(),B("div",{key:1,class:"mobile-backdrop",onClick:G[1]||(G[1]=(...V)=>c(s).closeSidebar&&c(s).closeSidebar(...V))})):Ce("",!0),w.value?Ce("",!0):(D(),Oe(Zr,{key:2})),r("main",_l,[Q(z)])],2)):Ce("",!0),Q(vl),Q(Pl)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});eo();var Tl=oo(xl,[["__scopeId","data-v-4b9c67e7"]]);xe();Lo();var tt=localStorage.getItem("hermes_brightness")||"system",Ml=localStorage.getItem("hermes_style")||"ink",Il=window.matchMedia("(prefers-color-scheme: dark)").matches,Hl=tt==="dark"||tt==="system"&&Il,Dl=Ml==="comic";Hl&&document.documentElement.classList.add("dark");Dl&&document.documentElement.classList.add("comic");var Rl=new URLSearchParams(window.location.search),it=window.location.hash.split("?")[1],nt=Rl.get("token")||(it?new URLSearchParams(it).get("token"):null);nt&&(window.__LOGIN_TOKEN__=nt);var ra=Jt(Tl);ra.use(ai());ra.use(vt);ra.use(ii);ra.mount("#app");export{bt as $,bd as A,ad as B,ka as C,fd as D,Ls as E,nd as F,rd as G,dd as H,Hs as I,Cn as J,sd as K,ld as L,pd as M,Ia as N,gd as O,Rs as P,lo as Q,cd as R,Ns as S,vd as T,id as U,Ya as V,wt as W,co as X,ia as Y,qo as Z,Tt as _,kd as a,Bs as b,Da as c,wd as d,ft as et,Ad as f,Pd as g,Md as h,Id as i,ud as j,hd as k,Cd as l,Dd as m,xd as n,Di as nt,Sl as o,Rd as p,Go as q,Td as r,Hd as s,_d as t,Ri as tt,kl as u,Ha as v,md as w,yd as x,Sd as y,td as z};
1
+ import{a as qt,i as Ot,n as Ie,r as Bt}from"./rolldown-runtime-M0oDzQ_3.js";import{$n as C,$t as r,An as Y,At as ya,B as Wt,Bn as b,Bt as xe,Cn as Po,H as jt,I as Gt,In as Vt,Jn as c,Jt as Kt,Kt as yo,On as ro,Qn as Qt,Qt as me,Tn as rt,Ut as Jt,W as Ao,Xn as De,Yt as _o,an as Re,bn as aa,en as Oe,ft as st,g as lt,hn as $t,in as dt,jn as So,mt as Zt,n as Yt,nn as B,on as Q,qt as Xt,sn as Le,t as Ye,tn as Ce,wn as ei,wt as qe,xn as D,yn as Fo,z as xa,zn as oi}from"./ui-vendor-DNWaqYj5.js";import{_ as Lo,c as Ve,f as No,g as ta,h as ai,l as Xe,m as Uo,p as Ta,s as ti}from"./vue-vendor-VX6KvV1_.js";import{a as ct,c as Na,d as ee,i as ii,l as Be,n as eo,o as xo,r as ni,s as zo,t as oo,u as ri}from"./_plugin-vue_export-helper-CtZk2OSc.js";import{M as si,N as li,j as di}from"./vendor-B1Lfatlz.js";import{_ as ci,b as ui,i as pi,l as mi,p as gi,r as hi,t as vi,v as fi,y as bi}from"./system-Pg8JEuA6.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))l(s);new MutationObserver(s=>{for(const d of s)if(d.type==="childList")for(const u of d.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&l(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const d={};return s.integrity&&(d.integrity=s.integrity),s.referrerPolicy&&(d.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?d.credentials="include":s.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function l(s){if(s.ep)return;s.ep=!0;const d=a(s);fetch(s.href,d)}})();xe();Lo();No();Be();ni();Ve();var ut={login:{title:"Quanta Hermes",description:"Enter your access token to continue. Find it in the server startup logs.",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: quanthermes. Default password: 12345678. Change them after the first sign-in.",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 quanthermes 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",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",search:"Search",apiRelay:"API Relay",history:"History",jobs:"Jobs",kanban:"Kanban",models:"Models",profiles:"Profiles",skills:"Skills",plugins:"Plugins",mcp:"MCP",memory:"Memory",logs:"Logs",usage:"Usage",performance:"Performance",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",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",networkConfig:"Switch WiFi",connected:"Connected",disconnected:"Disconnected",collapse:"Collapse menu",expand:"Expand menu",updateTip:"In customized builds, upgrades are managed by your internal release process",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, restart it manually.",updateFailed:"Update failed. Check your internal update source configuration.",updateSource:"Update source: {source}",updateManagedInternally:"Customized build: upgrades are managed through your internal release process",logout:"Sign Out",nodeVersionWarning:"Detected Node.js v{version}. Please upgrade to version 23 or later.",changelog:"Changelog",noChangelog:"No changelog available"},devices:{title:"Devices",count:"{count} devices",lastScanned:"Last scanned: {time}",refresh:"Refresh",empty:"No devices found",computer:"Computer",endpointLabel:"Endpoint",statusLabel:"Status",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",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 Quanthermes Agent",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)",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",plan:"Write a markdown implementation plan",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",steer:"Send steering text to the active bridge run",destroy:"Release the bridge agent for this session",reloadMcp:"Reload MCP servers"},attachFiles:"Attach files",autoPlaySpeech:"Auto-play voice",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:"QuantHermes History",historyScopeHint:"Read-only QuantHermes history sessions 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",approvalKicker:"Terminal permission",approvalTitle:"Review command before running",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",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",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",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"},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",ready:"Ready",running:"Running",blocked:"Blocked",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..."},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"},action:{title:"Actions",complete:"Complete",completeSummary:"Completion summary (optional)",block:"Block",blockReason:"Reason for blocking",unblock:"Unblock",assign:"Assign",assignTo:"Assign to..."},message:{taskCreated:"Task created",taskCompleted:"Task completed",taskBlocked:"Task blocked",taskUnblocked:"Task unblocked",taskAssigned:"Task assigned",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.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Refresh",notice:"Read-only inventory of discoverable QuantHermes plugin manifests. Discovery metadata is read without loading plugin code. Management actions stay in CLI for v1; changes take effect in new QuantHermes sessions.",loadFailed:"Failed to load plugins",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"Project plugins"}},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...",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",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 QuantHermes.",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 QuantHermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.",copilotDeleteHintAppsJson:"Copilot will be hidden from QuantHermes. Your VS Code Copilot extension login is not affected.",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",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",auxiliaryTitle:"Auxiliary Models",auxiliarySubtitle:"Side-task model overrides for compression, vision, approvals, MCP, and background maintenance.",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",builtIn:"Built-in",customType:"Custom",provider:"Provider",contextLength:"Context Length",contextLengthPlaceholder:"e.g. 256000 (optional)",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",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",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",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"},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.",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"},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"},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"},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:{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",installNow:"Install",installing:"Installing",installSuccess:"Installed",installFailed:"Install failed",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",accessToken:"Access Token",accessTokenHint:"Matrix access token",homeserver:"Homeserver URL",homeserverHint:"Matrix homeserver URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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",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)",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 QuantHermes 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_11_1:"LAN device discovery now includes pairing approvals, request history, duplicate request handling, status sync, and cleanup when device access is revoked",new_0_6_11_2:"LAN peer access is available through MCP with bundled MCP startup, command shims, reconnecting peer sockets, local connection listing, and capped terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis and MiMo voice cloning settings are now available, including playback support before saving settings",new_0_6_11_4:"Gateway autostart settings now expose profile filtering with multi-select controls, whitelist behavior, and focused tests for startup profile selection",new_0_6_11_5:"Chat scrolling and motion are steadier with bottom-follow tuning, initial bottom scroll fixes, scroll lock updates, and reduced-motion fade handling",new_0_6_11_6:"Agent Bridge and runtime flows are more reliable with abort timeout handling, resume startup guards, execute-code approval memory, Windows gateway recovery, and dev terminal proxy fixes",new_0_6_11_7:"Security is tighter with Web UI origin policy and security header hardening plus server-token loopback access guards",new_0_6_11_8:"Group chat and tool output rendering are more stable with room rejoin after reconnect, preserved reasoning/tool boundaries, safer tool payload rendering, and improved diff display",new_0_6_11_9:"Skills and workspace flows now support external skill directories, import/delete refresh, source-path grouping, localized folder picker text, and mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs, and OpenRouter attribution text received UI polish",new_0_6_10_1:"Desktop runtime startup is more resilient with download source selection, safer archive extraction, corrected runtime cache paths, Windows CLI launch fixes, and localized progress/error screens",new_0_6_10_2:"Auxiliary compression model settings let each Profile choose a dedicated provider/model for chat context compression instead of always using the active chat model",new_0_6_10_3:"Provider model catalogs can now be refreshed from the UI",new_0_6_10_4:"Users can upload profile avatars, and group chat members now sync and display account avatars consistently",new_0_6_10_5:"Workspace file browsing now supports richer text previews and context-menu coverage for source and document files",new_0_6_10_6:"Agent Bridge is more reliable with refreshed tool approval allowlists and Windows tasklist/taskkill output decoding that avoids UnicodeDecodeError crashes",new_0_6_10_7:"Website copy now consistently presents the product as Hermes Studio while keeping npm package, CLI, repository, and environment variable identifiers unchanged",new_0_6_10_8:"OpenAPI docs now include avatar, auxiliary model config, provider model cache refresh, and Hermes session import endpoints",new_0_6_10_9:"Memory notes can now be saved with empty content, making it possible to clear personal notes without a failed save",new_0_6_10_10:"Repository harness docs now track chat-chain changes so bridge and chat-runtime updates are documented before CI passes",new_0_6_9_1:"The app is now branded as Hermes Studio across the browser title, sidebar, website title, package metadata, and official homepage links",new_0_6_9_2:"Desktop update checks are more reliable with release-feed fallback handling when GitHub API requests are rate-limited or tag-scoped metadata is missing",new_0_6_9_3:"macOS desktop update install now stops the local Web UI server before letting electron-updater handle quit and install, so Restart installs the downloaded version",new_0_6_9_4:"Provider credentials and auth now respect Profile scoping more consistently, and gateway/runtime startup is more compatible with packaged desktop launches",new_0_6_9_5:"Browser Web Speech playback now pauses and resumes the current message in Chrome instead of restarting from the beginning",new_0_6_9_6:"Russian localization is now available in the language switcher, with translated client UI messages added by the community",new_0_6_8_1:"Desktop builds gained tray controls, manual update checks, update notifications, and local-browser launch support for the packaged Web UI",new_0_6_8_2:"Windows desktop startup is quieter and more reliable, with hidden Python/bridge subprocesses, fixed terminal popups, tray icon sizing, and browser packaging fixes",new_0_6_8_3:"Desktop packaging is more stable across platforms with macOS signing file-limit fixes, Linux writable paths, runtime cold-start handling, and workflow checkout fixes",new_0_6_8_4:"Official website and release distribution improved with download mirrors, sequenced website deploys after desktop releases, and desktop smoke-check cleanup",new_0_6_8_5:"Runtime usability improved with provider context-length preferences, unsent chat draft preservation, mobile layout overflow fixes, SSH file-provider custom ports, and nonblocking preview actions",new_0_6_7_1:"The desktop app now defaults to port 8748, supports LAN access, and can be opened directly from a local browser",new_0_6_7_9:"Desktop download links are now available on the official website at https://hermes-studio.ai/, and the latest installers remain available from GitHub Releases",new_0_6_7_2:"MCP tooling is more complete with bridge tool discovery fixes, MCP management lifecycle fixes, and per-model tool visibility controls in the manager",new_0_6_7_3:"Message lists now center empty states correctly, reduce scroll jitter, avoid leaking live chat messages into History while loading, preserve per-session scroll positions, and fade in over 1.5 seconds on session switches",new_0_6_7_4:"Bridge and runtime stability improved by preserving text/tool-call ordering, fixing Profile runtime status loading, improving Node/npm detection, and skipping production data directory creation",new_0_6_7_5:"Desktop distribution now covers Electron packaging, app naming, preload builds, release artifact uploads, Windows Hermes CLI launch, Linux icons and writable data paths, macOS unsigned release handling, and hidden Windows startup subprocesses",new_0_6_7_6:"The website now has downloads and deploy workflows, with deploys fixed for environments that do not provide rsync",new_0_6_7_7:"Server and auth fixes use dirname for Windows credential directories and raise the avatar upload body limit to avoid 413 errors on larger images",new_0_6_7_8:"Repository harness, validation docs, and agent guidance were added for coding agents, while stale setup script docs were removed"}},yi={login:{title:"Quanta Hermes",description:"输入访问令牌以继续。令牌在服务端启动日志中查看。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",defaultCredentialsHint:"默认登录名:quanthermes,默认密码:12345678。建议首次登录后立即修改。",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",lockResetHint:"如果这是你的服务器,可以执行以下命令清除登录锁定:",defaultLoginResetHint:"如需重置默认 quanthermes 密码,可以执行:",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:"重试",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:"对话",search:"搜索",apiRelay:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",mcp:"MCP",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",performance:"性能监控",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",devices:"设备",groupConversation:"对话",groupConversationShort:"对话",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系统",groupSystemShort:"系统",groupMonitoring:"监控",groupMonitoringShort:"监控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"编程工具",versionPreview:"版本预览",settings:"设置",networkConfig:"切换 WiFi",connected:"已连接",disconnected:"未连接",collapse:"收起菜单",expand:"展开菜单",updateTip:"定制版升级由内部发布流程管理",updateVersion:"升级版本 v{version}",reloadClientVersion:"刷新到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,请稍后刷新页面,如长时间未启动,请手动重启服务",updateFailed:"更新失败,请检查内部更新源配置",updateSource:"更新源:{source}",updateManagedInternally:"当前为定制版,升级由内部发布流程管理",logout:"退出登录",nodeVersionWarning:"检测到 Node.js v{version},请升级到23以上版本。",changelog:"更新日志",noChangelog:"暂无更新日志"},devices:{title:"设备",count:"{count} 台设备",lastScanned:"上次扫描:{time}",refresh:"刷新",empty:"暂无设备",computer:"电脑",endpointLabel:"端",statusLabel:"状态",address:"地址",os:"系统",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延迟",lastSeen:"最后发现",open:"打开",never:"从未",unknown:"未知",loadFailed:"加载设备失败",scanFailed:"扫描设备失败",updateFailed:"更新设备失败",duplicateRequest:"已存在待处理的配对申请",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:"开始与 Quanthermes Agent 对话",cliEmptyState:"开始 CLI 对话",outlineTitle:"会话大纲",outlineEmpty:"暂无会话内容",outlineUserQuestion:"用户问题",inputPlaceholder:"输入消息... (Enter 发送,Shift+Enter 换行)",slashCommandArgs:{message:"<消息>",title:"<标题>",text:"<文本>"},slashCommands:{usage:"计算当前会话用量",status:"查看会话状态和队列",abort:"停止当前 Bridge 运行",queue:"把消息加入当前运行后的队列",plan:"生成一份 Markdown 实施计划",goal:"设置一个跨轮次持续推进的目标",goalStatus:"查看当前目标状态",goalPause:"暂停当前目标循环",goalResume:"继续已暂停的目标循环",goalDone:"完成并清除当前目标",goalClear:"清除当前目标",subgoal:"为当前目标追加验收条件",clear:"清空当前显示内容",clearHistory:"删除当前会话已入库的消息历史",title:"重命名当前会话",compress:"空闲时触发上下文压缩",steer:"向当前 Bridge 运行发送引导文本",destroy:"释放当前会话的 Bridge Agent",reloadMcp:"重载 MCP 服务器"},attachFiles:"添加附件",autoPlaySpeech:"自动播放语音",showToolCalls:"显示工具调用",hideToolCalls:"隐藏工具调用",messageQueue:"消息队列",removeQueuedMessage:"移除队列消息",stop:"停止",start:"启动",stopGateway:"停止网关",send:"发送",contextUsed:"上下文已用:",sessions:"会话",webUiSessions:"会话",allProfiles:"全部配置",profileMissingModelsTip:"该会话所属配置「{profile}」没有可用的 provider 或模型",sessionScopeHint:"这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。",openHistory:"打开历史",hermesHistory:"QuantHermes 历史",historyScopeHint:"这里按来源只读查看 QuantHermes 历史会话。",noSessions:"暂无会话",searchTitle:"搜索会话",searchSubtitle:"按标题或消息内容搜索",searchScope:"搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜索会话...",searchEmpty:"最近会话",searchRecent:"最近会话",searchNoResults:"没有匹配的会话",searchNoSnippet:"没有可显示的摘要",searchEnterHint:"Enter 打开 · Esc 关闭",searchFailed:"搜索会话失败",newChat:"新建对话",approvalKicker:"终端授权",approvalTitle:"运行前请确认命令",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:"重命名",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:"重命名失败",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:"结果",truncated:"... (已截断)",unchangedLines:"{count} 行未修改",executionDuration:"执行时长",thinkingLabel:"思考过程",thinkingInProgress:"思考中…",thinkingShow:"展开思考过程",thinkingHide:"收起思考过程",thinkingDuration:"已观察 {duration}",thinkingChars:"{count} 字",copyBubble:"复制消息",copiedBubble:"已复制",copyFailed:"复制失败",playSpeech:"播放语音",pauseSpeech:"暂停",resumeSpeech:"继续",stopSpeech:"停止",speechNotSupported:"此浏览器不支持语音播放"},kanban:{title:"看板",createTask:"新建任务",noTasks:"暂无任务",allStatuses:"全部状态",allAssignees:"全部负责人",board:{create:"新建看板",archive:"归档看板",slugPlaceholder:"看板标识,例如 project-a",namePlaceholder:"显示名称(可选)",slugRequired:"看板标识不能为空",created:"看板已创建",archived:"看板已归档",archiveConfirm:"确定归档当前看板?"},columns:{triage:"待分拣",todo:"待办",ready:"就绪",running:"进行中",blocked:"阻塞",done:"已完成",archived:"已归档"},form:{title:"标题",titlePlaceholder:"任务标题",titleRequired:"标题不能为空",body:"描述",bodyPlaceholder:"任务描述(可选)",assignee:"负责人",selectAssignee:"选择负责人...",priority:"优先级",selectPriority:"选择优先级..."},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:"关键信息"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(可选)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"分配",assignTo:"分配给..."},message:{taskCreated:"任务已创建",taskCompleted:"任务已完成",taskBlocked:"任务已阻塞",taskUnblocked:"任务已解除阻塞",taskAssigned:"任务已分配",loadFailed:"加载任务失败"},stats:{total:"总计",tasks:"任务数"}},jobs:{title:"定时任务",createJob:"创建任务",editJob:"编辑任务",noJobs:"暂无定时任务,创建一个开始吧。",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:"要执行的内容",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:"技能",searchPlaceholder:"搜索技能...",noMatch:"没有匹配的技能",noSkills:"暂无技能",backTo:"返回",attachedFiles:"附件文件",loadFailed:"加载技能失败",fileLoadFailed:"加载文件失败",modified:"用户已修改",archived:"已归档",pinned:"已置顶",pin:"置顶技能",unpin:"取消置顶",pinFailed:"更改置顶状态失败",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;新会话会自动加载。"},plugins:{title:"插件",refresh:"刷新",notice:"只读展示可发现的 QuantHermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 QuantHermes 会话生效。",loadFailed:"加载插件失败",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:"路径 / 入口",cli:"CLI"},capabilities:{tools:"{count} 个工具",hooks:"{count} 个 hook",env:"{count} 个环境变量"},metadata:{agentRoot:"Agent 根目录",python:"Python",scanCwd:"扫描 cwd",projectPlugins:"项目插件"}},memory:{title:"记忆",refresh:"刷新",loadFailed:"加载记忆失败",myNotes:"我的笔记",noNotes:"暂无笔记。",notesPlaceholder:"输入笔记内容...",userProfile:"用户画像",noProfile:"暂无画像。",profilePlaceholder:"输入用户画像...",soul:"灵魂",noSoul:"暂无灵魂配置。",soulPlaceholder:"输入灵魂配置..."},models:{title:"模型",searchPlaceholder:"搜索模型...",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 已删除",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 凭证,点击「添加」即可在 QuantHermes 中启用 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 将从 QuantHermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。",copilotDeleteHintAppsJson:"Copilot 将从 QuantHermes 列表移除。不会影响 VS Code Copilot 插件的登录。",customBadge:"自定义",previewBadge:"预览",disabledBadge:"不可用",disabledTooltip:"此模型当前账号不可用",customModelPlaceholder:"未列出的模型 ID",customModelHint:"仅用于 provider 支持但未返回的模型;不是重命名。按回车加载。",removeCustomModel:"移除这个未列出的模型",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:"取消全选",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:"默认",builtIn:"内置",customType:"自定义",provider:"Provider",contextLength:"上下文长度",contextLengthPlaceholder:"例如 256000(可选)",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:"删除",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:"代理",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 回复完成时播放提示音",busyInputMode:"忙碌输入模式",busyInputModeHint:"AI 处理中仍可输入",theme:"主题",themeHint:"选择浅色、暗色或跟随系统",themeLight:"浅色",themeDark:"暗色",themeSystem:"跟随系统"},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。",mode:"Profile 策略",modeHint:"启动所有发现到的 profiles,或只启动白名单内的 profiles。",modeAll:"所有发现到的 profiles",modeInclude:"仅白名单 profiles",include:"白名单 profiles",includeHint:"逗号分隔 profile 名。白名单模式下留空表示不自动启动任何 profile。",exclude:"排除 profiles",excludeHint:"逗号分隔 profile 名;会在白名单/全量策略之后再排除。",profileListPlaceholder:"default, reviewer"},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:"修改会话操作是否授权"},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"},userAvatar:{title:"用户头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB,会自动压缩到 500KB 以下",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},voice:{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:"未安装",installNow:"一键安装",installing:"安装中",installSuccess:"安装完成",installFailed:"安装失败",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",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 服务器地址",appId:"App ID",appIdHint:"飞书 App ID",appSecret:"App Secret",appSecretHint:"飞书 App Secret",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:"智能体已添加",agentAlreadyInRoom:"该智能体已在房间中",agentAddFailedCount:"{count} 个智能体未添加:{details}",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",copyRoomLink:"复制房间链接",deleteRoomConfirm:"确定删除这个房间吗?",clearContext:"清理上下文",clearContextConfirm:"确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房间",joinFailed:"加入房间失败",inputPlaceholder:"输入消息... (Enter 发送)",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:"跟踪 QuantHermes 会话中的技能加载和编辑",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_11_1:"LAN 设备发现新增配对审批、申请历史、重复申请处理、状态同步,以及撤销设备权限时的清理逻辑",new_0_6_11_2:"LAN Peer 已接入 MCP,包含内置 MCP 启动、命令 shim、Peer Socket 重连、本地连接列表,以及终端会话数量限制",new_0_6_11_3:"统一后端 TTS 合成和 MiMo 音色复刻设置已可用,并支持保存设置前试听",new_0_6_11_4:"Gateway 自动启动配置现在支持按 Profile 多选过滤、白名单行为和启动 Profile 选择测试",new_0_6_11_5:"聊天滚动和动效更稳定,修复初次进入滚动到底部、滚动锁定、底部跟随时机和 reduced-motion 淡入处理",new_0_6_11_6:"Agent Bridge 和运行时流程更可靠,修复 abort 超时、恢复时误启动、execute-code 授权记忆、Windows Gateway 恢复和开发终端代理",new_0_6_11_7:"安全性增强:加固 Web UI Origin 策略、安全响应头,并限制 server token 只能走本地回环访问",new_0_6_11_8:"群聊和工具结果渲染更稳定,支持重连后重新加入房间、保留 reasoning/tool 边界、加固工具 payload 渲染并优化 diff 展示",new_0_6_11_9:"技能和 Workspace 流程支持外部技能目录、导入/删除自动刷新、按 sourcePath 分组、本地化文件夹选择文案和移动端技能操作图标",new_0_6_11_10:"设备页布局、原生会话标题、浏览器标签标题、Kanban 父任务 ID 和 OpenRouter 归属文案做了界面优化",new_0_6_10_1:"桌面运行时启动更可靠,支持下载源选择、更安全的压缩包解压、修正运行时缓存路径、Windows CLI 启动修复,以及本地化进度和错误界面",new_0_6_10_2:"辅助压缩模型设置允许每个 Profile 为聊天上下文压缩选择专用 provider/model,不再只能使用当前聊天模型",new_0_6_10_3:"Provider 模型目录现在可在界面中手动刷新",new_0_6_10_4:"用户可以上传账号头像,群聊成员也会一致同步并展示账号头像",new_0_6_10_5:"Workspace 文件浏览支持更完整的文本预览,并扩展源码和文档文件的右键菜单覆盖",new_0_6_10_6:"Agent Bridge 更可靠:会刷新工具审批 allowlist,并兼容 Windows tasklist/taskkill 输出解码,避免 UnicodeDecodeError 崩溃",new_0_6_10_7:"官网文案统一展示为 Hermes Studio,同时保留 npm package、CLI、仓库和环境变量等技术标识不变",new_0_6_10_8:"OpenAPI 文档补充头像、辅助模型配置、Provider 模型缓存刷新和 Hermes 会话导入端点",new_0_6_10_9:"记忆备注现在可以保存为空内容,清空个人备注时不会再保存失败",new_0_6_10_10:"仓库 harness 文档现在会追踪 Chat 链路变更,bridge 和 chat runtime 更新需要先记录后才能通过 CI",new_0_6_9_1:"应用品牌统一为 Hermes Studio,覆盖浏览器标题、侧边栏、官网标题、package metadata 和官网链接",new_0_6_9_2:"桌面端检查更新更可靠:GitHub API 被限流或 tag 路径缺少 metadata 时会走 release feed 兜底",new_0_6_9_3:"macOS 桌面端安装更新时会先停止本地 Web UI server,再交给 electron-updater 退出安装,修复点击重启不安装的问题",new_0_6_9_4:"Provider 凭据和认证更严格遵循 Profile 作用域,gateway/runtime 启动也更兼容桌面端打包环境",new_0_6_9_5:"浏览器 Web Speech 播放现在会在 Chrome 中暂停/恢复当前消息,不再点击暂停后从头重播",new_0_6_9_6:"语言切换器新增俄语,本次合入社区贡献的俄语客户端界面翻译",new_0_6_8_1:"桌面端补齐托盘控制、手动检查更新、更新提示,以及从本机浏览器打开打包 Web UI 的能力",new_0_6_8_2:"Windows 桌面端启动更安静也更稳定:隐藏 Python/bridge 子进程,修复终端弹窗、托盘图标尺寸和浏览器打包问题",new_0_6_8_3:"跨平台桌面打包更稳定:修复 macOS 签名文件数量限制、Linux 可写路径、runtime 冷启动和 workflow checkout 问题",new_0_6_8_4:"官网与发布链路改进:新增下载镜像,桌面 release 后再部署官网,并清理桌面 smoke check 流程",new_0_6_8_5:"运行体验继续优化:优先使用 provider 上下文长度、保留未发送草稿、修复移动端布局溢出、SSH 文件 Provider 自定义端口和非阻塞预览操作",new_0_6_7_1:"桌面版默认使用 8748 端口,支持局域网内访问,也可以直接用本机浏览器打开 Web UI",new_0_6_7_9:"桌面端下载入口已补充到官网 https://hermes-studio.ai/,也可以继续从 GitHub Releases 获取最新安装包",new_0_6_7_2:"MCP 工具链继续完善:修复 bridge 工具发现与 MCP 管理生命周期,并在管理页支持按模型控制工具可见性",new_0_6_7_3:"消息列表体验优化:修复空状态居中、滚动抖动、历史会话加载串消息,并在切换会话时保留滚动位置与 1.5 秒淡入效果",new_0_6_7_4:"Bridge 与运行态更稳定:保持文本和 tool-call 顺序、修复 Profile runtime 状态加载、改进 Node/npm 检测,并避免生产环境自动创建数据目录",new_0_6_7_5:"Desktop 分发链路补齐 Electron 打包、应用命名、preload 构建、release artifact 上传、Windows Hermes CLI 启动、Linux 图标与可写数据路径、macOS 无证书跳过签名和 Windows 启动无窗口体验",new_0_6_7_6:"官网发布支持下载页和部署工作流,并修复没有 rsync 的环境下部署失败的问题",new_0_6_7_7:"服务端与认证修复:Windows 凭据目录使用 dirname 解析,头像上传 body 限制提高,避免大图触发 413",new_0_6_7_8:"补充 coding agents 仓库 harness、验证文档和 agent 指南,同时移除过期 setup script 文档"}},Si={login:{title:"QuantHermes Web UI",description:"輸入存取權杖以繼續。權杖可在伺服器啟動日誌中查看。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",defaultCredentialsHint:"預設登入名:quanthermes,預設密碼:12345678",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",lockResetHint:"如果這是你的伺服器,可以執行以下命令清除登入鎖定:",defaultLoginResetHint:"如需重置預設 quanthermes 密碼,可以執行:",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:"重試",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:"對話",search:"搜尋",apiRelay:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",mcp:"MCP",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",performance:"效能監控",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",devices:"裝置",groupConversation:"對話",groupConversationShort:"對話",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系統",groupSystemShort:"系統",groupMonitoring:"監控",groupMonitoringShort:"監控",groupTools:"工具",groupToolsShort:"工具",codingAgents:"編程工具",versionPreview:"版本預覽",settings:"設定",connected:"已連線",disconnected:"未連線",collapse:"收起選單",expand:"展開選單",updateTip:"定製版升級由內部發布流程管理",updateVersion:"升級版本 v{version}",reloadClientVersion:"重新整理到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,請稍後重新整理頁面,如長時間未啟動,請手動重新啟動服務",updateFailed:"更新失敗,請檢查內部更新源配置",updateSource:"更新源:{source}",updateManagedInternally:"目前為定製版,升級由內部發布流程管理",logout:"登出",nodeVersionWarning:"偵測到 Node.js v{version},請升級至 23 以上版本。",changelog:"更新日誌",noChangelog:"目前無更新日誌"},devices:{title:"裝置",count:"{count} 台裝置",lastScanned:"上次掃描:{time}",refresh:"重新整理",empty:"暫無裝置",computer:"電腦",endpointLabel:"端",statusLabel:"狀態",address:"位址",os:"系統",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"延遲",lastSeen:"最後發現",open:"開啟",never:"從未",unknown:"未知",loadFailed:"載入裝置失敗",scanFailed:"掃描裝置失敗",updateFailed:"更新裝置失敗",duplicateRequest:"已存在待處理的配對申請",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:"開始與 Quanthermes Agent 對話",outlineTitle:"會話大綱",outlineEmpty:"暫無會話內容",outlineUserQuestion:"使用者問題",inputPlaceholder:"輸入訊息... (Enter 發送,Shift+Enter 換行)",slashCommandArgs:{message:"<訊息>",title:"<標題>",text:"<文字>"},slashCommands:{usage:"計算目前會話用量",status:"查看會話狀態和佇列",abort:"停止目前 Bridge 執行",queue:"將訊息加入目前執行後的佇列",plan:"產生一份 Markdown 實作計畫",goal:"設定一個跨輪次持續推進的目標",goalStatus:"查看目前目標狀態",goalPause:"暫停目前目標循環",goalResume:"繼續已暫停的目標循環",goalDone:"完成並清除目前目標",goalClear:"清除目前目標",subgoal:"為目前目標追加驗收條件",clear:"清空目前顯示內容",clearHistory:"刪除目前會話已儲存的訊息歷史",title:"重新命名目前會話",compress:"空閒時觸發上下文壓縮",steer:"向目前 Bridge 執行傳送引導文字",destroy:"釋放目前會話的 Bridge Agent",reloadMcp:"重載 MCP 伺服器"},attachFiles:"新增附件",autoPlaySpeech:"自動播放語音",showToolCalls:"顯示工具呼叫",hideToolCalls:"隱藏工具呼叫",messageQueue:"訊息佇列",removeQueuedMessage:"移除佇列訊息",stop:"停止",start:"啟動",stopGateway:"停止閘道",send:"發送",contextUsed:"上下文已用:",sessions:"工作階段",webUiSessions:"工作階段",allProfiles:"全部設定",profileMissingModelsTip:"此工作階段所屬設定「{profile}」沒有可用的 provider 或模型",sessionScopeHint:"這裡只顯示目前工作階段;CLI、Telegram、Discord、Cron 等頻道工作階段在歷史中以唯讀方式查看。",openHistory:"開啟歷史",hermesHistory:"QuantHermes 歷史",historyScopeHint:"這裡按來源以唯讀方式查看 QuantHermes 歷史工作階段。",noSessions:"目前無工作階段",searchTitle:"搜尋工作階段",searchSubtitle:"依標題或訊息內容搜尋",searchScope:"搜尋範圍:僅 Web UI 本地工作階段資料庫;不包含唯讀 Hermes 歷史工作階段。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜尋工作階段...",searchEmpty:"最近工作階段",searchRecent:"最近工作階段",searchNoResults:"沒有符合的工作階段",searchNoSnippet:"沒有可顯示的摘要",searchEnterHint:"Enter 開啟 · Esc 關閉",searchFailed:"搜尋工作階段失敗",newChat:"新增對話",approvalKicker:"終端授權",approvalTitle:"執行前請確認命令",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:"重新命名",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:"重新命名失敗",renameSession:"重新命名工作階段",sessionNotFound:"找不到工作階段",enterNewTitle:"輸入新標題",workspace:"工作區",setWorkspace:"設定工作區",setWorkspaceTitle:"設定工作階段工作區",workspacePlaceholder:"輸入專案路徑,例如 /home/user/project",folderPickerEmpty:"(空)",folderPickerNoFolders:"暫無工作區資料夾",folderPickerSelected:"已選擇:",workspaceSet:"工作區已設定",workspaceSetFailed:"設定工作區失敗",other:"其他",runFailed:"執行失敗",error:"錯誤",tool:"工具",arguments:"參數",result:"結果",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 對話"},kanban:{title:"看板",createTask:"新增任務",noTasks:"目前無任務",allStatuses:"所有狀態",allAssignees:"所有負責人",board:{create:"新增看板",archive:"封存看板",slugPlaceholder:"看板識別碼,例如 project-a",namePlaceholder:"顯示名稱(選填)",slugRequired:"看板識別碼不能為空",created:"看板已建立",archived:"看板已封存",archiveConfirm:"確定封存目前看板?"},columns:{triage:"待分類",todo:"待辦",ready:"就緒",running:"進行中",blocked:"阻塞",done:"已完成",archived:"已封存"},form:{title:"標題",titlePlaceholder:"任務標題",titleRequired:"標題不能為空",body:"描述",bodyPlaceholder:"任務描述(選填)",assignee:"負責人",selectAssignee:"選擇負責人...",priority:"優先級",selectPriority:"選擇優先級..."},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:"關鍵資訊"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(選填)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"指派",assignTo:"指派給..."},message:{taskCreated:"任務已建立",taskCompleted:"任務已完成",taskBlocked:"任務已阻塞",taskUnblocked:"任務已解除阻塞",taskAssigned:"任務已指派",loadFailed:"載入任務失敗"},stats:{total:"總計",tasks:"任務數"}},jobs:{title:"排程任務",createJob:"建立任務",editJob:"編輯任務",noJobs:"目前無排程任務,建立一個開始吧。",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:"要執行的內容",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:"技能",searchPlaceholder:"搜尋技能...",noMatch:"沒有符合的技能",noSkills:"目前無技能",backTo:"返回",attachedFiles:"附件檔案",loadFailed:"載入技能失敗",fileLoadFailed:"載入檔案失敗",modified:"使用者已修改",archived:"已封存",pinned:"已釘選",pin:"釘選技能",unpin:"取消釘選",pinFailed:"變更釘選狀態失敗",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;新會話會自動載入。"},plugins:{title:"插件",refresh:"重新整理",notice:"唯讀顯示可發現的 QuantHermes 插件 manifest。發現元資料讀取不會載入插件程式碼。v1 管理動作仍保留在 CLI,新 QuantHermes 工作階段生效。",loadFailed:"載入插件失敗",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:"路徑 / 入口",cli:"CLI"},capabilities:{tools:"{count} 個工具",hooks:"{count} 個 hook",env:"{count} 個環境變數"},metadata:{agentRoot:"Agent 根目錄",python:"Python",scanCwd:"掃描 cwd",projectPlugins:"專案插件"}},memory:{title:"記憶",refresh:"重新整理",loadFailed:"載入記憶失敗",myNotes:"我的筆記",noNotes:"目前無筆記。",notesPlaceholder:"輸入筆記內容...",userProfile:"使用者畫像",noProfile:"目前無畫像。",profilePlaceholder:"輸入使用者畫像...",soul:"靈魂",noSoul:"目前無靈魂設定。",soulPlaceholder:"輸入靈魂設定..."},models:{title:"模型",searchPlaceholder:"搜尋模型...",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 已刪除",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 憑證,點擊「新增」即可在 QuantHermes 中啟用 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 將從 QuantHermes 清單移除。不會影響 gh CLI —— `gh auth status` 仍顯示已登入。",copilotDeleteHintAppsJson:"Copilot 將從 QuantHermes 清單移除。不會影響 VS Code Copilot 插件的登入。",customBadge:"自訂",previewBadge:"預覽",disabledBadge:"不可用",disabledTooltip:"此模型目前帳號不可用",customModelPlaceholder:"自訂模型名稱",customModelHint:"按 Enter 載入",removeCustomModel:"移除這個未列出的模型",noProviders:"目前無 Provider,新增一個開始吧。",models:"模型清單",count:"個模型",more:"個更多",builtIn:"內建",customType:"自訂",provider:"Provider",contextLength:"上下文長度",contextLengthPlaceholder:"例如 256000(選填)",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:"取消全選",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:"預設",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:"登入成功!"},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:"代理",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 回覆完成時播放提示音",busyInputMode:"忙碌輸入模式",busyInputModeHint:"AI 處理中仍可輸入",theme:"主題",themeHint:"選擇淺色、暗色或跟隨系統",themeLight:"淺色",themeDark:"暗色",themeSystem:"跟隨系統"},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。",mode:"Profile 策略",modeHint:"啟動所有發現到的 profiles,或只啟動白名單內的 profiles。",modeAll:"所有發現到的 profiles",modeInclude:"僅白名單 profiles",include:"白名單 profiles",includeHint:"逗號分隔 profile 名。白名單模式下留空表示不自動啟動任何 profile。",exclude:"排除 profiles",excludeHint:"逗號分隔 profile 名;會在白名單/全量策略之後再排除。",profileListPlaceholder:"default, reviewer"},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:"修改工作階段操作是否授權"},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"},userAvatar:{title:"使用者頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB,會自動壓縮到 500KB 以下",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},voice:{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:"未安裝",installNow:"安裝",installing:"安裝中",installSuccess:"安裝完成",installFailed:"安裝失敗",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",accessToken:"Access Token",accessTokenHint:"Matrix Access Token",homeserver:"Homeserver URL",homeserverHint:"Matrix 伺服器位址",appId:"App ID",appIdHint:"飛書 App ID",appSecret:"App Secret",appSecretHint:"飛書 App Secret",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:"智慧代理已新增",agentAlreadyInRoom:"該智慧代理已在房間中",agentAddFailedCount:"{count} 個智慧代理未新增:{details}",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",copyRoomLink:"複製房間連結",deleteRoomConfirm:"確定刪除這個房間嗎?",clearContext:"清理上下文",clearContextConfirm:"確定清理目前房間上下文嗎?訊息和壓縮快照會被刪除,智慧代理和成員會保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房間",joinFailed:"加入房間失敗",inputPlaceholder:"輸入訊息... (Enter 發送)",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:"追蹤 QuantHermes 工作階段中的技能載入與編輯",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_11_1:"LAN 裝置發現新增配對審批、申請歷史、重複申請處理、狀態同步,以及撤銷裝置權限時的清理邏輯",new_0_6_11_2:"LAN Peer 已接入 MCP,包含內建 MCP 啟動、命令 shim、Peer Socket 重連、本地連線列表,以及終端會話數量限制",new_0_6_11_3:"統一後端 TTS 合成和 MiMo 音色複刻設定已可用,並支援保存設定前試聽",new_0_6_11_4:"Gateway 自動啟動設定現在支援按 Profile 多選過濾、白名單行為和啟動 Profile 選擇測試",new_0_6_11_5:"聊天滾動和動效更穩定,修復初次進入滾動到底部、滾動鎖定、底部跟隨時機和 reduced-motion 淡入處理",new_0_6_11_6:"Agent Bridge 和運行時流程更可靠,修復 abort 超時、恢復時誤啟動、execute-code 授權記憶、Windows Gateway 恢復和開發終端代理",new_0_6_11_7:"安全性增強:加固 Web UI Origin 策略、安全回應標頭,並限制 server token 只能走本地回環訪問",new_0_6_11_8:"群聊和工具結果渲染更穩定,支援重連後重新加入房間、保留 reasoning/tool 邊界、加固工具 payload 渲染並優化 diff 展示",new_0_6_11_9:"技能和 Workspace 流程支援外部技能目錄、匯入/刪除自動刷新、按 sourcePath 分組、本地化資料夾選擇文案和移動端技能操作圖示",new_0_6_11_10:"裝置頁布局、原生會話標題、瀏覽器分頁標題、Kanban 父任務 ID 和 OpenRouter 歸屬文案做了介面優化",new_0_6_10_1:"桌面運行時啟動更可靠,支援下載來源選擇、更安全的壓縮包解壓、修正運行時快取路徑、Windows CLI 啟動修復,以及本地化進度和錯誤介面",new_0_6_10_2:"輔助壓縮模型設定允許每個 Profile 為聊天上下文壓縮選擇專用 provider/model,不再只能使用目前聊天模型",new_0_6_10_3:"Provider 模型目錄現在可在介面中手動刷新",new_0_6_10_4:"使用者可以上傳帳號頭像,群聊成員也會一致同步並展示帳號頭像",new_0_6_10_5:"Workspace 文件瀏覽支援更完整的文字預覽,並擴展源碼和文件檔案的右鍵選單覆蓋",new_0_6_10_6:"Agent Bridge 更可靠:會刷新工具審批 allowlist,並相容 Windows tasklist/taskkill 輸出解碼,避免 UnicodeDecodeError 崩潰",new_0_6_10_7:"官網文案統一展示為 Hermes Studio,同時保留 npm package、CLI、倉庫和環境變數等技術標識不變",new_0_6_10_8:"OpenAPI 文件補充頭像、輔助模型配置、Provider 模型快取刷新和 Hermes 會話匯入端點",new_0_6_10_9:"記憶備註現在可以保存為空內容,清空個人備註時不會再保存失敗",new_0_6_10_10:"倉庫 harness 文件現在會追蹤 Chat 鏈路變更,bridge 和 chat runtime 更新需要先記錄後才能通過 CI",new_0_6_9_1:"應用品牌統一為 Hermes Studio,涵蓋瀏覽器標題、側邊欄、官網標題、package metadata 和官網連結",new_0_6_9_2:"桌面端檢查更新更可靠:GitHub API 被限流或 tag 路徑缺少 metadata 時會走 release feed 備援",new_0_6_9_3:"macOS 桌面端安裝更新時會先停止本機 Web UI server,再交給 electron-updater 退出安裝,修復點擊重啟不安裝的問題",new_0_6_9_4:"Provider 憑證與認證更嚴格遵循 Profile 作用域,gateway/runtime 啟動也更相容桌面端打包環境",new_0_6_9_5:"瀏覽器 Web Speech 播放現在會在 Chrome 中暫停/恢復目前訊息,不再點擊暫停後從頭重播",new_0_6_9_6:"語言切換器新增俄語,本次合入社群貢獻的俄語用戶端介面翻譯",new_0_6_8_1:"桌面端補齊托盤控制、手動檢查更新、更新提示,以及從本機瀏覽器開啟打包 Web UI 的能力",new_0_6_8_2:"Windows 桌面端啟動更安靜也更穩定:隱藏 Python/bridge 子程序,修復終端機彈窗、托盤圖示尺寸和瀏覽器打包問題",new_0_6_8_3:"跨平台桌面打包更穩定:修復 macOS 簽名檔案數量限制、Linux 可寫路徑、runtime 冷啟動和 workflow checkout 問題",new_0_6_8_4:"官網與發佈鏈路改進:新增下載鏡像,桌面 release 後再部署官網,並清理桌面 smoke check 流程",new_0_6_8_5:"執行體驗繼續優化:優先使用 provider 上下文長度、保留未送出草稿、修復行動端版面溢出、SSH 檔案 Provider 自訂連接埠和非阻塞預覽操作",new_0_6_7_1:"桌面版預設使用 8748 連接埠,支援區域網路內存取,也可以直接用本機瀏覽器開啟 Web UI",new_0_6_7_9:"桌面端下載入口已補充到官網 https://hermes-studio.ai/,也可以繼續從 GitHub Releases 取得最新安裝包",new_0_6_7_2:"MCP 工具鏈繼續完善:修復 bridge 工具發現與 MCP 管理生命週期,並在管理頁支援按模型控制工具可見性",new_0_6_7_3:"訊息列表體驗優化:修復空狀態置中、捲動抖動、歷史會話載入串訊息,並在切換會話時保留捲動位置與 1.5 秒淡入效果",new_0_6_7_4:"Bridge 與執行狀態更穩定:保持文字和 tool-call 順序、修復 Profile runtime 狀態載入、改進 Node/npm 偵測,並避免正式環境自動建立資料目錄",new_0_6_7_5:"Desktop 發佈鏈路補齊 Electron 打包、應用命名、preload 建置、release artifact 上傳、Windows Hermes CLI 啟動、Linux 圖示與可寫資料路徑、macOS 無憑證跳過簽名和 Windows 啟動無視窗體驗",new_0_6_7_6:"官網發佈支援下載頁和部署工作流,並修復沒有 rsync 的環境下部署失敗的問題",new_0_6_7_7:"服務端與認證修復:Windows 憑據目錄使用 dirname 解析,頭像上傳 body 限制提高,避免大圖觸發 413",new_0_6_7_8:"補充 coding agents 倉庫 harness、驗證文件和 agent 指南,同時移除過期 setup script 文件"}},ki={login:{title:"QuantHermes Web UI",description:"アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",defaultCredentialsHint:"既定のユーザー名:quanthermes、既定のパスワード:12345678",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",lockResetHint:"自分のサーバーの場合は、次のコマンドでログインロックを解除できます:",defaultLoginResetHint:"既定の quanthermes パスワードをリセットするには、次を実行してください:",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:"再試行",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:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",mcp:"MCP",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",performance:"パフォーマンス",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",devices:"デバイス",groupChat:"グループチャット",groupConversation:"会話",groupConversationShort:"会話",groupAgent:"エージェント",groupAgentShort:"エージェント",groupSystem:"システム",groupSystemShort:"シス",groupMonitoring:"監視",groupMonitoringShort:"監視",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:"カスタム版の更新は社内リリース手順で管理されます",updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました。内部更新ソース設定を確認してください。",updateSource:"更新元: {source}",updateManagedInternally:"カスタム版: 更新は内部リリース手順で管理されます",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません",kanban:"カンバン",groupTools:"ツール",groupToolsShort:"ツール",codingAgents:"コーディングエージェント",versionPreview:"バージョンプレビュー",groupPlatform:"プラットフォーム",gateways:"ゲートウェイ",expand:"メニューを展開",collapse:"メニューを折りたたむ"},devices:{title:"デバイス",count:"{count} 台のデバイス",lastScanned:"最終スキャン: {time}",refresh:"更新",empty:"デバイスが見つかりません",computer:"コンピューター",endpointLabel:"エンドポイント",statusLabel:"ステータス",address:"アドレス",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"レイテンシ",lastSeen:"最終検出",open:"開く",never:"なし",unknown:"不明",loadFailed:"デバイスの読み込みに失敗しました",scanFailed:"デバイスのスキャンに失敗しました",updateFailed:"デバイスの更新に失敗しました",duplicateRequest:"保留中のペアリング申請がすでにあります",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:"Quanthermes Agent と会話を開始しましょう",outlineTitle:"会話アウトライン",outlineEmpty:"会話内容はありません",outlineUserQuestion:"ユーザーの質問",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",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 サーバーを再読み込み"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",allProfiles:"すべてのプロファイル",profileMissingModelsTip:"このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"QuantHermes 履歴",historyScopeHint:"ソース別にグループ化された QuantHermes 履歴セッションを読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",approvalKicker:"ターミナル権限",approvalTitle:"実行前にコマンドを確認",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:"名前変更",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:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",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:"音声を自動再生"},jobs:{title:"スケジュールジョブ",createJob:"ジョブを作成",editJob:"ジョブを編集",noJobs:"スケジュールジョブがありません。作成して始めましょう。",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:"実行するプロンプト",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:"スキル",searchPlaceholder:"スキルを検索...",noMatch:"検索に一致するスキルがありません",noSkills:"スキルがありません",backTo:"戻る",attachedFiles:"添付ファイル",loadFailed:"スキルの読み込みに失敗しました",fileLoadFailed:"ファイルの読み込みに失敗しました",modified:"ユーザー変更あり",archived:"アーカイブ済み",pinned:"ピン留め",pin:"スキルをピン留め",unpin:"ピン留めを解除",pinFailed:"ピン留め状態の変更に失敗しました",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 を実行してください。新規セッションは自動で読み込みます。"},plugins:{title:"プラグイン",refresh:"更新",notice:"検出可能な QuantHermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい QuantHermes セッションで有効になります。",loadFailed:"プラグインの読み込みに失敗しました",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"エージェントルート",python:"Python",scanCwd:"cwd をスキャン",projectPlugins:"プロジェクトプラグイン"}},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:"プロバイダーを削除しました",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 トークンを検出しました。「追加」をクリックして QuantHermes で 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 は QuantHermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。",copilotDeleteHintAppsJson:"Copilot は QuantHermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。",customBadge:"カスタム",previewBadge:"プレビュー",disabledBadge:"利用不可",disabledTooltip:"このモデルは現在のアカウントでは利用できません。",customModelPlaceholder:"未掲載のモデル ID",customModelHint:"プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。",noProviders:"プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。",clearVisibleModels:"選択をクリア",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:"デフォルト",builtIn:"組み込み",customType:"カスタム",provider:"プロバイダー",contextLength:"コンテキスト長",contextLengthPlaceholder:"例: 256000(任意)",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:"ログイン成功!",visibilitySelectOne:"少なくとも 1 つの表示モデルを残してください",visibilitySaved:"表示モデルを保存しました",visibilitySaveFailed:"表示モデルの保存に失敗しました",visibilityHint:"Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。",showAllModels:"すべてのモデルを表示",searchPlaceholder:"モデルを検索...",removeCustomModel:"この一覧外モデルを削除",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:"エージェント",memory:"メモリ",compression:"圧縮",session:"セッション",privacy:"プライバシー",apiServer:"API サーバー",models:"モデル",voice:"音声"},display:{streaming:"ストリームレスポンス",streamingHint:"AI の返信をリアルタイムで表示",compact:"コンパクトモード",compactHint:"メッセージの間隔を狭める",showReasoning:"推論過程を表示",showReasoningHint:"モデルの思考プロセスを表示",showCost:"コストを表示",showCostHint:"返信にトークン使用量を表示",inlineDiffs:"インライン差分",inlineDiffsHint:"コード変更をインラインで表示",bellOnComplete:"完了通知音",bellOnCompleteHint:"AI の応答完了時に通知音を再生",busyInputMode:"処理中入力モード",busyInputModeHint:"AI 処理中でも入力を許可",theme:"テーマ",themeHint:"ライト、ダーク、またはシステム設定に従う",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム"},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 を自動起動しません。",mode:"Profile ポリシー",modeHint:"検出されたすべての profiles を起動するか、明示的な許可リストだけを起動します。",modeAll:"検出されたすべての profiles",modeInclude:"含めた profiles のみ",include:"含める profiles",includeHint:"カンマ区切りの profile 名。include モードで空リストの場合は何も起動しません。",exclude:"除外する profiles",excludeHint:"include/all ポリシー適用後にスキップする profile 名をカンマ区切りで指定します。",profileListPlaceholder:"default, reviewer"},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:"セッション操作に認証を必要とする"},privacy:{redactPii:"個人情報のマスキング",redactPiiHint:"機密情報を自動検出して隠す(パスワード、キーなど)"},apiServer:{enable:"有効化",enableHint:"API サーバーを有効にする",host:"ホスト",hostHint:"リッスンアドレス",port:"ポート",portHint:"リッスンポート",key:"キー",keyHint:"API アクセスキー",cors:"CORS 許可元",corsHint:"許可するクロスオリジン"},voice:{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をロック解除しました"},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:"未インストール",installNow:"インストール",installing:"インストール中",installSuccess:"インストールしました",installFailed:"インストールに失敗しました",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:"開発者ポータルから取得したボットトークン",accessToken:"アクセストークン",accessTokenHint:"Matrix アクセストークン",homeserver:"Homeserver URL",homeserverHint:"Matrix ホームサーバー URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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:"Account 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:"QuantHermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_6_11_1:"LAN device discovery に pairing approvals、request history、duplicate request handling、status sync、device access revoke 時の cleanup を追加しました",new_0_6_11_2:"LAN peer access は MCP から利用でき、bundled MCP startup、command shims、reconnecting peer sockets、local connection listing、terminal session caps に対応しました",new_0_6_11_3:"Unified backend TTS synthesis と MiMo voice cloning settings が利用可能になり、保存前の playback に対応しました",new_0_6_11_4:"Gateway autostart settings は Profile の multi-select filtering、whitelist behavior、startup profile selection tests に対応しました",new_0_6_11_5:"Chat scrolling と motion は bottom-follow tuning、initial bottom scroll fixes、scroll lock updates、reduced-motion fade handling により安定しました",new_0_6_11_6:"Agent Bridge と runtime flows は abort timeout handling、resume startup guards、execute-code approval memory、Windows Gateway recovery、dev terminal proxy fixes により安定しました",new_0_6_11_7:"Web UI origin policy、security headers、server-token loopback access guards により security を強化しました",new_0_6_11_8:"Group chat と tool output rendering は reconnect 後の room rejoin、reasoning/tool boundaries の保持、より安全な tool payload rendering、改善された diff display により安定しました",new_0_6_11_9:"Skills と Workspace flows は external skill directories、import/delete refresh、sourcePath grouping、localized folder picker text、mobile skill action icons に対応しました",new_0_6_11_10:"Device layout、session titles、browser tab titles、Kanban parent task IDs、OpenRouter attribution text を改善しました",new_0_6_10_1:"公式サイトの文言を Hermes Studio に統一し、npm package、CLI、repository、環境変数の識別子はそのまま保持しました",new_0_6_10_2:"Desktop の起動と runtime download 画面が、service startup、source selection、progress、error state のローカライズ文言に対応しました",new_0_6_10_3:"Windows Agent Bridge の process check がローカライズされた tasklist/taskkill 出力を許容し、非 UTF-8 system command output による UnicodeDecodeError crash を回避します",new_0_6_10_4:"OpenAPI docs に avatar、auxiliary model config、provider model cache refresh、Hermes session import endpoints を追加しました",new_0_6_10_5:"Workspace file browser がより充実した text preview と source/document files の context menu coverage に対応しました",new_0_6_10_6:"Agent Bridge は tool approval allowlist の更新と Windows tasklist/taskkill output decoding により、より安定しました",new_0_6_10_7:"ユーザーは profile avatar をアップロードでき、group chat members は account avatar を一貫して同期・表示します",new_0_6_10_8:"Provider model catalog を UI から refresh できるようになりました",new_0_6_10_9:"Memory notes は空の内容でも保存できるようになり、personal notes の clear が保存失敗になりません",new_0_6_10_10:"Repository harness docs が chat-chain changes を追跡し、bridge と chat-runtime updates は CI 通過前に文書化されます",new_0_6_9_1:"アプリのブランドを Hermes Studio に統一し、ブラウザタイトル、サイドバー、Web サイトタイトル、package metadata、公式サイトリンクに反映しました",new_0_6_9_2:"GitHub API の rate limit や tag 別 metadata 欠落時に release feed fallback を使い、Desktop の更新チェックがより安定しました",new_0_6_9_3:"macOS Desktop の更新インストールは先にローカル Web UI server を停止し、electron-updater に終了とインストールを任せるため Restart で正しく適用されます",new_0_6_9_4:"Provider 認証情報と auth は Profile scope をより一貫して扱い、gateway/runtime 起動も packaged Desktop により適合しました",new_0_6_9_5:"Browser Web Speech は Chrome で現在のメッセージを一時停止/再開し、停止ボタンで先頭から再生し直さないようになりました",new_0_6_9_6:"言語切り替えにロシア語を追加し、community による client UI message 翻訳を取り込みました",new_0_6_8_1:"Desktop build に tray control、手動 update check、update notification、packaged Web UI の local browser open を追加しました",new_0_6_8_2:"Windows Desktop は Python/bridge subprocess 非表示、terminal popup 修正、tray icon sizing、browser packaging 修正でより静かで安定した起動になりました",new_0_6_8_3:"Desktop packaging は macOS signing file limit、Linux writable path、runtime cold start、workflow checkout 修正で各 platform の安定性が向上しました",new_0_6_8_4:"公式サイトと release 配布は download mirrors、Desktop release 後の website deploy、desktop smoke check cleanup により改善しました",new_0_6_8_5:"Provider context length 優先、未送信 chat draft 保持、mobile layout overflow 修正、SSH File Provider custom port、nonblocking preview actions で runtime 体験を改善しました",new_0_6_7_1:"Desktop アプリは既定で port 8748 を使用し、LAN アクセスとローカルブラウザからの直接アクセスに対応しました",new_0_6_7_9:"Desktop のダウンロードリンクを公式サイト https://hermes-studio.ai/ に追加し、最新インストーラーは引き続き GitHub Releases からも取得できます",new_0_6_7_2:"MCP ツールは bridge の tool discovery 修正、MCP 管理ライフサイクル修正、管理画面のモデル別 tool visibility によりさらに整備されました",new_0_6_7_3:"メッセージ一覧は empty state の中央揃え、scroll jitter、History 読み込み中のライブチャット混入を修正し、セッション別スクロール位置保持と 1.5 秒のフェードインに対応しました",new_0_6_7_4:"Bridge と runtime は text/tool-call の順序保持、Profile runtime status loading 修正、Node/npm 検出改善、本番 data directory 作成スキップで安定しました",new_0_6_7_5:"Desktop 配布は Electron packaging、アプリ名、preload build、release artifact upload、Windows Hermes CLI 起動、Linux icon と書き込み可能 data path、macOS 未署名対応、Windows 起動時の非表示 subprocess に対応しました",new_0_6_7_6:"Web サイトに downloads と deploy workflow を追加し、rsync がない環境での deploy 失敗を修正しました",new_0_6_7_7:"Server と auth は Windows credential directory に dirname を使い、大きな avatar 画像で 413 にならないよう body limit を引き上げました",new_0_6_7_8:"Coding Agents 向けに repository harness、validation docs、agent guidance を追加し、古い setup script docs を削除しました"},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:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",agentAddFailedCount:"{count} 件のエージェントを追加できませんでした: {details}",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",copyRoomLink:"ルームリンクをコピー",deleteRoomConfirm:"このルームを削除しますか?",clearContext:"コンテキストを削除",clearContextConfirm:"このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。",contextCleared:"コンテキストを削除しました",you:"あなた",joined:"ルームに参加しました",joinFailed:"ルームへの参加に失敗しました",inputPlaceholder:"メッセージを入力... (Enterで送信)",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 の停止に失敗しました"},kanban:{title:"Kanban ボード",createTask:"新規タスク",noTasks:"タスクはありません",allStatuses:"すべての状態",allAssignees:"すべての担当者",columns:{triage:"振り分け待ち",todo:"未着手",ready:"準備完了",running:"進行中",blocked:"ブロック中",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:"優先度を選択..."},detail:{status:"状態",priority:"優先度",assignee:"担当者",tenant:"テナント",createdAt:"作成時刻",startedAt:"開始時刻",completedAt:"完了時刻",comments:"コメント",events:"イベント",runs:"実行履歴",artifacts:"成果物",result:"完了結果",highlights:"重要情報",sources:"データソース",sessions:"関連セッション",sessionMessages:"セッション記録",noSessions:"関連セッションが見つかりません。"},action:{title:"操作",assign:"割り当て",assignTo:"割り当て先...",block:"ブロック",blockReason:"ブロック理由",unblock:"ブロック解除",complete:"完了",completeSummary:"完了サマリー(任意)"},message:{loadFailed:"タスクの読み込みに失敗しました",taskCreated:"タスクを作成しました",taskAssigned:"タスクを割り当てました",taskBlocked:"タスクをブロックしました",taskUnblocked:"タスクのブロックを解除しました",taskCompleted:"タスクを完了しました"},stats:{total:"合計",tasks:"タスク数"}}},wi={login:{title:"QuantHermes Web UI",description:"계속하려면 액세스 토큰을 입력하세요. 서버 시작 로그에서 확인할 수 있습니다.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",defaultCredentialsHint:"기본 로그인 이름: quanthermes, 기본 비밀번호: 12345678",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",lockResetHint:"본인 서버라면 다음 명령으로 로그인 잠금을 해제할 수 있습니다:",defaultLoginResetHint:"기본 quanthermes 비밀번호를 재설정하려면 다음을 실행하세요:",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:"재시도",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:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",mcp:"MCP",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",performance:"성능 모니터링",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",devices:"기기",groupChat:"그룹 채팅",groupConversation:"대화",groupConversationShort:"대화",groupAgent:"에이전트",groupAgentShort:"에전",groupSystem:"시스템",groupSystemShort:"시스템",groupMonitoring:"모니터링",groupMonitoringShort:"모니터",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:"커스텀 빌드 업데이트는 내부 배포 절차로 관리됩니다",updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트에 실패했습니다. 내부 업데이트 소스 구성을 확인하세요.",updateSource:"업데이트 소스: {source}",updateManagedInternally:"커스텀 빌드: 업데이트는 내부 배포 절차로 관리됩니다",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다",kanban:"칸반",groupTools:"도구",groupToolsShort:"도구",codingAgents:"코딩 에이전트",versionPreview:"버전 미리보기",groupPlatform:"플랫폼",gateways:"게이트웨이",expand:"메뉴 펼치기",collapse:"메뉴 접기"},devices:{title:"기기",count:"기기 {count}개",lastScanned:"마지막 스캔: {time}",refresh:"새로고침",empty:"기기를 찾을 수 없습니다",computer:"컴퓨터",endpointLabel:"엔드포인트",statusLabel:"상태",address:"주소",os:"OS",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"지연 시간",lastSeen:"마지막 발견",open:"열기",never:"없음",unknown:"알 수 없음",loadFailed:"기기를 불러오지 못했습니다",scanFailed:"기기 스캔에 실패했습니다",updateFailed:"기기를 업데이트하지 못했습니다",duplicateRequest:"대기 중인 페어링 요청이 이미 있습니다",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:"Quanthermes Agent와 대화를 시작하세요",outlineTitle:"대화 개요",outlineEmpty:"대화 내용이 없습니다",outlineUserQuestion:"사용자 질문",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",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 서버 다시 로드"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",allProfiles:"모든 프로필",profileMissingModelsTip:'이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"QuantHermes 기록",historyScopeHint:"소스별로 그룹화된 QuantHermes 기록 세션을 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",approvalKicker:"터미널 권한",approvalTitle:"실행 전에 명령 확인",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:"이름 변경",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:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",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:"음성 자동 재생"},jobs:{title:"예약 작업",createJob:"작업 생성",editJob:"작업 편집",noJobs:"예약된 작업이 없습니다. 새로 만들어 시작하세요.",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:"실행할 프롬프트",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:"스킬",searchPlaceholder:"스킬 검색...",noMatch:"검색과 일치하는 스킬이 없습니다",noSkills:"스킬을 찾을 수 없습니다",backTo:"돌아가기",attachedFiles:"첨부 파일",loadFailed:"스킬을 불러오지 못했습니다",fileLoadFailed:"파일을 불러오지 못했습니다",modified:"사용자 수정됨",archived:"보관됨",pinned:"고정됨",pin:"스킬 고정",unpin:"고정 해제",pinFailed:"고정 상태 변경 실패",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 실행. 새 세션은 자동 로드됩니다."},plugins:{title:"플러그인",refresh:"새로고침",notice:"탐색 가능한 QuantHermes 플러그인 manifest의 읽기 전용 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. v1의 관리 작업은 CLI에 유지되며, 변경 사항은 새 QuantHermes 세션에서 적용됩니다.",loadFailed:"플러그인을 불러오지 못했습니다",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",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"에이전트 루트",python:"Python",scanCwd:"cwd 스캔",projectPlugins:"프로젝트 플러그인"}},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가 삭제되었습니다",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 토큰이 감지되었습니다. 추가를 클릭하여 QuantHermes에서 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이 QuantHermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.",copilotDeleteHintAppsJson:"Copilot이 QuantHermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.",customBadge:"커스텀",previewBadge:"프리뷰",disabledBadge:"사용 불가",disabledTooltip:"이 모델은 현재 계정에서 사용할 수 없습니다.",customModelPlaceholder:"목록에 없는 모델 ID",customModelHint:"제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.",noProviders:"Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.",clearVisibleModels:"선택 지우기",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:"기본값",builtIn:"내장",customType:"사용자 지정",provider:"공급자",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 256000 (선택사항)",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:"로그인 성공!",visibilitySelectOne:"최소 하나의 표시 모델을 유지하세요",visibilitySaved:"표시 모델이 저장되었습니다",visibilitySaveFailed:"표시 모델 저장 실패",visibilityHint:"Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.",showAllModels:"모든 모델 표시",searchPlaceholder:"모델 검색...",removeCustomModel:"목록에 없는 이 모델 제거",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:"에이전트",memory:"메모리",compression:"압축",session:"세션",privacy:"개인정보",apiServer:"API 서버",models:"모델",voice:"음성"},display:{streaming:"스트리밍 응답",streamingHint:"AI 응답을 실시간으로 표시",compact:"컴팩트 모드",compactHint:"메시지 간격 줄이기",showReasoning:"추론 과정 표시",showReasoningHint:"모델의 생각 과정 표시",showCost:"비용 표시",showCostHint:"응답에 토큰 사용량 표시",inlineDiffs:"인라인 변경사항",inlineDiffsHint:"코드 변경사항을 인라인으로 표시",bellOnComplete:"완료 알림음",bellOnCompleteHint:"AI 응답 완료 시 알림음 재생",busyInputMode:"바쁨 입력 모드",busyInputModeHint:"AI 처리 중에도 입력 허용",theme:"테마",themeHint:"라이트, 다크 또는 시스템 설정 따르기",themeLight:"라이트",themeDark:"다크",themeSystem:"시스템"},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도 자동으로 실행하지 않습니다.",mode:"Profile 정책",modeHint:"발견된 모든 profiles를 시작하거나 명시적으로 포함한 목록만 시작합니다.",modeAll:"발견된 모든 profiles",modeInclude:"포함된 profiles만",include:"포함할 profiles",includeHint:"쉼표로 구분한 profile 이름입니다. 포함 모드에서 빈 목록은 아무것도 시작하지 않습니다.",exclude:"제외할 profiles",excludeHint:"include/all 정책 적용 후 건너뛸 profile 이름을 쉼표로 구분해 입력합니다.",profileListPlaceholder:"default, reviewer"},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:"세션 작업에 인증 필요"},privacy:{redactPii:"개인정보 마스킹",redactPiiHint:"민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)"},apiServer:{enable:"활성화",enableHint:"API 서버 활성화",host:"호스트",hostHint:"수신 주소",port:"포트",portHint:"수신 포트",key:"키",keyHint:"API 접근 키",cors:"CORS 출처",corsHint:"허용된 교차 출처"},voice:{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 잠금 해제됨"},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:"설치되지 않음",installNow:"설치",installing:"설치 중",installSuccess:"설치됨",installFailed:"설치 실패",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:"Bot Token",botTokenHint:"개발자 포털에서 발급받은 Bot Token",accessToken:"Access Token",accessTokenHint:"Matrix 액세스 토큰",homeserver:"Homeserver URL",homeserverHint:"Matrix 홈서버 URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",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 Token",weixinTokenHint:"weixin CLI QR 로그인에서 가져오기 (hermes weixin)",accountId:"Account ID",accountIdHint:"Weixin Account 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:"QuantHermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_6_11_1:"LAN device discovery 에 pairing approvals, request history, duplicate request handling, status sync, device access revoke 시 cleanup 이 추가되었습니다",new_0_6_11_2:"LAN peer access 는 MCP 에서 사용할 수 있으며 bundled MCP startup, command shims, reconnecting peer sockets, local connection listing, terminal session caps 를 지원합니다",new_0_6_11_3:"Unified backend TTS synthesis 와 MiMo voice cloning settings 를 사용할 수 있고 저장 전 playback 을 지원합니다",new_0_6_11_4:"Gateway autostart settings 가 Profile multi-select filtering, whitelist behavior, startup profile selection tests 를 지원합니다",new_0_6_11_5:"Chat scrolling 과 motion 이 bottom-follow tuning, initial bottom scroll fixes, scroll lock updates, reduced-motion fade handling 으로 더 안정적입니다",new_0_6_11_6:"Agent Bridge 와 runtime flows 가 abort timeout handling, resume startup guards, execute-code approval memory, Windows Gateway recovery, dev terminal proxy fixes 로 더 안정적입니다",new_0_6_11_7:"Web UI origin policy, security headers, server-token loopback access guards 로 security 가 강화되었습니다",new_0_6_11_8:"Group chat 과 tool output rendering 이 reconnect 후 room rejoin, reasoning/tool boundaries 보존, 더 안전한 tool payload rendering, 개선된 diff display 로 안정화되었습니다",new_0_6_11_9:"Skills 와 Workspace flows 가 external skill directories, import/delete refresh, sourcePath grouping, localized folder picker text, mobile skill action icons 를 지원합니다",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs, OpenRouter attribution text 가 개선되었습니다",new_0_6_10_1:"공식 사이트 문구를 Hermes Studio 로 일관되게 표시하며 npm package, CLI, repository, 환경 변수 식별자는 그대로 유지합니다",new_0_6_10_2:"Desktop 시작 및 runtime download 화면이 service startup, source selection, progress, error state 에 대한 현지화 문구를 사용합니다",new_0_6_10_3:"Windows Agent Bridge process check 가 현지화된 tasklist/taskkill 출력을 허용하여 비 UTF-8 system command output 으로 인한 UnicodeDecodeError crash 를 방지합니다",new_0_6_10_4:"OpenAPI docs 에 avatar, auxiliary model config, provider model cache refresh, Hermes session import endpoints 가 추가되었습니다",new_0_6_10_5:"Workspace file browser 가 더 풍부한 text preview 와 source/document files 용 context menu coverage 를 지원합니다",new_0_6_10_6:"Agent Bridge 는 tool approval allowlist 갱신과 Windows tasklist/taskkill output decoding 으로 더 안정적입니다",new_0_6_10_7:"사용자가 profile avatar 를 업로드할 수 있고 group chat members 가 account avatar 를 일관되게 동기화하고 표시합니다",new_0_6_10_8:"Provider model catalog 를 UI 에서 refresh 할 수 있습니다",new_0_6_10_9:"Memory notes 를 빈 내용으로 저장할 수 있어 personal notes 를 저장 실패 없이 비울 수 있습니다",new_0_6_10_10:"Repository harness docs 가 chat-chain changes 를 추적하여 bridge 와 chat-runtime updates 가 CI 통과 전에 문서화됩니다",new_0_6_9_1:"앱 브랜드를 Hermes Studio 로 통일하고 브라우저 제목, 사이드바, 웹사이트 제목, package metadata, 공식 사이트 링크에 반영했습니다",new_0_6_9_2:"GitHub API rate limit 이나 tag metadata 누락 시 release feed fallback 을 사용해 Desktop 업데이트 확인이 더 안정적입니다",new_0_6_9_3:"macOS Desktop 업데이트 설치는 먼저 로컬 Web UI server 를 중지한 뒤 electron-updater 가 종료와 설치를 처리해 Restart 로 다운로드 버전을 적용합니다",new_0_6_9_4:"Provider 자격 증명과 auth 는 Profile scope 를 더 일관되게 따르며 gateway/runtime 시작도 패키징된 Desktop 실행과 더 호환됩니다",new_0_6_9_5:"Browser Web Speech 는 Chrome 에서 현재 메시지를 일시정지/재개하며 일시정지 클릭 시 처음부터 다시 재생하지 않습니다",new_0_6_9_6:"언어 전환기에 러시아어가 추가되었으며 커뮤니티가 번역한 client UI 메시지를 포함합니다",new_0_6_8_1:"Desktop build 에 tray control, 수동 update check, update notification, 패키징된 Web UI 의 local browser open 을 추가했습니다",new_0_6_8_2:"Windows Desktop 은 숨김 Python/bridge subprocess, terminal popup 수정, tray icon 크기 수정, browser packaging 수정으로 더 조용하고 안정적으로 시작합니다",new_0_6_8_3:"Desktop packaging 은 macOS signing file limit, Linux writable path, runtime cold start, workflow checkout 수정으로 플랫폼 전반의 안정성이 향상되었습니다",new_0_6_8_4:"공식 사이트와 release 배포는 download mirrors, Desktop release 이후 website deploy, desktop smoke check 정리로 개선되었습니다",new_0_6_8_5:"Provider context length 우선 사용, 미전송 chat draft 보존, mobile layout overflow 수정, SSH File Provider custom port, nonblocking preview actions 로 runtime 경험을 개선했습니다",new_0_6_7_1:"Desktop 앱은 기본적으로 8748 포트를 사용하며 LAN 접근과 로컬 브라우저 직접 열기를 지원합니다",new_0_6_7_9:"Desktop 다운로드 링크가 공식 웹사이트 https://hermes-studio.ai/ 에 추가되었으며 최신 설치 파일은 GitHub Releases 에서도 계속 받을 수 있습니다",new_0_6_7_2:"MCP 도구는 bridge tool discovery 수정, MCP 관리 라이프사이클 수정, 관리자 화면의 모델별 tool visibility 제어로 더 완성되었습니다",new_0_6_7_3:"메시지 목록은 빈 상태 중앙 정렬, 스크롤 튐, History 로딩 중 라이브 채팅 메시지 노출을 수정하고 세션별 스크롤 위치 보존과 1.5초 페이드인을 지원합니다",new_0_6_7_4:"Bridge 와 runtime 은 text/tool-call 순서 보존, Profile runtime status loading 수정, Node/npm 감지 개선, 운영 데이터 디렉터리 생성 생략으로 더 안정적입니다",new_0_6_7_5:"Desktop 배포는 Electron packaging, 앱 이름, preload build, release artifact upload, Windows Hermes CLI 시작, Linux 아이콘과 쓰기 가능한 데이터 경로, macOS 서명 인증서 없음 처리, Windows 시작 시 숨김 subprocess 를 포함합니다",new_0_6_7_6:"웹사이트에 downloads 와 deploy workflow 를 추가하고 rsync 가 없는 환경의 deploy 실패를 수정했습니다",new_0_6_7_7:"Server 와 auth 는 Windows credential directory 에 dirname 을 사용하고 큰 avatar 이미지의 413 오류를 피하도록 body limit 를 높였습니다",new_0_6_7_8:"Coding Agents 를 위한 repository harness, validation docs, agent guidance 를 추가하고 오래된 setup script docs 를 제거했습니다"},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:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",agentAddFailedCount:"{count}개의 에이전트를 추가하지 못했습니다: {details}",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",copyRoomLink:"방 링크 복사",deleteRoomConfirm:"이 방을 삭제하시겠습니까?",clearContext:"컨텍스트 지우기",clearContextConfirm:"이 방의 컨텍스트를 지우시겠습니까? 메시지와 압축 스냅샷은 삭제되고 에이전트와 멤버는 유지됩니다.",contextCleared:"컨텍스트가 지워졌습니다",you:"나",joined:"방에 참여했습니다",joinFailed:"방 참여에 실패했습니다",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송)",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 중지 실패"},kanban:{title:"Kanban 보드",createTask:"새 작업",noTasks:"작업 없음",allStatuses:"모든 상태",allAssignees:"모든 담당자",columns:{triage:"분류 대기",todo:"할 일",ready:"준비됨",running:"진행 중",blocked:"차단됨",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:"우선순위 선택..."},detail:{status:"상태",priority:"우선순위",assignee:"담당자",tenant:"테넌트",createdAt:"생성 시간",startedAt:"시작 시간",completedAt:"완료 시간",comments:"댓글",events:"이벤트",runs:"실행 기록",artifacts:"산출 파일",result:"완료 결과",highlights:"핵심 정보",sources:"데이터 소스",sessions:"관련 세션",sessionMessages:"세션 기록",noSessions:"관련 세션을 찾을 수 없습니다."},action:{title:"작업",assign:"할당",assignTo:"할당 대상...",block:"차단",blockReason:"차단 이유",unblock:"차단 해제",complete:"완료",completeSummary:"완료 요약 (선택)"},message:{loadFailed:"작업 로드 실패",taskCreated:"작업이 생성되었습니다",taskAssigned:"작업이 할당되었습니다",taskBlocked:"작업이 차단되었습니다",taskUnblocked:"작업 차단이 해제되었습니다",taskCompleted:"작업이 완료되었습니다"},stats:{total:"합계",tasks:"작업 수"}}},Ci={login:{title:"QuantHermes Web UI",description:"Entrez votre jeton d'acces pour continuer. Retrouvez-le dans les journaux de demarrage du serveur.",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 : quanthermes. Mot de passe par defaut : 12345678.",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 par defaut de quanthermes, 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",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",search:"Rechercher",apiRelay:"API Relay",history:"Historique",jobs:"Taches planifiees",models:"Modeles",profiles:"Profils",plugins:"Plugins",mcp:"MCP",skills:"Competences",memory:"Memoire",logs:"Journaux",usage:"Utilisation",performance:"Performance",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",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:"Les mises a jour des builds personnalises sont gerees en interne",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. Verifiez la source interne.",updateSource:"Source de mise a jour : {source}",updateManagedInternally:"Build personnalise : les mises a jour sont gerees en interne",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible",kanban:"Kanban",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"},devices:{title:"Appareils",count:"{count} appareils",lastScanned:"Dernier scan : {time}",refresh:"Actualiser",empty:"Aucun appareil trouvé",computer:"Ordinateur",endpointLabel:"Point de terminaison",statusLabel:"Statut",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Joindre des fichiers",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 QuantHermes",historyScopeHint:"Sessions d’historique QuantHermes en lecture seule, regroupées par source.",noSessions:"Aucune session",newChat:"Nouvelle discussion",approvalKicker:"Permission terminal",approvalTitle:"Vérifier la commande avant exécution",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",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",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",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",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"},jobs:{title:"Taches planifiees",createJob:"Creer une tache",editJob:"Modifier la tache",noJobs:"Aucune tache planifiee. Creez-en une pour commencer.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Actualiser",notice:"Inventaire en lecture seule des manifests de plugins QuantHermes détectables. Les métadonnées de découverte sont lues sans charger le code des plugins. En v1, la gestion reste dans le CLI; les changements prennent effet dans les nouvelles sessions QuantHermes.",loadFailed:"Échec du chargement des plugins",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",cli:"CLI"},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"}},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",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 QuantHermes.",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 QuantHermes. 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",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",builtIn:"Integre",customType:"Personnalise",provider:"Fournisseur",contextLength:"Longueur du contexte",contextLengthPlaceholder:"ex. 256000 (facultatif)",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 !",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...",removeCustomModel:"Retirer ce modèle non listé",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",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",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"},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.",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"},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:"Requiere l'autorisation pour les operations de session"},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:{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"},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é",installNow:"Installer",installing:"Installation",installSuccess:"Installé",installFailed:"Échec de l’installation",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",accessToken:"Jeton d'acces",accessTokenHint:"Jeton d'acces Matrix",homeserver:"URL du serveur domestique",homeserverHint:"URL du serveur domestique Matrix",appId:"ID de l'application",appIdHint:"ID de l'application Feishu",appSecret:"Secret de l'application",appSecretHint:"Secret de l'application 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 QuantHermes",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_11_1:"La decouverte des appareils LAN inclut maintenant les approbations de pairing, l historique des demandes, la gestion des doublons, la synchronisation de statut et le nettoyage lors de la revocation d acces",new_0_6_11_2:"L acces LAN peer est disponible via MCP avec demarrage MCP integre, command shims, peer sockets avec reconnexion, liste des connexions locales et sessions terminal limitees",new_0_6_11_3:"La synthese TTS backend unifiee et les reglages de clonage vocal MiMo sont disponibles, avec lecture avant enregistrement",new_0_6_11_4:"Les reglages Gateway autostart exposent le filtrage Profile via controles multi-select, le comportement whitelist et des tests de selection du Profile de demarrage",new_0_6_11_5:"Le scroll et les animations du chat sont plus stables avec bottom-follow tuning, initial bottom scroll fixes, scroll lock updates et gestion du fade reduced-motion",new_0_6_11_6:"Agent Bridge et les flux runtime sont plus fiables avec abort timeout handling, resume startup guards, memoire d approbation execute-code, recuperation Windows Gateway et fixes du proxy terminal dev",new_0_6_11_7:"La securite est renforcee avec Web UI origin policy, security headers et guards d acces loopback pour server token",new_0_6_11_8:"Group chat et le rendu tool output sont plus stables avec rejoin apres reconnect, preservation des reasoning/tool boundaries, rendu tool payload plus sur et meilleure vue diff",new_0_6_11_9:"Skills et Workspace prennent en charge external skill directories, refresh import/delete, groupement par sourcePath, texte localise du folder picker et icones mobiles d actions skill",new_0_6_11_10:"Le layout Devices, les titres de session, les titres browser tab, les Kanban parent task IDs et le texte d attribution OpenRouter ont ete polis",new_0_6_10_1:"Les textes du site presentent maintenant Hermes Studio de facon coherente, tout en conservant les identifiants npm package, CLI, depot et variables d environnement",new_0_6_10_2:"Les ecrans desktop de demarrage et de telechargement runtime utilisent maintenant des textes localises pour le demarrage des services, le choix de source, la progression et les erreurs",new_0_6_10_3:"Les verifications de processus Windows Agent Bridge tolerent les sorties tasklist/taskkill localisees, evitant les crashs UnicodeDecodeError dus aux sorties non UTF-8",new_0_6_10_4:"La documentation OpenAPI inclut maintenant les endpoints avatar, configuration des modeles auxiliaires, refresh du cache des modeles provider et import de session Hermes",new_0_6_10_5:"Le navigateur de fichiers Workspace propose des previews texte plus completes et une meilleure couverture du menu contextuel pour les fichiers source et documents",new_0_6_10_6:"Agent Bridge est plus fiable avec des allowlists d approbation d outils rafraichies et le decodage des sorties Windows tasklist/taskkill",new_0_6_10_7:"Les utilisateurs peuvent televerser des avatars de profil, et les membres de group chat synchronisent et affichent les avatars de compte de facon coherente",new_0_6_10_8:"Les catalogues de modeles provider peuvent maintenant etre rafraichis depuis l UI",new_0_6_10_9:"Les notes de memoire peuvent maintenant etre enregistrees avec un contenu vide afin de vider les notes personnelles sans echec",new_0_6_10_10:"La documentation harness suit maintenant les changements de chaine Chat afin que les mises a jour bridge et chat runtime soient documentees avant le passage CI",new_0_6_9_1:"L application utilise maintenant la marque Hermes Studio dans le titre du navigateur, la barre laterale, le titre du site, les metadonnees package et les liens officiels",new_0_6_9_2:"La verification des mises a jour desktop est plus fiable avec fallback release feed quand l API GitHub est limitee ou que les metadonnees par tag manquent",new_0_6_9_3:"Sur macOS, l installation de mise a jour arrete d abord le serveur Web UI local puis laisse electron-updater gerer la fermeture et l installation",new_0_6_9_4:"Les identifiants provider et l auth respectent mieux les scopes Profile, et le demarrage gateway/runtime est plus compatible avec les builds desktop packages",new_0_6_9_5:"Web Speech du navigateur met maintenant en pause et reprend le message courant dans Chrome au lieu de redemarrer depuis le debut",new_0_6_9_6:"La localisation russe est maintenant disponible dans le selecteur de langue, avec les messages UI client traduits par la communaute",new_0_6_8_1:"Les builds desktop ajoutent controles tray, verification manuelle des updates, notifications de mise a jour et ouverture locale dans le navigateur",new_0_6_8_2:"Le desktop Windows demarre plus discretement et plus fiablement avec subprocesses Python/bridge caches, popups terminal corriges, taille icone tray et packaging navigateur",new_0_6_8_3:"Le packaging desktop est plus stable entre plateformes avec fixes de limite de fichiers de signature macOS, chemins Linux inscriptibles, cold start runtime et workflow checkout",new_0_6_8_4:"Le site officiel et la distribution progressent avec mirrors de telechargement, deploy du site apres les releases desktop et nettoyage des desktop smoke checks",new_0_6_8_5:"L experience runtime progresse avec longueurs de contexte provider, brouillons non envoyes conserves, fixes overflow mobile, ports personnalises SSH File Provider et actions preview non bloquantes",new_0_6_7_1:"L application desktop utilise maintenant le port 8748 par défaut, prend en charge l accès LAN et peut être ouverte directement depuis un navigateur local",new_0_6_7_9:"Les liens de téléchargement desktop sont maintenant disponibles sur le site officiel https://hermes-studio.ai/, et les derniers installateurs restent disponibles via GitHub Releases",new_0_6_7_2:"Les outils MCP sont plus complets avec des corrections de découverte bridge, de cycle de vie MCP et des contrôles de visibilité par modèle dans le gestionnaire",new_0_6_7_3:"Les listes de messages centrent mieux les états vides, réduisent les sauts de scroll, évitent d afficher le chat actif pendant le chargement de History, conservent la position par session et ajoutent un fondu de 1,5 seconde au changement de session",new_0_6_7_4:"Bridge et runtime sont plus stables avec ordre texte/tool-call préservé, chargement du statut runtime de Profile corrigé, meilleure détection Node/npm et création du dossier de données production évitée",new_0_6_7_5:"La distribution Desktop couvre packaging Electron, nom d application, builds preload, uploads des artifacts, lancement Hermes CLI sous Windows, icônes Linux et chemins de données inscriptibles, macOS sans certificat de signature et sous-processus Windows masqués au démarrage",new_0_6_7_6:"Le site web ajoute les téléchargements et le workflow de déploiement, avec déploiement corrigé pour les environnements sans rsync",new_0_6_7_7:"Les corrections serveur et auth utilisent dirname pour les dossiers de credentials Windows et augmentent la limite d upload avatar afin d éviter les erreurs 413 sur les grandes images",new_0_6_7_8:"Le harness du dépôt, les docs de validation et les guides agent pour Coding Agents ont été ajoutés, tandis que les anciens docs de setup script ont été retirés"},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",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)",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"},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",ready:"Prêt",running:"En cours",blocked:"Bloqué",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é..."},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."},action:{title:"Actions",assign:"Assigner",assignTo:"Assigner à...",block:"Bloquer",blockReason:"Raison du blocage",unblock:"Débloquer",complete:"Terminer",completeSummary:"Résumé de fin (facultatif)"},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"},stats:{total:"Total",tasks:"Tâches"}}},Pi={login:{title:"QuantHermes Web UI",description:"Introduce tu token de acceso para continuar. Encuentralo en los registros de inicio del servidor.",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: quanthermes. Contrasena predeterminada: 12345678.",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 predeterminada de quanthermes, 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",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",search:"Buscar",apiRelay:"API Relay",history:"Historial",jobs:"Tareas programadas",models:"Modelos",profiles:"Perfiles",plugins:"Plugins",mcp:"MCP",skills:"Habilidades",memory:"Memoria",logs:"Registros",usage:"Uso",performance:"Rendimiento",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",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:"Las actualizaciones del build personalizado se gestionan internamente",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. Revisa la configuracion de la fuente interna.",updateSource:"Origen de actualizacion: {source}",updateManagedInternally:"Build personalizado: las actualizaciones se gestionan internamente",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",kanban:"Kanban",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ú"},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Último escaneo: {time}",refresh:"Actualizar",empty:"No se encontraron dispositivos",computer:"Equipo",endpointLabel:"Extremo",statusLabel:"Estado",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Adjuntar archivos",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 QuantHermes",historyScopeHint:"Sesiones del historial de QuantHermes, de solo lectura y agrupadas por origen.",noSessions:"Sin sesiones",newChat:"Nuevo chat",approvalKicker:"Permiso de terminal",approvalTitle:"Revisar comando antes de ejecutar",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",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",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",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",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"},jobs:{title:"Tareas programadas",createJob:"Crear tarea",editJob:"Editar tarea",noJobs:"No hay tareas programadas aun. Crea una para comenzar.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Actualizar",notice:"Inventario de solo lectura de manifests de plugins QuantHermes detectables. Los metadatos de descubrimiento se leen sin cargar código de plugins. En v1, la gestión permanece en CLI; los cambios se aplican en nuevas sesiones QuantHermes.",loadFailed:"No se pudieron cargar los plugins",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",cli:"CLI"},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"}},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",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 QuantHermes.",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 QuantHermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.",copilotDeleteHintAppsJson:"Copilot se ocultará de QuantHermes. 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",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",builtIn:"Integrado",customType:"Personalizado",provider:"Proveedor",contextLength:"Longitud del contexto",contextLengthPlaceholder:"ej. 256000 (opcional)",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!",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...",removeCustomModel:"Eliminar este modelo no listado",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",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",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"},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.",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"},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:"Autorización de sesión",requireAuthHint:"Requiere autorización para operaciones de sesión"},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:{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"},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",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Error de instalación",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",accessToken:"Token de acceso",accessTokenHint:"Token de acceso de Matrix",homeserver:"URL del homeserver",homeserverHint:"URL del homeserver de Matrix",appId:"ID de aplicacion",appIdHint:"ID de aplicacion de Feishu",appSecret:"Secreto de aplicacion",appSecretHint:"Secreto de aplicacion 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 QuantHermes",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_11_1:"El descubrimiento de dispositivos LAN ahora incluye aprobaciones de emparejamiento, historial de solicitudes, manejo de duplicados, sincronizacion de estado y limpieza al revocar acceso",new_0_6_11_2:"El acceso LAN peer esta disponible mediante MCP con inicio MCP integrado, command shims, sockets peer con reconexion, lista de conexiones locales y sesiones de terminal limitadas",new_0_6_11_3:"La sintesis TTS backend unificada y los ajustes de clonacion de voz MiMo ya estan disponibles, con reproduccion antes de guardar",new_0_6_11_4:"Los ajustes de autostart de Gateway ahora exponen filtrado por Profile con controles multi-select, comportamiento whitelist y pruebas de seleccion de Profile de inicio",new_0_6_11_5:"El scroll y las animaciones del chat son mas estables con ajustes de bottom-follow, scroll inicial al final, scroll lock y manejo de fade con reduced-motion",new_0_6_11_6:"Agent Bridge y runtime flows son mas fiables con manejo de abort timeout, guards de inicio al reanudar, memoria de aprobacion execute-code, recuperacion de Windows Gateway y fixes del proxy terminal dev",new_0_6_11_7:"La seguridad mejora con hardening de Web UI origin policy, security headers y guards de acceso loopback para server token",new_0_6_11_8:"Group chat y renderizado de tool output son mas estables con rejoin tras reconnect, preservacion de reasoning/tool boundaries, tool payload rendering mas seguro y mejor vista diff",new_0_6_11_9:"Skills y Workspace soportan external skill directories, refresh tras import/delete, agrupacion por sourcePath, texto localizado del selector de carpetas e iconos moviles de acciones",new_0_6_11_10:"Se pulieron layout de dispositivos, titulos de sesion, titulos de browser tab, Kanban parent task IDs y texto de atribucion OpenRouter",new_0_6_10_1:"Los textos del sitio ahora presentan Hermes Studio de forma consistente, manteniendo sin cambios los identificadores de npm package, CLI, repositorio y variables de entorno",new_0_6_10_2:"Las pantallas desktop de inicio y descarga del runtime ahora usan textos localizados para inicio de servicios, seleccion de fuente, progreso y errores",new_0_6_10_3:"Las comprobaciones de procesos de Windows Agent Bridge toleran salidas localizadas de tasklist/taskkill y evitan bloqueos UnicodeDecodeError por salidas no UTF-8",new_0_6_10_4:"La documentacion OpenAPI ahora incluye endpoints de avatar, configuracion de modelos auxiliares, refresh de cache de modelos provider e importacion de sesiones Hermes",new_0_6_10_5:"El explorador de archivos de Workspace ahora ofrece previews de texto mas completos y mejor cobertura del menu contextual para archivos fuente y documentos",new_0_6_10_6:"Agent Bridge es mas fiable con allowlists de aprobacion de herramientas actualizadas y decodificacion de salida tasklist/taskkill en Windows",new_0_6_10_7:"Los usuarios pueden subir avatares de perfil, y los miembros de group chat sincronizan y muestran avatares de cuenta de forma consistente",new_0_6_10_8:"Los catalogos de modelos provider ahora se pueden refrescar desde la UI",new_0_6_10_9:"Las notas de memoria ahora se pueden guardar vacias, permitiendo limpiar notas personales sin fallos de guardado",new_0_6_10_10:"La documentacion del harness ahora rastrea cambios de la cadena Chat para que actualizaciones de bridge y chat runtime se documenten antes de pasar CI",new_0_6_9_1:"La app ahora usa la marca Hermes Studio en el titulo del navegador, la barra lateral, el titulo del sitio, los metadatos del paquete y los enlaces oficiales",new_0_6_9_2:"La comprobacion de actualizaciones de escritorio es mas fiable con fallback al release feed cuando la API de GitHub tiene rate limit o faltan metadatos por tag",new_0_6_9_3:"En macOS, la instalacion de actualizaciones detiene primero el servidor Web UI local y luego deja que electron-updater gestione el cierre y la instalacion",new_0_6_9_4:"Las credenciales de proveedores y la autenticacion respetan mejor el scope de Profile, y el arranque de gateway/runtime es mas compatible con builds de escritorio",new_0_6_9_5:"Web Speech del navegador ahora pausa y reanuda el mensaje actual en Chrome en vez de reiniciarlo desde el principio",new_0_6_9_6:"La localizacion rusa ya esta disponible en el selector de idioma, con mensajes de UI del cliente traducidos por la comunidad",new_0_6_8_1:"Los builds de escritorio incorporan controles de tray, comprobacion manual de actualizaciones, notificaciones de update y apertura local en navegador",new_0_6_8_2:"El escritorio de Windows arranca de forma mas silenciosa y fiable con subprocesses Python/bridge ocultos, popups de terminal corregidos, tamano de icono de tray y packaging del navegador",new_0_6_8_3:"El packaging de escritorio es mas estable entre plataformas con fixes de limite de archivos de firma en macOS, rutas escribibles en Linux, cold start de runtime y workflow checkout",new_0_6_8_4:"El sitio oficial y la distribucion mejoran con mirrors de descarga, deploy del sitio secuenciado despues del release de escritorio y limpieza de desktop smoke checks",new_0_6_8_5:"La experiencia runtime mejora con longitudes de contexto preferidas por provider, borradores sin enviar preservados, fixes de overflow movil, puertos personalizados en SSH File Provider y acciones de preview no bloqueantes",new_0_6_7_1:"La app de escritorio ahora usa el puerto 8748 por defecto, permite acceso desde la red local y puede abrirse directamente desde un navegador local",new_0_6_7_9:"Los enlaces de descarga de escritorio ya están disponibles en el sitio oficial https://hermes-studio.ai/, y los instaladores más recientes siguen disponibles en GitHub Releases",new_0_6_7_2:"Las herramientas MCP quedan más completas con arreglos de discovery en bridge, ciclo de vida de gestión MCP y controles de visibilidad por modelo en el gestor",new_0_6_7_3:"Las listas de mensajes centran mejor el estado vacío, reducen saltos de scroll, evitan mostrar mensajes del chat activo mientras carga History, preservan la posición por sesión y hacen fade-in de 1,5 segundos al cambiar de sesión",new_0_6_7_4:"Bridge y runtime son más estables al preservar el orden texto/tool-call, corregir la carga de estado runtime de Profile, mejorar detección Node/npm y evitar crear directorios de datos en producción",new_0_6_7_5:"La distribución Desktop cubre empaquetado Electron, nombre de app, builds preload, subida de artifacts, inicio Hermes CLI en Windows, iconos Linux y rutas de datos escribibles, macOS sin certificados de firma y subprocesos ocultos al iniciar en Windows",new_0_6_7_6:"El sitio web suma página de descargas y workflow de deploy, con deploy corregido en entornos sin rsync",new_0_6_7_7:"Arreglos de servidor y auth usan dirname para credenciales en Windows y suben el límite de avatar para evitar errores 413 con imágenes grandes",new_0_6_7_8:"Se agregan harness del repositorio, documentación de validación y guías de agentes para Coding Agents, y se eliminan docs antiguas de setup scripts"},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",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)",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"},kanban:{title:"Tablero Kanban",createTask:"Nueva tarea",noTasks:"Sin tareas",allStatuses:"Todos los estados",allAssignees:"Todos los responsables",columns:{triage:"Clasificación",todo:"Pendiente",ready:"Listo",running:"En curso",blocked:"Bloqueado",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..."},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."},action:{title:"Acciones",assign:"Asignar",assignTo:"Asignar a...",block:"Bloquear",blockReason:"Motivo del bloqueo",unblock:"Desbloquear",complete:"Completar",completeSummary:"Resumen de finalización (opcional)"},message:{loadFailed:"No se pudo cargar la tarea",taskCreated:"Tarea creada",taskAssigned:"Tarea asignada",taskBlocked:"Tarea bloqueada",taskUnblocked:"Tarea desbloqueada",taskCompleted:"Tarea completada"},stats:{total:"Total",tasks:"Tareas"}}},Ai={login:{title:"QuantHermes Web UI",description:"Geben Sie Ihren Zugangs-Token ein, um fortzufahren. Finden Sie ihn in den Server-Startprotokollen.",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: quanthermes. Standard-Passwort: 12345678.",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",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",search:"Suche",apiRelay:"API-Relay",history:"Verlauf",jobs:"Geplante Aufgaben",models:"Modelle",profiles:"Profile",plugins:"Plugins",mcp:"MCP",skills:"Fahigkeiten",memory:"Gedachtnis",logs:"Protokolle",usage:"Nutzung",performance:"Leistung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Konsole",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:"Aktualisierungen fur angepasste Builds werden intern bereitgestellt",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. Prufen Sie die interne Update-Quelle.",updateSource:"Update-Quelle: {source}",updateManagedInternally:"Angepasster Build: Aktualisierungen werden intern verwaltet",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar",kanban:"Kanban",groupTools:"Werkzeuge",groupToolsShort:"Tools",codingAgents:"Coding Agents",versionPreview:"Versionsvorschau",groupPlatform:"Plattform",gateways:"Gateways",expand:"Menü ausklappen",collapse:"Menü einklappen"},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",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",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 Quanthermes Agent",outlineTitle:"Konversationsübersicht",outlineEmpty:"Kein Konversationsinhalt",outlineUserQuestion:"Benutzerfrage",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)",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",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"},attachFiles:"Dateien anhangen",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:"QuantHermes-Verlauf",historyScopeHint:"Schreibgeschützte QuantHermes-Verlaufssitzungen, nach Quelle gruppiert.",noSessions:"Keine Sitzungen",newChat:"Neuer Chat",approvalKicker:"Terminal-Berechtigung",approvalTitle:"Befehl vor dem Ausführen prüfen",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",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",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",renameSession:"Sitzung umbenennen",sessionNotFound:"Sitzung nicht gefunden",enterNewTitle:"Neuen Titel eingeben",other:"Sonstige",runFailed:"Ausfuhrung fehlgeschlagen",error:"Fehler",tool:"Werkzeug",arguments:"Argumente",result:"Ergebnis",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"},jobs:{title:"Geplante Aufgaben",createJob:"Aufgabe erstellen",editJob:"Aufgabe bearbeiten",noJobs:"Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Aktualisieren",notice:"Schreibgeschütztes Inventar erkennbarer QuantHermes-Plugin-Manifeste. Discovery-Metadaten werden gelesen, ohne Plugin-Code zu laden. Verwaltungsaktionen bleiben in v1 im CLI; Änderungen gelten für neue QuantHermes-Sitzungen.",loadFailed:"Plugins konnten nicht geladen werden",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",cli:"CLI"},capabilities:{tools:"{count} Tools",hooks:"{count} Hooks",env:"{count} env"},metadata:{agentRoot:"Agent-Stammverzeichnis",python:"Python",scanCwd:"Arbeitsverzeichnis scannen",projectPlugins:"Projekt-Plugins"}},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",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 QuantHermes 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 QuantHermes ausgeblendet. Ihre gh CLI-Anmeldung bleibt erhalten — `gh auth status` zeigt weiterhin als angemeldet.",copilotDeleteHintAppsJson:"Copilot wird aus QuantHermes 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",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",builtIn:"Integriert",customType:"Benutzerdefiniert",provider:"Anbieter",contextLength:"Kontextlange",contextLengthPlaceholder:"z.B. 256000 (optional)",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!",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...",removeCustomModel:"Dieses nicht gelistete Modell entfernen",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",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",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"},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.",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"},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"},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:{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"},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",installNow:"Installieren",installing:"Installiere",installSuccess:"Installiert",installFailed:"Installation fehlgeschlagen",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",accessToken:"Zugangs-Token",accessTokenHint:"Matrix-Zugangs-Token",homeserver:"Homeserver-URL",homeserverHint:"Matrix-Homeserver-URL",appId:"App-ID",appIdHint:"Feishu App-ID",appSecret:"App-Geheimnis",appSecretHint:"Feishu App-Geheimnis",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:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",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 QuantHermes-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_11_1:"LAN device discovery umfasst jetzt pairing approvals, request history, duplicate request handling, status sync und cleanup beim Entzug von device access",new_0_6_11_2:"LAN peer access ist ueber MCP verfuegbar, mit bundled MCP startup, command shims, reconnecting peer sockets, local connection listing und begrenzten terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis und MiMo voice cloning settings sind jetzt verfuegbar, inklusive playback vor dem Speichern",new_0_6_11_4:"Gateway autostart settings zeigen profile filtering mit multi-select controls, whitelist behavior und Tests fuer startup profile selection",new_0_6_11_5:"Chat scrolling und motion sind stabiler durch bottom-follow tuning, initial bottom scroll fixes, scroll lock updates und reduced-motion fade handling",new_0_6_11_6:"Agent Bridge und runtime flows sind zuverlaessiger mit abort timeout handling, resume startup guards, execute-code approval memory, Windows gateway recovery und dev terminal proxy fixes",new_0_6_11_7:"Security ist haerter durch Web UI origin policy, security headers und server-token loopback access guards",new_0_6_11_8:"Group chat und tool output rendering sind stabiler mit room rejoin nach reconnect, erhaltenen reasoning/tool boundaries, sichererem tool payload rendering und besserer diff display",new_0_6_11_9:"Skills und Workspace flows unterstuetzen jetzt external skill directories, import/delete refresh, source-path grouping, lokalisierte folder picker text und mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs und OpenRouter attribution text wurden verbessert",new_0_6_10_1:"Website-Texte zeigen das Produkt jetzt konsistent als Hermes Studio, waehrend npm package, CLI, Repository und Umgebungsvariablen unveraendert bleiben",new_0_6_10_2:"Desktop-Startup- und Runtime-Download-Screens nutzen jetzt lokalisierte Texte fuer Service-Start, Quellenauswahl, Fortschritt und Fehler",new_0_6_10_3:"Windows Agent Bridge Prozesspruefungen tolerieren lokalisierte tasklist/taskkill-Ausgaben und vermeiden UnicodeDecodeError-Abstuerze durch nicht-UTF-8-Systemausgaben",new_0_6_10_4:"OpenAPI-Dokumente enthalten jetzt Avatar-, Auxiliary-Model-Config-, Provider-Model-Cache-Refresh- und Hermes-Session-Import-Endpunkte",new_0_6_10_5:"Workspace-Dateibrowser bietet jetzt umfangreichere Textvorschauen und Kontextmenue-Abdeckung fuer Quellcode- und Dokumentdateien",new_0_6_10_6:"Agent Bridge ist zuverlaessiger durch aktualisierte Tool-Approval-Allowlists und Windows tasklist/taskkill-Ausgabedekodierung",new_0_6_10_7:"Nutzer koennen Profil-Avatare hochladen, und Group Chat Mitglieder synchronisieren und zeigen Account-Avatare konsistent an",new_0_6_10_8:"Provider-Modellkataloge koennen jetzt in der UI aktualisiert werden",new_0_6_10_9:"Memory-Notizen koennen jetzt mit leerem Inhalt gespeichert werden, sodass persoenliche Notizen sauber geloescht werden koennen",new_0_6_10_10:"Repository-Harness-Dokumentation verfolgt jetzt Chat-Chain-Aenderungen, damit Bridge- und Chat-Runtime-Updates vor erfolgreichem CI dokumentiert sind",new_0_6_9_1:"Die App ist jetzt als Hermes Studio gebrandet, inklusive Browser-Titel, Sidebar, Website-Titel, Package-Metadaten und offiziellen Website-Links",new_0_6_9_2:"Desktop-Update-Pruefungen sind robuster mit Release-Feed-Fallbacks, wenn GitHub API Requests rate-limited sind oder tag-spezifische Metadaten fehlen",new_0_6_9_3:"macOS Desktop-Updates stoppen vor der Installation den lokalen Web UI Server und lassen dann electron-updater Quit und Installation ausfuehren, sodass Restart die geladene Version installiert",new_0_6_9_4:"Provider-Zugangsdaten und Auth respektieren Profile-Scopes konsistenter, und Gateway/Runtime-Start ist kompatibler mit paketierten Desktop-Starts",new_0_6_9_5:"Browser Web Speech pausiert und setzt die aktuelle Nachricht in Chrome jetzt fort, statt beim Pausieren von vorne neu zu starten",new_0_6_9_6:"Russische Lokalisierung ist jetzt im Sprachumschalter verfuegbar, inklusive von der Community uebersetzter Client-UI-Texte",new_0_6_8_1:"Desktop-Builds erhalten Tray-Steuerung, manuelle Update-Pruefung, Update-Hinweise und lokales Browser-Oeffnen fuer die paketierte Web UI",new_0_6_8_2:"Windows Desktop startet leiser und zuverlaessiger mit versteckten Python/bridge-Subprozessen, korrigierten Terminal-Popups, Tray-Icon-Groessen und Browser-Packaging",new_0_6_8_3:"Desktop-Packaging ist plattformuebergreifend stabiler mit macOS Signing-Dateilimit-Fixes, Linux beschreibbaren Pfaden, Runtime-Cold-Start-Handling und Workflow-Checkout-Fixes",new_0_6_8_4:"Website und Release-Verteilung wurden mit Download-Mirrors, sequenziertem Website-Deploy nach Desktop-Releases und Desktop-Smoke-Check-Cleanup verbessert",new_0_6_8_5:"Die Runtime-Nutzung wurde verbessert mit Provider-Kontextlaengen, erhaltenen ungesendeten Chat-Entwuerfen, Mobile-Layout-Overflow-Fixes, SSH File Provider Custom Ports und nicht-blockierenden Preview-Aktionen",new_0_6_7_1:"Die Desktop-App nutzt jetzt standardmäßig Port 8748, unterstützt Zugriff im lokalen Netzwerk und kann direkt im lokalen Browser geöffnet werden",new_0_6_7_9:"Desktop-Download-Links sind jetzt auf der offiziellen Website https://hermes-studio.ai/ verfügbar, aktuelle Installer bleiben außerdem über GitHub Releases verfügbar",new_0_6_7_2:"MCP-Tools sind vollständiger: Bridge Tool Discovery, MCP-Management-Lifecycle und Tool-Sichtbarkeit pro Modell im Manager wurden verbessert",new_0_6_7_3:"Nachrichtenlisten zentrieren leere Zustände korrekt, reduzieren Scroll-Jitter, zeigen beim Laden von History keine Live-Chat-Nachrichten mehr, behalten Scrollpositionen pro Session und blenden beim Session-Wechsel 1,5 Sekunden ein",new_0_6_7_4:"Bridge und Runtime sind stabiler durch erhaltene Text/tool-call-Reihenfolge, korrektes Profile runtime status loading, bessere Node/npm-Erkennung und übersprungene Produktionsdatenverzeichnis-Erstellung",new_0_6_7_5:"Desktop-Distribution umfasst Electron-Packaging, App-Naming, Preload-Builds, Release-Artifact-Uploads, Windows Hermes CLI Start, Linux-Icons und beschreibbare Datenpfade, macOS ohne Signing-Zertifikate und versteckte Windows-Startup-Subprozesse",new_0_6_7_6:"Die Website hat Download- und Deploy-Workflows, und Deploys funktionieren auch in Umgebungen ohne rsync",new_0_6_7_7:"Server- und Auth-Fixes nutzen dirname für Windows-Credential-Verzeichnisse und erhöhen das Avatar-Upload-Limit gegen 413-Fehler bei größeren Bildern",new_0_6_7_8:"Repository-Harness, Validierungsdokumente und Agent-Guides für Coding Agents wurden ergänzt, alte Setup-Script-Dokumente entfernt"},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",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)",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"},kanban:{title:"Kanban-Board",createTask:"Neue Aufgabe",noTasks:"Keine Aufgaben",allStatuses:"Alle Status",allAssignees:"Alle Verantwortlichen",columns:{triage:"Sichtung",todo:"Zu erledigen",ready:"Bereit",running:"In Arbeit",blocked:"Blockiert",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..."},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."},action:{title:"Aktionen",assign:"Zuweisen",assignTo:"Zuweisen an...",block:"Blockieren",blockReason:"Blockierungsgrund",unblock:"Blockierung aufheben",complete:"Abschließen",completeSummary:"Abschlusszusammenfassung (optional)"},message:{loadFailed:"Aufgabe konnte nicht geladen werden",taskCreated:"Aufgabe erstellt",taskAssigned:"Aufgabe zugewiesen",taskBlocked:"Aufgabe blockiert",taskUnblocked:"Blockierung aufgehoben",taskCompleted:"Aufgabe abgeschlossen"},stats:{total:"Gesamt",tasks:"Aufgaben"}}},_i={login:{title:"QuantHermes Web UI",description:"Insira seu token de acesso para continuar. Encontre-o nos logs de inicializacao do servidor.",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: quanthermes. Senha padrao: 12345678.",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 padrao de quanthermes, 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",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",search:"Pesquisar",apiRelay:"API Relay",history:"Historico",jobs:"Tarefas agendadas",models:"Modelos",profiles:"Perfis",plugins:"Plugins",mcp:"MCP",skills:"Habilidades",memory:"Memoria",logs:"Logs",usage:"Uso",performance:"Desempenho",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",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:"As atualizacoes do build personalizado sao gerenciadas internamente",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. Verifique a fonte interna.",updateSource:"Fonte de atualizacao: {source}",updateManagedInternally:"Build personalizado: as atualizacoes sao gerenciadas internamente",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel",kanban:"Kanban",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"},devices:{title:"Dispositivos",count:"{count} dispositivos",lastScanned:"Última varredura: {time}",refresh:"Atualizar",empty:"Nenhum dispositivo encontrado",computer:"Computador",endpointLabel:"Ponto de acesso",statusLabel:"Estado",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",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 Quanthermes Agent",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)",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",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"},attachFiles:"Anexar arquivos",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 QuantHermes",historyScopeHint:"Sessões do histórico QuantHermes somente leitura, agrupadas por origem.",noSessions:"Sem sessoes",newChat:"Novo chat",approvalKicker:"Permissão do terminal",approvalTitle:"Revisar comando antes de executar",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",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",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",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",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"},jobs:{title:"Tarefas agendadas",createJob:"Criar tarefa",editJob:"Editar tarefa",noJobs:"Nenhuma tarefa agendada ainda. Crie uma para comecar.",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",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",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",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."},plugins:{title:"Plugins",refresh:"Atualizar",notice:"Inventário somente leitura dos manifests de plugins QuantHermes detectáveis. Os metadados de descoberta são lidos sem carregar código de plugin. No v1, ações de gerenciamento ficam na CLI; mudanças entram em vigor em novas sessões QuantHermes.",loadFailed:"Falha ao carregar plugins",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",cli:"CLI"},capabilities:{tools:"{count} ferramentas",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"Raiz do agente",python:"Python",scanCwd:"Verificar cwd",projectPlugins:"Plugins do projeto"}},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",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 QuantHermes.",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 QuantHermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.",copilotDeleteHintAppsJson:"O Copilot ficará oculto no QuantHermes. 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",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",builtIn:"Integrado",customType:"Personalizado",provider:"Provedor",contextLength:"Tamanho do contexto",contextLengthPlaceholder:"ex: 256000 (opcional)",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!",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...",removeCustomModel:"Remover este modelo não listado",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",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",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"},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.",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"},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:"Autorização de sessão",requireAuthHint:"Requer autorização para operações de sessão"},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:{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"},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",installNow:"Instalar",installing:"Instalando",installSuccess:"Instalado",installFailed:"Falha na instalação",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",accessToken:"Token de acesso",accessTokenHint:"Token de acesso Matrix",homeserver:"URL do homeserver",homeserverHint:"URL do homeserver Matrix",appId:"ID do aplicativo",appIdHint:"ID do aplicativo Feishu",appSecret:"Segredo do aplicativo",appSecretHint:"Segredo do aplicativo 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 QuantHermes",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_11_1:"A descoberta de dispositivos LAN agora inclui aprovacoes de pairing, historico de requests, tratamento de duplicados, sync de status e limpeza ao revogar acesso",new_0_6_11_2:"O acesso LAN peer esta disponivel via MCP com startup MCP integrado, command shims, peer sockets com reconexao, lista de conexoes locais e sessoes de terminal limitadas",new_0_6_11_3:"A sintese TTS backend unificada e as configuracoes de clonagem de voz MiMo estao disponiveis, com playback antes de salvar",new_0_6_11_4:"As configuracoes Gateway autostart agora exibem filtragem por Profile com controles multi-select, comportamento whitelist e testes de selecao de Profile inicial",new_0_6_11_5:"O scroll e as animacoes do chat estao mais estaveis com bottom-follow tuning, initial bottom scroll fixes, scroll lock updates e tratamento de fade reduced-motion",new_0_6_11_6:"Agent Bridge e runtime flows estao mais confiaveis com abort timeout handling, resume startup guards, memoria de aprovacao execute-code, recuperacao Windows Gateway e fixes do proxy terminal dev",new_0_6_11_7:"A seguranca foi reforcada com Web UI origin policy, security headers e guards de acesso loopback para server token",new_0_6_11_8:"Group chat e renderizacao de tool output estao mais estaveis com rejoin apos reconnect, preservacao de reasoning/tool boundaries, tool payload rendering mais seguro e melhor diff display",new_0_6_11_9:"Skills e Workspace agora suportam external skill directories, refresh apos import/delete, agrupamento por sourcePath, texto localizado do folder picker e icones moveis de acoes",new_0_6_11_10:"Layout de dispositivos, titulos de sessao, titulos de browser tab, Kanban parent task IDs e texto de atribuicao OpenRouter receberam polimento de UI",new_0_6_10_1:"Os textos do site agora apresentam Hermes Studio de forma consistente, mantendo identificadores de npm package, CLI, repositorio e variaveis de ambiente inalterados",new_0_6_10_2:"As telas desktop de inicio e download do runtime agora usam textos localizados para inicio de servicos, selecao de fonte, progresso e erros",new_0_6_10_3:"As verificacoes de processo do Windows Agent Bridge toleram saidas localizadas de tasklist/taskkill e evitam crashes UnicodeDecodeError por saidas nao UTF-8",new_0_6_10_4:"A documentacao OpenAPI agora inclui endpoints de avatar, configuracao de modelos auxiliares, refresh de cache de modelos provider e importacao de sessoes Hermes",new_0_6_10_5:"O navegador de arquivos Workspace agora tem previews de texto mais completos e melhor cobertura do menu de contexto para arquivos de codigo e documentos",new_0_6_10_6:"Agent Bridge esta mais confiavel com allowlists de aprovacao de ferramentas atualizadas e decodificacao de saida tasklist/taskkill no Windows",new_0_6_10_7:"Usuarios podem enviar avatares de perfil, e membros do group chat agora sincronizam e exibem avatares de conta de forma consistente",new_0_6_10_8:"Catalogos de modelos provider agora podem ser atualizados pela UI",new_0_6_10_9:"Notas de memoria agora podem ser salvas com conteudo vazio, permitindo limpar notas pessoais sem falha de salvamento",new_0_6_10_10:"A documentacao do harness agora rastreia mudancas da cadeia Chat para que updates de bridge e chat runtime sejam documentados antes do CI passar",new_0_6_9_1:"O app agora usa a marca Hermes Studio no titulo do navegador, sidebar, titulo do site, metadados do pacote e links oficiais",new_0_6_9_2:"A verificacao de atualizacoes desktop ficou mais confiavel com fallback para release feed quando a API do GitHub sofre rate limit ou faltam metadados por tag",new_0_6_9_3:"No macOS, a instalacao de updates para primeiro o servidor Web UI local e depois deixa o electron-updater cuidar do quit e install",new_0_6_9_4:"Credenciais de providers e auth respeitam melhor o escopo de Profile, e o startup de gateway/runtime ficou mais compativel com builds desktop empacotados",new_0_6_9_5:"Browser Web Speech agora pausa e retoma a mensagem atual no Chrome em vez de reiniciar do comeco",new_0_6_9_6:"A localizacao russa agora esta disponivel no seletor de idioma, com mensagens da UI cliente traduzidas pela comunidade",new_0_6_8_1:"Builds desktop ganharam controles de tray, verificacao manual de updates, notificacoes de update e abertura local no navegador",new_0_6_8_2:"O desktop Windows inicia de forma mais silenciosa e confiavel com subprocesses Python/bridge ocultos, popups de terminal corrigidos, tamanho de icone tray e packaging de navegador",new_0_6_8_3:"O packaging desktop ficou mais estavel entre plataformas com fixes de limite de arquivos de assinatura no macOS, caminhos gravaveis no Linux, runtime cold start e workflow checkout",new_0_6_8_4:"Site oficial e distribuicao melhoraram com mirrors de download, deploy do site apos releases desktop e limpeza dos desktop smoke checks",new_0_6_8_5:"A experiencia runtime melhorou com comprimentos de contexto por provider, rascunhos nao enviados preservados, fixes de overflow mobile, portas customizadas no SSH File Provider e acoes preview nao bloqueantes",new_0_6_7_1:"O app desktop agora usa a porta 8748 por padrão, permite acesso pela rede local e pode ser aberto diretamente em um navegador local",new_0_6_7_9:"Links de download do desktop agora estão disponíveis no site oficial https://hermes-studio.ai/, e os instaladores mais recentes continuam disponíveis no GitHub Releases",new_0_6_7_2:"As ferramentas MCP ficam mais completas com correções de discovery no bridge, ciclo de vida de gestão MCP e controles de visibilidade por modelo no gestor",new_0_6_7_3:"Listas de mensagens centralizam melhor estados vazios, reduzem saltos de rolagem, evitam mostrar o chat ativo enquanto History carrega, preservam posição por sessão e fazem fade-in de 1,5 segundo ao trocar sessão",new_0_6_7_4:"Bridge e runtime ficam mais estáveis preservando a ordem texto/tool-call, corrigindo carregamento de status runtime de Profile, melhorando detecção Node/npm e evitando criação de diretório de dados em produção",new_0_6_7_5:"A distribuição Desktop cobre empacotamento Electron, nome do app, builds preload, upload de artifacts, início do Hermes CLI no Windows, ícones Linux e caminhos de dados graváveis, macOS sem certificado de assinatura e subprocessos Windows ocultos no início",new_0_6_7_6:"O site agora tem página de downloads e workflow de deploy, com deploy corrigido em ambientes sem rsync",new_0_6_7_7:"Correções de servidor e auth usam dirname para diretórios de credenciais no Windows e aumentam o limite de upload de avatar para evitar erros 413 com imagens grandes",new_0_6_7_8:"Harness do repositório, docs de validação e guias de agente para Coding Agents foram adicionados, enquanto docs antigos de setup script foram removidos"},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",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)",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"},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",ready:"Pronto",running:"Em andamento",blocked:"Bloqueado",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..."},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."},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)"},message:{loadFailed:"Falha ao carregar tarefa",taskCreated:"Tarefa criada",taskAssigned:"Tarefa atribuída",taskBlocked:"Tarefa bloqueada",taskUnblocked:"Tarefa desbloqueada",taskCompleted:"Tarefa concluída"},stats:{total:"Total",tasks:"Tarefas"}}},xi={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:"Повторить",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:"Чат",search:"Поиск",apiRelay:"Ретранслятор API",history:"История",jobs:"Задачи",kanban:"Канбан",models:"Модели",profiles:"Пользователи",plugins:"Плагины",skills:"Навыки",memory:"Память",logs:"Логи",usage:"Использование",performance:"Мониторинг производительности",skillsUsage:"Использование навыков",channels:"Каналы",gateways:"Шлюзы",terminal:"Терминал",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:"Нет списка изменений"},devices:{title:"Устройства",count:"Устройств: {count}",lastScanned:"Последнее сканирование: {time}",refresh:"Обновить",empty:"Устройства не найдены",computer:"Компьютер",endpointLabel:"Точка доступа",statusLabel:"Статус",address:"Адрес",os:"ОС",agentVersion:"Agent",webUiVersion:"Web UI",responseMs:"Задержка",lastSeen:"Последний раз обнаружено",open:"Открыть",never:"Никогда",unknown:"Неизвестно",loadFailed:"Не удалось загрузить устройства",scanFailed:"Не удалось просканировать устройства",updateFailed:"Не удалось обновить устройство",duplicateRequest:"Уже есть ожидающий запрос на сопряжение",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",cliEmptyState:"Начните CLI-диалог",outlineTitle:"План беседы",outlineEmpty:"Нет содержимого беседы",outlineUserQuestion:"Вопрос пользователя",inputPlaceholder:"Введите сообщение... (Enter — отправить, Shift+Enter — новая строка)",slashCommandArgs:{message:"<сообщение>",title:"<заголовок>",text:"<текст>"},slashCommands:{usage:"Рассчитать использование текущего сеанса",status:"Показать статус сеанса и очередь",abort:"Остановить текущий запуск Bridge",queue:"Добавить сообщение в очередь после текущего запуска",clear:"Очистить текущее отображение",clearHistory:"Удалить сохранённую историю сообщений текущего сеанса",title:"Переименовать текущий сеанс",compress:"Запустить сжатие контекста в простое",steer:"Отправить направляющий текст текущему запуску Bridge",destroy:"Освободить Bridge Agent текущего сеанса"},attachFiles:"Прикрепить файлы",autoPlaySpeech:"Автовоспроизведение речи",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:"Новый диалог",approvalKicker:"Авторизация в терминале",approvalTitle:"Подтвердите команду перед выполнением",approvalAllowOnce:"Разрешить однократно",approvalAllowSession:"Разрешить для этого сеанса",approvalAlways:"Разрешить всегда",approvalDeny:"Отказать",newCliChat:"Новый CLI",deleteSession:"Удалить этот сеанс?",sessionDeleted:"Сеанс удалён",toggleBatchMode:"Пакетный выбор",selectAll:"Выбрать всё",confirmBatchDelete:"Удалить выбранные сеансы ({count})?",batchDeleteSuccess:"Удалено сеансов: {count}",batchDeletePartial:"Не удалось удалить сеансов: {failed}",batchDeleteFailed:"Ошибка пакетного удаления",rename:"Переименовать",pin:"Закрепить",unpin:"Открепить",pinned:"Закреплено",chatMode:"Чат",liveMode:"В реальном времени",liveSessions:"Сеансы в реальном времени",recentBadge:"Недавние",linkedSessions:"Связано сеансов: {count}",noVisibleMessages:"Нет видимых человеку сообщений.",monitorRoleUser:"Пользователь",monitorRoleAssistant:"Ассистент",copySessionLink:"Копировать ссылку на сеанс",copySessionId:"Копировать ID сеанса",export:"Экспорт",exportFull:"Полный экспорт (JSON)",exportCompressed:"Сжатый экспорт (TXT)",exportCompressing:"Сжатие контекста, подождите...",exportSuccess:"Сеанс экспортирован",exportFailed:"Ошибка экспорта",renamed:"Переименовано",renameFailed:"Ошибка переименования",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:"Результат",truncated:"... (обрезано)",unchangedLines:"{count} строк без изменений",executionDuration:"Длительность выполнения",thinkingLabel:"Процесс размышления",thinkingInProgress:"Размышление…",thinkingShow:"Развернуть процесс размышления",thinkingHide:"Свернуть процесс размышления",thinkingDuration:"Наблюдается {duration}",thinkingChars:"{count} зн.",copyBubble:"Копировать сообщение",copiedBubble:"Скопировано",copyFailed:"Ошибка копирования",playSpeech:"Воспроизвести речь",pauseSpeech:"Пауза",resumeSpeech:"Продолжить",stopSpeech:"Остановить",speechNotSupported:"Этот браузер не поддерживает воспроизведение речи"},kanban:{title:"Канбан",createTask:"Создать задачу",noTasks:"Нет задач",allStatuses:"Все статусы",allAssignees:"Все ответственные",board:{create:"Создать канбан",archive:"Архивировать канбан",slugPlaceholder:"Идентификатор канбана, например project-a",namePlaceholder:"Отображаемое имя (необязательно)",slugRequired:"Идентификатор канбана не может быть пустым",created:"Канбан создан",archived:"Канбан архивирован",archiveConfirm:"Архивировать текущий канбан?"},columns:{triage:"На сортировку",todo:"К выполнению",ready:"Готово",running:"В работе",blocked:"Заблокировано",done:"Выполнено",archived:"В архиве"},form:{title:"Заголовок",titlePlaceholder:"Заголовок задачи",titleRequired:"Заголовок не может быть пустым",body:"Описание",bodyPlaceholder:"Описание задачи (необязательно)",assignee:"Ответственный",selectAssignee:"Выберите ответственного...",priority:"Приоритет",selectPriority:"Выберите приоритет..."},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:"Ключевая информация"},action:{title:"Действие",complete:"Завершить",completeSummary:"Краткое описание завершения (необязательно)",block:"Заблокировать",blockReason:"Причина блокировки",unblock:"Разблокировать",assign:"Назначить",assignTo:"Назначить..."},message:{taskCreated:"Задача создана",taskCompleted:"Задача завершена",taskBlocked:"Задача заблокирована",taskUnblocked:"Задача разблокирована",taskAssigned:"Задача назначена",loadFailed:"Ошибка загрузки задач"},stats:{total:"Всего",tasks:"задач"}},jobs:{title:"Периодические задачи",createJob:"Создать задачу",editJob:"Редактировать задачу",noJobs:"Нет периодических задач. Создайте первую.",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:"Содержимое для выполнения",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:"Навыки",searchPlaceholder:"Поиск навыков...",noMatch:"Нет подходящих навыков",noSkills:"Нет навыков",backTo:"Назад",attachedFiles:"Прикреплённые файлы",loadFailed:"Ошибка загрузки навыков",fileLoadFailed:"Ошибка загрузки файла",modified:"Пользователь изменил",archived:"В архиве",pinned:"Закреплено",pin:"Закрепить навык",unpin:"Открепить",pinFailed:"Ошибка изменения статуса закрепления",toggleFailed:"Ошибка переключения статуса навыка",source:{builtin:"Встроенный",hub:"Установленный из Hub",local:"Локально установленный"}},plugins:{title:"Плагины",refresh:"Обновить",notice:"Только для чтения: отображаются манифесты обнаруживаемых плагинов Hermes. Чтение метаданных не загружает код плагинов. Действия управления v1 по-прежнему доступны в CLI, новые сеансы Hermes вступают в силу.",loadFailed:"Ошибка загрузки плагинов",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:"Путь / Точка входа",cli:"CLI"},capabilities:{tools:"{count} инструментов",hooks:"{count} хуков",env:"{count} переменных окружения"},metadata:{agentRoot:"Корневая директория агента",python:"Python",scanCwd:"Сканировать cwd",projectPlugins:"Плагины проекта"}},memory:{title:"Память",refresh:"Обновить",loadFailed:"Ошибка загрузки памяти",myNotes:"Мои заметки",noNotes:"Нет заметок.",notesPlaceholder:"Введите текст заметки...",userProfile:"Профиль пользователя",noProfile:"Нет профиля.",profilePlaceholder:"Введите профиль пользователя...",soul:"Душа",noSoul:"Нет конфигурации души.",soulPlaceholder:"Введите конфигурацию души..."},models:{title:"Модели",searchPlaceholder:"Поиск моделей...",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:"Провайдер удалён",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:"Срок действия ссылки истёк. Повторите попытку.",customBadge:"Пользовательская",previewBadge:"Предварительная",disabledBadge:"Недоступна",disabledTooltip:"Эта модель недоступна для текущей учётной записи",customModelPlaceholder:"ID модели, отсутствующей в списке",customModelHint:"Используйте, если провайдер поддерживает модель, но она не возвращена. Не переименование. Нажмите Enter для загрузки.",removeCustomModel:"Удалить эту модель из списка",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:"Снять все",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:"По умолч.",builtIn:"Встроенный",customType:"Пользовательский",provider:"Провайдер",contextLength:"Длина контекста",contextLengthPlaceholder:"Например, 200000 (необязательно)",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:"Агент",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",busyInputMode:"Режим ввода во время занятости",busyInputModeHint:"Разрешить ввод, пока AI обрабатывает запрос",theme:"Тема",themeHint:"Выберите светлую, тёмную или системную тему",themeLight:"Светлая",themeDark:"Тёмная",themeSystem:"Системная"},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 профиля.",mode:"Политика профилей",modeHint:"Запускать все найденные профили или только явный список включения.",modeAll:"Все найденные профили",modeInclude:"Только включенные профили",include:"Включенные профили",includeHint:"Имена профилей через запятую. В режиме включения пустой список не запускает ничего.",exclude:"Исключенные профили",excludeHint:"Имена профилей через запятую, которые нужно пропустить после применения политики.",profileListPlaceholder:"default, reviewer"},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:"Требовать авторизацию для изменения сеанса"},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}"},userAvatar:{title:"Аватар пользователя",upload:"Загрузить изображение",random:"Сгенерировать случайный",reset:"Сбросить по умолчанию",hint:"Поддерживаются PNG, JPEG и WebP до 1 МБ; автоматически сжимается до менее 500 КБ.",invalidType:"Выберите изображение PNG, JPEG или WebP",tooLarge:"Изображение аватара должно быть не больше 1 МБ",saveSuccess:"Аватар сохранён",saveFailed:"Не удалось сохранить аватар",resetSuccess:"Аватар сброшен",resetFailed:"Не удалось сбросить аватар"},voice:{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:"Токен бота, полученный на портале разработчика",accessToken:"Токен доступа",accessTokenHint:"Токен доступа Matrix",homeserver:"URL домашнего сервера",homeserverHint:"Адрес сервера Matrix",appId:"ID приложения",appIdHint:"ID приложения Feishu",appSecret:"Секрет приложения",appSecretHint:"Секрет приложения Feishu",clientId:"ID клиента",clientIdHint:"ID клиента DingTalk",clientSecret:"Секрет клиента",clientSecretHint:"Секрет клиента DingTalk",allowedUsers:"Разрешённые пользователи",allowedUsersHint:"Белый список ID пользователей или OpenID (через запятую)",allowAllUsers:"Разрешить всех пользователей",allowAllUsersHint:"Разрешить любым пользователям отправлять сообщения; при отключении используется белый список",botId:"ID бота",botIdHint:"ID бота WeChat Work",wecomSecretHint:"Секрет бота WeChat Work",waEnabled:"Включить WhatsApp",waEnabledHint:"Включить WhatsApp с помощью пары по QR-коду",weixinToken:"Токен WeChat",weixinTokenHint:"Получите с помощью CLI (hermes weixin) при входе по QR-коду",accountId:"ID учётной записи",accountIdHint:"ID учётной записи WeChat",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:"Агент добавлен",agentAlreadyInRoom:"Агент уже в комнате",agentAddFailedCount:"Не добавлено агентов: {count} — {details}",noAgents:"В комнате нет агентов",members:"Участники",roomCreated:"Комната создана",roomDeleted:"Комната удалена",roomCloned:"Комната клонирована",cloneRoom:"Клонировать комнату",copyRoomLink:"Копировать ссылку на комнату",deleteRoomConfirm:"Удалить эту комнату?",clearContext:"Очистить контекст",clearContextConfirm:"Очистить контекст текущей комнаты? Сообщения и сжатые снимки будут удалены, агенты и участники останутся.",contextCleared:"Контекст очищен",you:"Вы",joined:"Вы присоединились к комнате",joinFailed:"Не удалось присоединиться к комнате",inputPlaceholder:"Введите сообщение... (Enter — отправить)",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_11_1:"LAN device discovery теперь включает pairing approvals, request history, обработку duplicate requests, status sync и cleanup при отзыве device access",new_0_6_11_2:"LAN peer access доступен через MCP: bundled MCP startup, command shims, reconnecting peer sockets, local connection listing и лимиты terminal sessions",new_0_6_11_3:"Unified backend TTS synthesis и настройки MiMo voice cloning теперь доступны, включая playback перед сохранением",new_0_6_11_4:"Gateway autostart settings теперь показывают profile filtering с multi-select controls, whitelist behavior и tests для startup profile selection",new_0_6_11_5:"Chat scrolling и motion стали стабильнее благодаря bottom-follow tuning, initial bottom scroll fixes, scroll lock updates и reduced-motion fade handling",new_0_6_11_6:"Agent Bridge и runtime flows стали надежнее: abort timeout handling, resume startup guards, execute-code approval memory, Windows Gateway recovery и dev terminal proxy fixes",new_0_6_11_7:"Security усилена через Web UI origin policy, security headers и server-token loopback access guards",new_0_6_11_8:"Group chat и tool output rendering стали стабильнее: room rejoin после reconnect, сохранение reasoning/tool boundaries, более безопасный tool payload rendering и улучшенный diff display",new_0_6_11_9:"Skills и Workspace flows поддерживают external skill directories, import/delete refresh, sourcePath grouping, localized folder picker text и mobile skill action icons",new_0_6_11_10:"Device layout, session titles, browser tab titles, Kanban parent task IDs и OpenRouter attribution text получили UI polish",new_0_6_10_1:"Тексты сайта теперь последовательно используют название Hermes Studio, сохраняя неизменными идентификаторы npm package, CLI, репозитория и переменных окружения",new_0_6_10_2:"Экраны запуска desktop и загрузки runtime теперь используют локализованные тексты для запуска сервисов, выбора источника, прогресса и ошибок",new_0_6_10_3:"Проверки процессов Windows Agent Bridge допускают локализованный вывод tasklist/taskkill и предотвращают сбои UnicodeDecodeError из-за не-UTF-8 вывода системных команд",new_0_6_10_4:"Документация OpenAPI теперь включает endpoints для avatar, auxiliary model config, provider model cache refresh и импорта Hermes sessions",new_0_6_10_5:"Workspace file browser теперь поддерживает более полные text previews и coverage контекстного меню для source и document files",new_0_6_10_6:"Agent Bridge стал надежнее благодаря обновлению tool approval allowlists и декодированию Windows tasklist/taskkill output",new_0_6_10_7:"Пользователи могут загружать profile avatars, а group chat members теперь синхронизируют и отображают account avatars единообразно",new_0_6_10_8:"Provider model catalogs теперь можно refresh из UI",new_0_6_10_9:"Memory notes теперь можно сохранять с пустым содержимым, чтобы очищать personal notes без ошибки сохранения",new_0_6_10_10:"Repository harness docs теперь отслеживают chat-chain changes, чтобы bridge и chat-runtime updates были документированы до прохождения CI",new_0_6_9_1:"Приложение теперь использует бренд Hermes Studio в заголовке браузера, боковой панели, заголовке сайта, метаданных пакетов и официальных ссылках",new_0_6_9_2:"Проверка обновлений desktop стала надёжнее благодаря fallback через release feed, когда GitHub API ограничен rate limit или отсутствуют metadata для tag",new_0_6_9_3:"На macOS установка обновления сначала останавливает локальный Web UI server, затем electron-updater выполняет quit и install, поэтому Restart применяет скачанную версию",new_0_6_9_4:"Provider credentials и auth теперь последовательнее учитывают Profile scope, а запуск gateway/runtime лучше совместим с packaged desktop",new_0_6_9_5:"Browser Web Speech теперь ставит на паузу и возобновляет текущее сообщение в Chrome вместо повторного запуска с начала",new_0_6_9_6:"Русская локализация теперь доступна в переключателе языка, включая переведённые сообществом сообщения клиентского интерфейса",new_0_6_8_1:"Desktop builds получили tray controls, ручную проверку обновлений, уведомления об обновлениях и открытие packaged Web UI в локальном браузере",new_0_6_8_2:"Windows desktop запускается тише и надёжнее: скрыты Python/bridge subprocesses, исправлены terminal popups, размер tray icon и browser packaging",new_0_6_8_3:"Desktop packaging стал стабильнее на разных платформах благодаря исправлениям macOS signing file limit, writable paths в Linux, runtime cold start и workflow checkout",new_0_6_8_4:"Официальный сайт и release distribution улучшены download mirrors, последовательным deploy сайта после desktop release и очисткой desktop smoke checks",new_0_6_8_5:"Runtime usability улучшена за счёт provider context-length preferences, сохранения unsent chat drafts, исправлений mobile layout overflow, custom ports в SSH file provider и nonblocking preview actions",new_0_6_7_1:"Desktop app теперь по умолчанию использует порт 8748, поддерживает LAN access и может открываться напрямую из локального браузера",new_0_6_7_9:"Desktop download links теперь доступны на официальном сайте https://hermes-studio.ai/, а последние installers остаются доступными в GitHub Releases",new_0_6_7_2:"MCP tooling стал полнее благодаря исправлениям bridge tool discovery, lifecycle управления MCP и per-model tool visibility controls в manager",new_0_6_7_3:"Message lists теперь корректно центрируют empty states, уменьшают scroll jitter, не пропускают live chat messages в History при загрузке, сохраняют scroll positions по session и используют fade in 1.5 секунды при переключении sessions",new_0_6_7_4:"Bridge и runtime stability улучшены за счёт сохранения порядка text/tool-call, исправления загрузки Profile runtime status, улучшения Node/npm detection и пропуска создания production data directory",new_0_6_7_5:"Desktop distribution теперь покрывает Electron packaging, app naming, preload builds, release artifact uploads, Windows Hermes CLI launch, Linux icons and writable data paths, macOS unsigned release handling и скрытые Windows startup subprocesses",new_0_6_7_6:"Website получил downloads и deploy workflows, а deploy исправлен для окружений без rsync",new_0_6_7_7:"Server и auth fixes используют dirname для Windows credential directories и повышают avatar upload body limit, чтобы избежать 413 errors на крупных изображениях",new_0_6_7_8:"Repository harness, validation docs и agent guidance добавлены для coding agents, а устаревшие setup script docs удалены"}},da=["en","zh","zh-TW","ja","ko","fr","es","de","pt","ru"];function Ua(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function pt(o,e){const a={...o};for(const[l,s]of Object.entries(e)){const d=o[l];a[l]=Ua(d)&&Ua(s)?pt(d,s):s}return a}var Ti={en:ut,zh:yi,"zh-TW":Si,ja:ki,ko:wi,fr:Ci,es:Pi,de:Ai,pt:_i,ru:xi},mt={};for(const[o,e]of Object.entries(Ti))mt[o]=o==="en"?e:pt({...ut},{...e});var Mi=localStorage.getItem("hermes_locale");function Ii(o){if(o&&da.includes(o))return o;function e(a){const l=a.toLowerCase();if(l.startsWith("zh"))return l.includes("hant")||l.includes("-tw")||l.includes("-hk")||l.includes("-mo")?"zh-TW":"zh";const s=a.slice(0,2);return da.includes(a)?a:da.includes(s)?s:null}for(const a of navigator.languages){const l=e(a);if(l)return l}return"en"}function gt(o){document.documentElement.lang=o}var ht=Ii(Mi);gt(ht);var vt=ti({legacy:!1,locale:ht,fallbackLocale:"en",messages:mt});function Hi(o){vt.global.locale.value=o,gt(o)}var Di,Ri=Ie((()=>{Di="/logo.png"}));Ri();Ye();var Ei={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",placeholderColor:"#999999",caretColor:"#1a1a1a"},Card:{color:"#ffffff",borderColor:"#e0e0e0"},Modal:{color:"#ffffff"},Tag:{borderRadius:"6px"}},Fi={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 #3a3a3a",borderHover:"1px solid #666666",borderFocus:"1px solid #e0e0e0",placeholderColor:"#666666",caretColor:"#e0e0e0"},Card:{color:"#2a2a2a",borderColor:"#3a3a3a"},Modal:{color:"#2a2a2a"},Tag:{borderRadius:"6px"},Switch:{railColor:"#3a3a3a",railColorActive:"#66bb6a",loadingColor:"#e0e0e0",opacityDisabled:.4}};function Li(o,e){const a=o?Fi:Ei;return e?{...a,common:{...a.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:a}function Ni(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function Bo(){const o=Ni(so.value);Eo.value=o,wo.value=ko.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",wo.value)}function ft(){const o=me(()=>{const d=Eo.value?"dark":"light";return wo.value?`comic-${d}`:d});function e(d){so.value=d}function a(d){ko.value=d}function l(){so.value=Eo.value?"light":"dark"}function s(){ko.value=wo.value?"ink":"comic"}return{brightness:so,style:ko,isDark:Eo,isComic:wo,themeName:o,setBrightness:e,setStyle:a,toggleBrightness:l,toggleStyle:s}}var ca,ua,so,ko,Eo,wo,bt=Ie((()=>{ca="hermes_brightness",ua="hermes_style",so=b(localStorage.getItem(ca)||"system"),ko=b(localStorage.getItem(ua)||"ink"),Eo=b(!1),wo=b(!1),Bo(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{so.value==="system"&&Bo()}),ro(so,o=>{localStorage.setItem(ca,o),Bo()}),ro(ko,o=>{localStorage.setItem(ua,o),Bo()})})),pa,ma,za,qa,Oa,Ba,lo,qo=Ie((()=>{xe(),mi(),pa="0.6.13",ma="hermes_sidebar_collapsed",za="hermes_active_profile_name",qa=3e4,Oa=120*1e3,Ba=3e3,lo=ta("app",()=>{const o=b(!1),e=b(localStorage.getItem(ma)==="1"),a=b(!1),l=b(pa),s=b(""),d=b(!1),u=b(!1),g=b(""),P=b(!1),q=b(!1),w=b([]),W=b([]),_=b(""),G=b(""),z=b({}),V=b({}),re=b({}),ae=b(),k=b(""),I=b(!0),O=b(!0),J=b(4096);let y=null,X=0;function te(x){return new Promise(ie=>setTimeout(ie,x))}async function j(){if(q.value||!d.value)return!1;q.value=!0;try{await ci(),u.value=!1,s.value="";const x=Date.now()+Oa;for(;Date.now()<x;)if(await te(Ba),await A(),P.value)return fe(),!0;return!0}catch(x){return console.error("Failed to update Hermes Web UI:",x),!1}finally{q.value=!1}}async function A(){try{const x=await hi();a.value=x.status==="ok",x.webui_version&&(l.value=x.webui_version),P.value=!!x.webui_version&&x.webui_version!==pa,x.webui_latest?s.value=x.webui_latest:s.value="",d.value=!!x.webui_update_enabled,g.value=x.webui_update_source_label||"",u.value=!!x.webui_update_enabled&&!!x.webui_update_available,x.node_version&&(k.value=x.node_version)}catch{a.value=!1,P.value=!1,d.value=!1,u.value=!1,g.value=""}}function p(x){w.value=x.groups,W.value=x.profiles||[],V.value=x.model_aliases||{},re.value=x.model_visibility||{},z.value=x.custom_models||{};const ie=localStorage.getItem(za)||"",he=(ie?W.value.find(Me=>Me.profile===ie):void 0)||x,be=he.groups||[],ve=he.default||"",ye=he.default_provider||"",Ee=be.find(Me=>Me.provider===ye&&Me.models.includes(ve)),Ne=be.find(Me=>Me.models.includes(ve)),Io=be.find(Me=>Me.models.length>0),po=ye?be.find(Me=>Me.provider===ye):void 0,mo=ye?x.allProviders.find(Me=>Me.provider===ye):void 0,to=po?.available_models?.length?po.available_models:mo?.available_models?.length?mo.available_models:mo?.models||[],io=ye?re.value[ye]:void 0,go=!!(ve&&io?.mode==="include"&&!io.models.includes(ve)&&(to.length===0||to.includes(ve))),ho=!!(ve&&ye&&po&&!po.models.includes(ve)&&!go);if(Ee||Ne){const Me=Ee||Ne;_.value=ve,G.value=Me.provider}else ho?(_.value=ve,G.value=ye,z.value={...z.value,[ye]:Array.from(new Set([...z.value[ye]||[],ve]))}):Io?(_.value=Io.models[0],G.value=Io.provider):(_.value="",G.value="")}async function H(x=!1){if(Na()){if(!x&&y)return y;if(!(!x&&X>0&&Date.now()-X<qa))return X=Date.now(),y=(async()=>{try{p(await pi())}catch{}finally{y=null}})(),y}}async function $(x=15e3){if(!Na())return;const ie=y||(X===0?H():null);ie&&await Promise.race([ie,new Promise(he=>setTimeout(he,x))])}async function Fe(){return H(!0)}function Ke(x,ie){if(ie)return V.value[ie]?.[x]||"";for(const he of Object.values(V.value))if(he[x])return he[x];return""}function To(x,ie){return Ke(x,ie)||x}function Qe(x,ie,he){return x.map(be=>be.provider!==ie?be:{...be,models:be.models.filter(ve=>ve!==he),available_models:be.available_models?.filter(ve=>ve!==he)})}function K(x,ie){w.value=Qe(w.value,x,ie),W.value=W.value.map(he=>({...he,groups:Qe(he.groups,x,ie)}))}async function de(x,ie,he){const be=he.trim();await bi({provider:ie,model:x,alias:be});const ve={...V.value},ye={...ve[ie]||{}};be?(ye[x]=be,ve[ie]=ye):(delete ye[x],Object.keys(ye).length>0?ve[ie]=ye:delete ve[ie]),V.value=ve}async function Z(x,ie){try{const he=w.value.find(ve=>ve.models.includes(x)),be=ie||he?.provider||"";await fi({default:x,provider:be}),_.value=x,G.value=be||"",be&&!w.value.find(ve=>ve.provider===be)?.models.includes(x)&&(z.value=(await vi({provider:be,model:x})).custom_models||{})}catch(he){console.error("Failed to switch model:",he)}}async function We(x,ie){const he=z.value[ie]||[];if(!he.includes(x))return;const be={...z.value},ve=he.filter(ye=>ye!==x);ve.length>0?be[ie]=ve:delete be[ie];try{z.value=(await gi({provider:ie,model:x})).custom_models||be}catch(ye){console.error("Failed to remove custom model:",ye),z.value=be}if(K(ie,x),_.value===x&&G.value===ie){const ye=w.value.find(Ee=>Ee.provider===ie&&Ee.models.length>0)||w.value.find(Ee=>Ee.models.length>0);ye?await Z(ye.models[0],ye.provider):(_.value="",G.value="")}}function uo(x){return re.value[x]||{mode:"all",models:[]}}function je(x,ie){const he=uo(x);return he.mode!=="include"||he.models.includes(ie)}async function ce(x,ie){re.value=(await ui({provider:x,mode:ie.mode,models:ie.models})).model_visibility||{},await Fe()}function we(x=3e4){Oo(),A(),ae.value=setInterval(A,x)}function Oo(){ae.value&&(clearInterval(ae.value),ae.value=void 0)}function fe(){const x=new URL(window.location.href);x.searchParams.set("__hwui_reload",Date.now().toString()),window.location.replace(x.toString())}function Ge(){o.value=!o.value}function Mo(){o.value=!1}function ao(){e.value=!e.value;try{localStorage.setItem(ma,e.value?"1":"0")}catch{}}return{sidebarOpen:o,sidebarCollapsed:e,toggleSidebar:Ge,closeSidebar:Mo,toggleSidebarCollapsed:ao,connected:a,serverVersion:l,latestVersion:s,nodeVersion:k,updateEnabled:d,updateAvailable:u,updateSourceLabel:g,clientOutdated:P,updating:q,doUpdate:j,reloadClient:fe,modelGroups:w,profileModelGroups:W,customModels:z,modelAliases:V,modelVisibility:re,selectedModel:_,selectedProvider:G,streamEnabled:I,sessionPersistence:O,maxTokens:J,checkConnection:A,loadModels:H,waitForModelsForRun:$,reloadModels:Fe,applyAvailableModelsResponse:p,switchModel:Z,removeCustomModel:We,getModelAlias:Ke,displayModelName:To,setModelAlias:de,getProviderVisibility:uo,isModelVisible:je,setModelVisibility:ce,startHealthPolling:we,stopHealthPolling:Oo}})}));async function Wa(){return(await ee("/api/hermes/profiles")).profiles}async function Ui(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}`)).profile}async function zi(o={}){return ee(`/api/hermes/profiles/runtime-statuses${o.refresh===!1?"?refresh=0":""}`)}async function qi(o,e){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/avatar`,{method:"PUT",body:JSON.stringify(e)})).avatar}async function Oi(o){await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/avatar`,{method:"DELETE"})}async function Bi(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/gateway/restart`,{method:"POST"})).gateway}async function Wi(o){return(await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/restart`,{method:"POST"})).status}async function ji(o,e){try{const a=await ee("/api/hermes/profiles",{method:"POST",body:JSON.stringify({name:o,clone:e})});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 Gi(o){try{return await ee(`/api/hermes/profiles/${encodeURIComponent(o)}`,{method:"DELETE"}),!0}catch{return!1}}async function Vi(o,e){try{return await ee(`/api/hermes/profiles/${encodeURIComponent(o)}/rename`,{method:"POST",body:JSON.stringify({new_name:e})}),!0}catch{return!1}}async function Ki(o){return!!o}async function Qi(o){try{return await ee("/api/hermes/profiles/active",{method:"PUT",body:JSON.stringify({name:o})}),!0}catch{return!1}}async function Ji(o){try{const e=zo(),a=xo(),l={};a&&(l.Authorization=`Bearer ${a}`);const s=await fetch(`${e}/api/hermes/profiles/${encodeURIComponent(o)}/export`,{method:"POST",headers:l});if(!s.ok)throw new Error;const d=await s.blob(),u=URL.createObjectURL(d),g=document.createElement("a");return g.href=u,g.download=`hermes-profile-${o}.tar.gz`,g.click(),URL.revokeObjectURL(u),!0}catch{return!1}}async function $i(o){try{const e=zo(),a=xo(),l={};a&&(l.Authorization=`Bearer ${a}`);const s=new FormData;return s.append("file",o),(await fetch(`${e}/api/hermes/profiles/import`,{method:"POST",headers:l,body:s})).ok}catch{return!1}}var yt=Ie((()=>{Be()})),Zi=Bt({useProfilesStore:()=>co}),bo,co,ia=Ie((()=>{Lo(),xe(),yt(),qo(),bo="hermes_active_profile_name",co=ta("profiles",()=>{const o=b([]),e=b(localStorage.getItem(bo)),a=b(null),l=b({}),s=b(!1),d=b(!1);async function u(){s.value=!0;try{o.value=await Wa();const I=e.value||localStorage.getItem(bo);let O=o.value.find(J=>J.name===I)??null;!O&&o.value.length>0&&(O=o.value[0],e.value=O.name,localStorage.setItem(bo,O.name)),o.value=o.value.map(J=>({...J,active:!!O&&J.name===O.name})),a.value=O,O?e.value=O.name:(e.value=null,localStorage.removeItem(bo))}catch(I){console.error("Failed to fetch profiles:",I)}finally{s.value=!1}}async function g(){s.value=!0;try{o.value=await Wa(),a.value=o.value.find(I=>I.active)??null}catch(I){console.error("Failed to fetch Hermes profiles:",I)}finally{s.value=!1}}async function P(I){if(l.value[I])return l.value[I];try{const O=await Ui(I);return l.value[I]=O,O}catch{return null}}async function q(I,O){const J=await qi(I,O);return o.value=o.value.map(y=>y.name===I?{...y,avatar:J}:y),l.value[I]&&(l.value[I]={...l.value[I],avatar:J}),a.value?.name===I&&(a.value={...a.value,avatar:J}),J}async function w(I){await Oi(I),o.value=o.value.map(O=>O.name===I?{...O,avatar:null}:O),l.value[I]&&(l.value[I]={...l.value[I],avatar:null}),a.value?.name===I&&(a.value={...a.value,avatar:null})}async function W(I,O){const J=await ji(I,O);return J.success&&await u(),J}async function _(I){const O=await Gi(I);return O&&(delete l.value[I],await u()),O}function G(){}async function z(I,O){const J=await Vi(I,O);return J&&(delete l.value[I],await u()),J}async function V(I){d.value=!0;try{const O=await Ki(I);return O&&(e.value=I,localStorage.setItem(bo,I),o.value=o.value.map(J=>({...J,active:J.name===I})),a.value=o.value.find(J=>J.name===I)??null,await lo().reloadModels()),O}finally{d.value=!1}}async function re(I){d.value=!0;try{const O=await Qi(I);return O&&await g(),O}finally{d.value=!1}}async function ae(I){return Ji(I)}async function k(I){const O=await $i(I);return O&&await u(),O}return{profiles:o,activeProfile:a,activeProfileName:e,detailMap:l,loading:s,switching:d,fetchProfiles:u,fetchHermesProfiles:g,fetchProfileDetail:P,createProfile:W,deleteProfile:_,renameProfile:z,switchProfile:V,switchHermesProfile:re,exportProfile:ae,importProfile:k,updateAvatar:q,deleteAvatar:w,clearAllSessionCaches:G}})}));bt();xe();qo();ia();Ve();var Yi={class:"model-selector"},Xi={class:"model-label"},en=["title"],on={class:"model-list"},an=["onClick"],tn={class:"model-group-label"},nn={class:"model-group-count"},rn={class:"model-group-items"},sn=["title","onClick"],ln={class:"model-item-label"},dn={class:"model-item-name"},cn={key:0,class:"model-item-id"},un={key:0,class:"model-badge-preview"},pn={key:1,class:"model-badge-disabled"},mn={key:2,class:"model-badge-custom"},gn=["title","onClick"],hn={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"},vn={key:0,class:"model-empty"},fn={class:"model-custom"},bn={class:"model-custom-row"},yn={class:"model-custom-hint"},Sn=Le({__name:"ModelSelector",setup(o){const{t:e}=Xe(),a=lo(),l=co(),s=b(!1),d=b(""),u=b({}),g=b(""),P=b(""),q=me(()=>l.activeProfileName||"default"),w=me(()=>a.profileModelGroups.find(A=>A.profile===q.value)?.groups||[]),W=me(()=>(P.value=a.selectedProvider,w.value.map(A=>({label:A.label,value:A.provider})))),_=me(()=>w.value.map(A=>({...A,models:[...A.models,...(a.customModels[A.provider]||[]).filter(p=>!A.models.includes(p))]}))),G=me(()=>_.value.some(A=>A.provider===a.selectedProvider&&A.models.includes(a.selectedModel))),z=me(()=>G.value?a.displayModelName(a.selectedModel,a.selectedProvider):"");function V(A,p){return(a.customModels[p]||[]).includes(A)}async function re(A,p){await a.removeCustomModel(A,p)}function ae(A){return typeof A=="string"?A.toLowerCase():""}const k=me(()=>{const A=ae(d.value).trim();return A?_.value.map(p=>({...p,models:p.models.filter(H=>{const $=a.displayModelName(H,p.provider);return ae(H).includes(A)||ae($).includes(A)})})).filter(p=>p.models.length>0||ae(p.label).includes(A)):_.value});function I(A){u.value[A]=!u.value[A]}function O(A){return!!u.value[A]}function J(A,p){w.value.find(H=>H.provider===p)?.model_meta?.[A]?.disabled||(a.switchModel(A,p),s.value=!1,d.value="")}function y(A,p){return a.displayModelName(A,p)}function X(A,p){return a.getModelAlias(A,p)}function te(){const A=g.value.trim();!A||!P.value||w.value.find(p=>p.provider===P.value)?.model_meta?.[A]?.disabled||(a.switchModel(A,P.value),s.value=!1,d.value="",g.value="")}function j(){u.value={},d.value="",g.value="",P.value=a.selectedProvider,s.value=!0}return(A,p)=>(D(),B("div",Yi,[r("div",Xi,C(c(e)("models.title")),1),r("button",{class:"model-trigger",onClick:j},[r("span",{class:"model-name",title:c(a).selectedModel},C(z.value||"—"),9,en),p[4]||(p[4]=r("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"},[r("polyline",{points:"6 9 12 15 18 9"})],-1))]),Q(c(Ao),{show:s.value,"onUpdate:show":p[3]||(p[3]=H=>s.value=H),preset:"card",title:c(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:Y(()=>[Q(c(ya),{value:d.value,"onUpdate:value":p[0]||(p[0]=H=>d.value=H),placeholder:c(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),r("div",on,[(D(!0),B(_o,null,Po(k.value,H=>(D(),B("div",{key:H.provider,class:"model-group"},[r("div",{class:"model-group-header",onClick:$=>I(H.provider)},[(D(),B("svg",{class:De(["model-group-arrow",{collapsed:O(H.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[5]||(p[5]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),r("span",tn,C(H.label),1),r("span",nn,C(H.models.length),1)],8,an),So(r("div",rn,[(D(!0),B(_o,null,Po(H.models,$=>(D(),B("div",{key:$,class:De(["model-item",{active:$===c(a).selectedModel&&H.provider===c(a).selectedProvider,disabled:!!H.model_meta?.[$]?.disabled}]),title:H.model_meta?.[$]?.disabled?c(e)("models.disabledTooltip"):"",onClick:Fe=>J($,H.provider)},[r("span",ln,[r("span",dn,C(y($,H.provider)),1),X($,H.provider)?(D(),B("span",cn,C(c(e)("models.aliasCanonical",{model:$})),1)):Ce("",!0)]),H.model_meta?.[$]?.preview?(D(),B("span",un,C(c(e)("models.previewBadge")),1)):Ce("",!0),H.model_meta?.[$]?.disabled?(D(),B("span",pn,C(c(e)("models.disabledBadge")),1)):Ce("",!0),V($,H.provider)?(D(),B("span",mn,C(c(e)("models.customBadge")),1)):Ce("",!0),V($,H.provider)?(D(),B("button",{key:3,class:"model-custom-remove",type:"button",title:c(e)("models.removeCustomModel"),onClick:Kt(Fe=>re($,H.provider),["stop"])}," × ",8,gn)):Ce("",!0),$===c(a).selectedModel&&H.provider===c(a).selectedProvider?(D(),B("svg",hn,[...p[6]||(p[6]=[r("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):Ce("",!0)],10,sn))),128))],512),[[yo,!O(H.provider)]])]))),128)),k.value.length===0?(D(),B("div",vn,C(d.value?"No results":"No models"),1)):Ce("",!0),r("div",fn,[r("div",bn,[Q(c(st),{value:P.value,"onUpdate:value":p[1]||(p[1]=H=>P.value=H),options:W.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),Q(c(ya),{value:g.value,"onUpdate:value":p[2]||(p[2]=H=>g.value=H),placeholder:c(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:Xt(te,["enter"])},null,8,["value","placeholder"])]),r("div",yn,C(c(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});eo();var kn=oo(Sn,[["__scopeId","data-v-72b95fdf"]]),ja,Ga,Va,St,Ka=Ie((()=>{xe(),ja=qt(li()),Ga=["src"],Va=["innerHTML"],St=Le({__name:"ProfileAvatar",props:{name:{},avatar:{},size:{default:24}},setup(o){const e=o,a=me(()=>e.name||"default"),l=me(()=>(0,ja.default)(e.avatar?.seed||a.value)),s=me(()=>({width:`${e.size}px`,height:`${e.size}px`,flexBasis:`${e.size}px`}));return(d,u)=>(D(),B("span",{class:"profile-avatar-view",style:Qt(s.value)},[o.avatar?.type==="image"&&o.avatar.dataUrl?(D(),B("img",{key:0,class:"profile-avatar-image",src:o.avatar.dataUrl,alt:"",draggable:"false"},null,8,Ga)):(D(),B("span",{key:1,class:"profile-avatar-svg",innerHTML:l.value},null,8,Va))],4))}})})),wn=Ie((()=>{})),Go,Cn=Ie((()=>{Ka(),Ka(),wn(),eo(),Go=oo(St,[["__scopeId","data-v-6a9a551b"]])}));xe();Ye();ia();yt();Cn();Ve();var Pn={class:"profile-selector"},An={class:"selector-label"},_n={class:"profile-name"},xn={class:"profile-modal-header"},Tn={class:"profile-popover-title"},Mn={class:"profile-popover-name"},In={class:"profile-popover-subtitle"},Hn={class:"profile-runtime-list"},Dn={class:"profile-runtime-main"},Rn={class:"profile-runtime-info"},En={class:"profile-runtime-name-row"},Fn={class:"profile-runtime-name"},Ln={key:0,class:"active-badge"},Nn={class:"runtime-status-grid"},Un={class:"runtime-row compact"},zn={class:"runtime-label"},qn={class:"runtime-row compact"},On={class:"runtime-label"},Bn={key:0,class:"runtime-detail"},Wn={class:"profile-runtime-actions"},jn={key:0,class:"avatar-editor"},Gn={class:"avatar-editor-meta"},Vn={class:"avatar-editor-name"},Kn={class:"avatar-editor-hint"},Qn={class:"avatar-editor-actions"},Jn=Le({__name:"ProfileSelector",setup(o){const{t:e}=Xe(),a=xa(),l=co(),s=me(()=>l.activeProfileName??""),d=me(()=>s.value||"default"),u=me(()=>l.profiles.find(K=>K.name===d.value)),g=b([]),P=b(!1),q=b(!1),w=b(!1),W=b(null),_=b(!1),G=b(null),z=b({}),V=b({}),re=b({}),ae=me(()=>new Map(g.value.map(K=>[K.profile,K])));let k=0;async function I(K={}){const de=++k;K.background||(P.value=g.value.length===0);try{const Z=await zi({refresh:!K.background});return de!==k?!1:(g.value=Z.profiles,!!Z.refreshing)}catch{return g.value=[],!1}finally{de===k&&(P.value=!1)}}function O(){q.value=!0,I().then(K=>{K&&J()})}function J(K=0){K>=12||typeof window>"u"||window.setTimeout(()=>{q.value&&I({background:!0}).then(de=>{de&&J(K+1)})},K===0?700:1200)}function y(K){W.value=K,w.value=!0}function X(){return`profile-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}async function te(K){if(W.value){_.value=!0;try{await l.updateAvatar(W.value.name,K),a.success(e("profiles.avatar.saveSuccess")),w.value=!1}catch(de){a.error(de?.message||e("profiles.avatar.saveFailed"))}finally{_.value=!1}}}async function j(){await te({type:"generated",seed:X()})}async function A(){if(W.value){_.value=!0;try{await l.deleteAvatar(W.value.name),a.success(e("profiles.avatar.resetSuccess")),w.value=!1}catch(K){a.error(K?.message||e("profiles.avatar.resetFailed"))}finally{_.value=!1}}}function p(){G.value?.click()}async function H(K){const de=K.target,Z=de.files?.[0];if(de.value="",!!Z){if(!["image/png","image/jpeg","image/webp"].includes(Z.type)){a.warning(e("profiles.avatar.invalidType"));return}if(Z.size>1024*1024){a.warning(e("profiles.avatar.tooLarge"));return}await te({type:"image",dataUrl:await new Promise((We,uo)=>{const je=new FileReader;je.onload=()=>We(String(je.result||"")),je.onerror=()=>uo(je.error||new Error("Failed to read file")),je.readAsDataURL(Z)})})}}function $(K){return K==null?e("profiles.runtime.checking"):e(K?"profiles.runtime.running":"profiles.runtime.stopped")}function Fe(K){return K==null?e("profiles.runtime.checking"):e(K?"profiles.runtime.active":"profiles.runtime.idle")}async function Ke(K){z.value={...z.value,[K]:!0};try{const de=await Bi(K);ae.value.get(K)&&(g.value=g.value.map(Z=>Z.profile===K?{...Z,gateway:de}:Z)),a.success(e("profiles.runtime.gatewayRestarted",{name:K}))}catch(de){a.error(de?.message||e("profiles.runtime.gatewayRestartFailed"))}finally{z.value={...z.value,[K]:!1}}}async function To(K){V.value={...V.value,[K]:!0};try{const de=await Wi(K);g.value=g.value.map(Z=>Z.profile===K?de:Z),a.success(e("profiles.runtime.profileRestarted",{name:K}))}catch(de){a.error(de?.message||e("profiles.runtime.profileRestartFailed"))}finally{V.value={...V.value,[K]:!1}}}async function Qe(K){if(K!==d.value){re.value={...re.value,[K]:!0};try{if(!await l.switchProfile(K))throw new Error(e("profiles.switchFailed"));a.success(e("profiles.switchSuccess",{name:K})),window.location.reload()}catch(de){a.error(de?.message||e("profiles.switchFailed"))}finally{re.value={...re.value,[K]:!1}}}}return Fo(()=>{l.profiles.length===0&&l.fetchProfiles()}),(K,de)=>(D(),B("div",Pn,[r("div",An,C(c(e)("sidebar.profiles")),1),r("div",{class:"profile-display","data-testid":"profile-selector-select",onClick:O},[Q(Go,{class:"profile-avatar",name:d.value,avatar:u.value?.avatar,size:24},null,8,["name","avatar"]),r("span",_n,C(d.value),1)]),Q(c(Ao),{show:q.value,"onUpdate:show":de[0]||(de[0]=Z=>q.value=Z),preset:"card",bordered:!1,style:{width:"720px",maxWidth:"calc(100vw - 32px)"},class:"profile-manager-modal"},{header:Y(()=>[r("div",xn,[r("div",Tn,[r("span",Mn,C(c(e)("sidebar.profiles")),1),r("span",In,C(c(e)("profiles.runtime.activeProfile",{name:d.value})),1)])])]),default:Y(()=>[Q(c(lt),{show:P.value,size:"small"},{default:Y(()=>[r("div",Hn,[(D(!0),B(_o,null,Po(c(l).profiles,Z=>(D(),B("div",{key:Z.name,class:De(["profile-runtime-item",{active:Z.name===d.value}])},[r("div",Dn,[Q(Go,{class:"profile-runtime-avatar",name:Z.name,avatar:Z.avatar,size:34},null,8,["name","avatar"]),r("div",Rn,[r("div",En,[r("span",Fn,C(Z.name),1),Z.name===d.value?(D(),B("span",Ln,C(c(e)("profiles.runtime.activeTag")),1)):Ce("",!0)]),r("div",Nn,[r("div",Un,[r("span",zn,C(c(e)("profiles.runtime.bridgeWorker")),1),r("span",{class:De(["runtime-value",{running:ae.value.get(Z.name)?.bridge.running}])},[de[2]||(de[2]=r("span",{class:"runtime-dot"},null,-1)),Re(" "+C(Fe(ae.value.get(Z.name)?.bridge.running)),1)],2)]),r("div",qn,[r("span",On,C(c(e)("profiles.runtime.gateway")),1),r("span",{class:De(["runtime-value",{running:ae.value.get(Z.name)?.gateway.running}])},[de[3]||(de[3]=r("span",{class:"runtime-dot"},null,-1)),Re(" "+C($(ae.value.get(Z.name)?.gateway.running)),1)],2)])]),!ae.value.get(Z.name)?.gateway.running&&(ae.value.get(Z.name)?.gateway.diagnostics?.reason||ae.value.get(Z.name)?.gateway.error)?(D(),B("div",Bn,C(ae.value.get(Z.name)?.gateway.diagnostics?.reason||ae.value.get(Z.name)?.gateway.error),1)):Ce("",!0)])]),r("div",Wn,[Q(c(qe),{size:"small",type:"primary",onClick:We=>y(Z)},{default:Y(()=>[Re(C(c(e)("profiles.avatar.customize")),1)]),_:1},8,["onClick"]),Q(c(qe),{size:"small",type:"primary",loading:z.value[Z.name],onClick:We=>Ke(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.restartGateway")),1)]),_:1},8,["loading","onClick"]),Q(c(qe),{size:"small",type:"primary",loading:V.value[Z.name],onClick:We=>To(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.restartProfile")),1)]),_:1},8,["loading","onClick"]),Q(c(qe),{size:"small",type:"primary",disabled:Z.name===d.value,loading:re.value[Z.name],onClick:We=>Qe(Z.name)},{default:Y(()=>[Re(C(c(e)("profiles.runtime.switchProfile")),1)]),_:1},8,["disabled","loading","onClick"])])],2))),128))])]),_:1},8,["show"])]),_:1},8,["show"]),Q(c(Ao),{show:w.value,"onUpdate:show":de[1]||(de[1]=Z=>w.value=Z),preset:"card",title:c(e)("profiles.avatar.title"),bordered:!1,style:{width:"420px",maxWidth:"calc(100vw - 32px)"}},{default:Y(()=>[W.value?(D(),B("div",jn,[Q(Go,{name:W.value.name,avatar:W.value.avatar,size:72},null,8,["name","avatar"]),r("div",Gn,[r("div",Vn,C(W.value.name),1),r("div",Kn,C(c(e)("profiles.avatar.hint")),1)]),r("input",{ref_key:"fileInputRef",ref:G,class:"avatar-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:H},null,544),r("div",Qn,[Q(c(qe),{type:"primary",loading:_.value,onClick:p},{default:Y(()=>[Re(C(c(e)("profiles.avatar.upload")),1)]),_:1},8,["loading"]),Q(c(qe),{type:"primary",loading:_.value,onClick:j},{default:Y(()=>[Re(C(c(e)("profiles.avatar.random")),1)]),_:1},8,["loading"]),Q(c(qe),{loading:_.value,onClick:A},{default:Y(()=>[Re(C(c(e)("profiles.avatar.reset")),1)]),_:1},8,["loading"])])])):Ce("",!0)]),_:1},8,["show","title"])]))}});eo();var $n=oo(Jn,[["__scopeId","data-v-7b6f9840"]]);xe();Ve();Ye();var Zn=Le({__name:"LanguageSwitch",setup(o){const{locale:e}=Xe(),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 l(s){Hi(s),localStorage.setItem("hermes_locale",s)}return(s,d)=>(D(),Oe(c(st),{value:c(e),options:a,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":l},null,8,["value"]))}}),Yn=Zn;xe();var Xn={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},er=["title"],or={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ar={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},tr=["title"],ir={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},nr={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},rr=Le({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:a,toggleBrightness:l,toggleStyle:s}=ft();return(d,u)=>(D(),B("div",Xn,[r("button",{class:"theme-switch",title:c(a)?"Ink style":"Comic style",onClick:u[0]||(u[0]=(...g)=>c(s)&&c(s)(...g))},[c(a)?(D(),B("svg",or,[...u[2]||(u[2]=[r("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(D(),B("svg",ar,[...u[3]||(u[3]=[r("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,er),r("button",{class:"theme-switch",title:c(e)?"Light mode":"Dark mode",onClick:u[1]||(u[1]=(...g)=>c(l)&&c(l)(...g))},[c(e)?(D(),B("svg",ir,[...u[4]||(u[4]=[dt('<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)])])):(D(),B("svg",nr,[...u[5]||(u[5]=[r("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,tr)]))}});eo();var sr=oo(rr,[["__scopeId","data-v-4c30f4bd"]]);xe();var ga=b(!1);function Ma(){function o(){ga.value=!0}function e(){ga.value=!1}return{sessionSearchOpen:ga,openSessionSearch:o,closeSessionSearch:e}}xe();function lr(o){let e={};if(typeof window<"u")try{const s=window.localStorage.getItem(o);s&&(e=JSON.parse(s))}catch{e={}}const a=oi({...e});function l(){typeof window>"u"||window.localStorage.setItem(o,JSON.stringify({...a}))}return{record:a,persist:l}}xe();var dr=["href","title","aria-current","onClick"],cr=Le({__name:"RouteLinkItem",props:{to:{},active:{type:Boolean,default:void 0},exact:{type:Boolean,default:!1},title:{}},setup(o){const e=o;return(a,l)=>{const s=rt("RouterLink");return D(),Oe(s,{to:e.to,custom:""},{default:Y(d=>[r("a",{class:De(["route-link-item",{active:e.active??(e.exact?!!d?.isExactActive:!!d?.isActive)}]),href:d?.href||"#",title:e.title,"aria-current":e.active??(e.exact?!!d?.isExactActive:!!d?.isActive)?"page":void 0,onClick:d?.navigate},[ei(a.$slots,"default")],10,dr)]),_:3},8,["to"])}}}),Pe=cr,ur=[{version:"0.6.11",date:"2026-06-06",changes:["changelog.new_0_6_11_1","changelog.new_0_6_11_2","changelog.new_0_6_11_3","changelog.new_0_6_11_4","changelog.new_0_6_11_5","changelog.new_0_6_11_6","changelog.new_0_6_11_7","changelog.new_0_6_11_8","changelog.new_0_6_11_9","changelog.new_0_6_11_10"]},{version:"0.6.10",date:"2026-06-03",changes:["changelog.new_0_6_10_1","changelog.new_0_6_10_2","changelog.new_0_6_10_3","changelog.new_0_6_10_4","changelog.new_0_6_10_5","changelog.new_0_6_10_6","changelog.new_0_6_10_7","changelog.new_0_6_10_8","changelog.new_0_6_10_9","changelog.new_0_6_10_10"]},{version:"0.6.9",date:"2026-06-02",changes:["changelog.new_0_6_9_1","changelog.new_0_6_9_2","changelog.new_0_6_9_3","changelog.new_0_6_9_4","changelog.new_0_6_9_5","changelog.new_0_6_9_6"]},{version:"0.6.8",date:"2026-06-01",changes:["changelog.new_0_6_8_1","changelog.new_0_6_8_2","changelog.new_0_6_8_3","changelog.new_0_6_8_4","changelog.new_0_6_8_5"]},{version:"0.6.7",date:"2026-05-31",changes:["changelog.new_0_6_7_1","changelog.new_0_6_7_9","changelog.new_0_6_7_2","changelog.new_0_6_7_3","changelog.new_0_6_7_4","changelog.new_0_6_7_5","changelog.new_0_6_7_6","changelog.new_0_6_7_7","changelog.new_0_6_7_8"]}],Qa="http:";function pr(o){return(o||"").trim()||"localhost"}function mr(o){const e=pr(o||(typeof window<"u"?window.location.hostname:"localhost"));return{provisioningUrl:`${Qa}//${e}/`,businessUrl:`${Qa}//${e}:6060/`}}xe();Ve();Ye();qo();Be();var gr=["title"],hr={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},vr={key:0,points:"9 18 15 12 9 6"},fr={key:1,points:"15 18 9 12 15 6"},br={class:"sidebar-nav"},yr={class:"nav-group"},Sr={class:"nav-group-items"},kr={class:"nav-group"},wr={class:"nav-group-items"},Cr={class:"nav-group"},Pr={class:"nav-group-items"},Ar={class:"nav-group"},_r={class:"nav-group-items"},xr={class:"nav-group"},Tr={class:"nav-group-items"},Mr=["href"],Ir={class:"sidebar-footer"},Hr={class:"status-row"},Dr={class:"status-text"},Rr={class:"version-info"},Er={key:0,class:"sidebar-update-action"},Fr=["disabled"],Lr={class:"sidebar-update-label"},Nr={key:1,class:"sidebar-update-action"},Ur=["disabled"],zr={class:"sidebar-update-label"},qr={key:2,class:"sidebar-update-action sidebar-update-progress"},Or={class:"sidebar-update-label"},Br={key:3,class:"update-source"},Wr={key:4,class:"update-source"},jr={class:"changelog-list"},Gr={class:"changelog-version-header"},Vr={class:"changelog-version-tag"},Kr={class:"changelog-date"},Qr={class:"changelog-changes"},Jr="/logo.png",ha="Quanta Hermes",$r=Le({__name:"AppSidebar",setup(o){const{t:e}=Xe(),a=Ta(),l=Uo(),s=lo(),{openSessionSearch:d}=Ma(),u=me(()=>a.name==="hermes.session"?"hermes.chat":a.name==="hermes.historySession"?"hermes.history":a.name==="hermes.groupChatRoom"?"hermes.groupChat":a.name),g=me(()=>ri());function P(...J){return J.includes(u.value)}function q(J){return l.hasRoute(J)}const{record:w,persist:W}=lr("hermes.sidebar.collapsedGroups");function _(J){return e(`sidebar.group${J}${s.sidebarCollapsed?"Short":""}`)}const G=me(()=>mr().provisioningUrl);function z(J){w[J]=!w[J],W()}function V(J){return!!w[J]}function re(){localStorage.clear(),l.replace({name:"login"})}const ae=b(!1);function k(){ae.value=!0}async function I(){await s.doUpdate()}async function O(){typeof window<"u"&&window.location.reload()}return(J,y)=>(D(),B("aside",{class:De(["sidebar",{open:c(s).sidebarOpen,collapsed:c(s).sidebarCollapsed}])},[Q(Pe,{class:"sidebar-logo",to:{name:"hermes.chat"}},{default:Y(()=>[r("img",{src:Jr,alt:ha,class:"logo-img"}),r("span",{class:"logo-text"},C(ha))]),_:1}),r("button",{class:"collapse-btn",onClick:y[0]||(y[0]=X=>c(s).toggleSidebarCollapsed()),title:c(s).sidebarCollapsed?c(e)("sidebar.expand"):c(e)("sidebar.collapse")},[(D(),B("svg",hr,[c(s).sidebarCollapsed?(D(),B("polyline",vr)):(D(),B("polyline",fr))]))],8,gr),r("nav",br,[r("div",yr,[r("div",{class:"nav-group-label",onClick:y[1]||(y[1]=X=>z("conversation"))},[r("span",null,C(_("Conversation")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[8]||(y[8]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Sr,[Q(Pe,{class:"nav-item",to:{name:"hermes.chat"},active:P("hermes.chat","hermes.session")},{default:Y(()=>[y[9]||(y[9]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})],-1)),r("span",null,C(c(e)("sidebar.chat")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.history"},active:P("hermes.history","hermes.historySession")},{default:Y(()=>[y[10]||(y[10]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"10"}),r("polyline",{points:"12 6 12 12 16 14"})],-1)),r("span",null,C(c(e)("sidebar.history")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.groupChat"},active:P("hermes.groupChat","hermes.groupChatRoom")},{default:Y(()=>[y[12]||(y[12]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),r("circle",{cx:"9",cy:"7",r:"4"}),r("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),r("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})],-1)),r("span",null,[Re(C(c(e)("sidebar.groupChat")),1),y[11]||(y[11]=r("span",{class:"beta-tag"},"(beta)",-1))])]),_:1},8,["active"]),r("button",{class:"nav-item",onClick:y[2]||(y[2]=(...X)=>c(d)&&c(d)(...X))},[y[13]||(y[13]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"11",cy:"11",r:"7"}),r("path",{d:"m20 20-3.5-3.5"})],-1)),r("span",null,C(c(e)("sidebar.search")),1)])],512),[[yo,!V("conversation")]])]),r("div",kr,[r("div",{class:"nav-group-label",onClick:y[3]||(y[3]=X=>z("agent"))},[r("span",null,C(_("Agent")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[14]||(y[14]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",wr,[Q(Pe,{class:"nav-item",to:{name:"hermes.jobs"},active:u.value==="hermes.jobs"},{default:Y(()=>[y[15]||(y[15]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),r("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),r("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),r("line",{x1:"3",y1:"10",x2:"21",y2:"10"})],-1)),r("span",null,C(c(e)("sidebar.jobs")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.kanban"},active:u.value==="hermes.kanban"},{default:Y(()=>[y[16]||(y[16]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),r("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),r("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),r("span",null,C(c(e)("sidebar.kanban")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.channels"},active:u.value==="hermes.channels"},{default:Y(()=>[y[17]||(y[17]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),r("span",null,C(c(e)("sidebar.channels")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.skills"},active:u.value==="hermes.skills"},{default:Y(()=>[y[18]||(y[18]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),r("polyline",{points:"2 17 12 22 22 17"}),r("polyline",{points:"2 12 12 17 22 12"})],-1)),r("span",null,C(c(e)("sidebar.skills")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.plugins"},active:u.value==="hermes.plugins"},{default:Y(()=>[y[19]||(y[19]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("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"}),r("path",{d:"M5 19l1-1"})],-1)),r("span",null,C(c(e)("sidebar.plugins")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.mcp"},active:u.value==="hermes.mcp"},{default:Y(()=>[y[20]||(y[20]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M4 7V4h16v3"}),r("path",{d:"M9 20h6"}),r("path",{d:"M12 7v13"}),r("rect",{x:"4",y:"7",width:"16",height:"7",rx:"2"})],-1)),r("span",null,C(c(e)("sidebar.mcp")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.memory"},active:u.value==="hermes.memory"},{default:Y(()=>[y[21]||(y[21]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M9 18h6"}),r("path",{d:"M10 22h4"}),r("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),r("span",null,C(c(e)("sidebar.memory")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.models"},active:u.value==="hermes.models"},{default:Y(()=>[y[22]||(y[22]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"3"}),r("path",{d:"M12 1v4"}),r("path",{d:"M12 19v4"}),r("path",{d:"M1 12h4"}),r("path",{d:"M19 12h4"}),r("path",{d:"M4.22 4.22l2.83 2.83"}),r("path",{d:"M16.95 16.95l2.83 2.83"}),r("path",{d:"M4.22 19.78l2.83-2.83"}),r("path",{d:"M16.95 7.05l2.83-2.83"})],-1)),r("span",null,C(c(e)("sidebar.models")),1)]),_:1},8,["active"])],512),[[yo,!V("agent")]])]),r("div",Cr,[r("div",{class:"nav-group-label",onClick:y[4]||(y[4]=X=>z("monitoring"))},[r("span",null,C(_("Monitoring")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[23]||(y[23]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Pr,[Q(Pe,{class:"nav-item",to:{name:"hermes.logs"},active:u.value==="hermes.logs"},{default:Y(()=>[y[24]||(y[24]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),r("polyline",{points:"14 2 14 8 20 8"}),r("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),r("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),r("polyline",{points:"10 9 9 9 8 9"})],-1)),r("span",null,C(c(e)("sidebar.logs")),1)]),_:1},8,["active"]),Q(Pe,{class:"nav-item",to:{name:"hermes.usage"},active:u.value==="hermes.usage"},{default:Y(()=>[y[25]||(y[25]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),r("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),r("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),r("span",null,C(c(e)("sidebar.usage")),1)]),_:1},8,["active"]),g.value?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.performance"},active:u.value==="hermes.performance"},{default:Y(()=>[y[26]||(y[26]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),r("span",null,C(c(e)("sidebar.performance")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.skillsUsage"},active:u.value==="hermes.skillsUsage"},{default:Y(()=>[y[27]||(y[27]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M21.21 15.89A10 10 0 1 1 8.11 2.79"}),r("path",{d:"M22 12A10 10 0 0 0 12 2v10z"})],-1)),r("span",null,C(c(e)("sidebar.skillsUsage")),1)]),_:1},8,["active"])],512),[[yo,!V("monitoring")]])]),r("div",Ar,[r("div",{class:"nav-group-label",onClick:y[5]||(y[5]=X=>z("tools"))},[r("span",null,C(_("Tools")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("tools")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[28]||(y[28]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",_r,[q("hermes.codingAgents")?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.codingAgents"},active:u.value==="hermes.codingAgents"},{default:Y(()=>[y[29]||(y[29]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("polyline",{points:"16 18 22 12 16 6"}),r("polyline",{points:"8 6 2 12 8 18"}),r("line",{x1:"12",y1:"20",x2:"14",y2:"4"})],-1)),r("span",null,C(c(e)("sidebar.codingAgents")),1)]),_:1},8,["active"])):Ce("",!0),q("hermes.versionPreview")&&g.value?(D(),Oe(Pe,{key:1,class:"nav-item",to:{name:"hermes.versionPreview"},active:u.value==="hermes.versionPreview"},{default:Y(()=>[y[30]||(y[30]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("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"}),r("polyline",{points:"7.5 4.21 12 6.81 16.5 4.21"}),r("polyline",{points:"7.5 19.79 7.5 14.6 3 12"}),r("polyline",{points:"21 12 16.5 14.6 16.5 19.79"}),r("polyline",{points:"3.27 6.96 12 12.01 20.73 6.96"}),r("line",{x1:"12",y1:"22.08",x2:"12",y2:"12"})],-1)),r("span",null,C(c(e)("sidebar.versionPreview")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.devices"},active:u.value==="hermes.devices"},{default:Y(()=>[y[31]||(y[31]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("rect",{x:"3",y:"4",width:"18",height:"12",rx:"2"}),r("path",{d:"M8 20h8"}),r("path",{d:"M12 16v4"}),r("path",{d:"M6 8h.01"}),r("path",{d:"M10 8h.01"})],-1)),r("span",null,C(c(e)("sidebar.devices")),1)]),_:1},8,["active"])],512),[[yo,!V("tools")]])]),r("div",xr,[r("div",{class:"nav-group-label",onClick:y[6]||(y[6]=X=>z("system"))},[r("span",null,C(_("System")),1),(D(),B("svg",{class:De(["nav-group-arrow",{collapsed:V("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...y[32]||(y[32]=[r("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),So(r("div",Tr,[r("a",{class:"nav-item",href:G.value,target:"_blank",rel:"noopener noreferrer"},[y[33]||(y[33]=dt('<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" data-v-271355f9><rect x="16" y="16" width="6" height="6" rx="1" data-v-271355f9></rect><path d="M32 22h-8" data-v-271355f9></path><path d="M22 22h-2" data-v-271355f9></path><path d="M32 16h-12" data-v-271355f9></path><path d="M18 16H2" data-v-271355f9></path><path d="M32 10H12" data-v-271355f9></path><path d="M18 10H2" data-v-271355f9></path><path d="M22 4H2" data-v-271355f9></path></svg>',1)),r("span",null,C(c(e)("sidebar.networkConfig")),1)],8,Mr),g.value?(D(),Oe(Pe,{key:0,class:"nav-item",to:{name:"hermes.profiles"},active:u.value==="hermes.profiles"},{default:Y(()=>[y[34]||(y[34]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),r("circle",{cx:"12",cy:"7",r:"4"})],-1)),r("span",null,C(c(e)("sidebar.profiles")),1)]),_:1},8,["active"])):Ce("",!0),Q(Pe,{class:"nav-item",to:{name:"hermes.settings"},active:u.value==="hermes.settings"},{default:Y(()=>[y[35]||(y[35]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("circle",{cx:"12",cy:"12",r:"3"}),r("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)),r("span",null,C(c(e)("sidebar.settings")),1)]),_:1},8,["active"])],512),[[yo,!V("system")]])])]),Q($n),Q(kn),r("div",Ir,[r("button",{class:"nav-item logout-item",onClick:re},[y[36]||(y[36]=r("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[r("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),r("polyline",{points:"16 17 21 12 16 7"}),r("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),r("span",null,C(c(e)("sidebar.logout")),1)]),r("div",Hr,[r("div",{class:De(["status-indicator",{connected:c(s).connected,disconnected:!c(s).connected}])},[y[37]||(y[37]=r("span",{class:"status-dot"},null,-1)),r("span",Dr,C(c(s).connected?c(e)("sidebar.connected"):c(e)("sidebar.disconnected")),1)],2),Q(Yn)]),r("div",Rr,[r("span",{class:"version-text",onClick:k},C(ha)+" v"+C(c(s).serverVersion||"0.1.0"),1),Q(sr)]),c(s).updateEnabled&&c(s).updateAvailable&&!c(s).updating?(D(),B("div",Er,[r("button",{class:"sidebar-update-btn",disabled:c(s).updating,onClick:I},[r("span",Lr,C(c(e)("sidebar.updateVersion",{version:c(s).latestVersion||c(s).serverVersion})),1)],8,Fr)])):c(s).updateEnabled&&c(s).clientOutdated&&!c(s).updating?(D(),B("div",Nr,[r("button",{class:"sidebar-update-btn",disabled:c(s).updating,onClick:O},[r("span",zr,C(c(e)("sidebar.reloadClientVersion",{version:c(s).serverVersion})),1)],8,Ur)])):c(s).updating?(D(),B("div",qr,[r("span",Or,C(c(e)("sidebar.updating")),1)])):Ce("",!0),c(s).updateEnabled&&c(s).updateSourceLabel?(D(),B("div",Br,C(c(e)("sidebar.updateSource",{source:c(s).updateSourceLabel})),1)):c(s).updateEnabled?Ce("",!0):(D(),B("div",Wr,C(c(e)("sidebar.updateManagedInternally")),1))]),Q(c(Ao),{show:ae.value,"onUpdate:show":y[7]||(y[7]=X=>ae.value=X),preset:"dialog",title:c(e)("sidebar.changelog"),style:{width:"520px"}},{default:Y(()=>[r("div",jr,[(D(!0),B(_o,null,Po(c(ur),X=>(D(),B("div",{key:X.version,class:"changelog-version-block"},[r("div",Gr,[r("span",Vr,"v"+C(X.version),1),r("span",Kr,C(X.date),1)]),r("ul",Qr,[(D(!0),B(_o,null,Po(X.changes,(te,j)=>(D(),B("li",{key:j},C(c(e)(te)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});eo();var Zr=oo($r,[["__scopeId","data-v-271355f9"]]);function Yr(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onMessageDelta&&a.onMessageDelta(o)}function Xr(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onReasoningDelta&&a.onReasoningDelta(o)}function es(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onThinkingDelta&&a.onThinkingDelta(o)}function os(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onReasoningAvailable&&a.onReasoningAvailable(o)}function as(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onToolStarted&&a.onToolStarted(o)}function ts(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onToolCompleted&&a.onToolCompleted(o)}function Wo(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onSubagentEvent&&a.onSubagentEvent(o)}function is(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunStarted&&a.onRunStarted(o)}function ns(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunCompleted&&a.onRunCompleted(o),!(o.queue_remaining>0)&&pe.delete(e)}function rs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunFailed&&a.onRunFailed(o),!(o.queue_remaining>0)&&pe.delete(e)}function ss(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onRunQueued&&a.onRunQueued(o)}function ls(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onCompressionStarted&&a.onCompressionStarted(o)}function ds(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onCompressionCompleted&&a.onCompressionCompleted(o)}function cs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortStarted&&a.onAbortStarted(o)}function us(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortTimeout&&a.onAbortTimeout(o)}function ps(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAbortCompleted&&a.onAbortCompleted(o),!(o.queue_length>0)&&pe.delete(e)}function ms(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onUsageUpdated&&a.onUsageUpdated(o)}function gs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onSessionCommand&&a.onSessionCommand(o);for(const l of Zo)l(o)}function hs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a&&a.onSessionTitleUpdated?.(o);for(const l of Yo)l(o)}function vs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onAgentEvent&&a.onAgentEvent(o)}function fs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onApprovalRequested&&a.onApprovalRequested(o)}function bs(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onApprovalResolved&&a.onApprovalResolved(o)}function ys(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onPeerUserMessage&&a.onPeerUserMessage(o);for(const l of $o)l(o)}function Ss(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onClarifyRequested&&a.onClarifyRequested(o)}function ks(o){const e=o.session_id;if(!e)return;const a=pe.get(e);a?.onClarifyResolved&&a.onClarifyResolved(o)}function ws(o,e){return pe.set(o,e),()=>{pe.delete(o)}}function Cs(o){pe.delete(o)}function Ps(o){return $o.add(o),()=>{$o.delete(o)}}function As(o){return Zo.add(o),()=>{Zo.delete(o)}}function _s(o){return Yo.add(o),()=>{Yo.delete(o)}}function xs(o,e,a){na().emit("clarify.respond",{session_id:o,clarify_id:e,response:a})}function Ts(o,e,a){na().emit("approval.respond",{session_id:o,approval_id:e,choice:a})}function Ja(){return ue}function na(o){const e=o?.trim()||null;if(ue?.connected&&(!e||Ko===e))return ue;ue&&(ue.removeAllListeners(),ue.disconnect(),Vo=!1,Ko=null);const a=zo(),l=xo();let s=e||"default";try{if(!e){const{useProfilesStore:d}=(ia(),Ot(Zi));s=d().activeProfileName||"default"}}catch{s=e||localStorage.getItem("hermes_active_profile_name")||"default"}return Ko=s,ue=si(`${a}/chat-run`,{auth:{token:l},query:{profile:s},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),Vo||(ue.on("message.delta",Yr),ue.on("reasoning.delta",Xr),ue.on("thinking.delta",es),ue.on("reasoning.available",os),ue.on("tool.started",as),ue.on("tool.completed",ts),ue.on("subagent.start",Wo),ue.on("subagent.tool",Wo),ue.on("subagent.progress",Wo),ue.on("subagent.complete",Wo),ue.on("run.started",is),ue.on("run.failed",rs),ue.on("run.completed",ns),ue.on("run.queued",ss),ue.on("approval.requested",fs),ue.on("approval.resolved",bs),ue.on("run.peer_user_message",ys),ue.on("clarify.requested",Ss),ue.on("clarify.resolved",ks),ue.on("compression.started",ls),ue.on("compression.completed",ds),ue.on("abort.started",cs),ue.on("abort.timeout",us),ue.on("abort.completed",ps),ue.on("usage.updated",ms),ue.on("agent.event",vs),ue.on("session.command",gs),ue.on("session.title.updated",hs),Vo=!0),ue}function jo(o,e,a){const l=o;if(typeof l.off=="function"){l.off(e,a);return}l.removeListener?.(e,a)}function $a(o,e,a){const l=na(a);return l.once("resumed",e),l.emit("resume",{session_id:o,...a?{profile:a}:{}}),l}function Ms(o,e,a,l,s,d){const u=o.session_id;if(!u)throw new Error("session_id is required for startRunViaSocket");let g=!1;const P=na(o.profile);if(pe.has(u))return P.emit("run",o),{abort:()=>{g||P.emit("abort",{session_id:u})}};let q=!1,w=()=>{},W=null;const _=()=>{W&&(jo(P,"resumed",W),W=null)},G=()=>{_(),d?.onReconnectResume&&(W=k=>{_(),!(g||k.session_id!==u)&&d.onReconnectResume?.(k)},P.on("resumed",W)),P.emit("resume",{session_id:u,...o.profile?{profile:o.profile}:{}})},z=k=>{g||(g=!0,w(),pe.delete(u),l(k))},V=k=>{g||q||z(k)};P.on("connect_error",V);const re=k=>{if(!(g||k==="io client disconnect")){if(kt.has(k)){q=!0;return}z(new Error(`Socket disconnected: ${k}`))}};P.on("disconnect",re);const ae=()=>{g||!q||(q=!1,G())};return P.on("connect",ae),w=()=>{_(),jo(P,"connect_error",V),jo(P,"disconnect",re),jo(P,"connect",ae)},pe.set(u,{onMessageDelta:k=>{g||e(k)},onReasoningDelta:k=>{g||e(k)},onThinkingDelta:k=>{g||e(k)},onReasoningAvailable:k=>{g||e(k)},onToolStarted:k=>{g||e(k)},onToolCompleted:k=>{g||e(k)},onSubagentEvent:k=>{g||e(k)},onRunStarted:k=>{g||(e(k),s?.(k.run_id||""))},onRunCompleted:k=>{g||(e(k),!(k.queue_remaining>0)&&(g=!0,w(),a()))},onRunFailed:k=>{g||(e(k),!(k.queue_remaining>0)&&(g=!0,w(),a()))},onCompressionStarted:k=>{g||e(k)},onCompressionCompleted:k=>{g||e(k)},onAbortStarted:k=>{g||e(k)},onAbortTimeout:k=>{g||e(k)},onAbortCompleted:k=>{g||(e(k),!(k.queue_length>0)&&(g=!0,w(),a()))},onUsageUpdated:k=>{g||e(k)},onAgentEvent:k=>{g||e(k)},onSessionCommand:k=>{g||(e(k),k.terminal!==!1&&(g=!0,w(),pe.delete(u),a()))},onSessionTitleUpdated:k=>{e(k)},onRunQueued:k=>{g||e(k)},onApprovalRequested:k=>{g||e(k)},onApprovalResolved:k=>{g||e(k)},onClarifyRequested:k=>{g||e(k)},onClarifyResolved:k=>{g||e(k)}}),P.emit("run",o),{abort:()=>{g||P.emit("abort",{session_id:u})}}}var ue,Vo,Ko,kt,pe,$o,Zo,Yo,Is=Ie((()=>{di(),Be(),ue=null,Vo=!1,Ko=null,kt=new Set(["transport close","transport error","ping timeout"]),pe=new Map,$o=new Set,Zo=new Set,Yo=new Set}));async function Sa(o,e,a){const l=new URLSearchParams;o&&l.set("source",o),e&&l.set("limit",String(e)),a&&l.set("profile",a);const s=l.toString();return(await ee(`/api/hermes/sessions${s?`?${s}`:""}`)).sessions}async function ad(o,e,a){const l=new URLSearchParams;o&&l.set("source",o),e&&l.set("limit",String(e)),a&&l.set("profile",a);const s=l.toString();return(await ee(`/api/hermes/sessions/hermes${s?`?${s}`:""}`)).sessions}async function Za(o,e,a,l){const s=new URLSearchParams;return s.set("q",o),e&&s.set("source",e),a&&s.set("limit",String(a)),l&&s.set("profile",l),(await ee(`/api/hermes/search/sessions?${s.toString()}`)).results}async function Ya(o,e,a=300,l){try{const s=new URLSearchParams;return s.set("offset",String(e)),s.set("limit",String(a)),l&&s.set("profile",l),await ee(`/api/hermes/sessions/conversations/${encodeURIComponent(o)}/messages/paginated?${s}`)}catch{return null}}async function td(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return(await ee(`/api/hermes/sessions/hermes/${o}${l?`?${l}`:""}`)).session}catch{return null}}async function Hs(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return await ee(`/api/hermes/sessions/${o}${l?`?${l}`:""}`,{method:"DELETE"}),!0}catch{return!1}}async function id(o,e){const a=new URLSearchParams;e&&a.set("profile",e);const l=a.toString();return ee(`/api/hermes/sessions/hermes/${encodeURIComponent(o)}/import${l?`?${l}`:""}`,{method:"POST"})}async function nd(o){try{const e=o.map(a=>typeof a=="string"?{id:a}:{id:a.id,profile:a.profile||void 0});return await ee("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:e.map(a=>a.id),sessions:e})})}catch(e){throw e}}async function rd(o,e){try{return await ee(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function sd(o,e){try{return await ee(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Ds(o,e,a){try{return await ee(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:a})}),!0}catch{return!1}}async function ld(o,e="full",a="json"){const l=zo(),s=xo(),d=`${l}/api/hermes/sessions/${o}/export?mode=${e}&ext=${a}&token=${encodeURIComponent(s)}`,u=await fetch(d);if(!u.ok)throw new Error("Export failed");const g=await u.blob(),P=u.headers.get("Content-Disposition")||"";let q=`session_${o}.${a}`;const w=P.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);w&&(q=decodeURIComponent(w[1].replace(/"/g,"")));const W=document.createElement("a");W.href=URL.createObjectURL(g),W.download=q,W.click(),URL.revokeObjectURL(W.href)}async function dd(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,a=new URLSearchParams;return a.set("days",String(e)),ee(`/api/hermes/usage/stats?${a}`)}async function cd(o,e,a){const l=new URLSearchParams;o&&l.set("profile",o),e&&l.set("provider",e),a&&l.set("model",a);const s=l.toString();return(await ee(`/api/hermes/sessions/context-length${s?`?${s}`:""}`)).context_length}var wt=Ie((()=>{Be()}));function Ia(o,e){const a=zo();if(o.startsWith("/api/hermes/download?"))try{const u=new URL(o,"http://localhost").searchParams.get("path");u&&(o=u)}catch{}const l=new URLSearchParams({path:decodeURIComponent(o)});if(e){const u=decodeURIComponent(e);l.set("name",u)}const s=ct();s&&l.set("profile",s);const d=xo();return d&&l.set("token",d),`${a}/api/hermes/download?${l.toString()}`}async function ud(o,e){const a=Ia(o,e),l=await fetch(a);if(!l.ok){const g=await l.json().catch(()=>({error:`HTTP ${l.status}`}));throw new Error(g.error||`Download failed: ${l.status}`)}const s=await l.blob(),d=URL.createObjectURL(s),u=document.createElement("a");u.href=d,u.download=e||o.split("/").pop()||"download",document.body.appendChild(u),u.click(),document.body.removeChild(u),URL.revokeObjectURL(d)}async function pd(o,e){const a=Ia(o,e),l=await fetch(a);if(!l.ok){const s=await l.json().catch(()=>({error:`HTTP ${l.status}`}));throw new Error(s.error||`Preview failed: ${l.status}`)}return l.text()}var Rs=Ie((()=>{Be()}));async function Es(o){return ee(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function Fs(o,e,a){await ee("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e,...a})})}async function md(){return ee("/api/hermes/config/auxiliary-models")}async function gd(o){return ee("/api/hermes/config/auxiliary-models",{method:"PUT",body:JSON.stringify({auxiliary:o})})}async function hd(o,e){await ee("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function vd(){return ee("/api/hermes/weixin/qrcode")}async function fd(o){return ee(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function bd(o){await ee("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var Ls=Ie((()=>{Be()}));function Xa(o){if(!Array.isArray(o))return[];const e=new Set,a=[];for(const l of o){const s=String(l||"").trim();!s||e.has(s)||(e.add(s),a.push(s))}return a}function et(o,e){const a={...o};return"enabled"in e&&(typeof e.enabled=="boolean"?a.enabled=e.enabled:delete a.enabled),"include"in e&&(Array.isArray(e.include)?a.include=Xa(e.include):delete a.include),"exclude"in e&&(Array.isArray(e.exclude)?a.exclude=Xa(e.exclude):delete a.exclude),a}var ka,Ns=Ie((()=>{Lo(),xe(),Ls(),ka=ta("settings",()=>{const o=b(!1),e=b(!1),a=b({}),l=b({}),s=b({}),d=b({}),u=b({}),g=b({}),P=b({}),q=b({}),w=b({}),W=b({}),_=b({}),G=b({}),z=b({}),V=b({}),re=b({}),ae=b({}),k=b({}),I=b({}),O=b({});async function J(){o.value=!0;try{const te=await Es();a.value=te.display||{},l.value=te.agent||{},s.value=te.memory||{},d.value=te.compression||{},u.value=te.session_reset||{},g.value=te.privacy||{},P.value=te.approvals||{},q.value=te.gatewayAutoStart||{},w.value=te.telegram||{},W.value=te.discord||{},_.value=te.slack||{},G.value=te.whatsapp||{},z.value=te.matrix||{},V.value=te.wecom||{},re.value=te.feishu||{},ae.value=te.dingtalk||{},k.value=te.qqbot||{},I.value=te.weixin||{},O.value=te.platforms||{}}catch(te){console.error("Failed to fetch settings:",te)}finally{o.value=!1}}function y(te,j){switch(te){case"display":a.value={...a.value,...j};break;case"agent":l.value={...l.value,...j};break;case"memory":s.value={...s.value,...j};break;case"compression":d.value={...d.value,...j};break;case"session_reset":u.value={...u.value,...j};break;case"privacy":g.value={...g.value,...j};break;case"approvals":P.value={...P.value,...j};break;case"gatewayAutoStart":q.value=et(q.value,j);break;case"telegram":w.value={...w.value,...j};break;case"discord":W.value={...W.value,...j};break;case"slack":_.value={..._.value,...j};break;case"whatsapp":G.value={...G.value,...j};break;case"matrix":z.value={...z.value,...j};break;case"wecom":V.value={...V.value,...j};break;case"feishu":re.value={...re.value,...j};break;case"dingtalk":ae.value={...ae.value,...j};break;case"qqbot":k.value={...k.value,...j};break;case"weixin":I.value={...I.value,...j};break;case"platforms":for(const[A,p]of Object.entries(j))O.value={...O.value,[A]:{...O.value[A]||{},...p}};break}}async function X(te,j,A){e.value=!0;try{switch(await Fs(te,j,A),te){case"display":a.value={...a.value,...j};break;case"agent":l.value={...l.value,...j};break;case"memory":s.value={...s.value,...j};break;case"compression":d.value={...d.value,...j};break;case"session_reset":u.value={...u.value,...j};break;case"privacy":g.value={...g.value,...j};break;case"approvals":P.value={...P.value,...j};break;case"gatewayAutoStart":q.value=et(q.value,j);break;case"telegram":w.value={...w.value,...j};break;case"discord":W.value={...W.value,...j};break;case"slack":_.value={..._.value,...j};break;case"whatsapp":G.value={...G.value,...j};break;case"matrix":z.value={...z.value,...j};break;case"wechat":case"wecom":V.value={...V.value,...j};break;case"feishu":re.value={...re.value,...j};break;case"dingtalk":ae.value={...ae.value,...j};break;case"qqbot":k.value={...k.value,...j};break;case"weixin":I.value={...I.value,...j};break;case"platforms":for(const[p,H]of Object.entries(j))O.value={...O.value,[p]:{...O.value[p]||{},...H}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:a,agent:l,memory:s,compression:d,sessionReset:u,privacy:g,approvals:P,gatewayAutoStart:q,telegram:w,discord:W,slack:_,whatsapp:G,matrix:z,wecom:V,feishu:re,dingtalk:ae,qqbot:k,weixin:I,platforms:O,fetchSettings:J,saveSection:X,updateLocal:y}})}));function Ct(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(Qo||(Qo=new o),Qo):null}function Us(){const o=Ct();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function zs(){const o=Ct();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,a=.16,l=o.createOscillator(),s=o.createGain();return l.type="sine",l.frequency.setValueAtTime(880,e),l.frequency.exponentialRampToValueAtTime(660,e+a),s.gain.setValueAtTime(1e-4,e),s.gain.exponentialRampToValueAtTime(.18,e+.015),s.gain.exponentialRampToValueAtTime(1e-4,e+a),l.connect(s),s.connect(o.destination),l.start(e),l.stop(e+a),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var Qo,qs=Ie((()=>{Qo=null}));function wa(o){const e=[];let a=o.replace(Pt,l=>(e.push(l),`${Xo}${e.length-1}${ea}`));return a=a.replace(At,l=>(e.push(l),`${Xo}${e.length-1}${ea}`)),{masked:a,blocks:e}}function va(o,e){if(e.length===0)return o;const a=new RegExp(`${Xo}(\\d+)${ea}`,"g");let l=o;for(let s=0;s<e.length;s+=1){const d=l.replace(a,(u,g)=>e[Number(g)]??"");if(d===l)break;l=d}return l}function yd(o,e){const{masked:a,blocks:l}=wa(o),s=[];let d=null,u="",g=0;Ca.lastIndex=0;let P;for(;(P=Ca.exec(a))!==null;)u+=a.slice(g,P.index),s.push(P[2]),g=P.index+P[0].length;const q=a.slice(g),w=q.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return w?(u+=q.slice(0,w.index),e.streaming?d=w[2]:u+=q.slice(w.index)):u+=q,{segments:s.map(W=>va(W,l)),pending:d===null?null:va(d,l),body:va(u,l),hasThinking:s.length>0||d!==null}}function Sd(o){const e=a=>[...a].length;return o.segments.reduce((a,l)=>a+e(l),0)+e(o.pending||"")}function Os(o,e){const a=wa(o).masked,l=wa(e).masked;return{startedAtBoundary:!Pa.test(a)&&Pa.test(l),endedAtBoundary:!Aa.test(a)&&Aa.test(l)}}var Ca,Xo,ea,Pt,At,Pa,Aa,Bs=Ie((()=>{Ca=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,Xo="\0THKCODE",ea="\0",Pt=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,At=/`[^`\n]*`/g,Pa=/<(think|thinking|reasoning)>/i,Aa=/<\/(think|thinking|reasoning)>/i}));function _e(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Ws(o){if(typeof o!="string"||!o.trim())return!1;try{const e=JSON.parse(o);if(e&&typeof e=="object"){const a=e;if(a.success===!1||a.error!=null&&String(a.error).trim()!=="")return!0}}catch{return!1}return!1}async function js(o){if(o.length===0)return[];const e=new FormData;for(const u of o)u.file&&e.append("file",u.file,u.name);const a=localStorage.getItem("hermes_api_key")||"",l=ct(),s={};a&&(s.Authorization=`Bearer ${a}`),l&&(s["X-Hermes-Profile"]=l);const d=await fetch("/upload",{method:"POST",body:e,headers:s});if(!d.ok)throw new Error(`Upload failed: ${d.status}`);return(await d.json()).files}async function Gs(o,e,a){const l=[];if(o.trim()&&l.push({type:"text",text:o.trim()}),e&&e.length>0&&a)for(let s=0;s<a.length;s++){const d=a[s],u=e[s];u?.type.startsWith("image/")?l.push({type:"image",name:d.name,path:d.path,media_type:u.type}):l.push({type:"file",name:d.name,path:d.path,media_type:u?.type})}return l}function Co(o){return o!=null&&o!==""}function Ze(o){return Co(o)?o:void 0}function fa(o){if(!Co(o))return"";if(typeof o=="string")return o;try{const e=JSON.stringify(o);if(e!==void 0)return e}catch{}return String(o)}function ba(o){return typeof o=="string"&&Ws(o)}function Ro(o){const e=o.filter(d=>d.role==="assistant"?(d.tool_calls?.length||0)>0||fa(d.content).trim()!=="":!0),a=new Map,l=new Map;for(const d of e)if(d.role==="assistant"&&d.tool_calls)for(const u of d.tool_calls)u.id&&(u.function?.name&&a.set(u.id,u.function.name),Co(u.function?.arguments)&&l.set(u.id,u.function.arguments));const s=[];for(const d of e){if(d.role==="assistant"&&d.tool_calls?.length&&!fa(d.content).trim()){for(const u of d.tool_calls)s.push({id:String(d.id)+"_"+u.id,role:"tool",content:"",timestamp:Math.round(d.timestamp*1e3),toolName:u.function?.name||void 0,toolCallId:u.id,toolArgs:Ze(u.function?.arguments),toolStatus:"done"});continue}if(d.role==="tool"){const u=d.tool_call_id||"",g=d.tool_name||a.get(u)||void 0,P=l.has(u)?l.get(u):void 0;let q="";const w=fa(d.content);if(w)try{const _=typeof d.content=="string"?JSON.parse(w):d.content;q=_?.url||_?.title||_?.preview||_?.summary||""}catch{q=w.slice(0,80)}const W=s.findIndex(_=>_.role==="tool"&&_.toolName===g&&!_.toolResult&&_.id.includes("_"+u));W!==-1&&s.splice(W,1),s.push({id:String(d.id),role:"tool",content:"",timestamp:Math.round(d.timestamp*1e3),toolName:g,toolCallId:u||void 0,toolArgs:P,toolPreview:typeof q=="string"&&q.slice(0,100)||void 0,toolResult:Ze(d.content),toolStatus:"done"});continue}s.push({id:String(d.id),role:d.role,content:d.content||"",timestamp:Math.round(d.timestamp*1e3),reasoning:d.reasoning?d.reasoning:void 0,systemType:d.role==="command"?"command":void 0})}return s}function Vs(o){return{id:o.id,profile:o.profile||"default",title:o.title||"",source:o.source||void 0,messages:[],createdAt:Math.round(o.started_at*1e3),updatedAt:Math.round((o.last_active||o.ended_at||o.started_at)*1e3),model:o.model,provider:o.provider||o.billing_provider||"",messageCount:o.message_count,messageTotal:o.message_count,loadedMessageCount:0,hasMoreBefore:!1,inputTokens:o.input_tokens,outputTokens:o.output_tokens,endedAt:o.ended_at!=null?Math.round(o.ended_at*1e3):null,lastActiveAt:o.last_active!=null?Math.round(o.last_active*1e3):void 0,workspace:o.workspace||null}}function _t(){try{return co().activeProfileName||"default"}catch{return"default"}}function Jo(){return xt+_t()}function ot(){return _t()==="default"?oa:null}function Ks(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function Qs(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let a=0;a<localStorage.length;a++){const l=localStorage.key(a);l&&(l===Jo()||l===oa||o.some(s=>l.startsWith(s))&&e.push(l))}e.forEach(a=>_a(a)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function Js(o,e){try{localStorage.setItem(o,e);return}catch(a){if(!Ks(a))return}Qs();try{localStorage.setItem(o,e)}catch{}}function at(o){try{return localStorage.getItem(o)}catch{return null}}function _a(o){try{localStorage.removeItem(o)}catch{}}var xt,oa,Ha,Tt=Ie((()=>{Is(),wt(),Be(),Rs(),Lo(),xe(),qo(),ia(),Ns(),qs(),Bs(),xt="hermes_active_session_",oa="hermes_active_session",Ha=ta("chat",()=>{const o=new WeakSet,e=b([]),a=b(null),l=b(null),s=b(new Map),d=b(new Set),u=b(null),g=b(new Map),P=b(new Map),q=b(new Map),w=b(new Map),W=me(()=>{const t=a.value;return t&&w.value.get(t)||null}),_=b(new Map),G=me(()=>{const t=a.value;return t&&_.value.get(t)||null}),z=b(!1);function V(t){z.value=t}const re=me(()=>{const t=a.value;return t==null?!1:s.value.has(t)||d.value.has(t)}),ae=b(!1),k=b(!1),I=b(!1),O=me(()=>re.value),J=b(new Map),y=me(()=>{const t=a.value;return t&&J.value.get(t)||null});function X(t,i){if(!t)return;const n=new Map(J.value);i?n.set(t,i):n.delete(t),J.value=n}const te=b(null),j=me(()=>te.value?.aborting===!0);function A(t){te.value=t}const p=b(null),H=me(()=>p.value?.messages||[]);function $(t){return s.value.has(t)||d.value.has(t)}function Fe(){const t=a.value;a.value=null,p.value=null,l.value=null,A(null),X(t,null),_a(Jo())}async function Ke(t,i){ae.value=!0;try{const n=(await Sa(void 0,void 0,t||void 0)).map(Vs),v=new Map(e.value.map(se=>[se.id,{messages:se.messages,contextTokens:se.contextTokens}]));for(const se of n){const S=v.get(se.id);S?.messages?.length&&(se.messages=S.messages),S?.contextTokens!=null&&(se.contextTokens=S.contextTokens)}e.value=n;const f=a.value,E=ot(),M=at(Jo())||(E?at(oa):null),ne=i&&e.value.some(se=>se.id===i)?i:f&&e.value.some(se=>se.id===f)?f:M&&e.value.some(se=>se.id===M)?M:e.value[0]?.id;ne?await de(ne):Fe()}catch(n){console.error("Failed to load sessions:",n)}finally{ae.value=!1,k.value=!0}}async function To(){const t=a.value;if(!t)return!1;try{const i=e.value.find(v=>v.id===t);if(!i)return!1;const n=await Ya(t,0,Math.max(i.loadedMessageCount||300,300),p.value?.profile);return n?(i.messages=Ro(n.messages||[]),i.loadedMessageCount=n.messages.length,i.messageTotal=n.total,i.messageCount=n.total,i.hasMoreBefore=n.hasMore,n.session.title&&(i.title=n.session.title),!0):!1}catch(i){return console.error("Failed to refresh active session:",i),!1}}function Qe(t={}){const i={id:_e(),profile:t.profile||co().activeProfileName||"default",title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now(),model:t.model||void 0,provider:t.provider||""};return e.value.unshift(i),i}function K(){const t=new Date,i={id:`${[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0"),"_",String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return e.value.unshift(i),i}async function de(t,i){Ea(t),a.value=t,l.value=i??null,Js(Jo(),t);const n=ot();if(n&&_a(n),p.value=e.value.find(v=>v.id===t)||null,!!p.value){I.value=!0;try{await new Promise((v,f)=>{const E=setTimeout(()=>f(new Error("resume timeout")),15e3);$a(t,M=>{if(clearTimeout(E),M.session_id!==t||a.value!==t){v();return}const ne=e.value.find(se=>se.id===t);if(!ne){v();return}if(M.isWorking?d.value.add(t):d.value.delete(t),M.queueLength&&M.queueLength>0?g.value.set(t,M.queueLength):g.value.delete(t),Array.isArray(M.queueMessages)?Ne(t,Ee(M.queueMessages)):M.queueLength||Ne(t,[]),M.isAborting?A({aborting:!0,synced:null}):M.isWorking||A(null),M.isWorking||X(t,null),M.inputTokens!=null&&(ne.inputTokens=M.inputTokens),M.outputTokens!=null&&(ne.outputTokens=M.outputTokens),M.contextTokens!=null&&(ne.contextTokens=M.contextTokens),M.messages?.length&&(ne.messages=Ro(M.messages),ne.loadedMessageCount=M.messageLoadedCount??M.messages.length,ne.messageTotal=M.messageTotal??ne.messageCount??ne.loadedMessageCount,ne.messageCount=ne.messageTotal,ne.hasMoreBefore=M.hasMoreBefore??ne.loadedMessageCount<ne.messageTotal),!ne.title){const se=ne.messages.find(S=>S.role==="user");se&&(ne.title=se.content.slice(0,40)+(se.content.length>40?"...":""))}if(p.value=ne,M.events?.length)for(const se of M.events){const S=se.data;if(S.event==="compression.started")X(t,{compressing:!0,messageCount:S.message_count||0,beforeTokens:S.token_count||0,afterTokens:0,compressed:null});else if(S.event==="compression.completed"){const m=S.contextTokens||S.afterTokens||0;X(t,{compressing:!1,messageCount:S.totalMessages||0,beforeTokens:S.beforeTokens||0,afterTokens:m,compressed:S.compressed??!1,error:S.error}),S.contextTokens!=null&&(ne.contextTokens=S.contextTokens)}else if(S.event==="abort.started")A({aborting:!0,synced:null});else if(S.event==="abort.timeout")A({aborting:!0,synced:!1,timedOut:!0,message:S.message});else if(S.event==="abort.completed")A({aborting:!1,synced:S.synced??!1});else if(S.event==="approval.requested")to({...S,session_id:t});else if(S.event==="approval.resolved")io({...S,session_id:t});else if(S.event==="clarify.requested")go({...S,session_id:t});else if(S.event==="clarify.resolved")ho({...S,session_id:t});else if(S.event==="run.failed")ao(t,S.error),d.value.delete(t),g.value.delete(t);else if(S.event==="tool.started"){const m=ce(t),U=S.tool_call_id,F=U?m.find(L=>L.role==="tool"&&L.toolCallId===U):null;F?fe(t,F.id,{toolName:S.tool||S.name,toolArgs:Co(S.arguments)?S.arguments:F.toolArgs,toolPreview:S.preview||F.toolPreview,toolStatus:F.toolStatus||"running"}):we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:S.tool||S.name,toolCallId:U,toolPreview:S.preview,toolArgs:Ze(S.arguments),toolStatus:"running"})}else if(S.event==="tool.completed"){const m=ce(t),U=S.tool_call_id,F=U?m.filter(L=>L.role==="tool"&&L.toolCallId===U):m.filter(L=>L.role==="tool"&&L.toolStatus==="running");if(F.length>0){const L=Ze(S.output);fe(t,F[F.length-1].id,{toolStatus:S.error===!0||ba(L)?"error":"done",toolDuration:S.duration,toolResult:L})}}else String(S.event||"").startsWith("subagent.")&&Mo(t,S)}v()},p.value?.profile)})}catch(v){console.error("Failed to load session messages via resume:",v)}finally{I.value=!1}a.value===t&&vo(t)}}async function Z(t=a.value){if(!t)return!1;const i=e.value.find(f=>f.id===t);if(!i||i.isLoadingOlderMessages||!i.hasMoreBefore)return!1;const n=i.loadedMessageCount||0,v=300;i.isLoadingOlderMessages=!0;try{const f=await Ya(t,n,v,i.profile);if(!f||f.messages.length===0)return i.hasMoreBefore=!1,!1;const E=new Set(i.messages.map(ne=>ne.id)),M=Ro(f.messages).filter(ne=>!E.has(ne.id));return i.messages=[...M,...i.messages],i.loadedMessageCount=n+f.messages.length,i.messageTotal=f.total,i.messageCount=f.total,i.hasMoreBefore=f.hasMore,M.length>0}catch(f){return console.error("Failed to load older session messages:",f),!1}finally{i.isLoadingOlderMessages=!1}}function We(t={}){const i=lo(),n=Qe({profile:t.profile,model:t.model||i.selectedModel||void 0,provider:t.provider||i.selectedProvider||""});return de(n.id),n}async function uo(t,i,n){const v=n||p.value?.id;if(!v||!await Ds(v,t,i||""))return!1;const f=e.value.find(E=>E.id===v);return f&&(f.model=t,f.provider=i||""),p.value?.id===v&&(p.value.model=t,p.value.provider=i||""),!0}async function je(t){await Hs(t,e.value.find(i=>i.id===t)?.profile),e.value=e.value.filter(i=>i.id!==t),a.value===t&&(e.value.length>0?await de(e.value[0].id):de(Qe().id))}function ce(t){return e.value.find(i=>i.id===t)?.messages||[]}function we(t,i){const n=e.value.find(v=>v.id===t);n&&n.messages.push(i)}function Oo(t){const i=e.value.findIndex(n=>n.id===t.id);i!==-1?e.value[i]=t:e.value.push(t)}function fe(t,i,n){const v=e.value.find(E=>E.id===t);if(!v)return;const f=v.messages.findIndex(E=>E.id===i);f!==-1&&(v.messages[f]={...v.messages[f],...n})}function Ge(t){const i=e.value.find(n=>n.id===t);i&&(i.messages=i.messages.filter(n=>n.commandAction!=="agent.event"))}function Mo(t,i){const n=String(i.event||"");if(!n.startsWith("subagent."))return;const v=String(i.subagent_id||`${i.task_index??0}`),f=`subagent:${i.run_id||"run"}:${v}`,E=Number(i.task_index??0),M=Number(i.task_count??1),ne=`${E+1}/${Math.max(1,M||1)}`,se=String(i.tool||i.name||""),S=Number(i.tool_count||0),m=String(i.goal||"").trim(),U=String(i.text||i.preview||"").trim(),F=String(i.summary||"").trim(),L=Number(i.duration_seconds??i.duration);let oe=U||F||m;n==="subagent.start"?oe=`subagent ${ne} started${m?`: ${m}`:""}`:n==="subagent.tool"?oe=`${`subagent ${ne}${S?` turn ${S}`:""}`}${se?`: ${se}`:""}${U?` - ${U}`:""}`:n==="subagent.progress"?oe=`subagent ${ne}: ${U||"working"}`:n==="subagent.complete"&&(oe=`subagent ${ne} ${String(i.status||"completed")}${F?`: ${F}`:""}`);const ke=ce(t).find(He=>He.role==="tool"&&He.toolCallId===f),Se=n==="subagent.complete"?i.status&&String(i.status)!=="completed"?"error":"done":"running",Te={toolName:"delegate_task",toolCallId:f,toolPreview:oe.slice(0,220),toolStatus:Se,toolDuration:Number.isFinite(L)?L:void 0,toolResult:n==="subagent.complete"?JSON.stringify({status:i.status||"completed",summary:F||U,api_calls:i.api_calls,input_tokens:i.input_tokens,output_tokens:i.output_tokens},null,2):void 0};if(ke){fe(t,ke.id,Te);return}we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),...Te})}function ao(t,i){const n=i?`Error: ${i}`:"Run failed",v=ce(t),f=v[v.length-1];if(f?.isStreaming){fe(t,f.id,{role:"assistant",content:n,isStreaming:!1,systemType:"error"});return}f?.role==="assistant"&&f.systemType==="error"&&f.content===n||we(t,{id:_e(),role:"assistant",content:n,timestamp:Date.now(),systemType:"error"})}function x(t){if(o.has(t))return;o.add(t);const i=t.session_id;if(!i)return;const n=e.value.find(M=>M.id===i),v=t.action,f=String(t.command||"").toLowerCase();if(t.started===!0&&t.terminal===!1&&d.value.add(i),v==="clear"&&f==="clear"){if(n&&(n.messages=[]),P.value.delete(i),g.value.delete(i),t.clearHistory){const M=String(t.message||"");M&&we(i,{id:_e(),role:"command",content:M,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}return}v==="title"&&n&&typeof t.title=="string"&&(n.title=t.title,n.updatedAt=Date.now()),v==="usage"&&n&&(n.inputTokens=t.inputTokens,n.outputTokens=t.outputTokens,t.contextTokens!=null&&(n.contextTokens=t.contextTokens)),v==="destroy"&&(s.value.delete(i),d.value.delete(i),g.value.delete(i),P.value.delete(i),A(null),ce(i).forEach(M=>{M.isStreaming&&fe(i,M.id,{isStreaming:!1}),M.role==="tool"&&M.toolStatus==="running"&&(M.toolStatus="error")}));const E=String(t.message||"");E&&we(i,{id:_e(),role:"command",content:E,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}function ie(t){const i=t.session_id;if(!i)return;const n=String(t.text||t.message||"").trim();if(!n)return;const v=ce(i),f=v[v.length-1],E={...t};if(f?.role==="system"&&f.commandAction==="agent.event"){if(f.content===n)return;fe(i,f.id,{content:n,timestamp:Date.now(),commandData:E});return}we(i,{id:_e(),role:"system",content:n,timestamp:Date.now(),systemType:"command",commandAction:"agent.event",commandData:E})}function he(t,i){const n=P.value.get(t)||[];if(n.some(f=>f.id===i.id))return;const v=new Map(P.value);v.set(t,[...n,{...i,queued:!0}]),P.value=v}function be(t,i,n){const v=P.value.get(t);if(!v?.length)return;const f=v.map(M=>M.id===i?{...M,...n,queued:!0}:M),E=new Map(P.value);E.set(t,f),P.value=E}function ve(t,i){const n=P.value.get(t);if(!n?.length)return!1;const v=n.filter(E=>E.id!==i);if(v.length===n.length)return!1;const f=new Map(P.value);return v.length>0?(f.set(t,v),g.value.set(t,v.length)):(f.delete(t),g.value.delete(t)),P.value=f,!0}function ye(t,i){ve(t,i)&&Ja()?.emit("cancel_queued_run",{session_id:t,queue_id:i})}function Ee(t){return Array.isArray(t)?t.flatMap(i=>{const n=i,v=typeof n?.content=="string"?n.content:"",f=n?.id!=null?String(n.id):"";if(!f||!v.trim())return[];const E=typeof n?.timestamp=="number"&&Number.isFinite(n.timestamp)?Math.round(n.timestamp*1e3):Date.now(),M=n?.role==="command"?"command":"user";return[{id:f,role:M,content:v,timestamp:E,queued:!0,systemType:M==="command"?"command":void 0}]}):[]}function Ne(t,i){const n=new Map((P.value.get(t)||[]).map(E=>[E.id,E])),v=i.map(E=>({...n.get(E.id)||{},...E,attachments:n.get(E.id)?.attachments||E.attachments,queued:!0})),f=new Map(P.value);v.length>0?f.set(t,v):f.delete(t),P.value=f}function Io(t,i){const n=new Map(q.value),v=new Set(n.get(t)||[]);v.add(i),n.set(t,v),q.value=n}function po(t,i){const n=q.value.get(t);if(!n?.has(i))return!1;const v=new Set(n);v.delete(i);const f=new Map(q.value);return v.size>0?f.set(t,v):f.delete(t),q.value=f,!0}function mo(t,i){const n=Number(i.queue_length||0);n>0?g.value.set(t,n):g.value.delete(t);const v=i.dequeued_queue_id!=null?String(i.dequeued_queue_id):"";if(v){const U=P.value.get(t)||[],F=U.find(L=>L.id===v);Array.isArray(i.queued_messages)?Ne(t,Ee(i.queued_messages)):Ne(t,U.filter(L=>L.id!==v)),F&&!ce(t).some(L=>L.id===F.id)?(we(t,{...F,queued:!1}),no(t)):F||Io(t,v);return}if(Array.isArray(i.queued_messages)){Ne(t,Ee(i.queued_messages));return}const f=i.message,E=typeof f?.content=="string"?f.content:"",M=f?.id!=null?String(f.id):"";if(!M||!E.trim()||(P.value.get(t)||[]).some(U=>U.id===M))return;const ne=typeof f?.timestamp=="number"&&Number.isFinite(f.timestamp)?Math.round(f.timestamp*1e3):Date.now(),se=ce(t),S=se.findIndex(U=>U.id===M&&U.role==="user"),m=S>=0?se[S]:null;S>=0&&se.splice(S,1),he(t,{...m||{},id:M,role:f?.role==="command"?"command":"user",content:E,timestamp:m?.timestamp||ne,attachments:m?.attachments,queued:!0,systemType:f?.role==="command"?"command":m?.systemType})}function to(t){const i=t.session_id,n=t.approval_id;if(!i||!n)return;const v=(Array.isArray(t.choices)?t.choices:["once","session","deny"]).filter(f=>f==="once"||f==="session"||f==="always"||f==="deny");w.value.set(i,{sessionId:i,approvalId:n,command:String(t.command||""),description:String(t.description||""),choices:v.length?v:["once","session","deny"],allowPermanent:!!t.allow_permanent,requestedAt:Date.now()}),w.value=new Map(w.value)}function io(t){const i=t.session_id;if(!i)return;const n=w.value.get(i);if(!n)return;const v=t.approval_id;v&&n.approvalId!==v||(w.value.delete(i),w.value=new Map(w.value))}function go(t){const i=t.session_id,n=t.clarify_id;!i||!n||(_.value.set(i,{sessionId:i,clarifyId:n,question:String(t.question||""),choices:Array.isArray(t.choices)?t.choices:null,timeoutMs:Number(t.timeout_ms)||3e5,requestedAt:Date.now()}),_.value=new Map(_.value))}function ho(t){const i=t.session_id;if(!i)return;const n=_.value.get(i);if(!n)return;const v=t.clarify_id;v&&n.clarifyId!==v||(_.value.delete(i),_.value=new Map(_.value))}function Me(t){let i=!1;w.value.has(t)&&(w.value.delete(t),i=!0),_.value.has(t)&&(_.value.delete(t),i=!0),i&&(w.value=new Map(w.value),_.value=new Map(_.value))}function Mt(t){const i=G.value;i&&(xs(i.sessionId,i.clarifyId,t),_.value.delete(i.sessionId),_.value=new Map(_.value))}function It(t){const i=W.value;i&&(Ts(i.sessionId,i.approvalId,t),w.value.delete(i.sessionId),w.value=new Map(w.value))}function no(t){const i=e.value.find(n=>n.id===t);if(i){if(!i.title){const n=i.messages.find(v=>v.role==="user");if(n){const v=n.attachments?.length?n.attachments.map(f=>f.name).join(", "):n.content;i.title=v.slice(0,40)+(v.length>40?"...":"")}}i.updatedAt=Date.now()}}function sa(t){const i=t.session_id,n=typeof t.title=="string"?t.title.trim():"";if(!i||!n)return;const v=e.value.find(f=>f.id===i);v&&(v.title=n,v.updatedAt=Date.now()),p.value?.id===i&&(p.value.title=n)}function Ht(){ka().display.bell_on_complete&&Us()}function Ra(){ka().display.bell_on_complete&&zs()}async function Dt(t,i){if(!t.trim()&&!(i&&i.length>0))return;Ht(),p.value||de(Qe().id);const n=a.value,v=p.value?p.value.messageCount==null||p.value.messageCount===0:!1,f=t.trim().startsWith("/"),E=f&&/^\/compress(?:\s|$)/i.test(t.trim()),M=f&&/^\/plan(?:\s|$)/i.test(t.trim()),ne=f&&/^\/goal(?:\s|$)/i.test(t.trim()),se=$(n)&&(!f||M),S={id:_e(),role:f?"command":"user",content:t.trim(),timestamp:Date.now(),attachments:i&&i.length>0?i:void 0,queued:se,systemType:f?"command":void 0};se?he(n,S):(we(n,S),no(n),d.value.add(n));let m=!1;try{let U;if(i&&i.length>0){const h=await js(i),N=new Map(h.map(T=>[T.name,Ia(T.path,T.name)]));if(se&&S.attachments)S.attachments=S.attachments.map(T=>{const R=N.get(T.name);return R?{...T,url:R}:T}),be(n,S.id,{attachments:S.attachments});else{const T=ce(n).findLast(R=>R.id===S.id);T?.attachments&&(T.attachments=T.attachments.map(R=>{const le=N.get(R.name);return le?{...R,url:le}:R}))}U=await Gs(t,i,h)}else U=t.trim();const F=lo();await F.waitForModelsForRun();const L=p.value?.model||F.selectedModel,oe=p.value?.provider||F.selectedProvider,ke={input:U,session_id:n,profile:p.value?.profile||co().activeProfileName||void 0,model:v&&L||void 0,provider:v&&oe||void 0,model_groups:F.modelGroups.map(h=>({provider:h.provider,models:h.models})),queue_id:S.id,source:"cli"};v&&p.value&&(p.value.messageCount=Math.max(p.value.messageCount||0,1));const Se=()=>{s.value.delete(n),d.value.delete(n)};let Te=!1,He=!1,Ae=null,Ue=null;const Ut=()=>{ce(n).forEach(h=>{h.role==="assistant"&&h.isStreaming&&fe(n,h.id,{isStreaming:!1})}),Ae=null,Ue=null},zt=Ms(ke,h=>{switch(h.event){case"run.started":Ge(n),A(null),X(n,null),Te=!1,He=!1,Ut(),h.queue_length>0?g.value.set(n,h.queue_length):g.value.delete(n);break;case"run.queued":mo(n,h);break;case"session.command":x(h);break;case"agent.event":ie(h);break;case"compression.started":X(n,{compressing:!0,messageCount:h.message_count||0,beforeTokens:h.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const N=h.contextTokens||h.afterTokens||0;if(X(n,{compressing:!1,messageCount:h.totalMessages||0,beforeTokens:h.beforeTokens||0,afterTokens:N,compressed:h.compressed??!1,error:h.error}),h.contextTokens!=null){const T=e.value.find(R=>R.id===n);T&&(T.contextTokens=h.contextTokens)}setTimeout(()=>{const T=J.value.get(n);T&&!T.compressing&&X(n,null)},5e3);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:h.message});break;case"abort.completed":{if(A({aborting:!1,synced:h.synced??!1}),Me(n),h.queue_length>0){g.value.set(n,h.queue_length),A(null);break}const N=ce(n),T=N[N.length-1];T?.isStreaming&&fe(n,T.id,{isStreaming:!1}),N.forEach((R,le)=>{R.role==="tool"&&R.toolStatus==="running"&&(N[le]={...R,toolStatus:"done"})}),Se(),A(null);break}case"reasoning.delta":case"thinking.delta":{const N=h.text||h.delta||"";if(!N)break;Te=!0;const T=ce(n),R=Ue||Ae,le=R?T.find(ge=>ge.id===R):null;if(le?.role==="assistant")le.reasoning=(le.reasoning||"")+N,Ue=le.id,fo(le.id);else{const ge=_e();we(n,{id:ge,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:N}),Ae=ge,Ue=ge,fo(ge)}break}case"reasoning.available":{const N=ce(n),T=N[N.length-1];T?.role==="assistant"&&T.isStreaming&&Do(T.id);break}case"message.delta":{h.delta&&(Te=!0);const N=ce(n),T=Ae?N.find(R=>R.id===Ae):null;if(T?.role==="assistant"&&T.isStreaming){const R=T.content,le=R+(h.delta||"");Ho(T.id,R,le),T.reasoning&&Do(T.id),T.content=le}else{const R=_e(),le=h.delta||"";Ho(R,"",le),we(n,{id:R,role:"assistant",content:le,timestamp:Date.now(),isStreaming:!0}),Ae=R}break}case"session.title.updated":sa(h);break;case"tool.started":{He=!0;const N=ce(n),T=h.tool_call_id,R=Ae?N.find(ge=>ge.id===Ae):N[N.length-1];R?.isStreaming&&fe(n,R.id,{isStreaming:!1}),Ae=null;const le=T?N.find(ge=>ge.role==="tool"&&ge.toolCallId===T):null;if(le){fe(n,le.id,{toolName:h.tool||h.name,toolArgs:Co(h.arguments)?h.arguments:le.toolArgs,toolPreview:h.preview||le.toolPreview,toolStatus:le.toolStatus||"running"});break}we(n,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:h.tool||h.name,toolCallId:T,toolPreview:h.preview,toolArgs:Ze(h.arguments),toolStatus:"running"});break}case"tool.completed":{He=!0;const N=ce(n),T=h.tool_call_id,R=T?N.filter(le=>le.role==="tool"&&le.toolCallId===T):N.filter(le=>le.role==="tool"&&le.toolStatus==="running");if(R.length>0){const le=R[R.length-1],ge=Ze(h.output),ze=h.error===!0||ba(ge),$e=h.duration;fe(n,le.id,{toolStatus:ze?"error":"done",toolDuration:$e,toolResult:ge})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":He=!0,Mo(n,h);break;case"approval.requested":to(h);break;case"approval.resolved":io(h);break;case"clarify.requested":go(h);break;case"clarify.resolved":ho(h);break;case"run.completed":{Ge(n);const N=ce(n),T=Ae?N.find(ge=>ge.id===Ae):N[N.length-1],R=T?.role==="assistant"&&T.isStreaming?T.id:null;if(T?.isStreaming&&fe(n,T.id,{isStreaming:!1}),h.inputTokens!=null){const ge=e.value.find(ze=>ze.id===n);ge&&(ge.inputTokens=h.inputTokens,ge.outputTokens=h.outputTokens,h.contextTokens!=null&&(ge.contextTokens=h.contextTokens))}let le="";if(h.parsed_content!==void 0){const ge=ce(n),ze=Ae?ge.find($e=>$e.id===Ae):R?ge.find($e=>$e.id===R):void 0;if(ze){const $e=typeof h.parsed_content=="string"?h.parsed_content:"",Fa=$e.trim(),La=ze.content?.trim()??"";Fa||!La?(fe(n,ze.id,{content:$e}),le=Fa):(le=La,Te=!0),h.parsed_reasoning&&fe(n,ze.id,{reasoning:h.parsed_reasoning})}}else{const ge=typeof h.output=="string"?h.output:"";le=ge.trim(),!Te&&le!==""&&(we(n,{id:_e(),role:"assistant",content:ge,timestamp:Date.now()}),Te=!0)}if(!Te&&!He&&le===""?we(n,{id:_e(),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()}):Ra(),z.value){const ge=[...ce(n)].reverse().find(ze=>ze.role==="assistant");ge?.content&&setTimeout(()=>{la(ge.id,ge.content)},300)}h.queue_remaining>0?g.value.set(n,h.queue_remaining):Se(),Ae=null,Ue=null,no(n);break}case"run.failed":{if(Ge(n),h.inputTokens!=null){const T=e.value.find(R=>R.id===n);T&&(T.inputTokens=h.inputTokens,T.outputTokens=h.outputTokens,h.contextTokens!=null&&(T.contextTokens=h.contextTokens))}ao(n,h.error);const N=ce(n);N.forEach((T,R)=>{T.role==="tool"&&T.toolStatus==="running"&&(N[R]={...T,toolStatus:"error"})}),h.queue_remaining>0?g.value.set(n,h.queue_remaining):Se();break}case"usage.updated":{const N=e.value.find(T=>T.id===n);N&&(N.inputTokens=h.inputTokens,N.outputTokens=h.outputTokens,h.contextTokens!=null&&(N.contextTokens=h.contextTokens));break}}},()=>{const h=ce(n),N=h[h.length-1];N?.isStreaming&&fe(n,N.id,{isStreaming:!1}),Se(),no(n)},h=>{console.warn("Socket.IO run stream error:",h.message),ao(n,h.message);const N=ce(n);N.forEach((T,R)=>{T.role==="tool"&&T.toolStatus==="running"&&(N[R]={...T,toolStatus:"error"})}),Se()},void 0,{onReconnectResume:h=>{if(h.session_id!==n)return;const N=e.value.find(T=>T.id===n);if(N){if(h.isWorking?d.value.add(n):d.value.delete(n),h.queueLength&&h.queueLength>0?g.value.set(n,h.queueLength):g.value.delete(n),Array.isArray(h.queueMessages)?Ne(n,Ee(h.queueMessages)):h.queueLength||Ne(n,[]),h.isAborting?A({aborting:!0,synced:null}):h.isWorking||A(null),h.isWorking||X(n,null),h.inputTokens!=null&&(N.inputTokens=h.inputTokens),h.outputTokens!=null&&(N.outputTokens=h.outputTokens),h.contextTokens!=null&&(N.contextTokens=h.contextTokens),Array.isArray(h.messages)){N.messages=Ro(h.messages),N.loadedMessageCount=h.messageLoadedCount??h.messages.length,N.messageTotal=h.messageTotal??N.messageCount??N.loadedMessageCount,N.messageCount=N.messageTotal,N.hasMoreBefore=h.hasMoreBefore??N.loadedMessageCount<N.messageTotal;const T=[...N.messages].reverse().find(R=>R.role==="assistant");h.isWorking&&T?(T.isStreaming=!0,Ae=T.id,Ue=T.id,T.reasoning&&fo(T.id)):(Ae=null,Ue=null)}if(h.events?.length)for(const T of h.events){const R=T.data;switch(R.event){case"compression.started":X(n,{compressing:!0,messageCount:R.message_count||0,beforeTokens:R.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const le=R.contextTokens||R.afterTokens||0;X(n,{compressing:!1,messageCount:R.totalMessages||0,beforeTokens:R.beforeTokens||0,afterTokens:le,compressed:R.compressed??!1,error:R.error}),R.contextTokens!=null&&(N.contextTokens=R.contextTokens);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:R.message});break;case"abort.completed":A({aborting:!1,synced:R.synced??!1});break;case"approval.requested":to({...R,session_id:n});break;case"approval.resolved":io({...R,session_id:n});break;case"clarify.requested":go({...R,session_id:n});break;case"clarify.resolved":ho({...R,session_id:n});break;case"run.failed":ao(n,R.error);break;case"agent.event":ie(R);break}}a.value===n&&(p.value=N),!h.isWorking&&!(h.queueLength&&h.queueLength>0)&&(Ge(n),Se(),Ae=null,no(n))}}});m=!0,(!f||E||M||ne)&&s.value.set(n,zt)}catch(U){se&&!m&&ve(n,S.id),!se&&!m&&d.value.delete(n),we(n,{id:_e(),role:"system",content:`Error: ${U.message}`,timestamp:Date.now()})}}function vo(t,i=!1){if(s.value.has(t)||!i&&!d.value.has(t))return;let n=!1,v=!1,f=!1,E=null,M=null;const ne=()=>{n||(n=!0,s.value.delete(t),d.value.delete(t),Cs(t))},se=()=>{ce(t).forEach(m=>{m.role==="assistant"&&m.isStreaming&&fe(t,m.id,{isStreaming:!1})}),E=null,M=null};function S(m){if(!n&&!(m.session_id&&m.session_id!==t))switch(m.event){case"run.queued":mo(t,m);break;case"session.command":x(m);break;case"agent.event":ie(m);break;case"run.started":Ge(t),A(null),X(t,null),v=!1,f=!1,se(),m.queue_length>0?g.value.set(t,m.queue_length):g.value.delete(t);break;case"compression.started":X(t,{compressing:!0,messageCount:m.message_count||0,beforeTokens:m.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const U=m.contextTokens||m.afterTokens||0;if(X(t,{compressing:!1,messageCount:m.totalMessages||0,beforeTokens:m.beforeTokens||0,afterTokens:U,compressed:m.compressed??!1,error:m.error}),m.contextTokens!=null){const F=e.value.find(L=>L.id===t);F&&(F.contextTokens=m.contextTokens)}setTimeout(()=>{const F=J.value.get(t);F&&!F.compressing&&X(t,null)},5e3);break}case"abort.started":A({aborting:!0,synced:null});break;case"abort.timeout":A({aborting:!0,synced:!1,timedOut:!0,message:m.message});break;case"abort.completed":{if(A({aborting:!1,synced:m.synced??!1}),Me(t),m.queue_length>0){g.value.set(t,m.queue_length),A(null);break}const U=ce(t),F=U[U.length-1];F?.isStreaming&&fe(t,F.id,{isStreaming:!1}),U.forEach((L,oe)=>{L.role==="tool"&&L.toolStatus==="running"&&(U[oe]={...L,toolStatus:"done"})}),ne(),A(null);break}case"reasoning.delta":case"thinking.delta":{const U=m.text||m.delta||"";if(!U)break;v=!0;const F=ce(t),L=M||E,oe=L?F.find(ke=>ke.id===L):null;if(oe?.role==="assistant")oe.reasoning=(oe.reasoning||"")+U,M=oe.id,fo(oe.id);else{const ke=_e();we(t,{id:ke,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:U}),E=ke,M=ke,fo(ke)}break}case"reasoning.available":{const U=ce(t),F=U[U.length-1];F?.role==="assistant"&&F.isStreaming&&Do(F.id);break}case"message.delta":{m.delta&&(v=!0);const U=ce(t),F=E?U.find(L=>L.id===E):null;if(F?.role==="assistant"&&F.isStreaming){const L=F.content,oe=L+(m.delta||"");Ho(F.id,L,oe),F.reasoning&&Do(F.id),F.content=oe}else{const L=_e(),oe=m.delta||"";Ho(L,"",oe),we(t,{id:L,role:"assistant",content:oe,timestamp:Date.now(),isStreaming:!0}),E=L}break}case"session.title.updated":sa(m);break;case"tool.started":{f=!0;const U=ce(t),F=m.tool_call_id,L=E?U.find(ke=>ke.id===E):U[U.length-1];L?.isStreaming&&fe(t,L.id,{isStreaming:!1}),E=null;const oe=F?U.find(ke=>ke.role==="tool"&&ke.toolCallId===F):null;if(oe){fe(t,oe.id,{toolName:m.tool||m.name,toolArgs:Co(m.arguments)?m.arguments:oe.toolArgs,toolPreview:m.preview||oe.toolPreview,toolStatus:oe.toolStatus||"running"});break}we(t,{id:_e(),role:"tool",content:"",timestamp:Date.now(),toolName:m.tool||m.name,toolCallId:F,toolPreview:m.preview,toolArgs:Ze(m.arguments),toolStatus:"running"});break}case"tool.completed":{f=!0;const U=ce(t),F=m.tool_call_id,L=F?U.filter(oe=>oe.role==="tool"&&oe.toolCallId===F):U.filter(oe=>oe.role==="tool"&&oe.toolStatus==="running");if(L.length>0){const oe=Ze(m.output),ke=m.error===!0||ba(oe);fe(t,L[L.length-1].id,{toolStatus:ke?"error":"done",toolDuration:m.duration,toolResult:oe})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":f=!0,Mo(t,m);break;case"approval.requested":to(m);break;case"approval.resolved":io(m);break;case"clarify.requested":go(m);break;case"clarify.resolved":ho(m);break;case"run.completed":{Ge(t);const U=m.queue_remaining>0;U?g.value.set(t,m.queue_remaining):g.value.delete(t);const F=ce(t),L=E?F.find(Se=>Se.id===E):F[F.length-1],oe=L?.role==="assistant"&&L.isStreaming?L.id:null;if(L?.isStreaming&&fe(t,L.id,{isStreaming:!1}),m.inputTokens!=null){const Se=e.value.find(Te=>Te.id===t);Se&&(Se.inputTokens=m.inputTokens,Se.outputTokens=m.outputTokens,m.contextTokens!=null&&(Se.contextTokens=m.contextTokens))}let ke="";if(m.parsed_content!==void 0){const Se=ce(t),Te=E?Se.find(He=>He.id===E):oe?Se.find(He=>He.id===oe):void 0;if(Te){const He=typeof m.parsed_content=="string"?m.parsed_content:"",Ae=He.trim(),Ue=Te.content?.trim()??"";Ae||!Ue?(fe(t,Te.id,{content:He}),ke=Ae):(ke=Ue,v=!0),m.parsed_reasoning&&fe(t,Te.id,{reasoning:m.parsed_reasoning})}}else{const Se=typeof m.output=="string"?m.output:"";ke=Se.trim(),!v&&ke!==""&&we(t,{id:_e(),role:"assistant",content:Se,timestamp:Date.now()})}if(!v&&!f&&ke===""?we(t,{id:_e(),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()}):Ra(),z.value){const Se=[...ce(t)].reverse().find(Te=>Te.role==="assistant");Se?.content&&setTimeout(()=>{la(Se.id,Se.content)},300)}U?(E=null,M=null):(ne(),E=null,M=null),no(t);break}case"run.failed":{if(Ge(t),m.inputTokens!=null){const L=e.value.find(oe=>oe.id===t);L&&(L.inputTokens=m.inputTokens,L.outputTokens=m.outputTokens,m.contextTokens!=null&&(L.contextTokens=m.contextTokens))}const U=m.queue_remaining>0;U?g.value.set(t,m.queue_remaining):g.value.delete(t),ao(t,m.error);const F=ce(t);F.forEach((L,oe)=>{L.role==="tool"&&L.toolStatus==="running"&&(F[oe]={...L,toolStatus:"error"})}),U||ne();break}case"usage.updated":{const U=e.value.find(F=>F.id===t);U&&(U.inputTokens=m.inputTokens,U.outputTokens=m.outputTokens,m.contextTokens!=null&&(U.contextTokens=m.contextTokens));break}}}ws(t,{onMessageDelta:m=>S(m),onReasoningDelta:m=>S(m),onThinkingDelta:m=>S(m),onReasoningAvailable:m=>S(m),onToolStarted:m=>S(m),onToolCompleted:m=>S(m),onSubagentEvent:m=>S(m),onRunStarted:m=>S(m),onRunCompleted:m=>S(m),onRunFailed:m=>S(m),onCompressionStarted:m=>S(m),onCompressionCompleted:m=>S(m),onAbortStarted:m=>S(m),onAbortTimeout:m=>S(m),onAbortCompleted:m=>S(m),onUsageUpdated:m=>S(m),onAgentEvent:m=>S(m),onSessionCommand:m=>S(m),onRunQueued:m=>S(m),onClarifyRequested:m=>S(m),onClarifyResolved:m=>S(m)}),s.value.set(t,{abort:()=>{Ja()?.emit("abort",{session_id:t})}})}function Rt(t){const i=t.session_id;if(!i||a.value!==i||!p.value)return;const n=t.message,v=typeof n?.content=="string"?n.content:"";if(!v.trim())return;const f=n?.id!=null?String(n.id):"",E=ce(i);if(f&&E.some(S=>S.id===f)){d.value.add(i),vo(i,!0);return}if(f&&(P.value.get(i)||[]).some(S=>S.id===f)){d.value.add(i),vo(i,!0);return}const M=typeof n?.timestamp=="number"&&Number.isFinite(n.timestamp)?Math.round(n.timestamp*1e3):Date.now(),ne={id:f||_e(),role:n?.role==="command"?"command":"user",content:v,timestamp:M,queued:!!n?.queued,systemType:n?.role==="command"?"command":void 0},se=f?po(i,f):!1;n?.queued||!se&&$(i)?he(i,ne):(we(i,ne),no(i)),d.value.add(i),vo(i,!0)}Ps(Rt);function Et(t){const i=t.session_id;if(!i||a.value!==i||!p.value)return;const n=t.started===!0&&t.terminal===!1;x(t),n&&(d.value.add(i),vo(i,!0))}As(Et),_s(sa);function Ft(){const t=a.value;if(!t||j.value)return;Me(t);const i=s.value.get(t);if(i){A({aborting:!0,synced:null}),i.abort();const n=ce(t),v=n[n.length-1];v?.isStreaming&&fe(t,v.id,{isStreaming:!1})}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&a.value&&!re.value){const t=a.value;t&&!s.value.has(t)&&$a(t,i=>{i.isWorking?d.value.add(t):d.value.delete(t),i.isAborting?A({aborting:!0,synced:null}):i.isWorking||A(null),i.isWorking||X(t,null),i.messages?.length&&p.value&&(p.value.messages=Ro(i.messages),p.value.loadedMessageCount=i.messageLoadedCount??i.messages.length,p.value.messageTotal=i.messageTotal??p.value.messageCount??p.value.loadedMessageCount,p.value.messageCount=p.value.messageTotal,p.value.hasMoreBefore=i.hasMoreBefore??p.value.loadedMessageCount<p.value.messageTotal),vo(t)},p.value?.profile)}});const Je=new Map;function Lt(t){return Je.get(t)}function Ho(t,i,n){const{startedAtBoundary:v,endedAtBoundary:f}=Os(i,n);if(!v&&!f)return;const E=Je.get(t)||{};v&&E.startedAt===void 0&&(E.startedAt=Date.now()),f&&E.endedAt===void 0&&(E.endedAt=Date.now()),Je.set(t,E)}function fo(t){const i=Je.get(t)||{};i.startedAt===void 0&&(i.startedAt=Date.now(),Je.set(t,i))}function Do(t){const i=Je.get(t);!i||i.startedAt===void 0||i.endedAt===void 0&&(i.endedAt=Date.now(),Je.set(t,i))}function Nt(t){if(!t)return;const i=t.toLowerCase();for(const n of e.value)(n.provider||"").toLowerCase()===i&&(n.model=void 0,n.provider="")}function Ea(t){Je.clear()}function la(t,i){const n=new CustomEvent("auto-play-speech",{detail:{messageId:t,content:i}});window.dispatchEvent(n)}return{sessions:e,activeSessionId:a,activeSession:p,focusMessageId:l,messages:H,isStreaming:re,isRunActive:O,isSessionLive:$,sessionProfileFilter:u,compressionState:y,abortState:te,isAborting:j,queueLengths:g,queuedUserMessages:P,pendingApprovals:w,activePendingApproval:W,activePendingClarify:G,removeQueuedMessage:ye,isLoadingSessions:ae,sessionsLoaded:k,isLoadingMessages:I,newChat:We,newCliSession:K,switchSession:de,loadOlderMessages:Z,switchSessionModel:uo,addOrUpdateSession:Oo,clearProviderFromSessions:Nt,deleteSession:je,sendMessage:Dt,stopStreaming:Ft,respondApproval:It,respondToClarify:Mt,loadSessions:Ke,refreshActiveSession:To,getThinkingObservation:Lt,noteThinkingDelta:Ho,noteReasoningStart:fo,noteReasoningEnd:Do,clearThinkingObservationFor:Ea,setAutoPlaySpeech:V,playMessageSpeech:la}})}));xe();No();Tt();function $s(){const o=Uo(),e=Ha(),{sessionSearchOpen:a,openSessionSearch:l,closeSessionSearch:s}=Ma();function d(u){const g=u.ctrlKey||u.metaKey;if(g&&u.key==="n"){u.preventDefault(),e.newChat();return}if(g&&u.key==="j"){u.preventDefault(),o.push({name:"hermes.jobs"});return}if(g&&u.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;u.preventDefault(),l();return}if(u.key==="Escape"){if(a.value){u.preventDefault(),s();return}const P=document.querySelector(".n-modal-mask");P&&P.querySelector(".n-base-close")?.click()}}Fo(()=>{window.addEventListener("keydown",d)}),aa(()=>{window.removeEventListener("keydown",d)})}xe();No();Ye();Ve();wt();Tt();var Zs={class:"session-search-modal"},Ys={class:"search-header"},Xs={class:"search-title"},el={class:"search-hint"},ol={class:"search-scope"},al={class:"search-body"},tl={key:0,class:"search-empty"},il={key:1,class:"result-list"},nl=["onClick","onMouseenter"],rl={class:"result-main"},sl={class:"result-title-row"},ll={class:"result-title"},dl={class:"result-source"},cl={class:"result-snippet"},ul={class:"result-meta"},pl={class:"result-time"},ml={key:0,class:"result-match"},gl={class:"search-footer"},hl=Le({__name:"SessionSearchModal",setup(o){const{t:e}=Xe(),a=xa(),l=Uo(),s=Ha(),{sessionSearchOpen:d}=Ma(),u=b(""),g=b(!1),P=b([]),q=b([]),w=b(0),W=b(null),_=me(()=>s.sessionProfileFilter||void 0);let G=null,z=0;const V=me(()=>u.value.trim().length>0),re=me(()=>V.value?q.value:P.value.map(p=>({...p,matched_message_id:null,snippet:p.preview||"",rank:0})));function ae(p){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[p]||p}function k(p){return p?new Date(p*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function I(p){const H=p.title?.trim();return H||(p.preview?.trim()?p.preview.trim():p.id)}async function O(){const p=++z;g.value=!0;try{const H=_.value?await Sa(void 0,8,_.value):await Sa(void 0,8);if(p!==z)return;P.value=H,q.value=[],w.value=0}catch(H){if(p!==z)return;a.error(H instanceof Error?H.message:e("chat.searchFailed"))}finally{p===z&&(g.value=!1)}}async function J(p){const H=++z;g.value=!0;try{const $=p.trim()?_.value?await Za(p.trim(),void 0,10,_.value):await Za(p.trim(),void 0,10):[];if(H!==z)return;q.value=$,w.value=0}catch($){if(H!==z)return;a.error($ instanceof Error?$.message:e("chat.searchFailed"))}finally{H===z&&(g.value=!1)}}async function y(){s.sessions.length===0&&await s.loadSessions(s.sessionProfileFilter)}async function X(p){const H=p.matched_message_id!=null?String(p.matched_message_id):null;d.value=!1,await y(),!s.sessions.some($=>$.id===p.id)&&typeof s.addOrUpdateSession=="function"&&s.addOrUpdateSession({id:p.id,profile:p.profile||"default",title:p.title||"",source:p.source,messages:[],createdAt:Math.round(p.started_at*1e3),updatedAt:Math.round((p.last_active||p.ended_at||p.started_at)*1e3),model:p.model,provider:p.provider||p.billing_provider||"",messageCount:p.message_count,endedAt:p.ended_at!=null?Math.round(p.ended_at*1e3):null,lastActiveAt:p.last_active!=null?Math.round(p.last_active*1e3):void 0,workspace:p.workspace||null}),await s.switchSession(p.id,H),l.currentRoute.value.name!=="hermes.chat"&&await l.push({name:"hermes.chat"})}function te(){d.value=!1}function j(p){const H=re.value;H.length!==0&&(w.value=(w.value+p+H.length)%H.length)}async function A(p){if(d.value){if(p.key==="ArrowDown"){p.preventDefault(),j(1);return}if(p.key==="ArrowUp"){p.preventDefault(),j(-1);return}if(p.key==="Enter"){p.preventDefault();const H=re.value[w.value];H&&await X(H);return}p.key==="Escape"&&(p.preventDefault(),te())}}return ro(()=>d.value,async p=>{if(!p){u.value="",q.value=[],P.value=[],w.value=0;return}u.value="",q.value=[],w.value=0,await O(),await $t(),W.value?.focus?.()}),ro(u,p=>{G&&(clearTimeout(G),G=null),G=setTimeout(()=>{d.value&&J(p)},160)}),ro(re,()=>{w.value>=re.value.length&&(w.value=0)}),Fo(()=>{window.addEventListener("keydown",A)}),aa(()=>{window.removeEventListener("keydown",A),G&&clearTimeout(G)}),(p,H)=>(D(),Oe(c(Ao),{show:c(d),"onUpdate:show":H[1]||(H[1]=$=>Vt(d)?d.value=$:null),preset:"card",title:c(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:Y(()=>[r("div",Zs,[r("div",Ys,[r("div",Xs,C(c(e)("chat.searchSubtitle")),1),r("div",el,C(c(e)("chat.searchHint")),1)]),r("div",ol,C(c(e)("chat.searchScope")),1),Q(c(ya),{ref_key:"inputRef",ref:W,value:u.value,"onUpdate:value":H[0]||(H[0]=$=>u.value=$),placeholder:c(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),r("div",al,[Q(c(lt),{show:g.value},{default:Y(()=>[re.value.length===0?(D(),B("div",tl,C(V.value?c(e)("chat.searchNoResults"):c(e)("chat.searchEmpty")),1)):(D(),B("div",il,[(D(!0),B(_o,null,Po(re.value,($,Fe)=>(D(),B("button",{key:$.id,class:De(["result-item",{active:Fe===w.value}]),onClick:Ke=>X($),onMouseenter:Ke=>w.value=Fe},[r("div",rl,[r("div",sl,[r("span",ll,C(I($)),1),r("span",dl,C(ae($.source)),1)]),r("div",cl,C(V.value?$.snippet||c(e)("chat.searchNoSnippet"):$.preview||c(e)("chat.searchRecent")),1)]),r("div",ul,[r("span",pl,C(k($.last_active||$.started_at)),1),V.value&&$.matched_message_id!=null?(D(),B("span",ml," #"+C($.matched_message_id),1)):Ce("",!0)])],42,nl))),128))]))]),_:1},8,["show"])]),r("div",gl,[r("span",null,C(c(e)("chat.searchEnterHint")),1),Q(c(qe),{quaternary:"",size:"small",onClick:te},{default:Y(()=>[Re(C(c(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});eo();var vl=oo(hl,[["__scopeId","data-v-971921f4"]]);xe();Ve();Ye();var fl={style:{display:"none"},"aria-hidden":"true"},bl=Le({__name:"AuthEventListener",setup(o){const e=xa(),{t:a}=Xe();let l=0;function s(d){const u=d.detail||{},g=Date.now();if(!(g-l<1200)){if(l=g,u.kind==="forbidden"){e.error(a("login.accessDenied"));return}e.error(a("login.sessionExpired"))}}return Fo(()=>{window.addEventListener("hermes-auth-notice",s)}),aa(()=>{window.removeEventListener("hermes-auth-notice",s)}),(d,u)=>(D(),B("span",fl))}}),yl=bl;async function kd(){const o=await fetch("/api/auth/status");if(!o.ok)throw new Error("Failed to fetch auth status");return o.json()}async function wd(o,e){const a=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:o,password:e})});if(!a.ok){const l=await a.json().catch(()=>({})),s=new Error(l.error||"Login failed");throw s.status=a.status,s}return(await a.json()).token}async function Sl(){return(await ee("/api/auth/me")).user}async function Cd(){const o=await ee("/api/auth/avatar");if(!o.avatar)return null;try{const e=JSON.parse(o.avatar);return e&&(e.type==="image"||e.type==="default")?e:null}catch{return null}}async function Pd(o){const e=JSON.stringify(o);await ee("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:e})})}async function Ad(){await ee("/api/auth/avatar",{method:"PUT",body:JSON.stringify({avatar:{type:"default"}})})}async function _d(o,e){return ee("/api/auth/change-password",{method:"POST",body:JSON.stringify({currentPassword:o,newPassword:e})})}async function xd(o,e){return ee("/api/auth/change-username",{method:"POST",body:JSON.stringify({currentPassword:o,newUsername:e})})}async function Da(){return ee("/api/auth/users")}async function Td(o){const e=await ee("/api/auth/users",{method:"POST",body:JSON.stringify(o)});return{...await Da(),users:e.users}}async function Md(o,e){const a=await ee(`/api/auth/users/${o}`,{method:"PUT",body:JSON.stringify(e)});return{...await Da(),users:a.users}}async function Id(o){const e=await ee(`/api/auth/users/${o}`,{method:"DELETE"});return{...await Da(),users:e.users}}async function Hd(){return(await ee("/api/auth/locked-ips")).locks}async function Dd(o){return ee(`/api/auth/locked-ips?ip=${encodeURIComponent(o)}`,{method:"DELETE"})}async function Rd(){return(await ee("/api/auth/locked-ips",{method:"DELETE"})).count}var kl=Ie((()=>{Be()}));xe();No();Ve();Ye();kl();Be();var wl={class:"credential-warning-text"},Cl=Le({__name:"DefaultCredentialPrompt",setup(o){const{t:e}=Xe(),a=Ta(),l=Uo(),s=b(!1),d=b(!1),u=b(""),g=b(null);function P(G){return`hermes_default_credentials_prompt_dismissed_${G}`}function q(){return window.hermesDesktop?.isDesktop===!0}async function w(){if(q()){s.value=!1;return}if(a.name==="login"){s.value=!1;return}const G=xo();if(!(!G||G===u.value)){u.value=G,d.value=!0;try{const z=await Sl();g.value=z.id;const V=sessionStorage.getItem(P(z.id))==="1";s.value=!!z.requiresCredentialChange&&!V}catch{s.value=!1}finally{d.value=!1}}}function W(){g.value!=null&&sessionStorage.setItem(P(g.value),"1"),s.value=!1}function _(){s.value=!1,l.push({name:"hermes.settings",query:{tab:"account"}})}return ro(()=>a.fullPath,()=>{w()},{immediate:!0}),(G,z)=>(D(),Oe(c(Ao),{show:s.value,"onUpdate:show":z[0]||(z[0]=V=>s.value=V),preset:"dialog",title:c(e)("login.defaultCredentialTitle"),"mask-closable":!1},{action:Y(()=>[Q(c(qe),{disabled:d.value,onClick:W},{default:Y(()=>[Re(C(c(e)("login.defaultCredentialLater")),1)]),_:1},8,["disabled"]),Q(c(qe),{type:"primary",loading:d.value,onClick:_},{default:Y(()=>[Re(C(c(e)("login.defaultCredentialAction")),1)]),_:1},8,["loading"])]),default:Y(()=>[r("p",wl,C(c(e)("login.defaultCredentialMessage")),1)]),_:1},8,["show","title"]))}});eo();var Pl=oo(Cl,[["__scopeId","data-v-3a600c1f"]]);xe();No();Ye();Ve();bt();qo();var Al={key:0,class:"node-warning-bar"},_l={class:"app-main"},xl=Le({__name:"App",setup(o){const{isDark:e,isComic:a}=ft(),{t:l}=Xe(),s=lo(),d=Ta(),u=Uo(),g=b(!1),P=me(()=>Li(e.value,a.value)),q=me(()=>e.value?Yt:null),w=me(()=>d.name==="login"),W=me(()=>{const _=s.nodeVersion,G=parseInt(_.split(".")[0],10);return!isNaN(G)&&G<23});return ro(()=>d.path,()=>{s.closeSidebar()}),u.isReady().then(()=>{g.value=!0}),Fo(()=>{w.value||(s.loadModels(),s.startHealthPolling())}),aa(()=>{s.stopHealthPolling()}),$s(),(_,G)=>{const z=rt("router-view");return D(),Oe(c(Zt),{theme:q.value,"theme-overrides":P.value},{default:Y(()=>[Q(c(Wt),null,{default:Y(()=>[Q(yl),Q(c(jt),null,{default:Y(()=>[Q(c(Gt),null,{default:Y(()=>[W.value&&g.value?(D(),B("div",Al,C(c(l)("sidebar.nodeVersionWarning",{version:c(s).nodeVersion})),1)):Ce("",!0),g.value?(D(),B("div",{key:1,class:De(["app-layout",{"no-sidebar":w.value}])},[w.value?Ce("",!0):(D(),B("button",{key:0,class:"hamburger-btn",onClick:G[0]||(G[0]=(...V)=>c(s).toggleSidebar&&c(s).toggleSidebar(...V))},[...G[2]||(G[2]=[r("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!w.value&&c(s).sidebarOpen?(D(),B("div",{key:1,class:"mobile-backdrop",onClick:G[1]||(G[1]=(...V)=>c(s).closeSidebar&&c(s).closeSidebar(...V))})):Ce("",!0),w.value?Ce("",!0):(D(),Oe(Zr,{key:2})),r("main",_l,[Q(z)])],2)):Ce("",!0),Q(vl),Q(Pl)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});eo();var Tl=oo(xl,[["__scopeId","data-v-4b9c67e7"]]);xe();Lo();var tt=localStorage.getItem("hermes_brightness")||"system",Ml=localStorage.getItem("hermes_style")||"ink",Il=window.matchMedia("(prefers-color-scheme: dark)").matches,Hl=tt==="dark"||tt==="system"&&Il,Dl=Ml==="comic";Hl&&document.documentElement.classList.add("dark");Dl&&document.documentElement.classList.add("comic");var Rl=new URLSearchParams(window.location.search),it=window.location.hash.split("?")[1],nt=Rl.get("token")||(it?new URLSearchParams(it).get("token"):null);nt&&(window.__LOGIN_TOKEN__=nt);var ra=Jt(Tl);ra.use(ai());ra.use(vt);ra.use(ii);ra.mount("#app");export{bt as $,bd as A,ad as B,ka as C,fd as D,Ls as E,nd as F,rd as G,dd as H,Hs as I,Cn as J,sd as K,ld as L,pd as M,Ia as N,gd as O,Rs as P,lo as Q,cd as R,Ns as S,vd as T,id as U,Ya as V,wt as W,co as X,ia as Y,qo as Z,Tt as _,kd as a,Bs as b,Da as c,wd as d,ft as et,Ad as f,Pd as g,Md as h,Id as i,ud as j,hd as k,Cd as l,Dd as m,xd as n,Di as nt,Sl as o,Rd as p,Go as q,Td as r,Hd as s,_d as t,Ri as tt,kl as u,Ha as v,md as w,yd as x,Sd as y,td as z};