hermes-web-ui 0.5.27 → 0.5.28

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 (36) hide show
  1. package/dist/client/assets/js/{ChannelsView-D_Hpf1W2.js → ChannelsView-CuofDTcs.js} +1 -1
  2. package/dist/client/assets/js/{ChatView-DOr-OoTw.js → ChatView-Cpj8e0uj.js} +1 -1
  3. package/dist/client/assets/js/{FileRenameModal-DCzKrCtb.js → FileRenameModal-DS3tMLmA.js} +1 -1
  4. package/dist/client/assets/js/{FilesView-UJ8COV83.js → FilesView-DitPDLfP.js} +1 -1
  5. package/dist/client/assets/js/{GatewaysView-DoaDCbK0.js → GatewaysView-DEwU6CSA.js} +1 -1
  6. package/dist/client/assets/js/{GroupChatView-DnI3I50w.js → GroupChatView-B1KWnK4w.js} +1 -1
  7. package/dist/client/assets/js/{HistoryMessageList-Dppp5myU.js → HistoryMessageList-DVoUuNfX.js} +1 -1
  8. package/dist/client/assets/js/{HistoryView-Bx31cTqX.js → HistoryView-By-yzPZa.js} +1 -1
  9. package/dist/client/assets/js/{JobsView-Dwo25w0R.js → JobsView-CCwgRxCj.js} +1 -1
  10. package/dist/client/assets/js/{KanbanView-B0OXZzdS.js → KanbanView-CHz90gv2.js} +1 -1
  11. package/dist/client/assets/js/{LoginView-BP1Dbycl.js → LoginView-nCg7jCjW.js} +1 -1
  12. package/dist/client/assets/js/{LogsView-Bjv7V7F0.js → LogsView-BXG5oQpY.js} +1 -1
  13. package/dist/client/assets/js/{MarkdownRenderer-CvzCPLnZ.js → MarkdownRenderer-BCFoS7DH.js} +1 -1
  14. package/dist/client/assets/js/{MemoryView-BZqGsRGv.js → MemoryView-DoVkLerx.js} +1 -1
  15. package/dist/client/assets/js/{MessageItem-BzZuEzVW.js → MessageItem-BhSU5oee.js} +1 -1
  16. package/dist/client/assets/js/{ModelsView-Bu2mJnSO.js → ModelsView-BeDBR3tp.js} +1 -1
  17. package/dist/client/assets/js/{PluginsView-Do42kP51.js → PluginsView-D3w2eLIX.js} +1 -1
  18. package/dist/client/assets/js/{ProfilesView-rgzlgeY7.js → ProfilesView-DgEhQ263.js} +1 -1
  19. package/dist/client/assets/js/{SessionListItem-Y4rY8ixs.js → SessionListItem-BKe7QBCc.js} +1 -1
  20. package/dist/client/assets/js/{SettingRow-5JNu2zcB.js → SettingRow-Cj9O4m9X.js} +1 -1
  21. package/dist/client/assets/js/{SettingsView-BsJJZ2sv.js → SettingsView-VtbkRWEM.js} +1 -1
  22. package/dist/client/assets/js/{SkillsUsageView-DmKMulrJ.js → SkillsUsageView-BGvo9h2N.js} +1 -1
  23. package/dist/client/assets/js/{SkillsView-DrUkFlBB.js → SkillsView-DwsnhtnV.js} +1 -1
  24. package/dist/client/assets/js/{TerminalView-HQvnFA42.js → TerminalView-BAlxAV-W.js} +1 -1
  25. package/dist/client/assets/js/{UsageView-DUlZFcoj.js → UsageView-ByfmOWKv.js} +1 -1
  26. package/dist/client/assets/js/{_plugin-vue_export-helper-ZIsfSgrY.js → _plugin-vue_export-helper-CrLlP_D3.js} +2 -2
  27. package/dist/client/assets/js/app-CYaCGxZ_.js +1 -0
  28. package/dist/client/assets/js/{auth-CrqiXkJC.js → auth-hbDI2OUF.js} +1 -1
  29. package/dist/client/assets/js/{index-JI6E-cKo.js → index-Bzb-xLYu.js} +1 -1
  30. package/dist/client/assets/js/{models-BR4rntqB.js → models-CDvVG-uE.js} +1 -1
  31. package/dist/client/assets/js/{session-browser-prefs-DPQy70mA.js → session-browser-prefs-HIgWQY8T.js} +1 -1
  32. package/dist/client/assets/js/{skills-BZYoszrI.js → skills-BCJOb_4y.js} +1 -1
  33. package/dist/client/index.html +3 -3
  34. package/dist/server/index.js +2 -2
  35. package/package.json +2 -2
  36. package/dist/client/assets/js/app-BP-u-rQP.js +0 -1
@@ -1 +1 @@
1
- import{i as yn,n as ve}from"./rolldown-runtime-BKwlnUi0.js";import{A as Cn,F as mo,J as Fe,K as kn,Mt as Sn,Nt as S,R as po,Rt as u,S as wo,St as ke,Tt as ze,U as _e,Vt as C,X as Pn,Y as An,Z as Ne,_t as I,at as we,b as xn,ct as ye,et as se,gt as bo,ht as Je,it as F,k as yo,kt as Tn,l as Hn,n as In,nt as Ae,ot as We,pt as Mn,rt as me,st as de,t as xe,tt as a,v as Dn,wt as he,x as Rn,xt as En,y as Co,yt as Be,zt as Y}from"./ui-vendor-CsTMg6zH.js";import{c as $e,d as ko,l as Ln,n as Ce,o as Ze,r as Te,s as qo,t as Fn,u as Oo}from"./vue-vendor-D8zSB7VM.js";import{a as So,c as Ye,d as Po,f as zn,i as Un,l as ce,n as He,o as jo,p as Wo,r as Nn,t as Ie}from"./_plugin-vue_export-helper-ZIsfSgrY.js";import{O as Bn,k as qn}from"./vendor-D9rSt2qK.js";import{n as qe,t as Xe}from"./app-BP-u-rQP.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))r(c);new MutationObserver(c=>{for(const i of c)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function t(c){const i={};return c.integrity&&(i.integrity=c.integrity),c.referrerPolicy&&(i.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?i.credentials="include":c.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(c){if(c.ep)return;c.ep=!0;const i=t(c);fetch(c.href,i)}})();_e();ko();Ze();Ye();Nn();Ce();var Vo={login:{title:"Hermes Web UI",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",credentialsRequired:"Please enter username and password",invalidCredentials:"Invalid username or password",tooManyAttempts:"Too many failed attempts, please try again later",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:"Set up a username and password for convenient login. The access token will continue to work as a backup.",removeConfirm:"Are you sure you want to remove password login? You will need to use the access token to log in.",passwordLoginNotConfigured:"Password login is not configured",passwordLoginConfigured:"Password login enabled ({username})"},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"},sidebar:{chat:"Chat",search:"Search",apiRelay:"API Relay",history:"History",jobs:"Jobs",kanban:"Kanban",models:"Models",profiles:"Profiles",skills:"Skills",plugins:"Plugins",memory:"Memory",logs:"Logs",usage:"Usage",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",groupChat:"Group Chat",files:"Files",groupConversation:"Conversation",groupPlatform:"Platform",groupAgent:"Agent",groupSystem:"System",groupMonitoring:"Monitoring",groupTools:"Tools",settings:"Settings",connected:"Connected",disconnected:"Disconnected",collapse:"Collapse menu",expand:"Expand menu",updateTip:'Run "hermes-web-ui update" in terminal to update',updateVersion:"Upgrade to v{version}",reloadClientVersion:"Reload for v{version}",updating:"Updating...",updateSuccess:"Update successful. Please refresh the page shortly. If it does not start after a while, start it manually.",updateFailed:"Update failed",logout:"Sign Out",nodeVersionWarning:"Detected Node.js v{version}. Please upgrade to version 23 or later.",changelog:"Changelog",noChangelog:"No changelog available"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Save",contextEditCancel:"Cancel",contextEditInvalid:"Please enter a valid context length",contextEditSuccess:"Context length updated",contextEditFailed:"Update failed",emptyState:"Start a conversation with Hermes Agent",cliEmptyState:"Start a CLI chat session",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",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"},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",sessionScopeHint:"Chat shows Web UI/API Server sessions only. CLI, Telegram, Discord, Cron, and other channel sessions are read-only in History.",openHistory:"Open History",hermesHistory:"Hermes History",historyScopeHint:"Read-only Hermes history sessions 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",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",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",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",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)",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"}},plugins:{title:"Plugins",refresh:"Refresh",notice:"Read-only inventory of discoverable Hermes plugin manifests. Discovery metadata is read without loading plugin code. Management actions stay in CLI for v1; changes take effect in new Hermes 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",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 Hermes.",copilotAddSourceEnv:"Source: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source: VS Code Copilot extension (apps.json)",copilotDeleteHintEnv:"This will clear COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Other tools are not affected.",copilotDeleteHintGhCli:"Copilot will be hidden from Hermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.",copilotDeleteHintAppsJson:"Copilot will be hidden from Hermes. Your VS Code Copilot extension login is not affected.",xaiLoginTitle:"xAI Grok OAuth Login",xaiWaiting:"Complete authorization in the opened xAI page. This window will close automatically once approved.",xaiOpenLink:"Open xAI authorization page",xaiApproved:"Sign-in succeeded!",xaiExpired:"The authorization link has expired. Please retry.",customBadge:"CUSTOM",previewBadge:"PREVIEW",disabledBadge:"UNAVAILABLE",disabledTooltip:"This model is currently unavailable for your account.",customModelPlaceholder:"Unlisted model ID",customModelHint:"For provider-supported models not returned by the API; not a display rename. Press Enter to load.",removeCustomModel:"Remove this unlisted model",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",builtIn:"Built-in",customType:"Custom",provider:"Provider",contextLength:"Context Length",contextLengthPlaceholder:"e.g. 200000 (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 to",switchConfirm:'Switching to profile "{name}" will restart the gateway. Continue?',switchSuccess:'Switched to profile "{name}"',switchFailed:"Failed to switch 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."},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:"Account",agent:"Agent",memory:"Memory",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"},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"},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"},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",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"}},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",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",noAgents:"No agents in this room",members:"members",roomCreated:"Room created",roomDeleted:"Room deleted",roomCloned:"Room cloned",cloneRoom:"Clone room",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 Hermes sessions",refresh:"Refresh",periodSelector:"Skill usage period",periodLabel:"{days}d",summary:"Summary",totalActions:"Actions",loads:"Loads",edits:"Edits",distinctSkills:"Skills",topSkills:"Top Skills",dailyTrend:"Daily Trend",periodSummary:"Last {days} days",skill:"Skill",share:"Share",lastUsed:"Last Used",noData:"No skill usage data",loadFailed:"Failed to load skill usage",otherSkills:"Other skills"},files:{title:"Files",fileTree:"File Tree",tree:"Directory Tree",list:"File List",breadcrumbRoot:"Home",newFile:"New File",newFolder:"New Folder",upload:"Upload",refresh:"Refresh",open:"Open",edit:"Edit",preview:"Preview",download:"Download",copyPath:"Copy Path",rename:"Rename",delete:"Delete",name:"Name",size:"Size",modified:"Modified",actions:"Actions",emptyDir:"Empty directory",loading:"Loading...",confirmDelete:'Are you sure you want to delete "{name}"?',confirmDeleteDir:'Are you sure you want to delete directory "{name}" and all its contents?',deleteFailed:"Delete failed",deleted:"Deleted",renameTo:"Rename to",newFileName:"File name",newFolderName:"Folder name",created:"Created",createFailed:"Create failed",renamed:"Renamed",renameFailed:"Rename failed",uploadSuccess:"Uploaded {count} file(s)",uploadFailed:"Upload failed",saveFailed:"Save failed",saved:"Saved",unsavedChanges:"You have unsaved changes. Discard?",pathCopied:"Path copied",fileTooLarge:"File too large (max 10MB)",permissionDenied:"Cannot modify protected file",notFound:"File or directory not found",backendError:"File operation failed",dragDropHint:"Drag files here to upload",closeEditor:"Close Editor",closePreview:"Close",saveFile:"Save"},download:{downloading:"Downloading...",downloadFailed:"Download failed",fileNotFound:"File not found or deleted",fileTooLarge:"File too large (exceeds limit)",backendError:"File read failed, remote environment may be unavailable",backendTimeout:"File read timed out",unsupportedBackend:"Current terminal backend does not support file download",invalidPath:"Invalid file path",download:"Download",downloadFile:"Download file"},changelog:{new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal panel connecting on mount causing PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock on restart",new_0_5_14_5:"Update FUN-Codex/FUN-Claude model lists, add builtin badge and API relay link",new_0_5_15_1:"Add Kanban board for visual task and session management",new_0_5_15_2:"Add official landing page and documentation website",new_0_5_15_3:"Fix group-chat agent client to use dynamic port instead of hardcoded 8648",new_0_5_15_4:"Add node-edge-tts voice module",new_0_5_15_5:"Fix WSL default listen host binding",new_0_5_15_6:"Add website homepage metadata for SEO",new_0_5_15_7:"Add IP-based login brute-force protection",new_0_5_15_8:"Fix double-wrapping of download URLs in MarkdownRenderer",new_0_5_15_9:"Fix Hermes markdown media rendering and sync retry",new_0_5_15_10:"Refactor to remove upstream env dependency",new_0_5_15_11:"If the Kanban feature is not available, please upgrade hermes-agent",new_0_5_16_1:"Migrate chat streaming from /v1/runs to /v1/responses API for lower latency",new_0_5_16_2:"Persist real API usage (tokens, cache, reasoning) to usage table",new_0_5_16_3:"Add QQ group QR code to website navigation bar",new_0_5_16_4:"Remove unused codex_reasoning_items field from message schema",new_0_5_17_1:"Full Windows compatibility: path handling, process management, terminal, log parsing",new_0_5_17_2:"Refactor Gateway process management with cross-platform start/stop/health-check",new_0_5_17_3:"Fix plugin discovery on Termux by parsing hermes shebang to locate Python",new_0_5_17_4:"Tolerate duplicate YAML keys in config parsing",new_0_5_17_5:"Improve auth lock window and dev shutdown flow",new_0_5_17_6:"Add Chinese (ZCOOL KuaiLe), Japanese (Zen Maru Gothic), Korean (Gaegu) handwritten fonts for Comic theme",new_0_5_17_7:"Add Comic/doodle theme style",new_0_5_17_8:"Change license to BSL-1.1",new_0_5_17_9:"Add read-only Hermes plugins page",new_0_5_17_10:"Convert image uploads to base64 multimodal format",new_0_5_17_11:"Fix Kanban board selection and isolation",new_0_5_17_12:"Add voice playback settings with 4-provider TTS support",new_0_5_17_13:"Lower context compression message threshold from 200 to 150",new_0_5_17_14:"Fix Web UI self-update restart logic",new_0_5_17_15:"Fix opencode-zen and opencode-go shared env var causing config coupling",new_0_5_17_16:"Add Traditional Chinese (zh-TW) language support",new_0_5_17_17:"Support managing visible models in Web UI",new_0_5_17_18:"Kanban: complete task action chain (comments, logs, assign, dispatch) with capability boundaries",new_0_5_17_19:"Fix provider auth entries not cleared on delete",new_0_5_17_20:"Fix Codex credential-pool auth recognition",new_0_5_17_21:"Add Edge TTS rate/pitch sliders to voice settings",new_0_5_17_22:"Config YAML duplicate keys no longer crash parsing",new_0_5_17_23:"Gateway port ownership now based on PID file, preventing cross-profile port hijacking",new_0_5_17_24:"History page now shows Cron session records",new_0_5_17_25:"Fix language switch and theme icons squeezed in collapsed sidebar",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_6_1:"Add voice playback feature with Web Speech API: manual button, auto-play toggle, rainbow border animation, and mobile optimization",new_0_5_6_2:"Add robust LLM JSON parser with tolerance for Python format and extract text from streaming events",new_0_5_6_3:"Add Skills enhancements: usage stats, source filtering, archived skills, provenance, and pin toggle",new_0_5_6_4:"Expand daily usage stats with detailed token breakdown including cache read/write separation",new_0_5_6_5:"Clarify session history scope with improved descriptions in chat and history views",new_0_5_6_6:"Redesigned attachment handling using Anthropic-style ContentBlock array format with type discriminated unions (text, image, file)",new_0_5_6_7:"Added frontend file download functionality supporting both ContentBlock and Markdown formats with authentication",new_0_5_6_8:"Fixed multi-process conflict causing SQLite database resets by eliminating redundant nodemon instances",new_0_5_5_1:"🎉 Happy Labor Day! No work this Labor Day, please bear with us if there are any issues",new_0_5_5_2:"Add History page for browsing Hermes session history",new_0_5_5_3:"History page manages session state independently without interfering with active chat",new_0_5_5_4:"History page auto-loads and selects first CLI session by default",new_0_5_5_5:"Add HistoryMessageList component with session prop injection support",new_0_5_5_6:"Filter empty content messages and tool messages without toolName for better display",new_0_5_5_7:"Remove localStorage session cache, all session data now fetched directly from backend",new_0_5_5_8:"Optimize profile switching logic by removing废弃 cache cleanup calls",new_0_5_4_1:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_2:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_3:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_4:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_5:"Support code block copy feedback with user notifications",new_0_5_4_6:"Align usage analytics with Hermes state DB schema",new_0_4_7_1:"Real-time streaming display of thinking/reasoning blocks",new_0_4_7_2:"Skip prepare script during Docker build",new_0_4_7_3:"Group chat mobile UX improvements and UI polish",new_0_4_7_4:"Clamp context remaining tokens to 0 instead of negative",new_0_4_7_5:"Add Alibaba Coding Plan builtin provider with .env base_url override",new_0_4_7_6:"Skip remote profiles on startup to prevent hang",new_0_4_7_7:"Detect and surface silently swallowed run errors",new_0_4_7_8:"Provider-aware context length lookup",new_0_4_7_9:"Reset config.model on switch and resolve CLI custom provider",new_0_4_7_10:"Clear base_url_env from .env when deleting builtin provider",new_0_4_7_11:"Align group chat room sidebar background with session list",new_0_4_4_1:"Add file browser with multi-backend support (local/Docker/SSH/Singularity)",new_0_4_4_2:"Add file download from chat message attachments",new_0_4_4_3:"Add live badge on active chat sessions",new_0_4_4_4:"Add StepFun and Nous Portal provider support",new_0_4_4_5:"Fix special character search queries causing 500 error",new_0_4_5_1:"Add group chat with multi-agent rooms, @mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Add token usage tracking, context display, and dynamic context length",new_0_4_2_2:"Add session search modal",new_0_4_2_3:"Restore group chat system with Socket.IO and SQLite persistence",new_0_4_2_4:"Add pinned sessions and live monitor in Chat page",new_0_4_2_5:"Fix builtin provider detection and model matching"}},On={login:{title:"Hermes Web UI",description:"输入访问令牌以继续。令牌在服务端启动日志中查看。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",passwordMismatch:"两次密码不一致",passwordTooShort:"密码长度至少 6 个字符",setupSuccess:"密码登录配置成功",passwordChanged:"密码修改成功",passwordRemoved:"密码登录已移除",setupPassword:"设置密码登录",changePassword:"修改密码",changeUsername:"修改用户名",removePasswordLogin:"移除",username:"用户名",currentPassword:"当前密码",newPassword:"新密码",confirmPassword:"确认密码",newUsername:"新用户名",usernameChanged:"用户名修改成功",usernameTooShort:"用户名至少 2 个字符",setupDescription:"设置用户名和密码以便快速登录。访问令牌仍可继续使用。",removeConfirm:"确定要移除密码登录吗?移除后需要使用访问令牌登录。",passwordLoginNotConfigured:"密码登录未配置",passwordLoginConfigured:"密码登录已启用({username})"},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:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",groupConversation:"对话",groupPlatform:"平台",groupAgent:"代理",groupSystem:"系统",groupMonitoring:"监控",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:"暂无更新日志"},drawer:{terminal:"终端",files:"工作区"},chat:{contextRemaining:"剩余",contextClickToEdit:"点击编辑上下文长度",contextEditTitle:"编辑上下文长度",contextEditDesc:"设置当前模型的上下文长度限制(token 数量)",contextEditPlaceholder:"请输入上下文长度",contextEditHint:"常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"取消",contextEditInvalid:"请输入有效的上下文长度",contextEditSuccess:"上下文长度已更新",contextEditFailed:"更新失败",emptyState:"开始与 Hermes Agent 对话",cliEmptyState:"开始 CLI 对话",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:"会话",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:"助手",copySessionId:"复制会话 ID",export:"导出",exportFull:"全量导出 (JSON)",exportCompressed:"压缩导出 (TXT)",exportCompressing:"正在压缩上下文,请稍候...",exportSuccess:"会话已导出",exportFailed:"导出失败",renamed:"已重命名",renameFailed:"重命名失败",renameSession:"重命名会话",sessionNotFound:"会话未找到",enterNewTitle:"输入新标题",workspace:"工作区",setWorkspace:"设置工作区",setWorkspaceTitle:"设置会话工作区",workspacePlaceholder:"输入项目路径,例如 /home/user/project",workspaceSet:"工作区已设置",workspaceSetFailed:"设置工作区失败",setModel:"设置模型",setModelTitle:"设置会话模型",modelSet:"模型已设置",modelSetFailed:"设置模型失败",other:"其他",runFailed:"运行失败",error:"错误",tool:"工具",arguments:"参数",result:"结果",truncated:"... (已截断)",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:"本地安装"}},plugins:{title:"插件",refresh:"刷新",notice:"只读展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 Hermes 会话生效。",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",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 凭证,点击「添加」即可在 Hermes 中启用 Copilot。",copilotAddSourceEnv:"来源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"来源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"来源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作会清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影响其他工具。",copilotDeleteHintGhCli:"Copilot 将从 Hermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。",copilotDeleteHintAppsJson:"Copilot 将从 Hermes 列表移除。不会影响 VS Code Copilot 插件的登录。",xaiLoginTitle:"xAI Grok OAuth 登录",xaiWaiting:"请在打开的 xAI 页面完成授权。授权完成后窗口会自动关闭。",xaiOpenLink:"打开 xAI 授权页",xaiApproved:"登录成功!",xaiExpired:"授权链接已过期,请重试。",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:"取消全选",builtIn:"内置",customType:"自定义",provider:"Provider",contextLength:"上下文长度",contextLengthPlaceholder:"例如 200000(可选)",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:"切换到",switchConfirm:'切换到配置 "{name}" 将重启网关,是否继续?',switchSuccess:'已切换到配置 "{name}"',switchFailed:"切换配置失败,网关可能需要手动重启",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:"暂无配置,创建一个开始吧。"},logs:{title:"日志",all:"全部",searchPlaceholder:"搜索...",refresh:"刷新",noEntries:"暂无日志"},settings:{title:"设置",saved:"已保存",saveFailed:"保存失败",tabs:{display:"显示",account:"账户",agent:"代理",memory:"记忆",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:"从不"},memory:{enabled:"启用记忆",enabledHint:"允许 AI 记住对话上下文",userProfile:"用户画像",userProfileHint:"允许 AI 记住用户偏好信息",charLimit:"记忆字符上限",charLimitHint:"MEMORY.md 最大字符数",userCharLimit:"用户画像字符上限",userCharLimitHint:"USER.md 最大字符数"},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"},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",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:"例如:用轻快上扬的语调,语速稍快"}},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",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:"该智能体已在房间中",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",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:"跟踪 Hermes 会话中的技能加载和编辑",refresh:"刷新",periodSelector:"技能用量周期",periodLabel:"{days}天",summary:"概览",totalActions:"操作",loads:"加载",edits:"编辑",distinctSkills:"技能数",topSkills:"热门",dailyTrend:"趋势",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暂无技能用量数据",loadFailed:"技能用量加载失败",otherSkills:"其他技能"},files:{title:"文件",fileTree:"文件树",tree:"目录树",list:"文件列表",breadcrumbRoot:"根目录",newFile:"新建文件",newFolder:"新建文件夹",upload:"上传",refresh:"刷新",open:"打开",edit:"编辑",preview:"预览",download:"下载",copyPath:"复制路径",rename:"重命名",delete:"删除",name:"名称",size:"大小",modified:"修改时间",actions:"操作",emptyDir:"空目录",loading:"加载中...",confirmDelete:"确定要删除「{name}」吗?",confirmDeleteDir:"确定要删除目录「{name}」及其所有内容吗?",deleteFailed:"删除失败",deleted:"已删除",renameTo:"重命名为",newFileName:"文件名",newFolderName:"文件夹名",created:"已创建",createFailed:"创建失败",renamed:"已重命名",renameFailed:"重命名失败",uploadSuccess:"已上传 {count} 个文件",uploadFailed:"上传失败",saveFailed:"保存失败",saved:"已保存",unsavedChanges:"有未保存的更改,是否丢弃?",pathCopied:"路径已复制",fileTooLarge:"文件过大(最大 10MB)",permissionDenied:"无法修改受保护的文件",notFound:"文件或目录不存在",backendError:"文件操作失败",dragDropHint:"拖拽文件到此处上传",closeEditor:"关闭编辑器",closePreview:"关闭",saveFile:"保存"},download:{downloading:"正在下载...",downloadFailed:"下载失败",fileNotFound:"文件不存在或已被删除",fileTooLarge:"文件过大(超过限制)",backendError:"文件读取失败,远程环境可能不可用",backendTimeout:"文件读取超时",unsupportedBackend:"当前 terminal backend 暂不支持文件下载",invalidPath:"无效的文件路径",download:"下载",downloadFile:"下载文件"},changelog:{new_0_5_14_1:"新增会话导出功能:支持完整和压缩模式,导出为 JSON 或纯文本",new_0_5_14_2:"修复终端面板启动即连接导致 PTY 资源耗尽的问题,改为懒加载连接",new_0_5_14_3:"修复 WSL2 环境下 IPv6 双栈绑定导致健康检查失败、端口无法访问的问题",new_0_5_14_4:"修复服务关闭时 SQLite 连接未释放导致重启后数据库被锁的问题",new_0_5_14_5:"更新 FUN-Codex/FUN-Claude 模型列表,新增内置标识、API 中转站入口",new_0_5_15_1:"新增看板面板,可视化任务与会话管理",new_0_5_15_2:"新增官网首页与文档站",new_0_5_15_3:"修复群聊 Agent 客户端使用动态端口而非硬编码 8648",new_0_5_15_4:"新增 node-edge-tts 语音模块",new_0_5_15_5:"修复 WSL 默认监听地址绑定问题",new_0_5_15_6:"新增官网首页 SEO 元数据",new_0_5_15_7:"新增基于 IP 的登录暴力破解防护",new_0_5_15_8:"修复 MarkdownRenderer 中下载链接重复包装问题",new_0_5_15_9:"修复 Hermes Markdown 媒体渲染与同步重试",new_0_5_15_10:"重构移除上游环境变量依赖",new_0_5_15_11:"如果看板功能无法使用,请升级 hermes-agent",new_0_5_16_1:"聊天流式接口从 /v1/runs 迁移至 /v1/responses,降低延迟",new_0_5_16_2:"持久化真实 API 用量(token、缓存、推理)到用量统计表",new_0_5_16_3:"官网导航栏新增 QQ 群二维码",new_0_5_16_4:"移除消息 schema 中未使用的 codex_reasoning_items 字段",new_0_5_17_1:"全面兼容 Windows:路径处理、进程管理、终端、日志解析",new_0_5_17_2:"重构 Gateway 进程管理,支持跨平台启动/停止/健康检查",new_0_5_17_3:"修复 Termux 环境下插件发现失败的问题,自动解析 hermes shebang 定位 Python",new_0_5_17_5:"优化认证锁定窗口和开发环境关闭流程",new_0_5_17_4:"YAML 配置解析容忍重复键",new_0_5_17_6:"Comic 主题新增中文(站酷快乐体)、日文(Zen Maru Gothic)、韩文(Gaegu)手写字体",new_0_5_17_7:"新增 Comic/涂鸦主题风格",new_0_5_17_8:"许可证变更为 BSL-1.1",new_0_5_17_9:"新增只读 Hermes 插件页",new_0_5_17_10:"图片上传转为 base64 多模态格式",new_0_5_17_11:"修复 Kanban 看板选择与隔离问题",new_0_5_17_12:"新增语音播放设置,支持 4 种 TTS 提供商",new_0_5_17_13:"降低上下文压缩提示阈值从 200 到 150",new_0_5_17_14:"修复 Web UI 自更新重启逻辑",new_0_5_17_15:"修复 opencode-zen 和 opencode-go 共享环境变量导致配置联动",new_0_5_17_16:"新增繁体中文(zh-TW)语言支持",new_0_5_17_17:"模型页支持在 Web UI 里管理可见模型",new_0_5_17_18:"Kanban:补齐任务操作链路(评论、日志、分配、派发),明确能力边界",new_0_5_17_19:"修复删除 Provider 时未清除认证条目",new_0_5_17_20:"修复 Codex credential-pool 认证识别",new_0_5_17_21:"Edge TTS 新增语速/音调调节",new_0_5_17_22:"config.yaml 重复键不再导致解析崩溃",new_0_5_17_23:"Gateway 端口所有权检查改为基于 PID 文件,防止跨 Profile 端口占用",new_0_5_17_24:"历史页面现在显示 Cron 会话记录",new_0_5_17_25:"修复收起侧边栏时语言切换和主题图标挤压问题",new_0_5_18_1:"新增技能使用情况监控页面,支持每日趋势图和热门技能统计",new_0_5_18_2:"新增 CLI 聊天会话桥接,通过 Python Agent Bridge 实现 WebSocket 会话",new_0_5_18_3:"新增 Ollama Cloud 供应商预设,支持动态模型目录",new_0_5_18_4:"支持模型显示名重命名(别名)",new_0_5_18_5:"支持在 Web UI 中管理模型可见性",new_0_5_18_6:"增强使用量分析仪表盘",new_0_5_18_7:"Docker 单容器部署,更新 docker-compose 配置并修复 gateway 启动问题",new_0_5_18_8:"修复插件页面非默认 profile 下 HERMES_HOME fallback 警告",new_0_5_18_9:"修复 dev 模式重启时网关稳定性,改善 Windows 兼容性",new_0_5_22_1:"修复 Hermes 会话列表接口错误读取 Web UI 本地会话库的问题",new_0_5_23_1:"新增仅 Bridge 会话可用的聊天斜杠命令,并支持本地化命令提示",new_0_5_23_2:"持久化命令历史用于会话回显,同时避免污染模型上下文、用量统计和压缩",new_0_5_23_3:"隔离 gateway profile 环境变量,防止凭据在不同 profile 之间串用",new_0_5_23_4:"gateway 分配端口时保留 Web UI 端口,避免启动端口冲突",new_0_5_23_5:"修复自更新重启逻辑,避免将 restart helper 的成功退出误报为失败",new_0_5_24_1:"对齐 Bridge 聊天与 API Server 的多模态输入、系统提示词和工作区上下文处理",new_0_5_25_1:"新增群聊房间重置和克隆操作",new_0_5_25_2:"支持配置 Web UI 状态目录,方便自定义部署目录结构",new_0_5_25_3:"语音设置新增 MiMo TTS 提供商",new_0_5_25_4:"自定义 Provider 模型列表改由后端代理请求,避免浏览器跨域失败",new_0_5_25_5:"修复 Bridge 会话的工具授权流程",new_0_5_25_6:"移除 Bridge 强制注入的 CLI 平台提示,保留用户自定义媒体和文件输出规则",new_0_5_25_7:"用户消息历史支持正确展示 base64 图片内容",new_0_5_25_8:"新增 Playwright 浏览器测试、聊天流式契约覆盖、Provider 模型测试和覆盖率基线",new_0_5_26_1:"聊天历史和 Markdown 渲染支持 Windows 与本地媒体路径",new_0_5_26_2:"过滤空 Assistant 历史消息,并在新运行开始时清理旧的压缩状态",new_0_5_26_3:"配置与 Profile 写入新增文件锁,降低并发写入导致配置损坏的风险",new_0_5_26_4:"新增 QQBot 与钉钉频道设置",new_0_5_26_5:"CLI 端口检测改为跨平台实现,并优化移动端终端抽屉尺寸",new_0_5_26_6:"隔离 Bridge Profile 环境,并修复不同 Python 环境下的 Hermes 插件发现",new_0_5_26_7:"Gateway 停止状态新增 Web UI 诊断说明,并保持日志加载状态稳定",new_0_5_26_8:"修复会话重置模式选项、自定义 Provider Base URL 处理和动态投递目标",new_0_5_26_9:"聊天输入栏新增本地保存的工具调用记录显示开关",new_0_5_26_10:"支持未找到源码目录时使用包安装的 Hermes Agent",new_0_5_26_11:"新增 xAI Grok OAuth 登录,支持 SuperGrok 订阅用户授权,并更新 Grok 模型预设",new_0_5_26_12:"扩展浏览器、聊天流式、Provider、Gateway、配置、插件和 Bridge 测试覆盖",new_0_5_27_1:"新增 Bridge 会话级模型设置,每个会话可以独立保存 provider 和 model",new_0_5_27_2:"在 Bridge 会话列表中右键会话,选择“设置模型”即可为当前会话切换模型",new_0_5_27_3:"运行时会自动校验会话模型是否可用;不可用时回退到当前默认模型并更新会话",new_0_5_27_4:"上下文压缩默认跟随当前 Profile 的默认选中模型",new_0_5_6_1:"新增语音播放功能:使用 Web Speech API,支持手动播放按钮、自动播放开关、彩虹边框动画和移动端优化",new_0_5_6_2:"新增健壮的 LLM JSON 解析器,兼容 Python 格式并从流式事件中提取文本",new_0_5_6_3:"Skills 功能增强:使用统计、来源过滤、归档技能、来源追溯和置顶切换",new_0_5_6_4:"扩展每日使用统计,包含详细的 token 细分,分离缓存读/写统计",new_0_5_6_5:"优化会话历史范围说明,改进聊天和历史视图的描述",new_0_5_6_6:"重新设计附件处理,采用 Anthropic 风格的 ContentBlock 数组格式,支持类型区分(文本、图片、文件)",new_0_5_6_7:"新增前端文件下载功能,支持 ContentBlock 和 Markdown 两种格式,带身份验证",new_0_5_6_8:"修复多进程冲突导致的 SQLite 数据库重置问题,清理冗余 nodemon 进程",new_0_5_5_1:"🎉 五一劳动节快乐!这个劳动节就不劳动啦,如果有问题大家忍忍",new_0_5_5_2:"新增历史页面,用于浏览 Hermes 会话历史记录",new_0_5_5_3:"历史页面独立管理会话状态,不影响当前聊天页面的活动会话",new_0_5_5_4:"历史页面默认自动加载并选中第一个 CLI 类型的会话",new_0_5_5_5:"新增 HistoryMessageList 组件,支持通过 props 注入会话数据",new_0_5_5_6:"过滤空内容消息和无 toolName 的 tool 消息,提升历史记录显示质量",new_0_5_5_7:"移除 localStorage 会话缓存,所有会话数据改为直接从后端获取",new_0_5_5_8:"优化 profile 切换逻辑,移除废弃的缓存清理调用",new_0_5_4_1:"修复并发聊天会话事件串扰问题,重构 WebSocket 事件路由机制",new_0_5_4_2:"修复 cron job 编辑 payload,支持长提示词的仅名称编辑",new_0_5_4_3:"修复 Docker 部署后 Web 终端无法使用 Hermes CLI 的问题",new_0_5_4_4:"添加工作区对话框标题 i18n 翻译,改进会话持久化",new_0_5_4_5:"支持代码块复制反馈,显示用户通知",new_0_5_4_6:"对齐使用分析与 Hermes 状态数据库架构",new_0_4_8_2:"修复嵌套 Markdown 代码块导致渲染截断",new_0_4_8_3:"修复压缩续接会话投影和搜索问题",new_0_4_8_4:"优化会话列表 N+1 查询,修复非 CJK 搜索 500 错误",new_0_4_8_5:"修复切换标签页返回时强制滚动到底部",new_0_4_8_6:"切换会话时添加加载过渡动画",new_0_4_8_7:"修复登录 Token 验证使用正确的会话端点",new_0_4_8_8:"修复刷新页面后图片附件失效问题",new_0_4_8_9:"点击图片附件可全屏预览",new_0_4_8_10:"上传目录从临时目录迁移到 ~/.hermes-web-ui/upload",new_0_4_7_1:"实时流式显示思考/推理过程",new_0_4_7_2:"Docker 构建时跳过 prepare 脚本",new_0_4_7_3:"群聊移动端体验改进和 UI 优化",new_0_4_7_4:"将剩余上下文 Token 数限制为 0 而非负数",new_0_4_7_5:"新增阿里云编码计划内置 Provider,支持 .env base_url 覆盖",new_0_4_7_6:"启动时跳过远程配置文件以防止卡住",new_0_4_7_7:"检测并展示被静默吞没的运行错误",new_0_4_7_8:"Provider 感知的上下文长度查询",new_0_4_7_9:"切换时重置 config.model 并解析 CLI 自定义 Provider",new_0_4_7_10:"删除内置 Provider 时清除 .env 中的 base_url_env",new_0_4_7_11:"对齐群聊房间侧边栏背景与会话列表",new_0_4_4_1:"新增文件浏览器,支持多后端(本地/Docker/SSH/Singularity)",new_0_4_4_2:"新增聊天消息附件文件下载",new_0_4_4_3:"活跃会话显示实时状态标签",new_0_4_4_4:"新增 StepFun 和 Nous Portal Provider 支持",new_0_4_4_5:"修复特殊字符搜索导致 500 错误",new_0_4_5_1:"新增群聊功能,支持多 Agent 房间、提及路由和输入状态恢复",new_0_4_5_2:"使用 YAML 重写模型上下文配置,新增 context_length 设置",new_0_4_5_3:"新增 gpt-5.5 到 OpenAI Codex 模型列表",new_0_4_5_4:"用本地控制器替换任务代理,优化模型加载",new_0_4_5_5:"ModelSelector 自定义模型功能新增 i18n 支持",new_0_4_5_6:"修复侧边栏 i18n 缺失 key 警告",new_0_4_5_7:"退出登录时清除所有 localStorage",new_0_4_5_8:"新增日志定期轮转,防止日志无限增长",new_0_4_2_1:"新增 Token 用量追踪、上下文显示和动态上下文长度",new_0_4_2_2:"新增会话搜索弹窗",new_0_4_2_3:"恢复群聊系统(Socket.IO + SQLite 持久化)",new_0_4_2_4:"Chat 页面新增固定会话和实时监控",new_0_4_2_5:"修复内置 Provider 检测和模型匹配问题"}},jn={login:{title:"Hermes Web UI",description:"輸入存取權杖以繼續。權杖可在伺服器啟動日誌中查看。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",passwordMismatch:"兩次密碼不一致",passwordTooShort:"密碼長度至少 6 個字元",setupSuccess:"密碼登入設定成功",passwordChanged:"密碼修改成功",passwordRemoved:"密碼登入已移除",setupPassword:"設定密碼登入",changePassword:"修改密碼",changeUsername:"修改使用者名稱",removePasswordLogin:"移除",username:"使用者名稱",currentPassword:"目前密碼",newPassword:"新密碼",confirmPassword:"確認密碼",newUsername:"新使用者名稱",usernameChanged:"使用者名稱修改成功",usernameTooShort:"使用者名稱至少 2 個字元",setupDescription:"設定使用者名稱和密碼以便快速登入。存取權杖仍可繼續使用。",removeConfirm:"確定要移除密碼登入嗎?移除後需使用存取權杖登入。",passwordLoginNotConfigured:"密碼登入未設定",passwordLoginConfigured:"密碼登入已啟用({username})"},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:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",groupConversation:"對話",groupPlatform:"平台",groupAgent:"代理",groupSystem:"系統",groupMonitoring:"監控",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:"目前無更新日誌"},drawer:{terminal:"終端機",files:"工作區"},chat:{contextRemaining:"剩餘",contextClickToEdit:"點擊編輯上下文長度",contextEditTitle:"編輯上下文長度",contextEditDesc:"設定目前模型的上下文長度限制(token 數量)",contextEditPlaceholder:"請輸入上下文長度",contextEditHint:"常見值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"儲存",contextEditCancel:"取消",contextEditInvalid:"請輸入有效的上下文長度",contextEditSuccess:"上下文長度已更新",contextEditFailed:"更新失敗",emptyState:"開始與 Hermes Agent 對話",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:"工作階段",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:"拒絕",deleteSession:"確定刪除此工作階段?",sessionDeleted:"工作階段已刪除",toggleBatchMode:"批次選取",selectAll:"全選",confirmBatchDelete:"確定刪除選取的 {count} 個工作階段?",batchDeleteSuccess:"已刪除 {count} 個工作階段",batchDeletePartial:"{failed} 個工作階段刪除失敗",batchDeleteFailed:"批次刪除失敗",rename:"重新命名",pin:"釘選",unpin:"取消釘選",pinned:"已釘選",chatMode:"聊天",liveMode:"即時",liveSessions:"即時工作階段",recentBadge:"最近",linkedSessions:"關聯 {count} 個工作階段",noVisibleMessages:"沒有人類可見訊息。",monitorRoleUser:"使用者",monitorRoleAssistant:"助手",copySessionId:"複製工作階段 ID",export:"匯出",exportFull:"完整匯出 (JSON)",exportCompressed:"壓縮匯出 (TXT)",exportCompressing:"正在壓縮上下文,請稍候...",exportSuccess:"工作階段已匯出",exportFailed:"匯出失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",renameSession:"重新命名工作階段",sessionNotFound:"找不到工作階段",enterNewTitle:"輸入新標題",workspace:"工作區",setWorkspace:"設定工作區",setWorkspaceTitle:"設定工作階段工作區",workspacePlaceholder:"輸入專案路徑,例如 /home/user/project",workspaceSet:"工作區已設定",workspaceSetFailed:"設定工作區失敗",other:"其他",runFailed:"執行失敗",error:"錯誤",tool:"工具",arguments:"參數",result:"結果",truncated:"... (已截斷)",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 插件 manifest。發現元資料讀取不會載入插件程式碼。v1 管理動作仍保留在 CLI,新 Hermes 工作階段生效。",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",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 憑證,點擊「新增」即可在 Hermes 中啟用 Copilot。",copilotAddSourceEnv:"來源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"來源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"來源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作會清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影響其他工具。",copilotDeleteHintGhCli:"Copilot 將從 Hermes 清單移除。不會影響 gh CLI —— `gh auth status` 仍顯示已登入。",copilotDeleteHintAppsJson:"Copilot 將從 Hermes 清單移除。不會影響 VS Code Copilot 插件的登入。",customBadge:"自訂",previewBadge:"預覽",disabledBadge:"不可用",disabledTooltip:"此模型目前帳號不可用",customModelPlaceholder:"自訂模型名稱",customModelHint:"按 Enter 載入",removeCustomModel:"移除這個未列出的模型",noProviders:"目前無 Provider,新增一個開始吧。",models:"模型清單",count:"個模型",more:"個更多",builtIn:"內建",customType:"自訂",provider:"Provider",contextLength:"上下文長度",contextLengthPlaceholder:"例如 200000(選填)",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:"取消全選",aliasEdit:"重新命名",aliasTitle:"模型顯示名",aliasTitleFor:"{model} 的顯示名",aliasPlaceholder:"留空則使用原始模型 ID",aliasHint:"僅修改 Web UI 顯示名,傳送給 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢復原始 ID",aliasManage:"顯示名",aliasManageFor:"{provider} 的顯示名",aliasSaveFailed:"儲存顯示名失敗",visibilitySelectOne:"至少保留一個可見模型"},profiles:{title:"設定檔",create:"建立設定檔",import:"匯入",export:"匯出",rename:"重新命名",delete:"刪除",switchTo:"切換至",switchConfirm:"切換至設定檔「{name}」將重新啟動閘道,是否繼續?",switchSuccess:"已切換至設定檔「{name}」",switchFailed:"切換設定檔失敗,閘道可能需要手動重新啟動",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:"目前無設定檔,建立一個開始吧。"},logs:{title:"日誌",all:"全部",searchPlaceholder:"搜尋...",refresh:"重新整理",noEntries:"目前無日誌"},settings:{title:"設定",saved:"已儲存",saveFailed:"儲存失敗",tabs:{display:"顯示",account:"帳號",agent:"代理",memory:"記憶",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:"從不"},memory:{enabled:"啟用記憶",enabledHint:"允許 AI 記住對話上下文",userProfile:"使用者畫像",userProfileHint:"允許 AI 記住使用者偏好資訊",charLimit:"記憶字元上限",charLimitHint:"MEMORY.md 最大字元數",userCharLimit:"使用者畫像字元上限",userCharLimitHint:"USER.md 最大字元數"},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"},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",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:"例如:用輕快上揚的語調,語速稍快"}},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",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:"該智慧代理已在房間中",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",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:"追蹤 Hermes 工作階段中的技能載入與編輯",refresh:"重新整理",periodSelector:"技能用量期間",periodLabel:"{days}天",summary:"總覽",totalActions:"操作",loads:"載入",edits:"編輯",distinctSkills:"技能數",topSkills:"熱門",dailyTrend:"趨勢",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暫無技能用量資料",loadFailed:"技能用量載入失敗",otherSkills:"其他技能"},files:{title:"檔案",fileTree:"檔案樹",tree:"目錄樹",list:"檔案清單",breadcrumbRoot:"根目錄",newFile:"新增檔案",newFolder:"新增資料夾",upload:"上傳",refresh:"重新整理",open:"開啟",edit:"編輯",preview:"預覽",download:"下載",copyPath:"複製路徑",rename:"重新命名",delete:"刪除",name:"名稱",size:"大小",modified:"修改時間",actions:"操作",emptyDir:"空目錄",loading:"載入中...",confirmDelete:"確定要刪除「{name}」嗎?",confirmDeleteDir:"確定要刪除目錄「{name}」及其所有內容嗎?",deleteFailed:"刪除失敗",deleted:"已刪除",renameTo:"重新命名為",newFileName:"檔案名稱",newFolderName:"資料夾名稱",created:"已建立",createFailed:"建立失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",uploadSuccess:"已上傳 {count} 個檔案",uploadFailed:"上傳失敗",saveFailed:"儲存失敗",saved:"已儲存",unsavedChanges:"有未儲存的變更,是否捨棄?",pathCopied:"路徑已複製",fileTooLarge:"檔案過大(最大 10MB)",permissionDenied:"無法修改受保護的檔案",notFound:"檔案或目錄不存在",backendError:"檔案操作失敗",dragDropHint:"拖曳檔案至此處上傳",closeEditor:"關閉編輯器",closePreview:"關閉",saveFile:"儲存"},download:{downloading:"正在下載...",downloadFailed:"下載失敗",fileNotFound:"檔案不存在或已被刪除",fileTooLarge:"檔案過大(超過限制)",backendError:"檔案讀取失敗,遠端環境可能不可用",backendTimeout:"檔案讀取逾時",unsupportedBackend:"目前 terminal backend 暫不支援檔案下載",invalidPath:"無效的檔案路徑",download:"下載",downloadFile:"下載檔案"},changelog:{new_0_5_14_1:"新增工作階段匯出功能:支援完整和壓縮模式,匯出為 JSON 或純文字",new_0_5_14_2:"修復終端機面板啟動即連線導致 PTY 資源耗盡的問題,改為延遲載入連線",new_0_5_14_3:"修復 WSL2 環境下 IPv6 雙堆疊綁定導致健康檢查失敗、連接埠無法存取的問題",new_0_5_14_4:"修復服務關閉時 SQLite 連線未釋放導致重啟後資料庫被鎖的問題",new_0_5_14_5:"更新 FUN-Codex/FUN-Claude 模型清單,新增內建標識、API 中轉站入口",new_0_5_15_1:"新增看板面板,視覺化任務與工作階段管理",new_0_5_15_2:"新增官網首頁與文件站",new_0_5_15_3:"修復群聊 Agent 客戶端使用動態連接埠而非硬式編碼 8648",new_0_5_15_4:"新增 node-edge-tts 語音模組",new_0_5_15_5:"修復 WSL 預設監聽位址綁定問題",new_0_5_15_6:"新增官網首頁 SEO 元資料",new_0_5_15_7:"新增基於 IP 的登入暴力破解防護",new_0_5_15_8:"修復 MarkdownRenderer 中下載連結重複包裝問題",new_0_5_15_9:"修復 Hermes Markdown 媒體渲染與同步重試",new_0_5_15_10:"重構移除上游環境變數依賴",new_0_5_15_11:"如果看板功能無法使用,請升級 hermes-agent",new_0_5_16_1:"聊天串流介面從 /v1/runs 遷移至 /v1/responses,降低延遲",new_0_5_16_2:"持久化真實 API 用量(token、快取、推理)到用量統計表",new_0_5_16_3:"官網導覽列新增 QQ 群 QR Code",new_0_5_16_4:"移除訊息 schema 中未使用的 codex_reasoning_items 欄位",new_0_5_17_1:"全面相容 Windows:路徑處理、程序管理、終端機、日誌解析",new_0_5_17_2:"重構 Gateway 程序管理,支援跨平台啟動/停止/健康檢查",new_0_5_17_3:"修復 Termux 環境下外掛發現失敗的問題,自動解析 hermes shebang 定位 Python",new_0_5_17_4:"YAML 配置解析容忍重複鍵",new_0_5_17_5:"最佳化認證鎖定視窗和開發環境關閉流程",new_0_5_17_6:"Comic 佈景主題新增中文(站酷快樂體)、日文(Zen Maru Gothic)、韓文(Gaegu)手寫字體",new_0_5_17_7:"新增 Comic/塗鴉佈景主題風格",new_0_5_17_8:"授權條款變更為 BSL-1.1",new_0_5_17_9:"新增唯讀 Hermes 外掛頁",new_0_5_17_10:"圖片上傳轉為 base64 多模態格式",new_0_5_17_11:"修復 Kanban 看板選擇與隔離問題",new_0_5_17_12:"新增語音播放設定,支援 4 種 TTS 提供商",new_0_5_17_13:"降低上下文壓縮提示閾值從 200 到 150",new_0_5_17_14:"修復 Web UI 自更新重啟邏輯",new_0_5_17_15:"修復 opencode-zen 和 opencode-go 共享環境變數導致配置聯動",new_0_5_17_16:"新增繁體中文(zh-TW)語言支援",new_0_5_17_17:"模型頁支援在 Web UI 裡管理可見模型",new_0_5_17_18:"Kanban:補齊任務操作鏈路(評論、日誌、分配、派發),明確能力邊界",new_0_5_17_19:"修復刪除 Provider 時未清除認證條目",new_0_5_17_20:"修復 Codex credential-pool 認證識別",new_0_5_17_21:"Edge TTS 新增語速/音調調節",new_0_5_17_22:"config.yaml 重複鍵不再導致解析崩潰",new_0_5_17_23:"Gateway 連接埠所有權檢查改為基於 PID 檔案,防止跨 Profile 連接埠佔用",new_0_5_17_24:"歷史頁面現在顯示 Cron 工作階段記錄",new_0_5_17_25:"修復收起側邊欄時語言切換和佈景主題圖示擠壓問題",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"修復 Hermes 會話列表介面錯誤讀取 Web UI 本地會話庫的問題",new_0_5_23_1:"新增僅 Bridge 會話可用的聊天斜線命令,並支援本地化命令提示",new_0_5_23_2:"持久化命令歷史用於會話回顯,同時避免污染模型上下文、用量統計和壓縮",new_0_5_23_3:"隔離 gateway profile 環境變數,防止憑證在不同 profile 之間串用",new_0_5_23_4:"gateway 分配連接埠時保留 Web UI 連接埠,避免啟動連接埠衝突",new_0_5_23_5:"修復自更新重啟邏輯,避免將 restart helper 的成功退出誤報為失敗",new_0_5_24_1:"對齊 Bridge 聊天與 API Server 的多模態輸入、系統提示詞和工作區上下文處理",new_0_5_25_1:"新增群聊房間重設和複製操作",new_0_5_25_2:"支援設定 Web UI 狀態目錄,方便自訂部署目錄結構",new_0_5_25_3:"語音設定新增 MiMo TTS 提供商",new_0_5_25_4:"自訂 Provider 模型清單改由後端代理請求,避免瀏覽器跨域失敗",new_0_5_25_5:"修復 Bridge 工作階段的工具授權流程",new_0_5_25_6:"移除 Bridge 強制注入的 CLI 平台提示,保留使用者自訂媒體和檔案輸出規則",new_0_5_25_7:"使用者訊息歷史支援正確展示 base64 圖片內容",new_0_5_25_8:"新增 Playwright 瀏覽器測試、聊天串流契約覆蓋、Provider 模型測試和覆蓋率基線",new_0_5_26_1:"聊天歷史和 Markdown 渲染支援 Windows 與本機媒體路徑",new_0_5_26_2:"過濾空 Assistant 歷史訊息,並在新執行開始時清理舊的壓縮狀態",new_0_5_26_3:"設定與 Profile 寫入新增檔案鎖,降低並發寫入導致設定損壞的風險",new_0_5_26_4:"新增 QQBot 與釘釘頻道設定",new_0_5_26_5:"CLI 連接埠偵測改為跨平台實作,並最佳化行動端終端機抽屜尺寸",new_0_5_26_6:"隔離 Bridge Profile 環境,並修復不同 Python 環境下的 Hermes 外掛發現",new_0_5_26_7:"Gateway 停止狀態新增 Web UI 診斷說明,並保持日誌載入狀態穩定",new_0_5_26_8:"修復工作階段重設模式選項、自訂 Provider Base URL 處理和動態投遞目標",new_0_5_26_9:"聊天輸入列新增本機保存的工具呼叫記錄顯示開關",new_0_5_26_10:"支援未找到原始碼目錄時使用套件安裝的 Hermes Agent",new_0_5_26_11:"新增 xAI Grok OAuth 登入,支援 SuperGrok 訂閱使用者授權,並更新 Grok 模型預設",new_0_5_26_12:"擴展瀏覽器、聊天串流、Provider、Gateway、設定、外掛和 Bridge 測試覆蓋",new_0_5_27_1:"新增 Bridge 工作階段級模型設定,每個工作階段可獨立保存 provider 和 model",new_0_5_27_2:"在 Bridge 工作階段列表中右鍵工作階段,選擇「設定模型」即可為目前工作階段切換模型",new_0_5_27_3:"執行時會自動校驗工作階段模型是否可用;不可用時回退到目前預設模型並更新工作階段",new_0_5_27_4:"上下文壓縮預設跟隨目前 Profile 的預設選中模型",new_0_5_6_1:"新增語音播放功能:使用 Web Speech API,支援手動播放按鈕、自動播放開關、彩虹邊框動畫和行動端最佳化",new_0_5_6_2:"新增強健的 LLM JSON 解析器,相容 Python 格式並從串流事件中擷取文字",new_0_5_6_3:"Skills 功能增強:使用統計、來源過濾、封存技能、來源追溯和釘選切換",new_0_5_6_4:"擴展每日使用統計,包含詳細的 token 細分,分離快取讀/寫統計",new_0_5_6_5:"最佳化工作階段歷史範圍說明,改進聊天和歷史視圖的描述",new_0_5_6_6:"重新設計附件處理,採用 Anthropic 風格的 ContentBlock 陣列格式,支援類型區分(文字、圖片、檔案)",new_0_5_6_7:"新增前端檔案下載功能,支援 ContentBlock 和 Markdown 兩種格式,附身份驗證",new_0_5_6_8:"修復多程序衝突導致的 SQLite 資料庫重設問題,清理冗餘 nodemon 程序",new_0_5_5_1:"🎉 勞動節快樂!祝大家勞動愉快",new_0_5_5_2:"新增歷史頁面,用於瀏覽 Hermes 工作階段歷史記錄",new_0_5_5_3:"歷史頁面獨立管理工作階段狀態,不影響目前聊天頁面的使用中工作階段",new_0_5_5_4:"歷史頁面預設自動載入並選取第一個 CLI 類型的工作階段",new_0_5_5_5:"新增 HistoryMessageList 元件,支援透過 props 注入工作階段資料",new_0_5_5_6:"過濾空內容訊息和無 toolName 的 tool 訊息,提升歷史記錄顯示品質",new_0_5_5_7:"移除 localStorage 工作階段快取,所有工作階段資料改為直接從後端取得",new_0_5_5_8:"最佳化 profile 切換邏輯,移除已棄用的快取清理呼叫",new_0_5_4_1:"修復並發聊天工作階段事件串擾問題,重構 WebSocket 事件路由機制",new_0_5_4_2:"修復 cron job 編輯 payload,支援長提示詞的僅名稱編輯",new_0_5_4_3:"修復 Docker 部署後 Web 終端機無法使用 Hermes CLI 的問題",new_0_5_4_4:"新增工作區對話框標題 i18n 翻譯,改進工作階段持久化",new_0_5_4_5:"支援程式碼區塊複製回饋,顯示使用者通知",new_0_5_4_6:"對齊使用分析與 Hermes 狀態資料庫架構",new_0_4_8_2:"修復巢狀 Markdown 程式碼區塊導致渲染截斷",new_0_4_8_3:"修復壓縮續接工作階段投影和搜尋問題",new_0_4_8_4:"最佳化工作階段清單 N+1 查詢,修復非 CJK 搜尋 500 錯誤",new_0_4_8_5:"修復切換標籤頁返回時強制捲動到底部",new_0_4_8_6:"切換工作階段時新增載入過渡動畫",new_0_4_8_7:"修復登入 Token 驗證使用正確的工作階段端點",new_0_4_8_8:"修復重新整理頁面後圖片附件失效問題",new_0_4_8_9:"點擊圖片附件可全螢幕預覽",new_0_4_8_10:"上傳目錄從暫存目錄遷移到 ~/.hermes-web-ui/upload",new_0_4_7_1:"即時串流顯示思考/推理過程",new_0_4_7_2:"Docker 建置時跳過 prepare 指令碼",new_0_4_7_3:"群聊行動端體驗改進和 UI 最佳化",new_0_4_7_4:"將剩餘上下文 Token 數限制為 0 而非負數",new_0_4_7_5:"新增阿里雲編碼計畫內建 Provider,支援 .env base_url 覆蓋",new_0_4_7_6:"啟動時跳過遠端設定檔以防止卡住",new_0_4_7_7:"偵測並展示被靜默吞沒的執行錯誤",new_0_4_7_8:"Provider 感知的上下文長度查詢",new_0_4_7_9:"切換時重設 config.model 並解析 CLI 自訂 Provider",new_0_4_7_10:"刪除內建 Provider 時清除 .env 中的 base_url_env",new_0_4_7_11:"對齊群聊房間側邊欄背景與工作階段清單",new_0_4_4_1:"新增檔案瀏覽器,支援多後端(本地/Docker/SSH/Singularity)",new_0_4_4_2:"新增聊天訊息附件檔案下載",new_0_4_4_3:"使用中工作階段顯示即時狀態標籤",new_0_4_4_4:"新增 StepFun 和 Nous Portal Provider 支援",new_0_4_4_5:"修復特殊字元搜尋導致 500 錯誤",new_0_4_5_1:"新增群聊功能,支援多 Agent 房間、提及路由和輸入狀態恢復",new_0_4_5_2:"使用 YAML 重寫模型上下文設定,新增 context_length 設定",new_0_4_5_3:"新增 gpt-5.5 到 OpenAI Codex 模型清單",new_0_4_5_4:"用本地控制器替換任務代理,最佳化模型載入",new_0_4_5_5:"ModelSelector 自訂模型功能新增 i18n 支援",new_0_4_5_6:"修復側邊欄 i18n 缺失 key 警告",new_0_4_5_7:"登出時清除所有 localStorage",new_0_4_5_8:"新增日誌定期輪替,防止日誌無限增長",new_0_4_2_1:"新增 Token 用量追蹤、上下文顯示和動態上下文長度",new_0_4_2_2:"新增工作階段搜尋彈窗",new_0_4_2_3:"恢復群聊系統(Socket.IO + SQLite 持久化)",new_0_4_2_4:"Chat 頁面新增釘選工作階段和即時監控",new_0_4_2_5:"修復內建 Provider 偵測和模型匹配問題"}},Wn={login:{title:"Hermes Web UI",description:"アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",passwordMismatch:"パスワードが一致しません",passwordTooShort:"パスワードは6文字以上必要です",setupSuccess:"パスワードログインが設定されました",passwordChanged:"パスワードが変更されました",passwordRemoved:"パスワードログインが削除されました",setupPassword:"パスワードログインを設定",changePassword:"パスワードを変更",changeUsername:"ユーザー名を変更",removePasswordLogin:"削除",username:"ユーザー名",currentPassword:"現在のパスワード",newPassword:"新しいパスワード",confirmPassword:"パスワード確認",newUsername:"新しいユーザー名",usernameChanged:"ユーザー名が変更されました",usernameTooShort:"ユーザー名は2文字以上必要です",setupDescription:"ユーザー名とパスワードを設定して、簡単にログインできるようにします。アクセストークンは引き続きバックアップとして使用できます。",removeConfirm:"パスワードログインを削除しますか?アクセストークンを使用してログインする必要があります。",passwordLoginNotConfigured:"パスワードログイン未設定",passwordLoginConfigured:"パスワードログイン有効({username})"},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:"折りたたむ"},sidebar:{chat:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",groupChat:"グループチャット",groupConversation:"会話",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:'ターミナルで "hermes-web-ui update" を実行して更新してください',updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません"},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 と会話を開始しましょう",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",clear:"現在の表示をクリア",clearHistory:"このセッションの保存済みメッセージ履歴を削除",title:"このセッション名を変更",compress:"アイドル時にコンテキスト圧縮を実行",steer:"実行中の Bridge に誘導テキストを送信",destroy:"このセッションの Bridge Agent を解放"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"Hermes 履歴",historyScopeHint:"ソース別にグループ化された Hermes 履歴セッションを読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",approvalKicker:"ターミナル権限",approvalTitle:"実行前にコマンドを確認",approvalAllowOnce:"一度だけ許可",approvalAllowSession:"セッション中は許可",approvalAlways:"常に許可",approvalDeny:"拒否",deleteSession:"このセッションを削除しますか?",toggleBatchMode:"一括選択",selectAll:"すべて選択",confirmBatchDelete:"{count}件のセッションを削除しますか?",batchDeleteSuccess:"{count}件のセッションを削除しました",batchDeletePartial:"{failed}件の削除に失敗しました",batchDeleteFailed:"一括削除に失敗しました",sessionDeleted:"セッションを削除しました",rename:"名前変更",pin:"ピン留め",unpin:"ピン留め解除",pinned:"ピン留め",chatMode:"チャット",liveMode:"ライブ",liveSessions:"ライブセッション",recentBadge:"最近",linkedSessions:"{count} 件の関連",noVisibleMessages:"人間向けに表示できるメッセージはありません。",monitorRoleUser:"ユーザー",monitorRoleAssistant:"アシスタント",copySessionId:"セッション ID をコピー",export:"エクスポート",exportFull:"フルエクスポート (JSON)",exportCompressed:"圧縮エクスポート (TXT)",exportCompressing:"コンテキストを圧縮中、お待ちください...",exportSuccess:"セッションをエクスポートしました",exportFailed:"エクスポートに失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",truncated:"... (省略)",executionDuration:"Execution time",thinkingLabel:"思考過程",thinkingInProgress:"思考中…",thinkingShow:"思考過程を表示",thinkingHide:"思考過程を隠す",thinkingDuration:"観測 {duration}",thinkingChars:"{count} 文字",copyBubble:"メッセージをコピー",copiedBubble:"コピーしました",copyFailed:"コピーに失敗しました",playSpeech:"音声を読み上げ",pauseSpeech:"一時停止",resumeSpeech:"再開",stopSpeech:"停止",speechNotSupported:"このブラウザは音声読み上げをサポートしていません"},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:"ローカル"}},plugins:{title:"プラグイン",refresh:"更新",notice:"検出可能な Hermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい Hermes セッションで有効になります。",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:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"プロジェクトプラグイン"}},memory:{title:"メモリ",refresh:"更新",loadFailed:"メモリの読み込みに失敗しました",myNotes:"メモ",noNotes:"メモはまだありません。",notesPlaceholder:"メモを入力...",userProfile:"ユーザープロファイル",noProfile:"プロファイルはまだありません。",profilePlaceholder:"プロファイルを入力...",soul:"ソウル",noSoul:"ソウル設定はまだありません。",soulPlaceholder:"ソウル設定を入力..."},models:{title:"モデル",addProvider:"プロバイダーを追加",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 トークンを検出しました。「追加」をクリックして Hermes で Copilot を有効化します。",copilotAddSourceEnv:"ソース: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"ソース: gh CLI (gh auth token)",copilotAddSourceAppsJson:"ソース: VS Code Copilot 拡張機能 (apps.json)",copilotDeleteHintEnv:"この操作で ~/.hermes/.env の COPILOT_GITHUB_TOKEN を消去します。他のツールには影響しません。",copilotDeleteHintGhCli:"Copilot は Hermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。",copilotDeleteHintAppsJson:"Copilot は Hermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。",customBadge:"カスタム",previewBadge:"プレビュー",disabledBadge:"利用不可",disabledTooltip:"このモデルは現在のアカウントでは利用できません。",customModelPlaceholder:"未掲載のモデル ID",customModelHint:"プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。",noProviders:"プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。",clearVisibleModels:"選択をクリア",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:"切り替え",switchConfirm:"プロファイル「{name}」に切り替えるとゲートウェイが再起動されます。続行しますか?",switchSuccess:"プロファイル「{name}」に切り替えました",switchFailed:"プロファイルの切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。",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:"プロファイルがありません。作成して始めましょう。"},logs:{title:"ログ",all:"すべて",searchPlaceholder:"検索...",refresh:"更新",noEntries:"ログエントリがありません"},settings:{title:"設定",saved:"保存しました",saveFailed:"保存に失敗しました",tabs:{display:"表示",account:"アカウント",agent:"エージェント",memory:"メモリ",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:"しない"},memory:{enabled:"メモリを有効化",enabledHint:"AI に会話コンテキストを記憶させる",userProfile:"ユーザープロファイル",userProfileHint:"AI にユーザーの設定を記憶させる",charLimit:"メモリ文字数上限",charLimitHint:"MEMORY.md の最大文字数",userCharLimit:"ユーザープロファイル文字数上限",userCharLimitHint:"USER.md の最大文字数"},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",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をロック解除しました"}},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",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:"スキャン済み、スマートフォンで確認してください..."},language:{label:"言語",zh:"中文",en:"English",ja:"日本語"},terminal:{sessions:"セッション",newTab:"新しいターミナル",closeSession:"このセッションを閉じますか?",sessionExited:"終了しました",processExited:"プロセスが終了しました(コード {code})"},usage:{title:"使用統計",refresh:"更新",totalTokens:"総トークン数",inputTokens:"入力",outputTokens:"出力",totalSessions:"総セッション数",avgPerDay:"1日平均 ~{n}",estimatedCost:"推定コスト",cacheHitRate:"キャッシュヒット率",modelBreakdown:"モデル別内訳",dailyTrend:"日別使用量",date:"日付",tokens:"トークン",cache:"キャッシュ",cacheRead:"キャッシュ読み取り",cacheWrite:"キャッシュ書き込み",sessions:"セッション",cost:"コスト",noData:"使用データがありません"},skillsUsage:{title:"スキル使用状況",subtitle:"Hermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_5_6_1:"音声再生機能:Web Speech API使用、手動再生ボタン、自動再生スイッチ、虹色ボーダーアニメーション、モバイル最適化",new_0_5_6_2:"堅牢なLLM JSONパーサー:Python形式対応、ストリーミングイベントからのテキスト抽出",new_0_5_6_3:"Skills機能強化:使用統計、ソースフィルター、アーカイブ済みスキル、来歴、ピン留め切替",new_0_5_6_4:"日次使用統計の拡張:キャッシュ読み取り/書き込み分離を含む詳細なトークン内訳",new_0_5_6_5:"セッション履歴範囲の明確化:チャットと履歴ビューの説明を改善",new_0_5_6_6:"AnthropicスタイルのContentBlock配列形式(テキスト、画像、ファイル)を使用して添付ファイル処理を再設計",new_0_5_6_7:"ContentBlockおよびMarkdown形式をサポートし、認証付きのフロントエンドファイルダウンロード機能を追加",new_0_5_6_8:"重複するnodemonインスタンスを削除し、SQLiteデータベースのリセットを引き起こすマルチプロセス競合を修正",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"カンバンボードでタスクとセッションを視覚的に管理",new_0_5_15_2:"公式ランディングページとドキュメントサイトを追加",new_0_5_15_3:"グループチャットエージェントクライアントがハードコード8648の代わりに動的ポートを使用",new_0_5_15_4:"node-edge-tts 音声モジュールを追加",new_0_5_15_5:"WSLデフォルトリッスンホストバインディングを修正",new_0_5_15_6:"ウェブサイトホームページのSEOメタデータを追加",new_0_5_15_7:"IPベースのログインブルートフォース保護を追加",new_0_5_15_8:"MarkdownRendererのダウンロードURL二重ラップを修正",new_0_5_15_9:"Hermes Markdownメディアレンダリングと同期リトライを修正",new_0_5_15_10:"アップストリーム環境変数依存をリファクタリングで削除",new_0_5_15_11:"カンバン機能が使用できない場合は、hermes-agent をアップグレードしてください",new_0_5_16_1:"チャットストリーミングを /v1/runs から /v1/responses API に移行し、レイテンシを削減",new_0_5_16_2:"実際の API 使用量(トークン、キャッシュ、推論)を統計テーブルに保存",new_0_5_16_3:"ウェブサイトのナビゲーションバーにQQグループのQRコードを追加",new_0_5_16_4:"メッセージスキーマから未使用の codex_reasoning_items フィールドを削除",new_0_5_17_1:"Windows完全対応:パス処理、プロセス管理、ターミナル、ログ解析",new_0_5_17_2:"Gatewayプロセス管理をリファクタリング、クロスプラットフォームの起動/停止/ヘルスチェックに対応",new_0_5_17_3:"Termuxでhermesのshebangを解析してPythonを見つけ、プラグイン検出を修正",new_0_5_17_4:"設定解析時のYAML重複キーを許容するように変更",new_0_5_17_5:"認証ロックウィンドウと開発環境のシャットダウンフローを改善",new_0_5_17_6:"Comicテーマに中国語(ZCOOL KuaiLe)、日本語(Zen Maru Gothic)、韓国語(Gaegu)の手書きフォントを追加",new_0_5_17_7:"Comic/ドゥードゥルテーマスタイルを追加",new_0_5_17_8:"ライセンスをBSL-1.1に変更",new_0_5_17_9:"読み取り専用のHermesプラグインページを追加",new_0_5_17_10:"画像アップロードをBase64マルチモーダル形式に変換",new_0_5_17_11:"カンバンボードの選択と分離を修正",new_0_5_17_12:"4プロバイダーTTS対応の音声再生設定を追加",new_0_5_17_13:"コンテキスト圧縮のメッセージしきい値を200から150に引き下げ",new_0_5_17_14:"Web UI自動更新の再起動ロジックを修正",new_0_5_17_15:"opencode-zenとopencode-goの共有環境変数による設定連動を修正",new_0_5_17_16:"繁体字中国語(zh-TW)言語サポートを追加",new_0_5_17_17:"Web UIで表示モデルを管理する機能を追加",new_0_5_17_18:"カンバン:タスクの完全なアクションチェーン(コメント、ログ、割り当て、ディスパッチ)と能力境界を追加",new_0_5_17_19:"プロバイダー削除時に認証エントリがクリアされない問題を修正",new_0_5_17_20:"Codex credential-pool認証の認識を修正",new_0_5_17_21:"音声設定にEdge TTSの速度/ピッチスライダーを追加",new_0_5_17_22:"設定YAMLの重複キーが解析クラッシュを起こさないように修正",new_0_5_17_23:"ゲートウェイポートの所有権をPIDファイルベースに変更し、プロファイル間のポート乗っ取りを防止",new_0_5_17_24:"履歴ページにCronセッションレコードを表示するように変更",new_0_5_17_25:"折りたたまれたサイドバーでの言語切替・テーマアイコンの圧縮表示を修正",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 労働者の日!今日はお休みです、何卒ご理解ください",new_0_5_5_2:"Hermesセッション履歴ページを追加",new_0_5_5_3:"履歴ページはアクティブチャットに干渉せずにセッション管理",new_0_5_5_4:"履歴ページは最初のCLIセッションを自動選択",new_0_5_5_5:"HistoryMessageListコンポーネントを追加",new_0_5_5_6:"空のメッセージとtoolNameなしのtoolメッセージをフィルタリング",new_0_5_5_7:"localStorageセッションキャッシュを削除、バックエンドから直接取得",new_0_5_5_8:"プロフィール切り替えを最適化",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"思考/推論ブロックのリアルタイムストリーミング表示",new_0_4_7_2:"Dockerビルド時にprepareスクリプトをスキップ",new_0_4_7_3:"グループチャットのモバイルUX改善とUIのブラッシュアップ",new_0_4_7_4:"コンテキスト残りトークン数をマイナスではなく0に制限",new_0_4_7_5:"Alibaba Coding Planビルトインプロバイダーを追加(.env base_urlオーバーライド対応)",new_0_4_7_6:"起動時にリモートプロファイルをスキップしてハングを防止",new_0_4_7_7:"黙って飲み込まれた実行エラーを検出して表示",new_0_4_7_8:"プロバイダー対応のコンテキスト長さルックアップ",new_0_4_7_9:"切り替え時にconfig.modelをリセットしCLIカスタムプロバイダーを解決",new_0_4_7_10:"ビルトインプロバイダー削除時に.envからbase_url_envをクリア",new_0_4_7_11:"グループチャットルームのサイドバー背景をセッションリストに合わせる",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"トークン使用量追跡と動的コンテキスト長を追加",new_0_4_2_2:"セッション検索モーダルを追加",new_0_4_2_3:"Socket.IOとSQLiteによるグループチャットシステムを復元",new_0_4_2_4:"チャットページにピン留めセッションとライブモニターを追加",new_0_4_2_5:"組み込みプロバイダー検出とモデルマッチングを修正"},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:"保存"},groupChat:{title:"グループチャット",createRoom:"ルームを作成",joinByCode:"コードで参加",roomName:"ルーム名",roomNamePlaceholder:"ルーム名を入力",inviteCode:"招待コード",autoGenerate:"自動生成",noRooms:"ルームがありません",selectOrCreate:"ルームを選択または作成してチャットを開始",agents:"エージェント",addAgent:"エージェントを追加",selectProfile:"プロファイルを選択",agentAdded:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",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:"無効なファイルパス",download:"ダウンロード",downloadFile:"ファイルをダウンロード"}},Vn={login:{title:"Hermes Web UI",description:"계속하려면 액세스 토큰을 입력하세요. 서버 시작 로그에서 확인할 수 있습니다.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",passwordMismatch:"비밀번호가 일치하지 않습니다",passwordTooShort:"비밀번호는 6자 이상이어야 합니다",setupSuccess:"비밀번호 로그인이 설정되었습니다",passwordChanged:"비밀번호가 변경되었습니다",passwordRemoved:"비밀번호 로그인이 제거되었습니다",setupPassword:"비밀번호 로그인 설정",changePassword:"비밀번호 변경",changeUsername:"사용자 이름 변경",removePasswordLogin:"제거",username:"사용자 이름",currentPassword:"현재 비밀번호",newPassword:"새 비밀번호",confirmPassword:"비밀번호 확인",newUsername:"새 사용자 이름",usernameChanged:"사용자 이름이 변경되었습니다",usernameTooShort:"사용자 이름은 2자 이상이어야 합니다",setupDescription:"사용자 이름과 비밀번호를 설정하여 편리하게 로그인하세요. 액세스 토큰은 백업으로 계속 사용할 수 있습니다.",removeConfirm:"비밀번호 로그인을 제거하시겠습니까? 액세스 토큰을 사용하여 로그인해야 합니다.",passwordLoginNotConfigured:"비밀번호 로그인 미설정",passwordLoginConfigured:"비밀번호 로그인 활성화됨 ({username})"},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:"접기"},sidebar:{chat:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",groupChat:"그룹 채팅",groupConversation:"대화",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:'터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트 실패",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다"},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와 대화를 시작하세요",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",clear:"현재 표시 내용 지우기",clearHistory:"이 세션의 저장된 메시지 기록 삭제",title:"이 세션 이름 변경",compress:"유휴 상태에서 컨텍스트 압축 실행",steer:"활성 Bridge 실행에 지시 텍스트 보내기",destroy:"이 세션의 Bridge Agent 해제"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"Hermes 기록",historyScopeHint:"소스별로 그룹화된 Hermes 기록 세션을 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",approvalKicker:"터미널 권한",approvalTitle:"실행 전에 명령 확인",approvalAllowOnce:"한 번만 허용",approvalAllowSession:"이 세션에서 허용",approvalAlways:"항상 허용",approvalDeny:"거부",deleteSession:"이 세션을 삭제하시겠습니까?",toggleBatchMode:"일괄 선택",selectAll:"모두 선택",confirmBatchDelete:"선택한 {count}개의 세션을 삭제하시겠습니까?",batchDeleteSuccess:"{count}개의 세션을 삭제했습니다",batchDeletePartial:"{failed}개의 세션 삭제 실패",batchDeleteFailed:"일괄 삭제 실패",sessionDeleted:"세션이 삭제되었습니다",rename:"이름 변경",pin:"고정",unpin:"고정 해제",pinned:"고정됨",chatMode:"채팅",liveMode:"라이브",liveSessions:"라이브 세션",recentBadge:"최근",linkedSessions:"{count}개 연결됨",noVisibleMessages:"사람이 볼 수 있는 메시지가 없습니다.",monitorRoleUser:"사용자",monitorRoleAssistant:"어시스턴트",copySessionId:"세션 ID 복사",export:"내보내기",exportFull:"전체 내보내기 (JSON)",exportCompressed:"압축 내보내기 (TXT)",exportCompressing:"컨텍스트 압축 중, 잠시 기다려주세요...",exportSuccess:"세션을 내보냈습니다",exportFailed:"내보내기 실패",renamed:"이름이 변경되었습니다",renameFailed:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",truncated:"... (잘림)",executionDuration:"Execution time",thinkingLabel:"사고 과정",thinkingInProgress:"사고 중…",thinkingShow:"사고 과정 펼치기",thinkingHide:"사고 과정 접기",thinkingDuration:"관측 {duration}",thinkingChars:"{count}자",copyBubble:"메시지 복사",copiedBubble:"복사됨",copyFailed:"복사 실패",playSpeech:"음성 재생",pauseSpeech:"일시정지",resumeSpeech:"재개",stopSpeech:"중지",speechNotSupported:"이 브라우저는 음성 재생을 지원하지 않습니다"},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:"로컬"}},plugins:{title:"플러그인",refresh:"새로고침",notice:"탐색 가능한 Hermes 플러그인 manifest의 읽기 전용 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. v1의 관리 작업은 CLI에 유지되며, 변경 사항은 새 Hermes 세션에서 적용됩니다.",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:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"프로젝트 플러그인"}},memory:{title:"메모리",refresh:"새로고침",loadFailed:"메모리를 불러오지 못했습니다",myNotes:"내 메모",noNotes:"메모가 없습니다.",notesPlaceholder:"메모를 작성하세요...",userProfile:"사용자 프로필",noProfile:"프로필이 없습니다.",profilePlaceholder:"프로필을 작성하세요...",soul:"소울",noSoul:"소울 설정이 없습니다.",soulPlaceholder:"소울 설정을 작성하세요..."},models:{title:"모델",addProvider:"Provider 추가",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 토큰이 감지되었습니다. 추가를 클릭하여 Hermes에서 Copilot을 활성화하세요.",copilotAddSourceEnv:"출처: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"출처: gh CLI (gh auth token)",copilotAddSourceAppsJson:"출처: VS Code Copilot 확장 (apps.json)",copilotDeleteHintEnv:"이 작업은 ~/.hermes/.env의 COPILOT_GITHUB_TOKEN을 지웁니다. 다른 도구에는 영향이 없습니다.",copilotDeleteHintGhCli:"Copilot이 Hermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.",copilotDeleteHintAppsJson:"Copilot이 Hermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.",customBadge:"커스텀",previewBadge:"프리뷰",disabledBadge:"사용 불가",disabledTooltip:"이 모델은 현재 계정에서 사용할 수 없습니다.",customModelPlaceholder:"목록에 없는 모델 ID",customModelHint:"제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.",noProviders:"Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.",clearVisibleModels:"선택 지우기",builtIn:"내장",customType:"사용자 지정",provider:"Provider",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 200000 (선택사항)",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:"전환",switchConfirm:'프로필 "{name}"(으)로 전환하면 게이트웨이가 재시작됩니다. 계속하시겠습니까?',switchSuccess:'프로필 "{name}"(으)로 전환되었습니다',switchFailed:"프로필 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.",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:"프로필이 없습니다. 새로 만들어 시작하세요."},logs:{title:"로그",all:"전체",searchPlaceholder:"검색...",refresh:"새로고침",noEntries:"로그 항목 없음"},settings:{title:"설정",saved:"저장됨",saveFailed:"저장 실패",tabs:{display:"표시",account:"계정",agent:"에이전트",memory:"메모리",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:"사용 안 함"},memory:{enabled:"메모리 활성화",enabledHint:"AI가 대화 컨텍스트를 기억하도록 허용",userProfile:"사용자 프로필",userProfileHint:"AI가 사용자 선호를 기억하도록 허용",charLimit:"메모리 문자 제한",charLimitHint:"MEMORY.md 최대 문자 수",userCharLimit:"사용자 프로필 문자 제한",userCharLimitHint:"USER.md 최대 문자 수"},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",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 잠금 해제됨"}},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 Access Token",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",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:"스캔됨, 휴대폰에서 확인해 주세요..."},language:{label:"언어",zh:"中文",en:"English",ko:"한국어"},terminal:{sessions:"세션",newTab:"새 터미널",closeSession:"이 세션을 닫으시겠습니까?",sessionExited:"종료됨",processExited:"프로세스가 종료되었습니다 (코드 {code})"},usage:{title:"사용량 통계",refresh:"새로고침",totalTokens:"총 토큰 수",inputTokens:"입력",outputTokens:"출력",totalSessions:"총 세션 수",avgPerDay:"일평균 ~{n}",estimatedCost:"예상 비용",cacheHitRate:"캐시 적중률",modelBreakdown:"모델별 분포",dailyTrend:"일별 사용량",date:"날짜",tokens:"토큰",cache:"캐시",cacheRead:"캐시 읽기",cacheWrite:"캐시 쓰기",sessions:"세션",cost:"비용",noData:"사용량 데이터 없음"},skillsUsage:{title:"스킬 사용량",subtitle:"Hermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_5_6_1:"음성 재생 기능: Web Speech API, 수동 재생 버튼, 자동 재생 스위치, 무지개 테두리 애니메이션, 모바일 최적화",new_0_5_6_2:"강력한 LLM JSON 파서: Python 형식 허용, 스트리밍 이벤트에서 텍스트 추출",new_0_5_6_3:"Skils 기능 향상: 사용 통계, 소스 필터링, 보관된 스킬, 출처, 고정 토글",new_0_5_6_4:"확장된 일일 사용 통계: 캐시 읽기/쓰기 분리를 포함한 상세한 토큰 분석",new_0_5_6_5:"세션 기록 범위 명확화: 채팅 및 기록 보기의 설명 개선",new_0_5_6_6:"Anthropic 스타일의 ContentBlock 배열 형식(텍스트, 이미지, 파일)을 사용하여 첨부파일 처리를 재설계",new_0_5_6_7:"인증이 포함된 ContentBlock 및 Markdown 형식을 지원하는 프론트엔드 파일 다운로드 기능 추가",new_0_5_6_8:"중복된 nodemon 인스턴스를 제거하여 SQLite 데이터베이스 재설정을 일으키는 다중 프로세스 충돌 수정",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"칸반 보드로 작업 및 세션 시각적 관리",new_0_5_15_2:"공식 랜딩 페이지 및 문서 사이트 추가",new_0_5_15_3:"그룹 채팅 에이전트 클라이언트가 하드코딩 8648 대신 동적 포트 사용",new_0_5_15_4:"node-edge-tts 음성 모듈 추가",new_0_5_15_5:"WSL 기본 리슨 호스트 바인딩 수정",new_0_5_15_6:"웹사이트 홈페이지 SEO 메타데이터 추가",new_0_5_15_7:"IP 기반 로그인 무차별 대입 공격 보호 추가",new_0_5_15_8:"MarkdownRenderer 다운로드 URL 이중 래핑 수정",new_0_5_15_9:"Hermes Markdown 미디어 렌더링 및 동기화 재시도 수정",new_0_5_15_10:"업스트림 환경 변수 종속성 제거",new_0_5_15_11:"칸반 기능을 사용할 수 없는 경우 hermes-agent를 업그레이드하세요",new_0_5_16_1:"채팅 스트리밍을 /v1/runs에서 /v1/responses API로 마이그레이션하여 지연 시간 단축",new_0_5_16_2:"실제 API 사용량(토큰, 캐시, 추론)을 사용량 통계 테이블에 저장",new_0_5_16_3:"웹사이트 내비게이션 바에 QQ 그룹 QR 코드 추가",new_0_5_16_4:"메시지 스키마에서 사용하지 않는 codex_reasoning_items 필드 제거",new_0_5_17_1:"Windows 완전 호환: 경로 처리, 프로세스 관리, 터미널, 로그 파싱",new_0_5_17_2:"Gateway 프로세스 관리 리팩토링, 크로스 플랫폼 시작/중지/헬스체크 지원",new_0_5_17_3:"Termux에서 hermes shebang을 파싱하여 Python을 찾아 플러그인 발견 수정",new_0_5_17_4:"설정 파싱 시 중복 YAML 키 허용",new_0_5_17_5:"인증 잠금 창 및 개발 환경 종료 흐름 개선",new_0_5_17_6:"Comic 테마에 중국어(ZCOOL KuaiLe), 일본어(Zen Maru Gothic), 한국어(Gaegu) 필기 폰트 추가",new_0_5_17_7:"Comic/낙서 테마 스타일 추가",new_0_5_17_8:"라이선스를 BSL-1.1로 변경",new_0_5_17_9:"읽기 전용 Hermes 플러그인 페이지 추가",new_0_5_17_10:"이미지 업로드를 base64 멀티모달 형식으로 변환",new_0_5_17_11:"칸반 보드 선택 및 격리 수정",new_0_5_17_12:"4개 제공자 TTS 지원 음성 재생 설정 추가",new_0_5_17_13:"컨텍스트 압축 메시지 임계값을 200에서 150으로 낮춤",new_0_5_17_14:"Web UI 자동 업데이트 재시작 로직 수정",new_0_5_17_15:"opencode-zen과 opencode-go 공유 환경 변수로 인한 설정 결합 문제 수정",new_0_5_17_16:"번체 중국어(zh-TW) 언어 지원 추가",new_0_5_17_17:"Web UI에서 보이는 모델 관리 지원",new_0_5_17_18:"칸반: 작업의 전체 액션 체인(댓글, 로그, 할당, 발송)과 기능 경계 구현",new_0_5_17_19:"프로바이더 삭제 시 인증 항목이 지워지지 않는 문제 수정",new_0_5_17_20:"Codex credential-pool 인증 인식 수정",new_0_5_17_21:"음성 설정에 Edge TTS 속도/피치 슬라이더 추가",new_0_5_17_22:"설정 YAML 중복 키가 더 이상 파싱 충돌을 일으키지 않음",new_0_5_17_23:"게이트웨이 포트 소유권이 PID 파일 기반으로 변경되어 프로필 간 포트 탈취 방지",new_0_5_17_24:"기록 페이지에 Cron 세션 기록 표시",new_0_5_17_25:"접힌 사이드바에서 언어 전환 및 테마 아이콘이 눌리는 문제 수정",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 노동절 감사합니다! 오늘은 쉬니까 양해 부탁드립니다",new_0_5_5_2:"Hermes 세션 기록 페이지 추가",new_0_5_5_3:"기록 페이지는 독립적으로 세션 관리",new_0_5_5_4:"기록 페이지는 첫 번째 CLI 세션 자동 선택",new_0_5_5_5:"HistoryMessageList 컴포넌트 추가",new_0_5_5_6:"빈 메시지와 toolName 없는 tool 메시지 필터링",new_0_5_5_7:"localStorage 세션 캐시 제거, 백엔드에서 직접 가져오기",new_0_5_5_8:"프로필 전환 최적화",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"생각/추론 블록의 실시간 스트리밍 표시",new_0_4_7_2:"Docker 빌드 중 prepare 스크립트 건너뛰기",new_0_4_7_3:"그룹 채팅 모바일 UX 개선 및 UI 다듬기",new_0_4_7_4:"컨텍스트 남은 토큰을 음수 대신 0으로 제한",new_0_4_7_5:".env base_url 재정의를 지원하는 Alibaba Coding Plan 내장 프로바이더 추가",new_0_4_7_6:"시작 시 원격 프로필 건너뛰어 중지 방지",new_0_4_7_7:"조용히 삼켜진 실행 오류 감지 및 표시",new_0_4_7_8:"프로바이더 인식 컨텍스트 길이 조회",new_0_4_7_9:"전환 시 config.model 재설정 및 CLI 커스텀 프로바이더 해결",new_0_4_7_10:"내장 프로바이더 삭제 시 .env에서 base_url_env 정리",new_0_4_7_11:"그룹 채팅 방 사이드바 배경을 세션 목록과 맞추기",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"토큰 사용량 추적 및 동적 컨텍스트 길이 추가",new_0_4_2_2:"세션 검색 모달 추가",new_0_4_2_3:"Socket.IO 및 SQLite로 그룹 채팅 시스템 복원",new_0_4_2_4:"채팅 페이지에 고정 세션 및 라이브 모니터 추가",new_0_4_2_5:"내장 프로바이더 감지 및 모델 매칭 수정"},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:"저장"},groupChat:{title:"그룹 채팅",createRoom:"방 만들기",joinByCode:"코드로 참여",roomName:"방 이름",roomNamePlaceholder:"방 이름을 입력하세요",inviteCode:"초대 코드",autoGenerate:"자동 생성",noRooms:"아직 방이 없습니다",selectOrCreate:"방을 선택하거나 만들어 채팅을 시작하세요",agents:"에이전트",addAgent:"에이전트 추가",selectProfile:"프로필 선택",agentAdded:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",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:"잘못된 파일 경로",download:"다운로드",downloadFile:"파일 다운로드"}},Kn={login:{title:"Hermes 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",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",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:"Configurez un nom d'utilisateur et un mot de passe pour un login rapide. Le jeton d'acces reste disponible.",removeConfirm:"Voulez-vous vraiment supprimer le login par mot de passe? Vous devrez utiliser le jeton d'acces.",passwordLoginNotConfigured:"Login par mot de passe non configure",passwordLoginConfigured:"Login par mot de passe active ({username})"},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"},sidebar:{chat:"Discussion",search:"Rechercher",apiRelay:"API Relay",history:"Historique",jobs:"Taches planifiees",models:"Modeles",profiles:"Profils",plugins:"Plugins",skills:"Competences",memory:"Memoire",logs:"Journaux",usage:"Utilisation",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",files:"Fichiers",groupChat:"Chat de groupe",groupConversation:"Conversation",settings:"Parametres",connected:"Connecte",disconnected:"Deconnecte",updateTip:'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',updateVersion:"Mettre a jour vers v{version}",reloadClientVersion:"Recharger pour v{version}",updating:"Mise a jour...",updateSuccess:"Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.",updateFailed:"Echec de la mise a jour",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible"},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 : 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Enregistrer",contextEditCancel:"Annuler",contextEditInvalid:"Veuillez entrer une longueur de contexte valide",contextEditSuccess:"Longueur du contexte mise à jour",contextEditFailed:"Échec de la mise à jour",emptyState:"Demarrer une conversation avec Hermes Agent",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",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"},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",sessionScopeHint:"Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.",openHistory:"Ouvrir l’historique",hermesHistory:"Historique Hermes",historyScopeHint:"Sessions d’historique Hermes 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",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",sessionDeleted:"Session supprimee",rename:"Renommer",pin:"Épingler",unpin:"Désépingler",pinned:"Épinglés",chatMode:"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",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Actualiser",notice:"Inventaire en lecture seule des manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Type de fournisseur",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Source : ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source : gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source : extension Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Cela supprimera COPILOT_GITHUB_TOKEN dans ~/.hermes/.env. Les autres outils ne sont pas affectés.",copilotDeleteHintGhCli:"Copilot sera masqué dans Hermes. Votre connexion gh CLI n'est pas affectée — `gh auth status` indiquera toujours que vous êtes connecté.",copilotDeleteHintAppsJson:"Copilot sera masqué dans Hermes. Votre extension Copilot de VS Code reste connectée.",customBadge:"PERSONNALISÉ",previewBadge:"APERÇU",disabledBadge:"INDISPONIBLE",disabledTooltip:"Ce modèle n'est pas disponible pour votre compte.",customModelPlaceholder:"ID de modèle non listé",customModelHint:"Pour les modèles pris en charge par le fournisseur mais non renvoyés par l’API ; ce n’est pas un renommage affiché. Entrée pour charger.",noProviders:"Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.",clearVisibleModels:"Effacer la sélection",builtIn:"Integre",customType:"Personnalise",provider:"Fournisseur",contextLength:"Longueur du contexte",contextLengthPlaceholder:"ex. 200000 (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"},profiles:{title:"Profils",create:"Creer un profil",import:"Importer",export:"Exporter",rename:"Renommer",delete:"Supprimer",switchTo:"Passer a",switchConfirm:'Le passage au profil "{name}" redemarrera la passerelle. Continuer ?',switchSuccess:'Profil "{name}" actif',switchFailed:"Echec du changement de profil. 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."},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",agent:"Agent",memory:"Memoire",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:"Theme",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"},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"},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",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"}},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:"Reactions",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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessions",cost:"Cout",noData:"Aucune donnee d'utilisation"},skillsUsage:{title:"Utilisation des compétences",subtitle:"Suivre les chargements et modifications de compétences dans les sessions Hermes",refresh:"Actualiser",periodSelector:"Période d'utilisation des compétences",periodLabel:"{days} j",summary:"Résumé",totalActions:"Act.",loads:"Charg.",edits:"Modif.",distinctSkills:"Comp.",topSkills:"Top comp.",dailyTrend:"Tendance",periodSummary:"{days} derniers jours",skill:"Comp.",share:"%",lastUsed:"Dern. usage",noData:"Aucune donnée d'utilisation des compétences",loadFailed:"Impossible de charger l'utilisation des compétences",otherSkills:"Autres comp."},changelog:{new_0_5_6_1:"Lecture vocale avec Web Speech API: bouton manuel, interrupteur auto-play, animation bordure arc-en-ciel et optimisation mobile",new_0_5_6_2:"Parseur JSON LLM robuste avec tolérance au format Python et extraction de texte des événements streaming",new_0_5_6_3:"Améliorations des Skills: statistiques d'utilisation, filtrage par source, compétences archivées, provenance et toggle d'épinglage",new_0_5_6_4:"Statistiques d'utilisation quotidiennes étendues avec répartition détaillée des tokens incluant la séparation lecture/écriture du cache",new_0_5_6_5:"Portée de l'historique des sessions clarifiée avec descriptions améliorées dans les vues chat et historique",new_0_5_6_6:"Repensé la gestion des pièces jointes en utilisant le format de tableau ContentBlock style Anthropic (texte, image, fichier)",new_0_5_6_7:"Ajouté la fonctionnalité de téléchargement de fichiers frontend supportant les formats ContentBlock et Markdown avec authentification",new_0_5_6_8:"Corrigé le conflit multi-processus causant des réinitialisations de base de données SQLite en éliminant les instances nodemon redondantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Tableau Kanban pour la gestion visuelle des tâches et sessions",new_0_5_15_2:"Page d'accueil officielle et site de documentation",new_0_5_15_3:"Client agent group-chat utilise port dynamique au lieu de 8648",new_0_5_15_4:"Module vocal node-edge-tts ajouté",new_0_5_15_5:"Correction liaison hôte d'écoute WSL par défaut",new_0_5_15_6:"Métadonnées SEO pour la page d'accueil du site",new_0_5_15_7:"Protection contre les attaques brute-force basée sur l'IP",new_0_5_15_8:"Correction double enveloppement des URLs de téléchargement dans MarkdownRenderer",new_0_5_15_9:"Correction rendu média Markdown et retry synchronisation",new_0_5_15_10:"Suppression dépendance variable d'environnement amont",new_0_5_15_11:"Si la fonction Kanban n'est pas disponible, veuillez mettre à niveau hermes-agent",new_0_5_16_1:"Migration du streaming de chat de /v1/runs vers l'API /v1/responses pour une latence réduite",new_0_5_16_2:"Persistance de l'utilisation réelle de l'API (tokens, cache, raisonnement) dans la table des statistiques",new_0_5_16_3:"Ajout du code QR du groupe QQ dans la barre de navigation du site",new_0_5_16_4:"Suppression du champ codex_reasoning_items inutilisé du schéma de messages",new_0_5_17_1:"Compatibilité Windows complète : gestion des chemins, des processus, terminal, analyse des logs",new_0_5_17_2:"Refonte de la gestion des processus Gateway avec démarrage/arrêt/health-check multiplateforme",new_0_5_17_3:"Correction de la découverte des plugins sur Termux en analysant le shebang hermes pour localiser Python",new_0_5_17_4:"Tolérer les clés YAML en double lors de l'analyse de la configuration",new_0_5_17_5:"Amélioration de la fenêtre de verrouillage d'authentification et du processus d'arrêt en dev",new_0_5_17_6:"Thème Comic : polices manuscrites pour chinois (ZCOOL KuaiLe), japonais (Zen Maru Gothic), coréen (Gaegu)",new_0_5_17_7:"Ajouter le style de thème Comic/doodle",new_0_5_17_8:"Changer la licence en BSL-1.1",new_0_5_17_9:"Ajouter une page de plugins Hermes en lecture seule",new_0_5_17_10:"Convertir les téléchargements d'images au format multimodal base64",new_0_5_17_11:"Corriger la sélection et l'isolation du tableau Kanban",new_0_5_17_12:"Ajouter les paramètres de lecture vocale avec support TTS de 4 fournisseurs",new_0_5_17_13:"Réduire le seuil de compression de contexte de 200 à 150 messages",new_0_5_17_14:"Corriger la logique de redémarrage de la mise à jour automatique de la Web UI",new_0_5_17_15:"Corriger la variable d'environnement partagée opencode-zen et opencode-go causant un couplage de configuration",new_0_5_17_16:"Ajouter la prise en charge du chinois traditionnel (zh-TW)",new_0_5_17_17:"Gérer les modèles visibles dans la Web UI",new_0_5_17_18:"Kanban : chaîne d'action complète des tâches (commentaires, logs, affectation, envoi) avec limites de capacités",new_0_5_17_19:"Corriger les entrées d'authentification fournisseur non effacées lors de la suppression",new_0_5_17_20:"Corriger la reconnaissance d'authentification credential-pool de Codex",new_0_5_17_21:"Ajouter les curseurs de vitesse/hauteur Edge TTS aux paramètres vocaux",new_0_5_17_22:"Les clés YAML en double dans la configuration ne provoquent plus de crash lors de l'analyse",new_0_5_17_23:"La propriété du port de passerelle est maintenant basée sur un fichier PID, empêchant le détournement de port entre profils",new_0_5_17_24:"La page d'historique affiche désormais les enregistrements de sessions Cron",new_0_5_17_25:"Corriger les icônes de changement de langue et de thème écrasées dans la barre latérale réduite",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Joyeuse Fête du Travail! Pas de travail aujourd'hui, merci de votre compréhension",new_0_5_5_2:"Ajout d'une page d'historique pour les sessions Hermes",new_0_5_5_3:"La page d'historique gère les sessions de manière indépendante",new_0_5_5_4:"Chargement automatique de la première session CLI",new_0_5_5_5:"Composant HistoryMessageList avec injection de props",new_0_5_5_6:"Filtrage des messages vides et des tools sans toolName",new_0_5_5_7:"Suppression du cache localStorage des sessions",new_0_5_5_8:"Optimisation du changement de profil",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Affichage en streaming en temps reel des blocs de reflexion/raisonnement",new_0_4_7_2:"Ignorer le script de preparation lors du build Docker",new_0_4_7_3:"Ameliorations UX mobile du chat de groupe et polissage de l'interface",new_0_4_7_4:"Limiter les jetons restants du contexte a 0 au lieu de negatif",new_0_4_7_5:"Ajouter le fournisseur integre Alibaba Coding Plan avec remplacement base_url dans .env",new_0_4_7_6:"Ignorer les profils distants au demarrage pour eviter le blocage",new_0_4_7_7:"Detecter et afficher les erreurs d'execution silencieusement ignorees",new_0_4_7_8:"Recherche de longueur de contexte sensible au fournisseur",new_0_4_7_9:"Reinitialiser config.model lors du changement et resoudre le fournisseur personnalise CLI",new_0_4_7_10:"Supprimer base_url_env du .env lors de la suppression du fournisseur integre",new_0_4_7_11:"Aligner le fond de la barre laterale du chat de groupe avec la liste des sessions",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Ajouter le suivi de l'utilisation des tokens et la longueur de contexte dynamique",new_0_4_2_2:"Ajouter la modal de recherche de sessions",new_0_4_2_3:"Restaurer le systeme de chat de groupe avec Socket.IO et SQLite",new_0_4_2_4:"Ajouter les sessions epinglees et le moniteur en direct",new_0_4_2_5:"Corriger la detection des fournisseurs integres et l'appariement des modeles"},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"},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",noAgents:"Aucun agent dans ce salon",members:"Membres",roomCreated:"Salon cree",roomDeleted:"Salon supprime",roomCloned:"Salon clone",cloneRoom:"Cloner le 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",download:"Telecharger",downloadFile:"Telecharger le fichier"}},Gn={login:{title:"Hermes 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",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",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:"Configure un nombre de usuario y contrasena para un inicio de sesion rapido. El token de acceso seguira funcionando.",removeConfirm:"Esta seguro de eliminar el login con contrasena? Necesitara usar el token de acceso.",passwordLoginNotConfigured:"Login con contrasena no configurado",passwordLoginConfigured:"Login con contrasena habilitado ({username})"},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"},sidebar:{chat:"Chat",search:"Buscar",apiRelay:"API Relay",history:"Historial",jobs:"Tareas programadas",models:"Modelos",profiles:"Perfiles",plugins:"Plugins",skills:"Habilidades",memory:"Memoria",logs:"Registros",usage:"Uso",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",files:"Archivos",groupChat:"Chat grupal",groupConversation:"Conversación",settings:"Configuracion",connected:"Conectado",disconnected:"Desconectado",updateTip:'Ejecuta "hermes-web-ui update" en la terminal para actualizar',updateVersion:"Actualizar a v{version}",reloadClientVersion:"Recargar para v{version}",updating:"Actualizando...",updateSuccess:"Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.",updateFailed:"Error al actualizar",logout:"Cerrar sesion",nodeVersionWarning:"Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.",changelog:"Registro de cambios",noChangelog:"No hay registro de cambios"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Guardar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor ingresa una longitud de contexto válida",contextEditSuccess:"Longitud del contexto actualizada",contextEditFailed:"Error en la actualización",emptyState:"Inicia una conversacion con Hermes Agent",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",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"},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",sessionScopeHint:"Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.",openHistory:"Abrir historial",hermesHistory:"Historial de Hermes",historyScopeHint:"Sesiones del historial de Hermes, 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",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",sessionDeleted:"Sesion eliminada",rename:"Renombrar",pin:"Fijar",unpin:"Desfijar",pinned:"Fijados",chatMode:"Chat",liveMode:"En vivo",liveSessions:"Sesiones en vivo",recentBadge:"Reciente",linkedSessions:"{count} vinculadas",noVisibleMessages:"No hay mensajes visibles para humanos.",monitorRoleUser:"Usuario",monitorRoleAssistant:"Asistente",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Actualizar",notice:"Inventario de solo lectura de manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Tipo de proveedor",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Origen: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origen: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origen: extensión Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Esto borrará COPILOT_GITHUB_TOKEN en ~/.hermes/.env. Otras herramientas no se verán afectadas.",copilotDeleteHintGhCli:"Copilot se ocultará de Hermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.",copilotDeleteHintAppsJson:"Copilot se ocultará de Hermes. La extensión Copilot de VS Code seguirá conectada.",customBadge:"PERSONALIZADO",previewBadge:"VISTA PREVIA",disabledBadge:"NO DISPONIBLE",disabledTooltip:"Este modelo no está disponible para tu cuenta.",customModelPlaceholder:"ID de modelo no listado",customModelHint:"Para modelos compatibles con el proveedor que la API no devuelve; no es un cambio de nombre visible. Enter para cargar.",noProviders:"No se encontraron proveedores. Anade un proveedor personalizado para comenzar.",clearVisibleModels:"Borrar selección",builtIn:"Integrado",customType:"Personalizado",provider:"Proveedor",contextLength:"Longitud del contexto",contextLengthPlaceholder:"ej. 200000 (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"},profiles:{title:"Perfiles",create:"Crear perfil",import:"Importar",export:"Exportar",rename:"Renombrar",delete:"Eliminar",switchTo:"Cambiar a",switchConfirm:'Cambiar al perfil "{name}" reiniciara la pasarela. Continuar?',switchSuccess:'Se ha cambiado al perfil "{name}"',switchFailed:"Error al cambiar de perfil. 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."},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",agent:"Agente",memory:"Memoria",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"},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"},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",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"}},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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sesiones",cost:"Costo",noData:"Sin datos de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Sigue las cargas y ediciones de habilidades en sesiones de Hermes",refresh:"Actualizar",periodSelector:"Periodo de uso de habilidades",periodLabel:"{days} d",summary:"Resumen",totalActions:"Acciones",loads:"Cargas",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendencia diaria",periodSummary:"Últimos {days} días",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"No hay datos de uso de habilidades",loadFailed:"No se pudo cargar el uso de habilidades",otherSkills:"Otras habs."},changelog:{new_0_5_6_1:"Reproducción de voz con Web Speech API: botón manual, interruptor auto-play, animación de borde arcoíris y optimización móvil",new_0_5_6_2:"Parser LLM JSON robusto con tolerancia a formato Python y extracción de texto de eventos streaming",new_0_5_6_3:"Mejoras de Skills: estadísticas de uso, filtrado de fuentes, skills archivados, procedencia y toggle de fijado",new_0_5_6_4:"Estadísticas diarias de uso expandidas con desglose detallado de tokens incluyendo separación de lectura/escritura de caché",new_0_5_6_5:"Ámbito del historial de sesiones aclarado con descripciones mejoradas en vistas de chat e historial",new_0_5_6_6:"Rediseñado el manejo de adjuntos usando formato de matriz ContentBlock estilo Anthropic (texto, imagen, archivo)",new_0_5_6_7:"Añadida funcionalidad de descarga de archivos en frontend soportando formatos ContentBlock y Markdown con autenticación",new_0_5_6_8:"Corregido conflicto de múltiples procesos que causaba reinicios de base de datos SQLite eliminando instancias nodemon redundantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Tablero Kanban para gestión visual de tareas y sesiones",new_0_5_15_2:"Página de inicio y sitio de documentación oficial",new_0_5_15_3:"Cliente agente group-chat usa puerto dinámico en vez de 8648",new_0_5_15_4:"Módulo de voz node-edge-tts añadido",new_0_5_15_5:"Corregido enlace de host de escucha WSL predeterminado",new_0_5_15_6:"Metadatos SEO para la página de inicio del sitio",new_0_5_15_7:"Protección contra ataques de fuerza bruta basada en IP",new_0_5_15_8:"Corregido envoltura doble de URLs de descarga en MarkdownRenderer",new_0_5_15_9:"Corregido renderizado de medios Markdown y reintento de sincronización",new_0_5_15_10:"Eliminada dependencia de variables de entorno upstream",new_0_5_15_11:"Si la función Kanban no está disponible, actualice hermes-agent",new_0_5_16_1:"Migrar streaming de chat de /v1/runs a /v1/responses API para menor latencia",new_0_5_16_2:"Persistir uso real de API (tokens, caché, razonamiento) en tabla de estadísticas",new_0_5_16_3:"Añadir código QR del grupo QQ a la barra de navegación del sitio web",new_0_5_16_4:"Eliminar campo codex_reasoning_items no utilizado del esquema de mensajes",new_0_5_17_1:"Compatibilidad completa con Windows: manejo de rutas, gestión de procesos, terminal, análisis de logs",new_0_5_17_2:"Refactorizada la gestión de procesos de Gateway con inicio/parada/health-check multiplataforma",new_0_5_17_3:"Corregido el descubrimiento de plugins en Termux analizando el shebang de hermes para localizar Python",new_0_5_17_4:"Tolerar claves YAML duplicadas en el análisis de configuración",new_0_5_17_5:"Mejorada la ventana de bloqueo de autenticación y el flujo de cierre del entorno de desarrollo",new_0_5_17_6:"Tema Comic: fuentes manuales para chino (ZCOOL KuaiLe), japonés (Zen Maru Gothic), coreano (Gaegu)",new_0_5_17_7:"Agregar estilo de tema Comic/doodle",new_0_5_17_8:"Cambiar licencia a BSL-1.1",new_0_5_17_9:"Agregar página de plugins Hermes de solo lectura",new_0_5_17_10:"Convertir subidas de imágenes a formato multimodal base64",new_0_5_17_11:"Corregir selección y aislamiento del tablero Kanban",new_0_5_17_12:"Agregar ajustes de reproducción de voz con soporte TTS de 4 proveedores",new_0_5_17_13:"Reducir umbral de compresión de contexto de 200 a 150 mensajes",new_0_5_17_14:"Corregir lógica de reinicio de autoactualización de Web UI",new_0_5_17_15:"Corregir variable de entorno compartida opencode-zen y opencode-go que causaba acoplamiento de configuración",new_0_5_17_16:"Agregar soporte para idioma chino tradicional (zh-TW)",new_0_5_17_17:"Gestionar modelos visibles en la Web UI",new_0_5_17_18:"Kanban: cadena de acción completa de tareas (comentarios, logs, asignación, despacho) con límites de capacidades",new_0_5_17_19:"Corregir entradas de autenticación de proveedor no limpiadas al eliminar",new_0_5_17_20:"Corregir reconocimiento de autenticación credential-pool de Codex",new_0_5_17_21:"Agregar controles deslizantes de velocidad/tono de Edge TTS a los ajustes de voz",new_0_5_17_22:"Las claves YAML duplicadas en la configuración ya no causan fallos en el análisis",new_0_5_17_23:"La propiedad del puerto del gateway ahora se basa en archivo PID, evitando secuestro de puerto entre perfiles",new_0_5_17_24:"La página de historial ahora muestra registros de sesiones Cron",new_0_5_17_25:"Corregir iconos de cambio de idioma y tema comprimidos en la barra lateral colapsada",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 ¡Feliz Día del Trabajo! Hoy no se trabaja, agradezcan su comprensión",new_0_5_5_2:"Añadida página de historial para sesiones Hermes",new_0_5_5_3:"La página de historial gestiona sesiones de forma independiente",new_0_5_5_4:"Carga automática de primera sesión CLI",new_0_5_5_5:"Componente HistoryMessageList con inyección de props",new_0_5_5_6:"Filtrado de mensajes vacíos y tools sin toolName",new_0_5_5_7:"Eliminado caché de sesiones localStorage, datos del backend",new_0_5_5_8:"Optimizado cambio de perfil, eliminadas llamadas de cachete obsoletas",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Visualizacion en streaming en tiempo real de bloques de pensamiento/razonamiento",new_0_4_7_2:"Omitir script de preparacion durante la construccion Docker",new_0_4_7_3:"Mejoras en la experiencia movil del chat grupal y pulido de UI",new_0_4_7_4:"Limitar los tokens restantes del contexto a 0 en lugar de negativos",new_0_4_7_5:"Agregar proveedor integrado Alibaba Coding Plan con anulacion de base_url en .env",new_0_4_7_6:"Omitir perfiles remotos al inicio para evitar bloqueos",new_0_4_7_7:"Detectar y mostrar errores de ejecucion silenciosamente tragados",new_0_4_7_8:"Consulta de longitud de contexto consciente del proveedor",new_0_4_7_9:"Restablecer config.model al cambiar y resolver proveedor personalizado CLI",new_0_4_7_10:"Limpiar base_url_env de .env al eliminar proveedor integrado",new_0_4_7_11:"Alinear el fondo de la barra lateral del chat grupal con la lista de sesiones",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Agregar seguimiento de uso de tokens y longitud de contexto dinamico",new_0_4_2_2:"Agregar modal de busqueda de sesiones",new_0_4_2_3:"Restaurar sistema de chat grupal con Socket.IO y SQLite",new_0_4_2_4:"Agregar sesiones fijas y monitor en vivo en la pagina de chat",new_0_4_2_5:"Corregir deteccion de proveedores integrados y coincidencia de modelos"},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"},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",noAgents:"No hay agentes en esta sala",members:"Miembros",roomCreated:"Sala creada",roomDeleted:"Sala eliminada",roomCloned:"Sala clonada",cloneRoom:"Clonar 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",download:"Descargar",downloadFile:"Descargar archivo"}},Qn={login:{title:"Hermes 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",credentialsRequired:"Bitte Benutzername und Passwort eingeben",invalidCredentials:"Ungultiger Benutzername oder Passwort",tooManyAttempts:"Zu viele fehlgeschlagene Versuche, bitte versuchen Sie es spater erneut",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:"Richten Sie Benutzername und Passwort fur bequemes Login ein. Der Zugangs-Token bleibt als Backup verfugbar.",removeConfirm:"Mochten Sie das Passwort-Login wirklich entfernen? Sie mussen dann den Zugangs-Token verwenden.",passwordLoginNotConfigured:"Passwort-Login ist nicht konfiguriert",passwordLoginConfigured:"Passwort-Login aktiviert ({username})"},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"},sidebar:{chat:"Chat",search:"Suche",apiRelay:"API-Relay",history:"Verlauf",jobs:"Geplante Aufgaben",models:"Modelle",profiles:"Profile",plugins:"Plugins",skills:"Fahigkeiten",memory:"Gedachtnis",logs:"Protokolle",usage:"Nutzung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Terminal",files:"Dateien",groupChat:"Gruppenchat",groupConversation:"Konversation",settings:"Einstellungen",connected:"Verbunden",disconnected:"Getrennt",updateTip:'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',updateVersion:"Aktualisieren auf v{version}",reloadClientVersion:"Für v{version} neu laden",updating:"Aktualisierung...",updateSuccess:"Aktualisierung erfolgreich. Bitte aktualisieren Sie die Seite in Kurze. Wenn der Dienst langere Zeit nicht startet, starten Sie ihn manuell.",updateFailed:"Aktualisierung fehlgeschlagen",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar"},drawer:{terminal:"Terminal",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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Speichern",contextEditCancel:"Abbrechen",contextEditInvalid:"Bitte geben Sie eine gültige Kontextlänge ein",contextEditSuccess:"Kontextlänge aktualisiert",contextEditFailed:"Aktualisierung fehlgeschlagen",emptyState:"Starten Sie eine Konversation mit Hermes Agent",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",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"},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",sessionScopeHint:"Chat zeigt nur Web-UI/API-Server-Sitzungen. CLI-, Telegram-, Discord-, Cron- und andere Kanal-Sitzungen sind schreibgeschützt im Verlauf.",openHistory:"Verlauf öffnen",hermesHistory:"Hermes-Verlauf",historyScopeHint:"Schreibgeschützte Hermes-Verlaufssitzungen, 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",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",sessionDeleted:"Sitzung geloscht",rename:"Umbenennen",pin:"Anheften",unpin:"Lösen",pinned:"Angeheftet",chatMode:"Chat",liveMode:"Live",liveSessions:"Live-Sitzungen",recentBadge:"Kürzlich",linkedSessions:"{count} verknüpft",noVisibleMessages:"Keine für Menschen sichtbaren Nachrichten.",monitorRoleUser:"Benutzer",monitorRoleAssistant:"Assistent",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)",executionDuration:"Execution time",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:"Pause",resumeSpeech:"Fortsetzen",stopSpeech:"Stoppen",speechNotSupported:"Sprachwiedergabe in diesem Browser nicht unterstützt"},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:"Prompt",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"}},plugins:{title:"Plugins",refresh:"Aktualisieren",notice:"Schreibgeschütztes Inventar erkennbarer Hermes-Plugin-Manifeste. Discovery-Metadaten werden gelesen, ohne Plugin-Code zu laden. Verwaltungsaktionen bleiben in v1 im CLI; Änderungen gelten für neue Hermes-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 root",python:"Python",scanCwd:"Scan cwd",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",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 Login",nousWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein:",nousCopyCode:"Code kopiert",nousOpenLink:"Autorisierungsseite öffnen",nousApproved:"Login erfolgreich",nousDenied:"Autorisierung wurde abgelehnt",nousExpired:"Autorisierung abgelaufen",copilotLoginTitle:"GitHub Copilot Anmeldung",copilotWaiting:"Öffnen Sie GitHub und geben Sie den unten angezeigten Gerätecode ein. Das Fenster schließt sich automatisch nach Genehmigung.",copilotCopyCode:"Code kopiert",copilotOpenLink:"GitHub-Autorisierungsseite öffnen",copilotApproved:"Anmeldung erfolgreich!",copilotDenied:"Autorisierung abgelehnt.",copilotExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",copilotAddDetectedTitle:"GitHub Copilot erkannt",copilotAddDetected:'Auf diesem Rechner wurde ein GitHub Copilot OAuth-Token erkannt. Klicken Sie auf „Hinzufügen", um Copilot in Hermes zu aktivieren.',copilotAddSourceEnv:"Quelle: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Quelle: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Quelle: VS Code Copilot-Erweiterung (apps.json)",copilotDeleteHintEnv:"Dies löscht COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Andere Tools sind nicht betroffen.",copilotDeleteHintGhCli:"Copilot wird aus Hermes ausgeblendet. Ihre gh CLI-Anmeldung bleibt erhalten — `gh auth status` zeigt weiterhin als angemeldet.",copilotDeleteHintAppsJson:"Copilot wird aus Hermes ausgeblendet. Ihre VS Code Copilot-Erweiterung bleibt angemeldet.",customBadge:"BENUTZERDEF.",previewBadge:"VORSCHAU",disabledBadge:"NICHT VERFÜGBAR",disabledTooltip:"Dieses Modell ist für Ihr Konto derzeit nicht verfügbar.",customModelPlaceholder:"Nicht gelistete Modell-ID",customModelHint:"Für vom Provider unterstützte Modelle, die die API nicht zurückgibt; keine Anzeige-Umbenennung. Enter zum Laden.",noProviders:"Keine Anbieter gefunden. Fugen Sie einen benutzerdefinierten Anbieter hinzu, um zu beginnen.",clearVisibleModels:"Auswahl löschen",builtIn:"Integriert",customType:"Benutzerdefiniert",provider:"Anbieter",contextLength:"Kontextlange",contextLengthPlaceholder:"z.B. 200000 (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"},profiles:{title:"Profile",create:"Profil erstellen",import:"Importieren",export:"Exportieren",rename:"Umbenennen",delete:"Loschen",switchTo:"Wechseln zu",switchConfirm:'Das Wechseln zum Profil "{name}" startet das Gateway neu. Fortfahren?',switchSuccess:'Zum Profil "{name}" gewechselt',switchFailed:"Profilwechsel fehlgeschlagen. Moglicherweise muss das Gateway 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."},logs:{title:"Protokolle",all:"Alle",searchPlaceholder:"Suchen...",refresh:"Aktualisieren",noEntries:"Keine Protokolleintrage"},settings:{title:"Einstellungen",saved:"Gespeichert",saveFailed:"Speichern fehlgeschlagen",tabs:{display:"Anzeige",account:"Konto",agent:"Agent",memory:"Gedachtnis",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"},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"},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",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"}},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",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..."},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 Read",cacheWrite:"Cache Write",sessions:"Sitzungen",cost:"Kosten",noData:"Keine Nutzungsdaten"},skillsUsage:{title:"Skill-Nutzung",subtitle:"Skill-Ladevorgänge und -Bearbeitungen aus Hermes-Sitzungen verfolgen",refresh:"Aktualisieren",periodSelector:"Zeitraum der Skill-Nutzung",periodLabel:"{days} T",summary:"Zusammenfassung",totalActions:"Aktionen",loads:"Laden",edits:"Änd.",distinctSkills:"Skillzahl",topSkills:"Top-Skills",dailyTrend:"Trend",periodSummary:"Letzte {days} Tage",skill:"Fähigkeit",share:"%",lastUsed:"Zuletzt",noData:"Keine Skill-Nutzungsdaten",loadFailed:"Skill-Nutzung konnte nicht geladen werden",otherSkills:"Andere Skills"},changelog:{new_0_5_6_1:"Sprachwiedergabe mit Web Speech API: manuelle Taste, Auto-Play-Schalter, Regenbogen-Randanimation und Mobile-Optimierung",new_0_5_6_2:"Robuster LLM-JSON-Parser mit Toleranz für Python-Format und Textextraktion aus Streaming-Events",new_0_5_6_3:"Skills-Verbesserungen: Nutzungsstatistiken, Quellfilterung, archivierte Skills, Herkunft und Pin-Toggle",new_0_5_6_4:"Erweiterte tägliche Nutzungsstatistiken mit detaillierter Token-Aufschlüsselung inkl. Cache-Lese-/Schreibtrennung",new_0_5_6_5:"Sitzungshistorium-Umfang geklärt mit verbesserten Beschreibungen in Chat- und Historienansichten",new_0_5_6_6:"Attachment-Verarbeitung neu gestaltet mit Anthropic-Stil ContentBlock-Array-Format (Text, Bild, Datei)",new_0_5_6_7:"Frontend-Dateidownload-Funktion für ContentBlock- und Markdown-Formate mit Authentifizierung hinzugefügt",new_0_5_6_8:"Multi-Prozess-Konflikt behoben, der SQLite-Database-Resets verursacht hat, durch Entfernen redundanter nodemon-Instanzen",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Kanban-Board für visuelle Aufgaben- und Sitzungsverwaltung hinzugefügt",new_0_5_15_2:"Offizielle Landing Page und Dokumentations-Website hinzugefügt",new_0_5_15_3:"Group-Chat-Agent-Client verwendet dynamischen Port statt fest codiert 8648",new_0_5_15_4:"node-edge-tts Sprachmodul hinzugefügt",new_0_5_15_5:"WSL-Standard-Listen-Host-Binding korrigiert",new_0_5_15_6:"Website-Startseiten-Metadaten für SEO hinzugefügt",new_0_5_15_7:"IP-basierten Schutz vor Login-Brute-Force-Angriffen hinzugefügt",new_0_5_15_8:"Doppelte Download-URL-Verpackung im MarkdownRenderer korrigiert",new_0_5_15_9:"Hermes Markdown-Medien-Rendering und Sync-Wiederholung korrigiert",new_0_5_15_10:"Upstream-Umgebungsvariablenabhängigkeit entfernt",new_0_5_15_11:"Wenn die Kanban-Funktion nicht verfügbar ist, updaten Sie bitte hermes-agent",new_0_5_16_1:"Chat-Streaming von /v1/runs auf /v1/responses API migriert für geringere Latenz",new_0_5_16_2:"Echte API-Nutzung (Tokens, Cache, Reasoning) in Nutzungsstatistik-Tabelle speichern",new_0_5_16_3:"QQ-Gruppen-QR-Code zur Website-Navigationsleiste hinzugefügt",new_0_5_16_4:"Unbenutztes codex_reasoning_items-Feld aus dem Nachrichtenschema entfernt",new_0_5_17_1:"Vollständige Windows-Kompatibilität: Pfadverarbeitung, Prozessverwaltung, Terminal, Log-Parsing",new_0_5_17_2:"Gateway-Prozessverwaltung refaktoriert mit plattformübergreifendem Start/Stop/Health-Check",new_0_5_17_3:"Plugin-Erkennung auf Termux repariert durch Parsen des Hermes-Shebangs zur Python-Lokalisierung",new_0_5_17_4:"Doppelte YAML-Schluessel in der Config-Parsing tolerieren",new_0_5_17_5:"Auth-Sperrfenster und Dev-Shutdown-Ablauf verbessert",new_0_5_17_6:"Comic-Theme: Handschriften-Fonts für Chinesisch (ZCOOL KuaiLe), Japanisch (Zen Maru Gothic), Koreanisch (Gaegu) hinzugefügt",new_0_5_17_7:"Comic/Doodle-Themenstil hinzugefuegt",new_0_5_17_8:"Lizenz auf BSL-1.1 geaendert",new_0_5_17_9:"Schreibgeschuetzte Hermes-Plugins-Seite hinzugefuegt",new_0_5_17_10:"Bild-Uploads in Base64-Multimodalformat konvertieren",new_0_5_17_11:"Kanban-Board-Auswahl und Isolierung korrigiert",new_0_5_17_12:"Sprachwiedergabeeinstellungen mit TTS-Unterstützung für 4 Anbieter hinzugefügt",new_0_5_17_13:"Schwellenwert fuer Kontextkomprimierung von 200 auf 150 Nachrichten gesenkt",new_0_5_17_14:"Web-UI-Selbstupdate-Neustartlogik korrigiert",new_0_5_17_15:"Gemeinsame Umgebungsvariable opencode-zen und opencode-go korrigiert, die Konfigurationskopplung verursachte",new_0_5_17_16:"Unterstützung für Traditionelles Chinesisch (zh-TW) hinzugefügt",new_0_5_17_17:"Sichtbare Modelle in der Web-UI verwalten",new_0_5_17_18:"Kanban: Vollständige Aktionskette für Aufgaben (Kommentare, Logs, Zuweisung, Versand) mit Fähigkeitsgrenzen",new_0_5_17_19:"Provider-Auth-Einträge werden beim Löschen nicht mehr gelöscht – korrigiert",new_0_5_17_20:"Codex credential-pool Auth-Erkennung korrigiert",new_0_5_17_21:"Edge TTS Geschwindigkeits-/Tonhoehen-Slider zu den Spracheinstellungen hinzugefuegt",new_0_5_17_22:"Doppelte YAML-Schluessel in der Config verursachen keinen Parsing-Absturz mehr",new_0_5_17_23:"Gateway-Port-Eigentum basiert jetzt auf PID-Datei und verhindert profiluebergreifende Port-Entfuehrung",new_0_5_17_24:"Verlaufsseite zeigt jetzt Cron-Sitzungsaufzeichnungen an",new_0_5_17_25:"Sprachwechsel- und Themen-Symbole in eingeklappter Seitenleiste nicht mehr gequetscht",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Tag der Arbeit! Heute wird nicht gearbeitet, bitte habt Verständnis",new_0_5_5_2:"Verlaufsseite für Hermes-Sitzungshistorie hinzugefügt",new_0_5_5_3:"Verlaufsseite verwaltet Sitzungen unabhängig ohne Störung des aktiven Chats",new_0_5_5_4:"Verlaufsseite lädt automatisch erste CLI-Sitzung",new_0_5_5_5:"HistoryMessageList-Komponente mit Session-Prop-Injection",new_0_5_5_6:"Leere Nachrichten und Tool-Nachrichten ohne toolName gefiltert",new_0_5_5_7:"LocalStorage-Sitzungscache entfernt, Daten direkt vom Backend",new_0_5_5_8:"Profile-Umschaltung optimiert, veraltete Cache-Aufrufe entfernt",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Echtzeit-Streaming-Anzeige von Denk-/Argumentationsblocken",new_0_4_7_2:"Prepare-Skript wahrend Docker-Build uberspringen",new_0_4_7_3:"Gruppenchat-Mobile-UX-Verbesserungen und UI-Aufpolierung",new_0_4_7_4:"Verbleibende Kontext-Token auf 0 statt auf negativ begrenzen",new_0_4_7_5:"Alibaba Coding Plan integrierter Provider mit .env base_url-Uberschreibung hinzugefugt",new_0_4_7_6:"Remote-Profile beim Start uberspringen, um Hanger zu vermeiden",new_0_4_7_7:"Stillschweigend verschluckte Laufzeitfehler erkennen und anzeigen",new_0_4_7_8:"Provider-bewusste Kontextlangen-Abfrage",new_0_4_7_9:"config.model beim Wechsel zurucksetzen und CLI-Custom-Provider auflosen",new_0_4_7_10:"base_url_env aus .env beim Loschen des integrierten Providers entfernen",new_0_4_7_11:"Gruppenchat-Raum-Seitenleistenhintergrund an die Sitzungsliste anpassen",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Token-Nutzungsverfolgung und dynamische Kontextlange hinzugefugt",new_0_4_2_2:"Sitzungssuche-Modal hinzugefugt",new_0_4_2_3:"Gruppenchat-System mit Socket.IO und SQLite wiederhergestellt",new_0_4_2_4:"Angeheftete Sitzungen und Live-Monitor hinzugefugt",new_0_4_2_5:"Eingebaute Provider-Erkennung und Modellabgleich behoben"},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"},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",noAgents:"Keine Agenten in diesem Raum",members:"Mitglieder",roomCreated:"Raum erstellt",roomDeleted:"Raum gelöscht",roomCloned:"Raum geklont",cloneRoom:"Raum klonen",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",download:"Herunterladen",downloadFile:"Datei herunterladen"}},Jn={login:{title:"Hermes 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",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",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:"Configure um nome de usuario e senha para login conveniente. O token de acesso continuara funcionando como backup.",removeConfirm:"Tem certeza de que deseja remover o login por senha? Voce precisara usar o token de acesso.",passwordLoginNotConfigured:"Login por senha nao configurado",passwordLoginConfigured:"Login por senha habilitado ({username})"},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"},sidebar:{chat:"Chat",search:"Pesquisar",apiRelay:"API Relay",history:"Historico",jobs:"Tarefas agendadas",models:"Modelos",profiles:"Perfis",plugins:"Plugins",skills:"Habilidades",memory:"Memoria",logs:"Logs",usage:"Uso",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",files:"Arquivos",groupChat:"Chat em grupo",groupConversation:"Conversa",settings:"Configuracoes",connected:"Conectado",disconnected:"Desconectado",updateTip:'Execute "hermes-web-ui update" no terminal para atualizar',updateVersion:"Atualizar para v{version}",reloadClientVersion:"Recarregar para v{version}",updating:"Atualizando...",updateSuccess:"Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.",updateFailed:"Falha na atualizacao",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Salvar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor, insira um tamanho de contexto válido",contextEditSuccess:"Tamanho do contexto atualizado",contextEditFailed:"Falha na atualização",emptyState:"Inicie uma conversa com o Hermes Agent",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",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"},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",sessionScopeHint:"O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.",openHistory:"Abrir histórico",hermesHistory:"Histórico Hermes",historyScopeHint:"Sessões do histórico Hermes 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",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",sessionDeleted:"Sessao excluida",rename:"Renomear",pin:"Fixar",unpin:"Desafixar",pinned:"Fixadas",chatMode:"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",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Atualizar",notice:"Inventário somente leitura dos manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Tipo de provedor",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Origem: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origem: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origem: extensão Copilot do VS Code (apps.json)",copilotDeleteHintEnv:"Isto irá limpar o COPILOT_GITHUB_TOKEN em ~/.hermes/.env. Outras ferramentas não são afetadas.",copilotDeleteHintGhCli:"O Copilot ficará oculto no Hermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.",copilotDeleteHintAppsJson:"O Copilot ficará oculto no Hermes. A extensão Copilot do VS Code continuará conectada.",customBadge:"PERSONALIZADO",previewBadge:"PRÉVIA",disabledBadge:"INDISPONÍVEL",disabledTooltip:"Este modelo não está disponível para sua conta.",customModelPlaceholder:"ID de modelo não listado",customModelHint:"Para modelos compatíveis com o provedor que a API não retorna; não é uma renomeação de exibição. Enter para carregar.",noProviders:"Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.",clearVisibleModels:"Limpar seleção",builtIn:"Integrado",customType:"Personalizado",provider:"Provedor",contextLength:"Tamanho do contexto",contextLengthPlaceholder:"ex: 200000 (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"},profiles:{title:"Perfis",create:"Criar perfil",import:"Importar",export:"Exportar",rename:"Renomear",delete:"Excluir",switchTo:"Mudar para",switchConfirm:'Mudar para o perfil "{name}" reiniciara o gateway. Continuar?',switchSuccess:'Mudou para o perfil "{name}"',switchFailed:"Falha ao mudar de perfil. 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."},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",agent:"Agente",memory:"Memoria",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"},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"},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",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"}},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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessoes",cost:"Custo",noData:"Sem dados de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Acompanhe carregamentos e edições de habilidades nas sessões Hermes",refresh:"Atualizar",periodSelector:"Período de uso de habilidades",periodLabel:"{days} d",summary:"Resumo",totalActions:"Ações",loads:"Carga",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendência diária",periodSummary:"Últimos {days} dias",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"Nenhum dado de uso de habilidades",loadFailed:"Falha ao carregar o uso de habilidades",otherSkills:"Outras habs."},changelog:{new_0_5_6_1:"Reprodução de voz: Web Speech API, botão manual, interruptor auto-play, animação de borda arco-íris e otimização móvel",new_0_5_6_2:"Parser JSON LLM robusto com tolerância ao formato Python e extração de texto de eventos streaming",new_0_5_6_3:"Melhorias de Skills: estatísticas de uso, filtragem de fonte, skills arquivados, procedência e toggle de fixação",new_0_5_6_4:"Estatísticas diárias de uso expandidas com breakdown detalhado de tokens incluindo separação de leitura/escrita de cache",new_0_5_6_5:"Escopo do histórico de sessões clarificado com descrições melhoradas nas visualizações de chat e histórico",new_0_5_6_6:"Processamento de anexos reprojetado usando formato de matriz ContentBlock estilo Anthropic (texto, imagem, arquivo)",new_0_5_6_7:"Adicionada funcionalidade de download de arquivos frontend suportando formatos ContentBlock e Markdown com autenticação",new_0_5_6_8:"Corrigido conflito de múltiplos processos que causava redefinições do banco de dados SQLite eliminando instâncias nodemon redundantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Quadro Kanban para gestão visual de tarefas e sessões",new_0_5_15_2:"Página inicial e site de documentação oficiais",new_0_5_15_3:"Cliente agente group-chat usa porta dinâmica em vez de 8648",new_0_5_15_4:"Módulo de voz node-edge-tts adicionado",new_0_5_15_5:"Corrigido bind de host de escuta WSL padrão",new_0_5_15_6:"Metadados SEO para página inicial do site",new_0_5_15_7:"Proteção contra ataques de força bruta baseada em IP",new_0_5_15_8:"Corrigido empacotamento duplo de URLs de download no MarkdownRenderer",new_0_5_15_9:"Corrigido renderização de mídia Markdown e retry de sincronização",new_0_5_15_10:"Removida dependência de variável de ambiente upstream",new_0_5_15_11:"Se o recurso Kanban não estiver disponível, atualize o hermes-agent",new_0_5_16_1:"Migrar streaming de chat de /v1/runs para /v1/responses API para menor latência",new_0_5_16_2:"Persistir uso real da API (tokens, cache, raciocínio) na tabela de estatísticas",new_0_5_16_3:"Adicionar código QR do grupo QQ à barra de navegação do site",new_0_5_16_4:"Remover campo codex_reasoning_items não utilizado do esquema de mensagens",new_0_5_17_1:"Compatibilidade total com Windows: manipulação de caminhos, gerenciamento de processos, terminal, análise de logs",new_0_5_17_2:"Refatorado gerenciamento de processos do Gateway com início/parada/health-check multiplataforma",new_0_5_17_3:"Corrigida descoberta de plugins no Termux analisando o shebang do hermes para localizar o Python",new_0_5_17_4:"Tolerar chaves YAML duplicadas na análise de configuração",new_0_5_17_5:"Melhorada janela de bloqueio de autenticação e fluxo de desligamento do ambiente de desenvolvimento",new_0_5_17_6:"Tema Comic: fontes manuscritas para chinês (ZCOOL KuaiLe), japonês (Zen Maru Gothic), coreano (Gaegu)",new_0_5_17_7:"Adicionar estilo de tema Comic/doodle",new_0_5_17_8:"Alterar licença para BSL-1.1",new_0_5_17_9:"Adicionar página de plugins Hermes somente leitura",new_0_5_17_10:"Converter uploads de imagem para formato multimodal base64",new_0_5_17_11:"Corrigir seleção e isolamento do quadro Kanban",new_0_5_17_12:"Adicionar configurações de reprodução de voz com suporte TTS de 4 provedores",new_0_5_17_13:"Reduzir limiar de compressão de contexto de 200 para 150 mensagens",new_0_5_17_14:"Corrigir lógica de reinicialização de autoatualização da Web UI",new_0_5_17_15:"Corrigir variável de ambiente compartilhada opencode-zen e opencode-go causando acoplamento de configuração",new_0_5_17_16:"Adicionar suporte ao idioma Chinês Tradicional (zh-TW)",new_0_5_17_17:"Suportar gerenciamento de modelos visíveis na Web UI",new_0_5_17_18:"Kanban: cadeia completa de ações de tarefas (comentários, logs, atribuição, despacho) com limites de capacidades",new_0_5_17_19:"Corrigir entradas de autenticação do provedor não limpas ao excluir",new_0_5_17_20:"Corrigir reconhecimento de autenticação credential-pool do Codex",new_0_5_17_21:"Adicionar controles deslizantes de velocidade/tom do Edge TTS às configurações de voz",new_0_5_17_22:"Chaves YAML duplicadas na configuração não causam mais falhas na análise",new_0_5_17_23:"Propriedade da porta do gateway agora baseada em arquivo PID, prevenindo sequestro de porta entre perfis",new_0_5_17_24:"Página de histórico agora exibe registros de sessões Cron",new_0_5_17_25:"Corrigir ícones de troca de idioma e tema comprimidos na barra lateral recolhida",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Feliz Dia do Trabalhador! Hoje não se trabalha, obrigado pela compreensão",new_0_5_5_2:"Adicionada página de histórico para sessões Hermes",new_0_5_5_3:"Página de histórico gerencia sessões de forma independente",new_0_5_5_4:"Carregamento automático da primeira sessão CLI",new_0_5_5_5:"Componente HistoryMessageList com injeção de props",new_0_5_5_6:"Filtragem de mensagens vazias e tools sem toolName",new_0_5_5_7:"Removido cache de sessões localStorage, dados do backend",new_0_5_5_8:"Otimizada troca de perfil",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Exibicao em streaming em tempo real de blocos de pensamento/razoamento",new_0_4_7_2:"Ignorar script de preparacao durante o build Docker",new_0_4_7_3:"Melhorias na UX mobile do chat em grupo e polimento da UI",new_0_4_7_4:"Limitar os tokens restantes do contexto a 0 em vez de negativo",new_0_4_7_5:"Adicionar provedor integrado Alibaba Coding Plan com substituicao de base_url no .env",new_0_4_7_6:"Ignorar perfis remotos na inicializacao para evitar travamento",new_0_4_7_7:"Detectar e exibir erros de execucao silenciosamente engolidos",new_0_4_7_8:"Consulta de comprimento de contexto consciente do provedor",new_0_4_7_9:"Redefinir config.model ao trocar e resolver provedor personalizado CLI",new_0_4_7_10:"Limpar base_url_env do .env ao excluir provedor integrado",new_0_4_7_11:"Alinhar o fundo da barra lateral da sala de chat em grupo com a lista de sessoes",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Adicionar rastreamento de uso de tokens e comprimento de contexto dinamico",new_0_4_2_2:"Adicionar modal de busca de sessoes",new_0_4_2_3:"Restaurar sistema de chat em grupo com Socket.IO e SQLite",new_0_4_2_4:"Adicionar sessoes fixas e monitor ao vivo na pagina de chat",new_0_4_2_5:"Corrigir deteccao de provedores integrados e combinacao de modelos"},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"},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",noAgents:"Nenhum agente nesta sala",members:"Membros",roomCreated:"Sala criada",roomDeleted:"Sala excluída",roomCloned:"Sala clonada",cloneRoom:"Clonar 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",download:"Baixar",downloadFile:"Baixar arquivo"}},io=["en","zh","zh-TW","ja","ko","fr","es","de","pt"];function Lo(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function Ko(o,e){const t={...o};for(const[r,c]of Object.entries(e)){const i=o[r];t[r]=Lo(i)&&Lo(c)?Ko(i,c):c}return t}var $n={en:Vo,zh:On,"zh-TW":jn,ja:Wn,ko:Vn,fr:Kn,es:Gn,de:Qn,pt:Jn},Go={};for(const[o,e]of Object.entries($n))Go[o]=o==="en"?e:Ko(Vo,e);var Zn=localStorage.getItem("hermes_locale");function Yn(o){if(o&&io.includes(o))return o;function e(t){const r=t.toLowerCase();if(r.startsWith("zh"))return r.includes("hant")||r.includes("-tw")||r.includes("-hk")||r.includes("-mo")?"zh-TW":"zh";const c=t.slice(0,2);return io.includes(t)?t:io.includes(c)?c:null}for(const t of navigator.languages){const r=e(t);if(r)return r}return"en"}var Xn=Yn(Zn),Qo=Fn({legacy:!1,locale:Xn,fallbackLocale:"en",messages:Go});function et(o){Qo.global.locale.value=o}var ot,nt=ve((()=>{ot="/logo.png"}));nt();xe();var tt={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"}},at={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 it(o,e){const t=o?at:tt;return e?{...t,common:{...t.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:t}function st(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function je(){const o=st(be.value);Ue.value=o,Pe.value=Se.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",Pe.value)}function Jo(){const o=se(()=>{const i=Ue.value?"dark":"light";return Pe.value?`comic-${i}`:i});function e(i){be.value=i}function t(i){Se.value=i}function r(){be.value=Ue.value?"light":"dark"}function c(){Se.value=Pe.value?"ink":"comic"}return{brightness:be,style:Se,isDark:Ue,isComic:Pe,themeName:o,setBrightness:e,setStyle:t,toggleBrightness:r,toggleStyle:c}}var so,ro,be,Se,Ue,Pe,$o=ve((()=>{so="hermes_brightness",ro="hermes_style",be=S(localStorage.getItem(so)||"system"),Se=S(localStorage.getItem(ro)||"ink"),Ue=S(!1),Pe=S(!1),je(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{be.value==="system"&&je()}),ke(be,o=>{localStorage.setItem(so,o),je()}),ke(Se,o=>{localStorage.setItem(ro,o),je()})}));$o();_e();Xe();Ce();var rt={class:"model-selector"},lt={class:"model-label"},dt=["title"],ct={class:"model-list"},ut=["onClick"],mt={class:"model-group-label"},pt={class:"model-group-count"},_t={class:"model-group-items"},gt=["title","onClick"],ht={class:"model-item-label"},vt={class:"model-item-name"},ft={key:0,class:"model-item-id"},wt={key:0,class:"model-badge-preview"},bt={key:1,class:"model-badge-disabled"},yt={key:2,class:"model-badge-custom"},Ct=["title","onClick"],kt={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"},St={key:0,class:"model-empty"},Pt={class:"model-custom"},At={class:"model-custom-row"},xt={class:"model-custom-hint"},Tt=ye({__name:"ModelSelector",setup(o){const{t:e}=Te(),t=qe(),r=S(!1),c=S(""),i=S({}),s=S(""),_=S(""),h=se(()=>t.displayModelName(t.selectedModel,t.selectedProvider)),U=se(()=>(_.value=t.selectedProvider,t.modelGroups.map(f=>({label:f.label,value:f.provider})))),x=se(()=>t.modelGroups.map(f=>({...f,models:[...f.models,...(t.customModels[f.provider]||[]).filter(g=>!f.models.includes(g))]})));function k(f,g){return(t.customModels[g]||[]).includes(f)}async function ee(f,g){await t.removeCustomModel(f,g)}function q(f){return typeof f=="string"?f.toLowerCase():""}const te=se(()=>{const f=q(c.value).trim();return f?x.value.map(g=>({...g,models:g.models.filter(D=>{const Q=t.displayModelName(D,g.provider);return q(D).includes(f)||q(Q).includes(f)})})).filter(g=>g.models.length>0||q(g.label).includes(f)):x.value});function X(f){i.value[f]=!i.value[f]}function ae(f){return!!i.value[f]}function O(f,g){t.modelGroups.find(D=>D.provider===g)?.model_meta?.[f]?.disabled||(t.switchModel(f,g),r.value=!1,c.value="")}function l(f,g){return t.displayModelName(f,g)}function z(f,g){return t.getModelAlias(f,g)}function G(){const f=s.value.trim();!f||!_.value||t.modelGroups.find(g=>g.provider===_.value)?.model_meta?.[f]?.disabled||(t.switchModel(f,_.value),r.value=!1,c.value="",s.value="")}function j(){i.value={},c.value="",s.value="",_.value=t.selectedProvider,r.value=!0}return(f,g)=>(I(),F("div",rt,[a("div",lt,C(u(e)("models.title")),1),a("button",{class:"model-trigger",onClick:j},[a("span",{class:"model-name",title:u(t).selectedModel},C(h.value||"—"),9,dt),g[4]||(g[4]=a("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"},[a("polyline",{points:"6 9 12 15 18 9"})],-1))]),de(u(wo),{show:r.value,"onUpdate:show":g[3]||(g[3]=D=>r.value=D),preset:"card",title:u(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:he(()=>[de(u(po),{value:c.value,"onUpdate:value":g[0]||(g[0]=D=>c.value=D),placeholder:u(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),a("div",ct,[(I(!0),F(Ne,null,Be(te.value,D=>(I(),F("div",{key:D.provider,class:"model-group"},[a("div",{class:"model-group-header",onClick:Q=>X(D.provider)},[(I(),F("svg",{class:Y(["model-group-arrow",{collapsed:ae(D.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...g[5]||(g[5]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),a("span",mt,C(D.label),1),a("span",pt,C(D.models.length),1)],8,ut),ze(a("div",_t,[(I(!0),F(Ne,null,Be(D.models,Q=>(I(),F("div",{key:Q,class:Y(["model-item",{active:Q===u(t).selectedModel&&D.provider===u(t).selectedProvider,disabled:!!D.model_meta?.[Q]?.disabled}]),title:D.model_meta?.[Q]?.disabled?u(e)("models.disabledTooltip"):"",onClick:T=>O(Q,D.provider)},[a("span",ht,[a("span",vt,C(l(Q,D.provider)),1),z(Q,D.provider)?(I(),F("span",ft,C(u(e)("models.aliasCanonical",{model:Q})),1)):me("",!0)]),D.model_meta?.[Q]?.preview?(I(),F("span",wt,C(u(e)("models.previewBadge")),1)):me("",!0),D.model_meta?.[Q]?.disabled?(I(),F("span",bt,C(u(e)("models.disabledBadge")),1)):me("",!0),k(Q,D.provider)?(I(),F("span",yt,C(u(e)("models.customBadge")),1)):me("",!0),k(Q,D.provider)?(I(),F("button",{key:3,class:"model-custom-remove",type:"button",title:u(e)("models.removeCustomModel"),onClick:Pn(T=>ee(Q,D.provider),["stop"])}," × ",8,Ct)):me("",!0),Q===u(t).selectedModel&&D.provider===u(t).selectedProvider?(I(),F("svg",kt,[...g[6]||(g[6]=[a("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):me("",!0)],10,gt))),128))],512),[[Fe,!ae(D.provider)]])]))),128)),te.value.length===0?(I(),F("div",St,C(c.value?"No results":"No models"),1)):me("",!0),a("div",Pt,[a("div",At,[de(u(yo),{value:_.value,"onUpdate:value":g[1]||(g[1]=D=>_.value=D),options:U.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),de(u(po),{value:s.value,"onUpdate:value":g[2]||(g[2]=D=>s.value=D),placeholder:u(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:An(G,["enter"])},null,8,["value","placeholder"])]),a("div",xt,C(u(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});He();var Ht=Ie(Tt,[["__scopeId","data-v-146cca78"]]);_e();xe();Po();Ce();var It={class:"profile-selector"},Mt={class:"selector-label"},Dt=ye({__name:"ProfileSelector",setup(o){const{t:e}=Te(),t=Co(),r=Wo(),c=se(()=>r.profiles.map(_=>({label:_.name,value:_.name}))),i=se(()=>r.activeProfileName??"");async function s(_){typeof _=="string"&&_!==i.value&&(await r.switchProfile(_)?(t.success(e("profiles.switchSuccess",{name:_})),window.location.reload()):t.error(e("profiles.switchFailed")))}return Je(()=>{r.profiles.length===0&&r.fetchProfiles()}),(_,h)=>(I(),F("div",It,[a("div",Mt,C(u(e)("sidebar.profiles")),1),de(u(yo),{"data-testid":"profile-selector-select",value:i.value,options:c.value,loading:u(r).switching,size:"small","onUpdate:value":s},null,8,["value","options","loading"])]))}});He();var Rt=Ie(Dt,[["__scopeId","data-v-ace64f6e"]]);_e();Ce();xe();var Et=ye({__name:"LanguageSwitch",setup(o){const{locale:e}=Te(),t=[{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"}];function r(c){et(c),localStorage.setItem("hermes_locale",c)}return(c,i)=>(I(),Ae(u(yo),{value:u(e),options:t,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":r},null,8,["value"]))}}),Lt=Et;_e();var Ft={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},zt=["title"],Ut={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Nt={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Bt=["title"],qt={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Ot={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},jt=ye({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:t,toggleBrightness:r,toggleStyle:c}=Jo();return(i,s)=>(I(),F("div",Ft,[a("button",{class:"theme-switch",title:u(t)?"Ink style":"Comic style",onClick:s[0]||(s[0]=(..._)=>u(c)&&u(c)(..._))},[u(t)?(I(),F("svg",Ut,[...s[2]||(s[2]=[a("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(I(),F("svg",Nt,[...s[3]||(s[3]=[a("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,zt),a("button",{class:"theme-switch",title:u(e)?"Light mode":"Dark mode",onClick:s[1]||(s[1]=(..._)=>u(r)&&u(r)(..._))},[u(e)?(I(),F("svg",qt,[...s[4]||(s[4]=[we('<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)])])):(I(),F("svg",Ot,[...s[5]||(s[5]=[a("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,Bt)]))}});He();var Wt=Ie(jt,[["__scopeId","data-v-4c30f4bd"]]);_e();var lo=S(!1);function Ao(){function o(){lo.value=!0}function e(){lo.value=!1}return{sessionSearchOpen:lo,openSessionSearch:o,closeSessionSearch:e}}var Vt=[{version:"0.5.27",date:"2026-05-17",changes:["changelog.new_0_5_27_1","changelog.new_0_5_27_2","changelog.new_0_5_27_3","changelog.new_0_5_27_4"]},{version:"0.5.26",date:"2026-05-17",changes:["changelog.new_0_5_26_1","changelog.new_0_5_26_2","changelog.new_0_5_26_3","changelog.new_0_5_26_4","changelog.new_0_5_26_5","changelog.new_0_5_26_6","changelog.new_0_5_26_7","changelog.new_0_5_26_8","changelog.new_0_5_26_9","changelog.new_0_5_26_10","changelog.new_0_5_26_11","changelog.new_0_5_26_12"]},{version:"0.5.25",date:"2026-05-16",changes:["changelog.new_0_5_25_1","changelog.new_0_5_25_2","changelog.new_0_5_25_3","changelog.new_0_5_25_4","changelog.new_0_5_25_5","changelog.new_0_5_25_6","changelog.new_0_5_25_7","changelog.new_0_5_25_8"]},{version:"0.5.24",date:"2026-05-15",changes:["changelog.new_0_5_24_1"]},{version:"0.5.23",date:"2026-05-15",changes:["changelog.new_0_5_23_1","changelog.new_0_5_23_2","changelog.new_0_5_23_3","changelog.new_0_5_23_4","changelog.new_0_5_23_5"]},{version:"0.5.22",date:"2026-05-14",changes:["changelog.new_0_5_22_1"]},{version:"0.5.21",date:"2026-05-14",changes:["changelog.new_0_5_18_1","changelog.new_0_5_18_2","changelog.new_0_5_18_3","changelog.new_0_5_18_4","changelog.new_0_5_18_5","changelog.new_0_5_18_6","changelog.new_0_5_18_7","changelog.new_0_5_18_8","changelog.new_0_5_18_9"]},{version:"0.5.17",date:"2026-05-11",changes:["changelog.new_0_5_17_1","changelog.new_0_5_17_2","changelog.new_0_5_17_3","changelog.new_0_5_17_4","changelog.new_0_5_17_5","changelog.new_0_5_17_6","changelog.new_0_5_17_7","changelog.new_0_5_17_8","changelog.new_0_5_17_9","changelog.new_0_5_17_10","changelog.new_0_5_17_11","changelog.new_0_5_17_12","changelog.new_0_5_17_13","changelog.new_0_5_17_14","changelog.new_0_5_17_15","changelog.new_0_5_17_16","changelog.new_0_5_17_17","changelog.new_0_5_17_18","changelog.new_0_5_17_19","changelog.new_0_5_17_20","changelog.new_0_5_17_21","changelog.new_0_5_17_22","changelog.new_0_5_17_23","changelog.new_0_5_17_24","changelog.new_0_5_17_25"]},{version:"0.5.16",date:"2026-05-10",changes:["changelog.new_0_5_16_1","changelog.new_0_5_16_2","changelog.new_0_5_16_3","changelog.new_0_5_16_4"]},{version:"0.5.15",date:"2026-05-09",changes:["changelog.new_0_5_15_1","changelog.new_0_5_15_2","changelog.new_0_5_15_3","changelog.new_0_5_15_4","changelog.new_0_5_15_5","changelog.new_0_5_15_6","changelog.new_0_5_15_7","changelog.new_0_5_15_8","changelog.new_0_5_15_9","changelog.new_0_5_15_10","changelog.new_0_5_15_11"]},{version:"0.5.14",date:"2026-05-07",changes:["changelog.new_0_5_14_1","changelog.new_0_5_14_2","changelog.new_0_5_14_3","changelog.new_0_5_14_4","changelog.new_0_5_14_5"]}];_e();Ce();xe();Xe();var Kt=["title"],Gt={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Qt={key:0,points:"9 18 15 12 9 6"},Jt={key:1,points:"15 18 9 12 15 6"},$t={class:"sidebar-nav"},Zt={class:"nav-group"},Yt={class:"nav-item fun-link",href:"https://apikey.fun/register?aff=LIBAPI",target:"_blank",rel:"noopener noreferrer"},Xt={class:"nav-group"},ea={class:"nav-group"},oa={class:"nav-group"},na={class:"sidebar-footer"},ta={class:"status-row"},aa={class:"status-text"},ia={class:"version-info"},sa={class:"changelog-list"},ra={class:"changelog-version-header"},la={class:"changelog-version-tag"},da={class:"changelog-date"},ca={class:"changelog-changes"},ua="/logo.png",ma=ye({__name:"AppSidebar",setup(o){const{t:e}=Te(),t=Co(),r=qo(),c=$e(),i=qe(),{openSessionSearch:s}=Ao(),_=se(()=>r.name),h=Sn({});function U(O){h[O]=!h[O]}function x(O){return!!h[O]}function k(O){c.push({name:O})}async function ee(){await i.doUpdate()?t.success(e("sidebar.updateSuccess"),{duration:5e3}):t.error(e("sidebar.updateFailed"))}function q(){i.reloadClient()}function te(){localStorage.clear(),c.replace({name:"login"})}const X=S(!1);function ae(){X.value=!0}return(O,l)=>(I(),F("aside",{class:Y(["sidebar",{open:u(i).sidebarOpen,collapsed:u(i).sidebarCollapsed}])},[a("div",{class:"sidebar-logo",onClick:l[0]||(l[0]=z=>u(c).push("/hermes/chat"))},[a("img",{src:ua,alt:"Hermes",class:"logo-img"}),l[24]||(l[24]=a("span",{class:"logo-text"},"Hermes",-1))]),a("button",{class:"collapse-btn",onClick:l[1]||(l[1]=z=>u(i).toggleSidebarCollapsed()),title:u(i).sidebarCollapsed?u(e)("sidebar.expand"):u(e)("sidebar.collapse")},[(I(),F("svg",Gt,[u(i).sidebarCollapsed?(I(),F("polyline",Qt)):(I(),F("polyline",Jt))]))],8,Kt),a("nav",$t,[a("div",Zt,[a("div",{class:"nav-group-label",onClick:l[2]||(l[2]=z=>U("conversation"))},[a("span",null,C(u(e)("sidebar.groupConversation")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[25]||(l[25]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.chat"}]),onClick:l[3]||(l[3]=z=>k("hermes.chat"))},[l[26]||(l[26]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("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)),a("span",null,C(u(e)("sidebar.chat")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.history"}]),onClick:l[4]||(l[4]=z=>k("hermes.history"))},[l[27]||(l[27]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"12",cy:"12",r:"10"}),a("polyline",{points:"12 6 12 12 16 14"})],-1)),a("span",null,C(u(e)("sidebar.history")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.groupChat"}]),onClick:l[5]||(l[5]=z=>k("hermes.groupChat"))},[l[29]||(l[29]=we('<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-592f9b57><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" data-v-592f9b57></path><circle cx="9" cy="7" r="4" data-v-592f9b57></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" data-v-592f9b57></path><path d="M16 3.13a4 4 0 0 1 0 7.75" data-v-592f9b57></path></svg>',1)),a("span",null,[We(C(u(e)("sidebar.groupChat")),1),l[28]||(l[28]=a("span",{class:"beta-tag"},"(beta)",-1))])],2),a("button",{class:"nav-item",onClick:l[6]||(l[6]=(...z)=>u(s)&&u(s)(...z))},[l[30]||(l[30]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"11",cy:"11",r:"7"}),a("path",{d:"m20 20-3.5-3.5"})],-1)),a("span",null,C(u(e)("sidebar.search")),1)]),a("a",Yt,[l[31]||(l[31]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),a("polyline",{points:"15 3 21 3 21 9"}),a("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)),a("span",null,C(u(e)("sidebar.apiRelay")),1)])],512),[[Fe,!x("conversation")]])]),a("div",Xt,[a("div",{class:"nav-group-label",onClick:l[7]||(l[7]=z=>U("agent"))},[a("span",null,C(u(e)("sidebar.groupAgent")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[32]||(l[32]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.jobs"}]),onClick:l[8]||(l[8]=z=>k("hermes.jobs"))},[l[33]||(l[33]=we('<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-592f9b57><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-592f9b57></rect><line x1="16" y1="2" x2="16" y2="6" data-v-592f9b57></line><line x1="8" y1="2" x2="8" y2="6" data-v-592f9b57></line><line x1="3" y1="10" x2="21" y2="10" data-v-592f9b57></line></svg>',1)),a("span",null,C(u(e)("sidebar.jobs")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.kanban"}]),onClick:l[9]||(l[9]=z=>k("hermes.kanban"))},[l[34]||(l[34]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),a("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),a("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),a("span",null,C(u(e)("sidebar.kanban")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.channels"}]),onClick:l[10]||(l[10]=z=>k("hermes.channels"))},[l[35]||(l[35]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),a("span",null,C(u(e)("sidebar.channels")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.skills"}]),onClick:l[11]||(l[11]=z=>k("hermes.skills"))},[l[36]||(l[36]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),a("polyline",{points:"2 17 12 22 22 17"}),a("polyline",{points:"2 12 12 17 22 12"})],-1)),a("span",null,C(u(e)("sidebar.skills")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.plugins"}]),onClick:l[12]||(l[12]=z=>k("hermes.plugins"))},[l[37]||(l[37]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("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"}),a("path",{d:"M5 19l1-1"})],-1)),a("span",null,C(u(e)("sidebar.plugins")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.memory"}]),onClick:l[13]||(l[13]=z=>k("hermes.memory"))},[l[38]||(l[38]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M9 18h6"}),a("path",{d:"M10 22h4"}),a("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),a("span",null,C(u(e)("sidebar.memory")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.models"}]),onClick:l[14]||(l[14]=z=>k("hermes.models"))},[l[39]||(l[39]=we('<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-592f9b57><circle cx="12" cy="12" r="3" data-v-592f9b57></circle><path d="M12 1v4" data-v-592f9b57></path><path d="M12 19v4" data-v-592f9b57></path><path d="M1 12h4" data-v-592f9b57></path><path d="M19 12h4" data-v-592f9b57></path><path d="M4.22 4.22l2.83 2.83" data-v-592f9b57></path><path d="M16.95 16.95l2.83 2.83" data-v-592f9b57></path><path d="M4.22 19.78l2.83-2.83" data-v-592f9b57></path><path d="M16.95 7.05l2.83-2.83" data-v-592f9b57></path></svg>',1)),a("span",null,C(u(e)("sidebar.models")),1)],2)],512),[[Fe,!x("agent")]])]),a("div",ea,[a("div",{class:"nav-group-label",onClick:l[15]||(l[15]=z=>U("monitoring"))},[a("span",null,C(u(e)("sidebar.groupMonitoring")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[40]||(l[40]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.logs"}]),onClick:l[16]||(l[16]=z=>k("hermes.logs"))},[l[41]||(l[41]=we('<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-592f9b57><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-592f9b57></path><polyline points="14 2 14 8 20 8" data-v-592f9b57></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-592f9b57></line><line x1="16" y1="17" x2="8" y2="17" data-v-592f9b57></line><polyline points="10 9 9 9 8 9" data-v-592f9b57></polyline></svg>',1)),a("span",null,C(u(e)("sidebar.logs")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.usage"}]),onClick:l[17]||(l[17]=z=>k("hermes.usage"))},[l[42]||(l[42]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),a("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),a("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),a("span",null,C(u(e)("sidebar.usage")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.skillsUsage"}]),onClick:l[18]||(l[18]=z=>k("hermes.skillsUsage"))},[l[43]||(l[43]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),a("span",null,C(u(e)("sidebar.skillsUsage")),1)],2)],512),[[Fe,!x("monitoring")]])]),a("div",oa,[a("div",{class:"nav-group-label",onClick:l[19]||(l[19]=z=>U("system"))},[a("span",null,C(u(e)("sidebar.groupSystem")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[44]||(l[44]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.gateways"}]),onClick:l[20]||(l[20]=z=>k("hermes.gateways"))},[l[45]||(l[45]=we('<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-592f9b57><rect x="2" y="2" width="20" height="8" rx="2" ry="2" data-v-592f9b57></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2" data-v-592f9b57></rect><line x1="6" y1="6" x2="6.01" y2="6" data-v-592f9b57></line><line x1="6" y1="18" x2="6.01" y2="18" data-v-592f9b57></line></svg>',1)),a("span",null,C(u(e)("sidebar.gateways")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.profiles"}]),onClick:l[21]||(l[21]=z=>k("hermes.profiles"))},[l[46]||(l[46]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),a("circle",{cx:"12",cy:"7",r:"4"})],-1)),a("span",null,C(u(e)("sidebar.profiles")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.settings"}]),onClick:l[22]||(l[22]=z=>k("hermes.settings"))},[l[47]||(l[47]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"12",cy:"12",r:"3"}),a("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)),a("span",null,C(u(e)("sidebar.settings")),1)],2)],512),[[Fe,!x("system")]])])]),de(Rt),de(Ht),a("div",na,[a("button",{class:"nav-item logout-item",onClick:te},[l[48]||(l[48]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),a("polyline",{points:"16 17 21 12 16 7"}),a("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),a("span",null,C(u(e)("sidebar.logout")),1)]),a("div",ta,[a("div",{class:Y(["status-indicator",{connected:u(i).connected,disconnected:!u(i).connected}])},[l[49]||(l[49]=a("span",{class:"status-dot"},null,-1)),a("span",aa,C(u(i).connected?u(e)("sidebar.connected"):u(e)("sidebar.disconnected")),1)],2),de(Lt)]),a("div",ia,[l[50]||(l[50]=we('<div class="version-links" data-v-592f9b57><a class="github-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener noreferrer" title="GitHub" data-v-592f9b57><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" data-v-592f9b57><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" data-v-592f9b57></path></svg></a><a class="website-link" href="https://ekkolearnai.com/" target="_blank" rel="noopener noreferrer" title="Website" data-v-592f9b57><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-592f9b57><circle cx="12" cy="12" r="10" data-v-592f9b57></circle><line x1="2" y1="12" x2="22" y2="12" data-v-592f9b57></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" data-v-592f9b57></path></svg></a></div>',1)),a("span",{class:"version-text",onClick:ae},"Web UI v"+C(u(i).serverVersion||"0.1.0"),1),de(Wt)]),u(i).clientOutdated?(I(),Ae(u(mo),{key:0,type:"warning",size:"tiny",block:"",class:"update-btn",onClick:q},{default:he(()=>[We(C(u(e)("sidebar.reloadClientVersion",{version:u(i).serverVersion})),1)]),_:1})):me("",!0),u(i).updateAvailable?(I(),Ae(u(mo),{key:1,type:"primary",size:"tiny",block:"",class:"update-btn",loading:u(i).updating,onClick:ee},{default:he(()=>[We(C(u(i).updating?u(e)("sidebar.updating"):u(e)("sidebar.updateVersion",{version:u(i).latestVersion})),1)]),_:1},8,["loading"])):me("",!0)]),de(u(wo),{show:X.value,"onUpdate:show":l[23]||(l[23]=z=>X.value=z),preset:"dialog",title:u(e)("sidebar.changelog"),style:{width:"520px"}},{default:he(()=>[a("div",sa,[(I(!0),F(Ne,null,Be(u(Vt),z=>(I(),F("div",{key:z.version,class:"changelog-version-block"},[a("div",ra,[a("span",la,"v"+C(z.version),1),a("span",da,C(z.date),1)]),a("ul",ca,[(I(!0),F(Ne,null,Be(z.changes,(G,j)=>(I(),F("li",{key:j},C(u(e)(G)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});He();var pa=Ie(ma,[["__scopeId","data-v-592f9b57"]]);function _a(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onMessageDelta&&t.onMessageDelta(o)}function ga(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onReasoningDelta&&t.onReasoningDelta(o)}function ha(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onThinkingDelta&&t.onThinkingDelta(o)}function va(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onReasoningAvailable&&t.onReasoningAvailable(o)}function fa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onToolStarted&&t.onToolStarted(o)}function wa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onToolCompleted&&t.onToolCompleted(o)}function ba(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunStarted&&t.onRunStarted(o)}function ya(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunCompleted&&t.onRunCompleted(o),!(o.queue_remaining>0)&&K.delete(e)}function Ca(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunFailed&&t.onRunFailed(o),!(o.queue_remaining>0)&&K.delete(e)}function ka(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunQueued&&t.onRunQueued(o)}function Sa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onCompressionStarted&&t.onCompressionStarted(o)}function Pa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onCompressionCompleted&&t.onCompressionCompleted(o)}function Aa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onAbortStarted&&t.onAbortStarted(o)}function xa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onAbortCompleted&&t.onAbortCompleted(o),!(o.queue_length>0)&&K.delete(e)}function Ta(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onUsageUpdated&&t.onUsageUpdated(o)}function Ha(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onSessionCommand&&t.onSessionCommand(o)}function Ia(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onApprovalRequested&&t.onApprovalRequested(o)}function Ma(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onApprovalResolved&&t.onApprovalResolved(o)}function Da(o,e){return K.set(o,e),()=>{K.delete(o)}}function Ra(o){K.delete(o)}function Ea(o,e,t){xo().emit("approval.respond",{session_id:o,approval_id:e,choice:t})}function Fo(){return $}function xo(){if($?.connected)return $;$&&($.removeAllListeners(),$.disconnect(),Ve=!1);const o=jo(),e=So();let t="default";try{const{useProfilesStore:r}=(Po(),yn(zn));t=r().activeProfileName||"default"}catch{t=localStorage.getItem("hermes_active_profile_name")||"default"}return $=qn(`${o}/chat-run`,{auth:{token:e},query:{profile:t},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),Ve||($.on("message.delta",_a),$.on("reasoning.delta",ga),$.on("thinking.delta",ha),$.on("reasoning.available",va),$.on("tool.started",fa),$.on("tool.completed",wa),$.on("run.started",ba),$.on("run.failed",Ca),$.on("run.completed",ya),$.on("run.queued",ka),$.on("approval.requested",Ia),$.on("approval.resolved",Ma),$.on("compression.started",Sa),$.on("compression.completed",Pa),$.on("abort.started",Aa),$.on("abort.completed",xa),$.on("usage.updated",Ta),$.on("session.command",Ha),Ve=!0),$}function zo(o,e){const t=xo();return t.once("resumed",e),t.emit("resume",{session_id:o}),t}function La(o,e,t,r,c){const i=o.session_id;if(!i)throw new Error("session_id is required for startRunViaSocket");let s=!1;const _=xo();return K.has(i)?(_.emit("run",o),{abort:()=>{s||_.emit("abort",{session_id:i})}}):(K.set(i,{onMessageDelta:h=>{s||e(h)},onReasoningDelta:h=>{s||e(h)},onThinkingDelta:h=>{s||e(h)},onReasoningAvailable:h=>{s||e(h)},onToolStarted:h=>{s||e(h)},onToolCompleted:h=>{s||e(h)},onRunStarted:h=>{s||(e(h),c?.(h.run_id||""))},onRunCompleted:h=>{s||(e(h),!(h.queue_remaining>0)&&(s=!0,t()))},onRunFailed:h=>{s||(e(h),!(h.queue_remaining>0)&&(s=!0,r(new Error(h.error||"Run failed"))))},onCompressionStarted:h=>{s||e(h)},onCompressionCompleted:h=>{s||e(h)},onAbortStarted:h=>{s||e(h)},onAbortCompleted:h=>{s||(e(h),!(h.queue_length>0)&&(s=!0,t()))},onUsageUpdated:h=>{s||e(h)},onSessionCommand:h=>{s||(e(h),h.terminal!==!1&&(s=!0,K.delete(i),t()))},onRunQueued:h=>{s||e(h)},onApprovalRequested:h=>{s||e(h)},onApprovalResolved:h=>{s||e(h)}}),_.emit("run",o),{abort:()=>{s||_.emit("abort",{session_id:i})}})}var $,Ve,K,Fa=ve((()=>{Bn(),$=null,Ve=!1,K=new Map}));async function Zo(o,e){const t=new URLSearchParams;o&&t.set("source",o),e&&t.set("limit",String(e));const r=t.toString();return(await ce(`/api/hermes/sessions${r?`?${r}`:""}`)).sessions}async function Ni(o,e){const t=new URLSearchParams;o&&t.set("source",o),e&&t.set("limit",String(e));const r=t.toString();return(await ce(`/api/hermes/sessions/hermes${r?`?${r}`:""}`)).sessions}async function za(o,e,t){const r=new URLSearchParams;return r.set("q",o),e&&r.set("source",e),t&&r.set("limit",String(t)),(await ce(`/api/hermes/search/sessions?${r.toString()}`)).results}async function Ua(o){try{return(await ce(`/api/hermes/sessions/${o}`)).session}catch{return null}}async function Bi(o){try{return(await ce(`/api/hermes/sessions/hermes/${o}`)).session}catch{return null}}async function Na(o){try{return await ce(`/api/hermes/sessions/${o}`,{method:"DELETE"}),!0}catch{return!1}}async function qi(o){try{return await ce("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:o})})}catch(e){throw e}}async function Oi(o,e){try{return await ce(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function ji(o,e){try{return await ce(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Ba(o,e,t){try{return await ce(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:t})}),!0}catch{return!1}}async function Wi(o,e="full",t="json"){const r=jo(),c=So(),i=`${r}/api/hermes/sessions/${o}/export?mode=${e}&ext=${t}&token=${encodeURIComponent(c)}`,s=await fetch(i);if(!s.ok)throw new Error("Export failed");const _=await s.blob(),h=s.headers.get("Content-Disposition")||"";let U=`session_${o}.${t}`;const x=h.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);x&&(U=decodeURIComponent(x[1].replace(/"/g,"")));const k=document.createElement("a");k.href=URL.createObjectURL(_),k.download=U,k.click(),URL.revokeObjectURL(k.href)}async function Vi(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,t=new URLSearchParams;return t.set("days",String(e)),ce(`/api/hermes/usage/stats?${t}`)}async function Ki(o){const e=new URLSearchParams;o&&e.set("profile",o);const t=e.toString();return(await ce(`/api/hermes/sessions/context-length${t?`?${t}`:""}`)).context_length}var Yo=ve((()=>{Ye()}));async function qa(o){return ce(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function Oa(o,e){await ce("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e})})}async function Gi(o,e){await ce("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function Qi(){return ce("/api/hermes/weixin/qrcode")}async function Ji(o){return ce(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function $i(o){await ce("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var ja=ve((()=>{Ye()})),_o,Wa=ve((()=>{_e(),ja(),_o=Oo("settings",()=>{const o=S(!1),e=S(!1),t=S({}),r=S({}),c=S({}),i=S({}),s=S({}),_=S({}),h=S({}),U=S({}),x=S({}),k=S({}),ee=S({}),q=S({}),te=S({}),X=S({}),ae=S({}),O=S({}),l=S({});async function z(){o.value=!0;try{const f=await qa();t.value=f.display||{},r.value=f.agent||{},c.value=f.memory||{},i.value=f.session_reset||{},s.value=f.privacy||{},_.value=f.approvals||{},h.value=f.telegram||{},U.value=f.discord||{},x.value=f.slack||{},k.value=f.whatsapp||{},ee.value=f.matrix||{},q.value=f.wecom||{},te.value=f.feishu||{},X.value=f.dingtalk||{},ae.value=f.qqbot||{},O.value=f.weixin||{},l.value=f.platforms||{}}catch(f){console.error("Failed to fetch settings:",f)}finally{o.value=!1}}function G(f,g){switch(f){case"display":t.value={...t.value,...g};break;case"agent":r.value={...r.value,...g};break;case"memory":c.value={...c.value,...g};break;case"session_reset":i.value={...i.value,...g};break;case"privacy":s.value={...s.value,...g};break;case"approvals":_.value={..._.value,...g};break;case"telegram":h.value={...h.value,...g};break;case"discord":U.value={...U.value,...g};break;case"slack":x.value={...x.value,...g};break;case"whatsapp":k.value={...k.value,...g};break;case"matrix":ee.value={...ee.value,...g};break;case"wecom":q.value={...q.value,...g};break;case"feishu":te.value={...te.value,...g};break;case"dingtalk":X.value={...X.value,...g};break;case"qqbot":ae.value={...ae.value,...g};break;case"weixin":O.value={...O.value,...g};break;case"platforms":for(const[D,Q]of Object.entries(g))l.value={...l.value,[D]:{...l.value[D]||{},...Q}};break}}async function j(f,g){e.value=!0;try{switch(await Oa(f,g),f){case"display":t.value={...t.value,...g};break;case"agent":r.value={...r.value,...g};break;case"memory":c.value={...c.value,...g};break;case"session_reset":i.value={...i.value,...g};break;case"privacy":s.value={...s.value,...g};break;case"approvals":_.value={..._.value,...g};break;case"telegram":h.value={...h.value,...g};break;case"discord":U.value={...U.value,...g};break;case"slack":x.value={...x.value,...g};break;case"whatsapp":k.value={...k.value,...g};break;case"matrix":ee.value={...ee.value,...g};break;case"wechat":case"wecom":q.value={...q.value,...g};break;case"feishu":te.value={...te.value,...g};break;case"dingtalk":X.value={...X.value,...g};break;case"qqbot":ae.value={...ae.value,...g};break;case"weixin":O.value={...O.value,...g};break;case"platforms":for(const[D,Q]of Object.entries(g))l.value={...l.value,[D]:{...l.value[D]||{},...Q}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:t,agent:r,memory:c,sessionReset:i,privacy:s,approvals:_,telegram:h,discord:U,slack:x,whatsapp:k,matrix:ee,wecom:q,feishu:te,dingtalk:X,qqbot:ae,weixin:O,platforms:l,fetchSettings:z,saveSection:j,updateLocal:G}})}));function Xo(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(Ke||(Ke=new o),Ke):null}function Va(){const o=Xo();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function Ka(){const o=Xo();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,t=.16,r=o.createOscillator(),c=o.createGain();return r.type="sine",r.frequency.setValueAtTime(880,e),r.frequency.exponentialRampToValueAtTime(660,e+t),c.gain.setValueAtTime(1e-4,e),c.gain.exponentialRampToValueAtTime(.18,e+.015),c.gain.exponentialRampToValueAtTime(1e-4,e+t),r.connect(c),c.connect(o.destination),r.start(e),r.stop(e+t),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var Ke,Ga=ve((()=>{Ke=null}));function go(o){const e=[];let t=o.replace(en,r=>(e.push(r),`${Ge}${e.length-1}${Qe}`));return t=t.replace(on,r=>(e.push(r),`${Ge}${e.length-1}${Qe}`)),{masked:t,blocks:e}}function co(o,e){if(e.length===0)return o;const t=new RegExp(`${Ge}(\\d+)${Qe}`,"g");let r=o;for(let c=0;c<e.length;c+=1){const i=r.replace(t,(s,_)=>e[Number(_)]??"");if(i===r)break;r=i}return r}function Zi(o,e){const{masked:t,blocks:r}=go(o),c=[];let i=null,s="",_=0;ho.lastIndex=0;let h;for(;(h=ho.exec(t))!==null;)s+=t.slice(_,h.index),c.push(h[2]),_=h.index+h[0].length;const U=t.slice(_),x=U.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return x?(s+=U.slice(0,x.index),e.streaming?i=x[2]:s+=U.slice(x.index)):s+=U,{segments:c.map(k=>co(k,r)),pending:i===null?null:co(i,r),body:co(s,r),hasThinking:c.length>0||i!==null}}function Yi(o){const e=t=>[...t].length;return o.segments.reduce((t,r)=>t+e(r),0)+e(o.pending||"")}function Qa(o,e){const t=go(o).masked,r=go(e).masked;return{startedAtBoundary:!vo.test(t)&&vo.test(r),endedAtBoundary:!fo.test(t)&&fo.test(r)}}var ho,Ge,Qe,en,on,vo,fo,Ja=ve((()=>{ho=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,Ge="\0THKCODE",Qe="\0",en=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,on=/`[^`\n]*`/g,vo=/<(think|thinking|reasoning)>/i,fo=/<\/(think|thinking|reasoning)>/i}));function le(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}async function $a(o){if(o.length===0)return[];const e=new FormData;for(const c of o)c.file&&e.append("file",c.file,c.name);const t=localStorage.getItem("hermes_api_key")||"",r=await fetch("/upload",{method:"POST",body:e,headers:t?{Authorization:`Bearer ${t}`}:{}});if(!r.ok)throw new Error(`Upload failed: ${r.status}`);return(await r.json()).files}async function Za(o,e,t){const r=[];if(o.trim()&&r.push({type:"text",text:o.trim()}),e&&e.length>0&&t)for(let c=0;c<t.length;c++){const i=t[c],s=e[c];s?.type.startsWith("image/")?r.push({type:"image",name:i.name,path:i.path,media_type:s.type}):r.push({type:"file",name:i.name,path:i.path,media_type:s?.type})}return r}function uo(o){const e=o.filter(i=>i.role==="assistant"?(i.tool_calls?.length||0)>0||i.content&&i.content.trim()!=="":!0),t=new Map,r=new Map;for(const i of e)if(i.role==="assistant"&&i.tool_calls)for(const s of i.tool_calls)s.id&&(s.function?.name&&t.set(s.id,s.function.name),s.function?.arguments&&r.set(s.id,s.function.arguments));const c=[];for(const i of e){if(i.role==="assistant"&&i.tool_calls?.length&&!i.content?.trim()){for(const s of i.tool_calls)c.push({id:String(i.id)+"_"+s.id,role:"tool",content:"",timestamp:Math.round(i.timestamp*1e3),toolName:s.function?.name||void 0,toolCallId:s.id,toolArgs:s.function?.arguments||void 0,toolStatus:"done"});continue}if(i.role==="tool"){const s=i.tool_call_id||"",_=i.tool_name||t.get(s)||void 0,h=r.get(s)||void 0;let U="";if(i.content)try{const k=JSON.parse(i.content);U=k.url||k.title||k.preview||k.summary||""}catch{U=i.content.slice(0,80)}const x=c.findIndex(k=>k.role==="tool"&&k.toolName===_&&!k.toolResult&&k.id.includes("_"+s));x!==-1&&c.splice(x,1),c.push({id:String(i.id),role:"tool",content:"",timestamp:Math.round(i.timestamp*1e3),toolName:_,toolCallId:s||void 0,toolArgs:h,toolPreview:typeof U=="string"&&U.slice(0,100)||void 0,toolResult:i.content||void 0,toolStatus:"done"});continue}c.push({id:String(i.id),role:i.role,content:i.content||"",timestamp:Math.round(i.timestamp*1e3),reasoning:i.reasoning?i.reasoning:void 0,systemType:i.role==="command"?"command":void 0})}return c}function Ya(o){return{id:o.id,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,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 nn(){try{return Wo().activeProfileName||"default"}catch{return"default"}}function tn(){return sn+nn()}function Xa(){return nn()==="default"?To:null}function ei(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function oi(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let t=0;t<localStorage.length;t++){const r=localStorage.key(t);r&&(r===tn()||r===To||o.some(c=>r.startsWith(c))&&e.push(r))}e.forEach(t=>an(t)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function ni(o,e){try{localStorage.setItem(o,e);return}catch(t){if(!ei(t))return}oi();try{localStorage.setItem(o,e)}catch{}}function an(o){try{localStorage.removeItem(o)}catch{}}var sn,To,Ho,rn=ve((()=>{Fa(),Yo(),Ye(),ko(),_e(),Xe(),Po(),Wa(),Ga(),Ja(),sn="hermes_active_session_",To="hermes_active_session",Ho=Oo("chat",()=>{const o=S([]),e=S(null),t=S(null),r=S(new Map),c=S(new Set),i=S(new Map),s=S(new Map),_=S(new Map),h=se(()=>{const n=e.value;return n&&_.value.get(n)||null}),U=S(!1);function x(n){U.value=n}const k=se(()=>{const n=e.value;return n==null?!1:r.value.has(n)||c.value.has(n)}),ee=S(!1),q=S(!1),te=S(!1),X=se(()=>k.value),ae=S(null);function O(n){ae.value=n}const l=S(null),z=se(()=>l.value?.aborting===!0);function G(n){l.value=n}const j=S(null),f=se(()=>j.value?.messages||[]);function g(n){return r.value.has(n)||c.value.has(n)}async function D(){ee.value=!0;try{const n=(await Zo()).map(Ya),m=new Map(o.value.map(P=>[P.id,P.messages]));for(const P of n){const N=m.get(P.id);N&&N.length&&(P.messages=N)}o.value=n;const d=e.value,w=d&&o.value.some(P=>P.id===d)?d:o.value[0]?.id;w&&await Z(w)}catch(n){console.error("Failed to load sessions:",n)}finally{ee.value=!1,q.value=!0}}async function Q(){const n=e.value;if(!n)return!1;try{const m=await Ua(n);if(!m)return!1;const d=o.value.find(w=>w.id===n);return d?(d.messages=uo(m.messages||[]),m.title&&(d.title=m.title),!0):!1}catch(m){return console.error("Failed to refresh active session:",m),!1}}function T(){const n={id:le(),title:"",source:"api_server",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(n),n}function J(){const n=new Date,m={id:`${[n.getFullYear(),String(n.getMonth()+1).padStart(2,"0"),String(n.getDate()).padStart(2,"0"),"_",String(n.getHours()).padStart(2,"0"),String(n.getMinutes()).padStart(2,"0"),String(n.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(m),m}async function Z(n,m){Eo(n),e.value=n,t.value=m??null,ni(tn(),n);const d=Xa();if(d&&an(d),j.value=o.value.find(w=>w.id===n)||null,!!j.value){te.value=!0;try{await new Promise((w,P)=>{const N=setTimeout(()=>P(new Error("resume timeout")),15e3);zo(n,ne=>{if(clearTimeout(N),ne.isWorking?c.value.add(n):c.value.delete(n),ne.queueLength&&ne.queueLength>0?i.value.set(n,ne.queueLength):i.value.delete(n),ne.isAborting?G({aborting:!0,synced:null}):ne.isWorking||G(null),ne.inputTokens!=null&&(j.value.inputTokens=ne.inputTokens),ne.outputTokens!=null&&(j.value.outputTokens=ne.outputTokens),ne.messages?.length&&(j.value.messages=uo(ne.messages)),!j.value.title){const pe=j.value.messages.find(b=>b.role==="user");if(pe){const b=pe.content.slice(0,40);j.value.title=b+(pe.content.length>40?"...":"")}}if(ne.events?.length)for(const pe of ne.events){const b=pe.data;if(b.event==="compression.started")O({compressing:!0,messageCount:b.message_count||0,beforeTokens:b.token_count||0,afterTokens:0,compressed:null});else if(b.event==="compression.completed")O({compressing:!1,messageCount:b.totalMessages||0,beforeTokens:b.beforeTokens||0,afterTokens:b.afterTokens||0,compressed:b.compressed??!1,error:b.error});else if(b.event==="abort.started")G({aborting:!0,synced:null});else if(b.event==="abort.completed")G({aborting:!1,synced:b.synced??!1});else if(b.event==="approval.requested")no({...b,session_id:n});else if(b.event==="approval.resolved")to({...b,session_id:n});else if(b.event==="tool.started"){const p=W(n),R=b.tool_call_id,H=R?p.find(E=>E.role==="tool"&&E.toolCallId===R):null;H?oe(n,H.id,{toolName:b.tool||b.name,toolArgs:typeof b.arguments=="string"?b.arguments:H.toolArgs,toolPreview:b.preview||H.toolPreview,toolStatus:H.toolStatus||"running"}):re(n,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:b.tool||b.name,toolCallId:R,toolPreview:b.preview,toolArgs:typeof b.arguments=="string"?b.arguments:void 0,toolStatus:"running"})}else if(b.event==="tool.completed"){const p=W(n),R=b.tool_call_id,H=R?p.filter(E=>E.role==="tool"&&E.toolCallId===R):p.filter(E=>E.role==="tool"&&E.toolStatus==="running");H.length>0&&oe(n,H[H.length-1].id,{toolStatus:b.error===!0?"error":"done",toolDuration:b.duration,toolResult:typeof b.output=="string"?b.output:void 0})}}w()})})}catch(w){console.error("Failed to load session messages via resume:",w)}finally{te.value=!1}Ro(n)}}function Oe(){const n=T(),m=qe();n.model=m.selectedModel||void 0,n.provider=m.selectedProvider||"",Z(n.id)}async function oo(n,m,d){const w=d||j.value?.id;if(!w||!await Ba(w,n,m||""))return!1;const P=o.value.find(N=>N.id===w);return P&&(P.model=n,P.provider=m||""),j.value?.id===w&&(j.value.model=n,j.value.provider=m||""),!0}async function ln(n){await Na(n),o.value=o.value.filter(m=>m.id!==n),e.value===n&&(o.value.length>0?await Z(o.value[0].id):Z(T().id))}function W(n){return o.value.find(m=>m.id===n)?.messages||[]}function re(n,m){const d=o.value.find(w=>w.id===n);d&&d.messages.push(m)}function dn(n){const m=o.value.findIndex(d=>d.id===n.id);m!==-1?o.value[m]=n:o.value.push(n)}function oe(n,m,d){const w=o.value.find(N=>N.id===n);if(!w)return;const P=w.messages.findIndex(N=>N.id===m);P!==-1&&(w.messages[P]={...w.messages[P],...d})}function Io(n){const m=n.session_id;if(!m)return;const d=o.value.find(N=>N.id===m),w=n.action;if(w==="clear"){if(d&&(d.messages=[]),s.value.delete(m),i.value.delete(m),n.clearHistory){const N=String(n.message||"");N&&re(m,{id:le(),role:"command",content:N,timestamp:Date.now(),systemType:n.ok===!1?"error":"command",commandAction:w,commandData:{...n}})}return}w==="title"&&d&&typeof n.title=="string"&&(d.title=n.title,d.updatedAt=Date.now()),w==="usage"&&d&&(d.inputTokens=n.inputTokens,d.outputTokens=n.outputTokens),w==="destroy"&&(r.value.delete(m),c.value.delete(m),i.value.delete(m),s.value.delete(m),G(null),W(m).forEach(N=>{N.isStreaming&&oe(m,N.id,{isStreaming:!1}),N.role==="tool"&&N.toolStatus==="running"&&(N.toolStatus="error")}));const P=String(n.message||"");P&&re(m,{id:le(),role:"command",content:P,timestamp:Date.now(),systemType:n.ok===!1?"error":"command",commandAction:w,commandData:{...n}})}function cn(n,m){const d=s.value.get(n)||[];d.push({...m,queued:!0}),s.value.set(n,d)}function un(n,m){const d=s.value.get(n);if(!d?.length)return;const w=d.filter(P=>P.id!==m);w.length>0?s.value.set(n,w):s.value.delete(n),i.value.set(n,w.length),Fo()?.emit("cancel_queued_run",{session_id:n,queue_id:m})}function no(n){const m=n.session_id,d=n.approval_id;if(!m||!d)return;const w=(Array.isArray(n.choices)?n.choices:["once","session","deny"]).filter(P=>P==="once"||P==="session"||P==="always"||P==="deny");_.value.set(m,{sessionId:m,approvalId:d,command:String(n.command||""),description:String(n.description||""),choices:w.length?w:["once","session","deny"],allowPermanent:!!n.allow_permanent,requestedAt:Date.now()}),_.value=new Map(_.value)}function to(n){const m=n.session_id;if(!m)return;const d=_.value.get(m);if(!d)return;const w=n.approval_id;w&&d.approvalId!==w||(_.value.delete(m),_.value=new Map(_.value))}function mn(n){const m=h.value;m&&(Ea(m.sessionId,m.approvalId,n),_.value.delete(m.sessionId),_.value=new Map(_.value))}function Mo(n){const m=s.value.get(n);if(!m?.length)return;const d=m.shift();m.length>0?s.value.set(n,m):s.value.delete(n),re(n,{...d,queued:!1}),Me(n)}function Me(n){const m=o.value.find(d=>d.id===n);if(m){if(!m.title){const d=m.messages.find(w=>w.role==="user");if(d){const w=d.attachments?.length?d.attachments.map(P=>P.name).join(", "):d.content;m.title=w.slice(0,40)+(w.length>40?"...":"")}}m.updatedAt=Date.now()}}function pn(){_o().display.bell_on_complete&&Va()}function Do(){_o().display.bell_on_complete&&Ka()}async function _n(n,m){if(!n.trim()&&!(m&&m.length>0))return;pn(),j.value||Z(T().id);const d=e.value,w=j.value?.source==="cli"&&n.trim().startsWith("/"),P=w&&/^\/compress(?:\s|$)/i.test(n.trim()),N=g(d)&&!w,ne={id:le(),role:w?"command":"user",content:n.trim(),timestamp:Date.now(),attachments:m&&m.length>0?m:void 0,queued:N,systemType:w?"command":void 0};N||(re(d,ne),Me(d));try{let pe;if(m&&m.length>0){const v=await $a(m),M=So(),B=new Map(v.map(A=>{const y=`/api/hermes/download?path=${encodeURIComponent(A.path)}&name=${encodeURIComponent(A.name)}`;return[A.name,M?`${y}&token=${encodeURIComponent(M)}`:y]}));if(N&&ne.attachments)ne.attachments=ne.attachments.map(A=>{const y=B.get(A.name);return y?{...A,url:y}:A});else{const A=W(d).findLast(y=>y.id===ne.id);A?.attachments&&(A.attachments=A.attachments.map(y=>{const ue=B.get(y.name);return ue?{...y,url:ue}:y}))}pe=await Za(n,m,v)}else pe=n.trim();const b=qe();await b.loadModels();const p=j.value?.model||b.selectedModel,R=j.value?.source==="cli",H=j.value?.provider||b.selectedProvider,E={input:pe,session_id:d,model:R?void 0:p||void 0,provider:R?void 0:H||void 0,model_groups:b.modelGroups.map(v=>({provider:v.provider,models:v.models})),queue_id:ne.id,source:R?"cli":"api_server"};N&&cn(d,ne);const L=()=>{r.value.delete(d),c.value.delete(d)};let V=!1,ge=!1,ie=null;const fn=()=>{Mo(d)},wn=()=>{W(d).forEach(v=>{v.role==="assistant"&&v.isStreaming&&oe(d,v.id,{isStreaming:!1})}),ie=null},bn=La(E,v=>{switch(v.event){case"run.started":G(null),O(null),V=!1,ge=!1,wn(),fn(),v.queue_length>0?i.value.set(d,v.queue_length):i.value.delete(d);break;case"run.queued":i.value.set(d,v.queue_length||0);break;case"session.command":Io(v);break;case"compression.started":O({compressing:!0,messageCount:v.message_count||0,beforeTokens:v.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":O({compressing:!1,messageCount:v.totalMessages||0,beforeTokens:v.beforeTokens||0,afterTokens:v.afterTokens||0,compressed:v.compressed??!1,error:v.error}),setTimeout(()=>{ae.value&&!ae.value.compressing&&O(null)},5e3);break;case"abort.started":G({aborting:!0,synced:null});break;case"abort.completed":{if(G({aborting:!1,synced:v.synced??!1}),v.queue_length>0){i.value.set(d,v.queue_length),G(null);break}const M=W(d),B=M[M.length-1];B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"done"})}),L(),G(null);break}case"reasoning.delta":case"thinking.delta":{const M=v.text||v.delta||"";if(!M)break;V=!0;const B=W(d),A=ie?B.find(y=>y.id===ie):null;if(A?.role==="assistant"&&A.isStreaming)A.reasoning=(A.reasoning||"")+M,Re(A.id);else{const y=le();re(d,{id:y,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:M}),ie=y,Re(y)}break}case"reasoning.available":{const M=W(d),B=M[M.length-1];B?.role==="assistant"&&B.isStreaming&&Ee(B.id);break}case"message.delta":{v.delta&&(V=!0);const M=W(d),B=ie?M.find(A=>A.id===ie):null;if(B?.role==="assistant"&&B.isStreaming){const A=B.content,y=A+(v.delta||"");De(B.id,A,y),B.reasoning&&Ee(B.id),B.content=y}else{const A=le(),y=v.delta||"";De(A,"",y),re(d,{id:A,role:"assistant",content:y,timestamp:Date.now(),isStreaming:!0}),ie=A}break}case"tool.started":{ge=!0;const M=W(d),B=v.tool_call_id,A=ie?M.find(ue=>ue.id===ie):M[M.length-1];A?.isStreaming&&oe(d,A.id,{isStreaming:!1}),ie=null;const y=B?M.find(ue=>ue.role==="tool"&&ue.toolCallId===B):null;if(y){oe(d,y.id,{toolName:v.tool||v.name,toolArgs:typeof v.arguments=="string"?v.arguments:y.toolArgs,toolPreview:v.preview||y.toolPreview,toolStatus:y.toolStatus||"running"});break}re(d,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:v.tool||v.name,toolCallId:B,toolPreview:v.preview,toolArgs:typeof v.arguments=="string"?v.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{ge=!0;const M=W(d),B=v.tool_call_id,A=B?M.filter(y=>y.role==="tool"&&y.toolCallId===B):M.filter(y=>y.role==="tool"&&y.toolStatus==="running");if(A.length>0){const y=A[A.length-1],ue=v.error===!0,Le=v.duration;oe(d,y.id,{toolStatus:ue?"error":"done",toolDuration:Le,toolResult:typeof v.output=="string"?v.output:void 0})}break}case"approval.requested":no(v);break;case"approval.resolved":to(v);break;case"run.completed":{const M=W(d),B=ie?M.find(y=>y.id===ie):M[M.length-1];if(B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),v.inputTokens!=null){const y=o.value.find(ue=>ue.id===d);y&&(y.inputTokens=v.inputTokens,y.outputTokens=v.outputTokens)}let A="";if(v.parsed_content!==void 0){const y=W(d),ue=ie?y.find(Le=>Le.id===ie):[...y].reverse().find(Le=>Le.role==="assistant");ue&&(oe(d,ue.id,{content:v.parsed_content||""}),v.parsed_reasoning&&oe(d,ue.id,{reasoning:v.parsed_reasoning}),A=(v.parsed_content||"").trim())}else{const y=typeof v.output=="string"?v.output:"";A=y.trim(),!V&&A!==""&&(re(d,{id:le(),role:"assistant",content:y,timestamp:Date.now()}),V=!0)}if(!V&&!ge&&A===""?re(d,{id:le(),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()}):Do(),U.value){const y=[...W(d)].reverse().find(ue=>ue.role==="assistant");y?.content&&setTimeout(()=>{ao(y.id,y.content)},300)}v.queue_remaining>0?i.value.set(d,v.queue_remaining):L(),ie=null,Me(d);break}case"run.failed":{const M=W(d),B=M[M.length-1];B?.isStreaming?oe(d,B.id,{isStreaming:!1,content:v.error?`Error: ${v.error}`:"Run failed",role:"system"}):re(d,{id:le(),role:"system",content:v.error?`Error: ${v.error}`:"Run failed",timestamp:Date.now()}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"error"})}),v.queue_remaining>0?i.value.set(d,v.queue_remaining):L();break}case"usage.updated":{const M=o.value.find(B=>B.id===d);M&&(M.inputTokens=v.inputTokens,M.outputTokens=v.outputTokens);break}}},()=>{const v=W(d),M=v[v.length-1];M?.isStreaming&&oe(d,M.id,{isStreaming:!1}),L(),Me(d)},v=>{console.warn("Socket.IO run stream error:",v.message);const M=W(d),B=M[M.length-1];B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"done"})}),L(),d===e.value&&Q()},void 0);(!w||P)&&r.value.set(d,bn)}catch(pe){re(d,{id:le(),role:"system",content:`Error: ${pe.message}`,timestamp:Date.now()})}}function Ro(n){if(r.value.has(n)||!c.value.has(n))return;let m=!1,d=!1,w=!1,P=null;const N=()=>{m||(m=!0,r.value.delete(n),c.value.delete(n),Ra(n))},ne=()=>{Mo(n)},pe=()=>{W(n).forEach(p=>{p.role==="assistant"&&p.isStreaming&&oe(n,p.id,{isStreaming:!1})}),P=null};function b(p){if(!m&&!(p.session_id&&p.session_id!==n))switch(p.event){case"run.queued":i.value.set(n,p.queue_length||0);break;case"session.command":Io(p);break;case"run.started":G(null),O(null),d=!1,w=!1,pe(),ne(),p.queue_length>0?i.value.set(n,p.queue_length):i.value.delete(n);break;case"compression.started":O({compressing:!0,messageCount:p.message_count||0,beforeTokens:p.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":O({compressing:!1,messageCount:p.totalMessages||0,beforeTokens:p.beforeTokens||0,afterTokens:p.afterTokens||0,compressed:p.compressed??!1,error:p.error}),setTimeout(()=>{ae.value&&!ae.value.compressing&&O(null)},5e3);break;case"abort.started":G({aborting:!0,synced:null});break;case"abort.completed":{if(G({aborting:!1,synced:p.synced??!1}),p.queue_length>0){i.value.set(n,p.queue_length),G(null);break}const R=W(n),H=R[R.length-1];H?.isStreaming&&oe(n,H.id,{isStreaming:!1}),R.forEach((E,L)=>{E.role==="tool"&&E.toolStatus==="running"&&(R[L]={...E,toolStatus:"done"})}),N(),G(null);break}case"reasoning.delta":case"thinking.delta":{const R=p.text||p.delta||"";if(!R)break;d=!0;const H=W(n),E=P?H.find(L=>L.id===P):null;if(E?.role==="assistant"&&E.isStreaming)E.reasoning=(E.reasoning||"")+R,Re(E.id);else{const L=le();re(n,{id:L,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:R}),P=L,Re(L)}break}case"reasoning.available":{const R=W(n),H=R[R.length-1];H?.role==="assistant"&&H.isStreaming&&Ee(H.id);break}case"message.delta":{p.delta&&(d=!0);const R=W(n),H=P?R.find(E=>E.id===P):null;if(H?.role==="assistant"&&H.isStreaming){const E=H.content,L=E+(p.delta||"");De(H.id,E,L),H.reasoning&&Ee(H.id),H.content=L}else{const E=le(),L=p.delta||"";De(E,"",L),re(n,{id:E,role:"assistant",content:L,timestamp:Date.now(),isStreaming:!0}),P=E}break}case"tool.started":{w=!0;const R=W(n),H=p.tool_call_id,E=P?R.find(V=>V.id===P):R[R.length-1];E?.isStreaming&&oe(n,E.id,{isStreaming:!1}),P=null;const L=H?R.find(V=>V.role==="tool"&&V.toolCallId===H):null;if(L){oe(n,L.id,{toolName:p.tool||p.name,toolArgs:typeof p.arguments=="string"?p.arguments:L.toolArgs,toolPreview:p.preview||L.toolPreview,toolStatus:L.toolStatus||"running"});break}re(n,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:p.tool||p.name,toolCallId:H,toolPreview:p.preview,toolArgs:typeof p.arguments=="string"?p.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{w=!0;const R=W(n),H=p.tool_call_id,E=H?R.filter(L=>L.role==="tool"&&L.toolCallId===H):R.filter(L=>L.role==="tool"&&L.toolStatus==="running");if(E.length>0){const L=p.error===!0;oe(n,E[E.length-1].id,{toolStatus:L?"error":"done",toolDuration:p.duration,toolResult:typeof p.output=="string"?p.output:void 0})}break}case"approval.requested":no(p);break;case"approval.resolved":to(p);break;case"run.completed":{const R=p.queue_remaining>0;R?i.value.set(n,p.queue_remaining):i.value.delete(n);const H=W(n),E=P?H.find(V=>V.id===P):H[H.length-1];if(E?.isStreaming&&oe(n,E.id,{isStreaming:!1}),p.inputTokens!=null){const V=o.value.find(ge=>ge.id===n);V&&(V.inputTokens=p.inputTokens,V.outputTokens=p.outputTokens)}let L="";if(p.parsed_content!==void 0){const V=W(n),ge=P?V.find(ie=>ie.id===P):[...V].reverse().find(ie=>ie.role==="assistant");ge&&(oe(n,ge.id,{content:p.parsed_content||""}),p.parsed_reasoning&&oe(n,ge.id,{reasoning:p.parsed_reasoning}),L=(p.parsed_content||"").trim())}else{const V=typeof p.output=="string"?p.output:"";L=V.trim(),!d&&L!==""&&re(n,{id:le(),role:"assistant",content:V,timestamp:Date.now()})}if(!d&&!w&&L===""?re(n,{id:le(),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()}):Do(),U.value){const V=[...W(n)].reverse().find(ge=>ge.role==="assistant");V?.content&&setTimeout(()=>{ao(V.id,V.content)},300)}R||N(),P=null,Me(n);break}case"run.failed":{const R=p.queue_remaining>0;R?i.value.set(n,p.queue_remaining):i.value.delete(n);const H=W(n),E=H[H.length-1];E?.isStreaming?oe(n,E.id,{isStreaming:!1,content:p.error?`Error: ${p.error}`:"Run failed",role:"system"}):re(n,{id:le(),role:"system",content:p.error?`Error: ${p.error}`:"Run failed",timestamp:Date.now()}),H.forEach((L,V)=>{L.role==="tool"&&L.toolStatus==="running"&&(H[V]={...L,toolStatus:"error"})}),R||N();break}case"usage.updated":{const R=o.value.find(H=>H.id===n);R&&(R.inputTokens=p.inputTokens,R.outputTokens=p.outputTokens);break}}}Da(n,{onMessageDelta:p=>b(p),onReasoningDelta:p=>b(p),onThinkingDelta:p=>b(p),onReasoningAvailable:p=>b(p),onToolStarted:p=>b(p),onToolCompleted:p=>b(p),onRunStarted:p=>b(p),onRunCompleted:p=>b(p),onRunFailed:p=>b(p),onCompressionStarted:p=>b(p),onCompressionCompleted:p=>b(p),onAbortStarted:p=>b(p),onAbortCompleted:p=>b(p),onUsageUpdated:p=>b(p),onSessionCommand:p=>b(p),onRunQueued:p=>b(p)}),r.value.set(n,{abort:()=>{Fo()?.emit("abort",{session_id:n})}})}function gn(){const n=e.value;if(!n||z.value)return;const m=r.value.get(n);if(m){G({aborting:!0,synced:null}),m.abort();const d=W(n),w=d[d.length-1];w?.isStreaming&&oe(n,w.id,{isStreaming:!1}),window.setTimeout(()=>{e.value===n&&l.value?.aborting&&(r.value.delete(n),c.value.delete(n),G(null))},2e4)}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&e.value&&!k.value){const n=e.value;n&&!r.value.has(n)&&zo(n,m=>{m.isWorking?c.value.add(n):c.value.delete(n),m.isAborting?G({aborting:!0,synced:null}):m.isWorking||G(null),m.messages?.length&&j.value&&(j.value.messages=uo(m.messages)),Ro(n)})}});const fe=new Map;function hn(n){return fe.get(n)}function De(n,m,d){const{startedAtBoundary:w,endedAtBoundary:P}=Qa(m,d);if(!w&&!P)return;const N=fe.get(n)||{};w&&N.startedAt===void 0&&(N.startedAt=Date.now()),P&&N.endedAt===void 0&&(N.endedAt=Date.now()),fe.set(n,N)}function Re(n){const m=fe.get(n)||{};m.startedAt===void 0&&(m.startedAt=Date.now(),fe.set(n,m))}function Ee(n){const m=fe.get(n);!m||m.startedAt===void 0||m.endedAt===void 0&&(m.endedAt=Date.now(),fe.set(n,m))}function vn(n){if(!n)return;const m=n.toLowerCase();for(const d of o.value)(d.provider||"").toLowerCase()===m&&(d.model=void 0,d.provider="")}function Eo(n){fe.clear()}function ao(n,m){const d=new CustomEvent("auto-play-speech",{detail:{messageId:n,content:m}});window.dispatchEvent(d)}return{sessions:o,activeSessionId:e,activeSession:j,focusMessageId:t,messages:f,isStreaming:k,isRunActive:X,isSessionLive:g,compressionState:ae,abortState:l,isAborting:z,queueLengths:i,queuedUserMessages:s,pendingApprovals:_,activePendingApproval:h,removeQueuedMessage:un,isLoadingSessions:ee,sessionsLoaded:q,isLoadingMessages:te,newChat:Oe,newCliSession:J,switchSession:Z,switchSessionModel:oo,addOrUpdateSession:dn,clearProviderFromSessions:vn,deleteSession:ln,sendMessage:_n,stopStreaming:gn,respondApproval:mn,loadSessions:D,refreshActiveSession:Q,getThinkingObservation:hn,noteThinkingDelta:De,noteReasoningStart:Re,noteReasoningEnd:Ee,clearThinkingObservationFor:Eo,setAutoPlaySpeech:x,playMessageSpeech:ao}})}));_e();Ze();rn();function ti(){const o=$e(),e=Ho(),{sessionSearchOpen:t,openSessionSearch:r,closeSessionSearch:c}=Ao();function i(s){const _=s.ctrlKey||s.metaKey;if(_&&s.key==="n"){s.preventDefault(),e.newChat();return}if(_&&s.key==="j"){s.preventDefault(),o.push({name:"hermes.jobs"});return}if(_&&s.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;s.preventDefault(),r();return}if(s.key==="Escape"){if(t.value){s.preventDefault(),c();return}const h=document.querySelector(".n-modal-mask");h&&h.querySelector(".n-base-close")?.click()}}Je(()=>{window.addEventListener("keydown",i)}),bo(()=>{window.removeEventListener("keydown",i)})}_e();Ze();xe();Ce();Yo();rn();var ai={class:"session-search-modal"},ii={class:"search-header"},si={class:"search-title"},ri={class:"search-hint"},li={class:"search-scope"},di={class:"search-body"},ci={key:0,class:"search-empty"},ui={key:1,class:"result-list"},mi=["onClick","onMouseenter"],pi={class:"result-main"},_i={class:"result-title-row"},gi={class:"result-title"},hi={class:"result-source"},vi={class:"result-snippet"},fi={class:"result-meta"},wi={class:"result-time"},bi={key:0,class:"result-match"},yi={class:"search-footer"},Ci=ye({__name:"SessionSearchModal",setup(o){const{t:e}=Te(),t=Co(),r=$e(),c=Ho(),{sessionSearchOpen:i}=Ao(),s=S(""),_=S(!1),h=S([]),U=S([]),x=S(0),k=S(null);let ee=null,q=0;const te=se(()=>s.value.trim().length>0),X=se(()=>te.value?U.value:h.value.map(T=>({...T,matched_message_id:null,snippet:T.preview||"",rank:0})));function ae(T){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[T]||T}function O(T){return T?new Date(T*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function l(T){const J=T.title?.trim();return J||(T.preview?.trim()?T.preview.trim():T.id)}async function z(){const T=++q;_.value=!0;try{const J=await Zo(void 0,8);if(T!==q)return;h.value=J,U.value=[],x.value=0}catch(J){if(T!==q)return;t.error(J instanceof Error?J.message:e("chat.searchFailed"))}finally{T===q&&(_.value=!1)}}async function G(T){const J=++q;_.value=!0;try{const Z=T.trim()?await za(T.trim(),void 0,10):[];if(J!==q)return;U.value=Z,x.value=0}catch(Z){if(J!==q)return;t.error(Z instanceof Error?Z.message:e("chat.searchFailed"))}finally{J===q&&(_.value=!1)}}async function j(){c.sessions.length===0&&await c.loadSessions()}async function f(T){const J=T.matched_message_id!=null?String(T.matched_message_id):null;i.value=!1,await j(),await c.switchSession(T.id,J),r.currentRoute.value.name!=="hermes.chat"&&await r.push({name:"hermes.chat"})}function g(){i.value=!1}function D(T){const J=X.value;J.length!==0&&(x.value=(x.value+T+J.length)%J.length)}async function Q(T){if(i.value){if(T.key==="ArrowDown"){T.preventDefault(),D(1);return}if(T.key==="ArrowUp"){T.preventDefault(),D(-1);return}if(T.key==="Enter"){T.preventDefault();const J=X.value[x.value];J&&await f(J);return}T.key==="Escape"&&(T.preventDefault(),g())}}return ke(()=>i.value,async T=>{if(!T){s.value="",U.value=[],h.value=[],x.value=0;return}s.value="",U.value=[],x.value=0,await z(),await Mn(),k.value?.focus?.()}),ke(s,T=>{ee&&(clearTimeout(ee),ee=null),ee=setTimeout(()=>{i.value&&G(T)},160)}),ke(X,()=>{x.value>=X.value.length&&(x.value=0)}),Je(()=>{window.addEventListener("keydown",Q)}),bo(()=>{window.removeEventListener("keydown",Q),ee&&clearTimeout(ee)}),(T,J)=>(I(),Ae(u(wo),{show:u(i),"onUpdate:show":J[1]||(J[1]=Z=>Tn(i)?i.value=Z:null),preset:"card",title:u(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:he(()=>[a("div",ai,[a("div",ii,[a("div",si,C(u(e)("chat.searchSubtitle")),1),a("div",ri,C(u(e)("chat.searchHint")),1)]),a("div",li,C(u(e)("chat.searchScope")),1),de(u(po),{ref_key:"inputRef",ref:k,value:s.value,"onUpdate:value":J[0]||(J[0]=Z=>s.value=Z),placeholder:u(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),a("div",di,[de(u(Hn),{show:_.value},{default:he(()=>[X.value.length===0?(I(),F("div",ci,C(te.value?u(e)("chat.searchNoResults"):u(e)("chat.searchEmpty")),1)):(I(),F("div",ui,[(I(!0),F(Ne,null,Be(X.value,(Z,Oe)=>(I(),F("button",{key:Z.id,class:Y(["result-item",{active:Oe===x.value}]),onClick:oo=>f(Z),onMouseenter:oo=>x.value=Oe},[a("div",pi,[a("div",_i,[a("span",gi,C(l(Z)),1),a("span",hi,C(ae(Z.source)),1)]),a("div",vi,C(te.value?Z.snippet||u(e)("chat.searchNoSnippet"):Z.preview||u(e)("chat.searchRecent")),1)]),a("div",fi,[a("span",wi,C(O(Z.last_active||Z.started_at)),1),te.value&&Z.matched_message_id!=null?(I(),F("span",bi," #"+C(Z.matched_message_id),1)):me("",!0)])],42,mi))),128))]))]),_:1},8,["show"])]),a("div",yi,[a("span",null,C(u(e)("chat.searchEnterHint")),1),de(u(mo),{quaternary:"",size:"small",onClick:g},{default:he(()=>[We(C(u(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});He();var ki=Ie(Ci,[["__scopeId","data-v-8818182c"]]);_e();Ze();xe();Ce();$o();Xe();var Si={key:0,class:"node-warning-bar"},Pi={class:"app-main"},Ai=ye({__name:"App",setup(o){const{isDark:e,isComic:t}=Jo(),{t:r}=Te(),c=qe(),i=qo(),s=$e(),_=S(!1),h=se(()=>it(e.value,t.value)),U=se(()=>e.value?In:null),x=se(()=>i.name==="login"),k=se(()=>{const ee=c.nodeVersion,q=parseInt(ee.split(".")[0],10);return!isNaN(q)&&q<23});return ke(()=>i.path,()=>{c.closeSidebar()}),s.isReady().then(()=>{_.value=!0}),Je(()=>{x.value||(c.loadModels(),c.startHealthPolling())}),bo(()=>{c.stopHealthPolling()}),ti(),(ee,q)=>{const te=En("router-view");return I(),Ae(u(Cn),{theme:U.value,"theme-overrides":h.value},{default:he(()=>[de(u(xn),null,{default:he(()=>[de(u(Rn),null,{default:he(()=>[de(u(Dn),null,{default:he(()=>[k.value&&_.value?(I(),F("div",Si,C(u(r)("sidebar.nodeVersionWarning",{version:u(c).nodeVersion})),1)):me("",!0),_.value?(I(),F("div",{key:1,class:Y(["app-layout",{"no-sidebar":x.value}])},[x.value?me("",!0):(I(),F("button",{key:0,class:"hamburger-btn",onClick:q[0]||(q[0]=(...X)=>u(c).toggleSidebar&&u(c).toggleSidebar(...X))},[...q[2]||(q[2]=[a("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!x.value&&u(c).sidebarOpen?(I(),F("div",{key:1,class:"mobile-backdrop",onClick:q[1]||(q[1]=(...X)=>u(c).closeSidebar&&u(c).closeSidebar(...X))})):me("",!0),x.value?me("",!0):(I(),Ae(pa,{key:2})),a("main",Pi,[de(te)])],2)):me("",!0),de(ki)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});He();var xi=Ie(Ai,[["__scopeId","data-v-f6c7ab5c"]]);_e();ko();var Uo=localStorage.getItem("hermes_brightness")||"system",Ti=localStorage.getItem("hermes_style")||"ink",Hi=window.matchMedia("(prefers-color-scheme: dark)").matches,Ii=Uo==="dark"||Uo==="system"&&Hi,Mi=Ti==="comic";Ii&&document.documentElement.classList.add("dark");Mi&&document.documentElement.classList.add("comic");var Di=new URLSearchParams(window.location.search),No=window.location.hash.split("?")[1],Bo=Di.get("token")||(No?new URLSearchParams(No).get("token"):null);Bo&&(window.__LOGIN_TOKEN__=Bo);var eo=kn(xi);eo.use(Ln());eo.use(Qo);eo.use(Un);eo.mount("#app");export{Jo as C,$o as S,ot as T,Ni as _,Zi as a,Oi as b,Qi as c,Gi as d,$i as f,Bi as g,Ki as h,Ja as i,ja as l,Wi as m,Ho as n,Wa as o,qi as p,Yi as r,_o as s,rn as t,Ji as u,Vi as v,nt as w,ji as x,Yo as y};
1
+ import{i as yn,n as ve}from"./rolldown-runtime-BKwlnUi0.js";import{A as Cn,F as mo,J as Fe,K as kn,Mt as Sn,Nt as S,R as po,Rt as u,S as wo,St as ke,Tt as ze,U as _e,Vt as C,X as Pn,Y as An,Z as Ne,_t as I,at as we,b as xn,ct as ye,et as se,gt as bo,ht as Je,it as F,k as yo,kt as Tn,l as Hn,n as In,nt as Ae,ot as We,pt as Mn,rt as me,st as de,t as xe,tt as a,v as Dn,wt as he,x as Rn,xt as En,y as Co,yt as Be,zt as Y}from"./ui-vendor-CsTMg6zH.js";import{c as $e,d as ko,l as Ln,n as Ce,o as Ze,r as Te,s as qo,t as Fn,u as Oo}from"./vue-vendor-D8zSB7VM.js";import{a as So,c as Ye,d as Po,f as zn,i as Un,l as ce,n as He,o as jo,p as Wo,r as Nn,t as Ie}from"./_plugin-vue_export-helper-CrLlP_D3.js";import{O as Bn,k as qn}from"./vendor-D9rSt2qK.js";import{n as qe,t as Xe}from"./app-CYaCGxZ_.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))r(c);new MutationObserver(c=>{for(const i of c)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function t(c){const i={};return c.integrity&&(i.integrity=c.integrity),c.referrerPolicy&&(i.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?i.credentials="include":c.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(c){if(c.ep)return;c.ep=!0;const i=t(c);fetch(c.href,i)}})();_e();ko();Ze();Ye();Nn();Ce();var Vo={login:{title:"Hermes Web UI",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",credentialsRequired:"Please enter username and password",invalidCredentials:"Invalid username or password",tooManyAttempts:"Too many failed attempts, please try again later",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:"Set up a username and password for convenient login. The access token will continue to work as a backup.",removeConfirm:"Are you sure you want to remove password login? You will need to use the access token to log in.",passwordLoginNotConfigured:"Password login is not configured",passwordLoginConfigured:"Password login enabled ({username})"},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"},sidebar:{chat:"Chat",search:"Search",apiRelay:"API Relay",history:"History",jobs:"Jobs",kanban:"Kanban",models:"Models",profiles:"Profiles",skills:"Skills",plugins:"Plugins",memory:"Memory",logs:"Logs",usage:"Usage",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",groupChat:"Group Chat",files:"Files",groupConversation:"Conversation",groupPlatform:"Platform",groupAgent:"Agent",groupSystem:"System",groupMonitoring:"Monitoring",groupTools:"Tools",settings:"Settings",connected:"Connected",disconnected:"Disconnected",collapse:"Collapse menu",expand:"Expand menu",updateTip:'Run "hermes-web-ui update" in terminal to update',updateVersion:"Upgrade to v{version}",reloadClientVersion:"Reload for v{version}",updating:"Updating...",updateSuccess:"Update successful. Please refresh the page shortly. If it does not start after a while, start it manually.",updateFailed:"Update failed",logout:"Sign Out",nodeVersionWarning:"Detected Node.js v{version}. Please upgrade to version 23 or later.",changelog:"Changelog",noChangelog:"No changelog available"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Save",contextEditCancel:"Cancel",contextEditInvalid:"Please enter a valid context length",contextEditSuccess:"Context length updated",contextEditFailed:"Update failed",emptyState:"Start a conversation with Hermes Agent",cliEmptyState:"Start a CLI chat session",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",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"},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",sessionScopeHint:"Chat shows Web UI/API Server sessions only. CLI, Telegram, Discord, Cron, and other channel sessions are read-only in History.",openHistory:"Open History",hermesHistory:"Hermes History",historyScopeHint:"Read-only Hermes history sessions 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",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",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",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",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)",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"}},plugins:{title:"Plugins",refresh:"Refresh",notice:"Read-only inventory of discoverable Hermes plugin manifests. Discovery metadata is read without loading plugin code. Management actions stay in CLI for v1; changes take effect in new Hermes 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",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 Hermes.",copilotAddSourceEnv:"Source: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source: VS Code Copilot extension (apps.json)",copilotDeleteHintEnv:"This will clear COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Other tools are not affected.",copilotDeleteHintGhCli:"Copilot will be hidden from Hermes. Your gh CLI login is not affected — `gh auth status` will still show you signed in.",copilotDeleteHintAppsJson:"Copilot will be hidden from Hermes. Your VS Code Copilot extension login is not affected.",xaiLoginTitle:"xAI Grok OAuth Login",xaiWaiting:"Complete authorization in the opened xAI page. This window will close automatically once approved.",xaiOpenLink:"Open xAI authorization page",xaiApproved:"Sign-in succeeded!",xaiExpired:"The authorization link has expired. Please retry.",customBadge:"CUSTOM",previewBadge:"PREVIEW",disabledBadge:"UNAVAILABLE",disabledTooltip:"This model is currently unavailable for your account.",customModelPlaceholder:"Unlisted model ID",customModelHint:"For provider-supported models not returned by the API; not a display rename. Press Enter to load.",removeCustomModel:"Remove this unlisted model",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",builtIn:"Built-in",customType:"Custom",provider:"Provider",contextLength:"Context Length",contextLengthPlaceholder:"e.g. 200000 (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 to",switchConfirm:'Switching to profile "{name}" will restart the gateway. Continue?',switchSuccess:'Switched to profile "{name}"',switchFailed:"Failed to switch 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."},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:"Account",agent:"Agent",memory:"Memory",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"},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"},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"},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",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"}},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",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",noAgents:"No agents in this room",members:"members",roomCreated:"Room created",roomDeleted:"Room deleted",roomCloned:"Room cloned",cloneRoom:"Clone room",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 Hermes sessions",refresh:"Refresh",periodSelector:"Skill usage period",periodLabel:"{days}d",summary:"Summary",totalActions:"Actions",loads:"Loads",edits:"Edits",distinctSkills:"Skills",topSkills:"Top Skills",dailyTrend:"Daily Trend",periodSummary:"Last {days} days",skill:"Skill",share:"Share",lastUsed:"Last Used",noData:"No skill usage data",loadFailed:"Failed to load skill usage",otherSkills:"Other skills"},files:{title:"Files",fileTree:"File Tree",tree:"Directory Tree",list:"File List",breadcrumbRoot:"Home",newFile:"New File",newFolder:"New Folder",upload:"Upload",refresh:"Refresh",open:"Open",edit:"Edit",preview:"Preview",download:"Download",copyPath:"Copy Path",rename:"Rename",delete:"Delete",name:"Name",size:"Size",modified:"Modified",actions:"Actions",emptyDir:"Empty directory",loading:"Loading...",confirmDelete:'Are you sure you want to delete "{name}"?',confirmDeleteDir:'Are you sure you want to delete directory "{name}" and all its contents?',deleteFailed:"Delete failed",deleted:"Deleted",renameTo:"Rename to",newFileName:"File name",newFolderName:"Folder name",created:"Created",createFailed:"Create failed",renamed:"Renamed",renameFailed:"Rename failed",uploadSuccess:"Uploaded {count} file(s)",uploadFailed:"Upload failed",saveFailed:"Save failed",saved:"Saved",unsavedChanges:"You have unsaved changes. Discard?",pathCopied:"Path copied",fileTooLarge:"File too large (max 10MB)",permissionDenied:"Cannot modify protected file",notFound:"File or directory not found",backendError:"File operation failed",dragDropHint:"Drag files here to upload",closeEditor:"Close Editor",closePreview:"Close",saveFile:"Save"},download:{downloading:"Downloading...",downloadFailed:"Download failed",fileNotFound:"File not found or deleted",fileTooLarge:"File too large (exceeds limit)",backendError:"File read failed, remote environment may be unavailable",backendTimeout:"File read timed out",unsupportedBackend:"Current terminal backend does not support file download",invalidPath:"Invalid file path",download:"Download",downloadFile:"Download file"},changelog:{new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal panel connecting on mount causing PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock on restart",new_0_5_14_5:"Update FUN-Codex/FUN-Claude model lists, add builtin badge and API relay link",new_0_5_15_1:"Add Kanban board for visual task and session management",new_0_5_15_2:"Add official landing page and documentation website",new_0_5_15_3:"Fix group-chat agent client to use dynamic port instead of hardcoded 8648",new_0_5_15_4:"Add node-edge-tts voice module",new_0_5_15_5:"Fix WSL default listen host binding",new_0_5_15_6:"Add website homepage metadata for SEO",new_0_5_15_7:"Add IP-based login brute-force protection",new_0_5_15_8:"Fix double-wrapping of download URLs in MarkdownRenderer",new_0_5_15_9:"Fix Hermes markdown media rendering and sync retry",new_0_5_15_10:"Refactor to remove upstream env dependency",new_0_5_15_11:"If the Kanban feature is not available, please upgrade hermes-agent",new_0_5_16_1:"Migrate chat streaming from /v1/runs to /v1/responses API for lower latency",new_0_5_16_2:"Persist real API usage (tokens, cache, reasoning) to usage table",new_0_5_16_3:"Add QQ group QR code to website navigation bar",new_0_5_16_4:"Remove unused codex_reasoning_items field from message schema",new_0_5_17_1:"Full Windows compatibility: path handling, process management, terminal, log parsing",new_0_5_17_2:"Refactor Gateway process management with cross-platform start/stop/health-check",new_0_5_17_3:"Fix plugin discovery on Termux by parsing hermes shebang to locate Python",new_0_5_17_4:"Tolerate duplicate YAML keys in config parsing",new_0_5_17_5:"Improve auth lock window and dev shutdown flow",new_0_5_17_6:"Add Chinese (ZCOOL KuaiLe), Japanese (Zen Maru Gothic), Korean (Gaegu) handwritten fonts for Comic theme",new_0_5_17_7:"Add Comic/doodle theme style",new_0_5_17_8:"Change license to BSL-1.1",new_0_5_17_9:"Add read-only Hermes plugins page",new_0_5_17_10:"Convert image uploads to base64 multimodal format",new_0_5_17_11:"Fix Kanban board selection and isolation",new_0_5_17_12:"Add voice playback settings with 4-provider TTS support",new_0_5_17_13:"Lower context compression message threshold from 200 to 150",new_0_5_17_14:"Fix Web UI self-update restart logic",new_0_5_17_15:"Fix opencode-zen and opencode-go shared env var causing config coupling",new_0_5_17_16:"Add Traditional Chinese (zh-TW) language support",new_0_5_17_17:"Support managing visible models in Web UI",new_0_5_17_18:"Kanban: complete task action chain (comments, logs, assign, dispatch) with capability boundaries",new_0_5_17_19:"Fix provider auth entries not cleared on delete",new_0_5_17_20:"Fix Codex credential-pool auth recognition",new_0_5_17_21:"Add Edge TTS rate/pitch sliders to voice settings",new_0_5_17_22:"Config YAML duplicate keys no longer crash parsing",new_0_5_17_23:"Gateway port ownership now based on PID file, preventing cross-profile port hijacking",new_0_5_17_24:"History page now shows Cron session records",new_0_5_17_25:"Fix language switch and theme icons squeezed in collapsed sidebar",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_6_1:"Add voice playback feature with Web Speech API: manual button, auto-play toggle, rainbow border animation, and mobile optimization",new_0_5_6_2:"Add robust LLM JSON parser with tolerance for Python format and extract text from streaming events",new_0_5_6_3:"Add Skills enhancements: usage stats, source filtering, archived skills, provenance, and pin toggle",new_0_5_6_4:"Expand daily usage stats with detailed token breakdown including cache read/write separation",new_0_5_6_5:"Clarify session history scope with improved descriptions in chat and history views",new_0_5_6_6:"Redesigned attachment handling using Anthropic-style ContentBlock array format with type discriminated unions (text, image, file)",new_0_5_6_7:"Added frontend file download functionality supporting both ContentBlock and Markdown formats with authentication",new_0_5_6_8:"Fixed multi-process conflict causing SQLite database resets by eliminating redundant nodemon instances",new_0_5_5_1:"🎉 Happy Labor Day! No work this Labor Day, please bear with us if there are any issues",new_0_5_5_2:"Add History page for browsing Hermes session history",new_0_5_5_3:"History page manages session state independently without interfering with active chat",new_0_5_5_4:"History page auto-loads and selects first CLI session by default",new_0_5_5_5:"Add HistoryMessageList component with session prop injection support",new_0_5_5_6:"Filter empty content messages and tool messages without toolName for better display",new_0_5_5_7:"Remove localStorage session cache, all session data now fetched directly from backend",new_0_5_5_8:"Optimize profile switching logic by removing废弃 cache cleanup calls",new_0_5_4_1:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_2:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_3:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_4:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_5:"Support code block copy feedback with user notifications",new_0_5_4_6:"Align usage analytics with Hermes state DB schema",new_0_4_7_1:"Real-time streaming display of thinking/reasoning blocks",new_0_4_7_2:"Skip prepare script during Docker build",new_0_4_7_3:"Group chat mobile UX improvements and UI polish",new_0_4_7_4:"Clamp context remaining tokens to 0 instead of negative",new_0_4_7_5:"Add Alibaba Coding Plan builtin provider with .env base_url override",new_0_4_7_6:"Skip remote profiles on startup to prevent hang",new_0_4_7_7:"Detect and surface silently swallowed run errors",new_0_4_7_8:"Provider-aware context length lookup",new_0_4_7_9:"Reset config.model on switch and resolve CLI custom provider",new_0_4_7_10:"Clear base_url_env from .env when deleting builtin provider",new_0_4_7_11:"Align group chat room sidebar background with session list",new_0_4_4_1:"Add file browser with multi-backend support (local/Docker/SSH/Singularity)",new_0_4_4_2:"Add file download from chat message attachments",new_0_4_4_3:"Add live badge on active chat sessions",new_0_4_4_4:"Add StepFun and Nous Portal provider support",new_0_4_4_5:"Fix special character search queries causing 500 error",new_0_4_5_1:"Add group chat with multi-agent rooms, @mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Add token usage tracking, context display, and dynamic context length",new_0_4_2_2:"Add session search modal",new_0_4_2_3:"Restore group chat system with Socket.IO and SQLite persistence",new_0_4_2_4:"Add pinned sessions and live monitor in Chat page",new_0_4_2_5:"Fix builtin provider detection and model matching"}},On={login:{title:"Hermes Web UI",description:"输入访问令牌以继续。令牌在服务端启动日志中查看。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",passwordMismatch:"两次密码不一致",passwordTooShort:"密码长度至少 6 个字符",setupSuccess:"密码登录配置成功",passwordChanged:"密码修改成功",passwordRemoved:"密码登录已移除",setupPassword:"设置密码登录",changePassword:"修改密码",changeUsername:"修改用户名",removePasswordLogin:"移除",username:"用户名",currentPassword:"当前密码",newPassword:"新密码",confirmPassword:"确认密码",newUsername:"新用户名",usernameChanged:"用户名修改成功",usernameTooShort:"用户名至少 2 个字符",setupDescription:"设置用户名和密码以便快速登录。访问令牌仍可继续使用。",removeConfirm:"确定要移除密码登录吗?移除后需要使用访问令牌登录。",passwordLoginNotConfigured:"密码登录未配置",passwordLoginConfigured:"密码登录已启用({username})"},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:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",groupConversation:"对话",groupPlatform:"平台",groupAgent:"代理",groupSystem:"系统",groupMonitoring:"监控",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:"暂无更新日志"},drawer:{terminal:"终端",files:"工作区"},chat:{contextRemaining:"剩余",contextClickToEdit:"点击编辑上下文长度",contextEditTitle:"编辑上下文长度",contextEditDesc:"设置当前模型的上下文长度限制(token 数量)",contextEditPlaceholder:"请输入上下文长度",contextEditHint:"常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"取消",contextEditInvalid:"请输入有效的上下文长度",contextEditSuccess:"上下文长度已更新",contextEditFailed:"更新失败",emptyState:"开始与 Hermes Agent 对话",cliEmptyState:"开始 CLI 对话",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:"会话",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:"助手",copySessionId:"复制会话 ID",export:"导出",exportFull:"全量导出 (JSON)",exportCompressed:"压缩导出 (TXT)",exportCompressing:"正在压缩上下文,请稍候...",exportSuccess:"会话已导出",exportFailed:"导出失败",renamed:"已重命名",renameFailed:"重命名失败",renameSession:"重命名会话",sessionNotFound:"会话未找到",enterNewTitle:"输入新标题",workspace:"工作区",setWorkspace:"设置工作区",setWorkspaceTitle:"设置会话工作区",workspacePlaceholder:"输入项目路径,例如 /home/user/project",workspaceSet:"工作区已设置",workspaceSetFailed:"设置工作区失败",setModel:"设置模型",setModelTitle:"设置会话模型",modelSet:"模型已设置",modelSetFailed:"设置模型失败",other:"其他",runFailed:"运行失败",error:"错误",tool:"工具",arguments:"参数",result:"结果",truncated:"... (已截断)",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:"本地安装"}},plugins:{title:"插件",refresh:"刷新",notice:"只读展示可发现的 Hermes 插件 manifest。发现元数据读取不会加载插件代码。v1 管理动作仍保留在 CLI,新 Hermes 会话生效。",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",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 凭证,点击「添加」即可在 Hermes 中启用 Copilot。",copilotAddSourceEnv:"来源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"来源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"来源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作会清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影响其他工具。",copilotDeleteHintGhCli:"Copilot 将从 Hermes 列表移除。不会影响 gh CLI —— `gh auth status` 仍显示已登录。",copilotDeleteHintAppsJson:"Copilot 将从 Hermes 列表移除。不会影响 VS Code Copilot 插件的登录。",xaiLoginTitle:"xAI Grok OAuth 登录",xaiWaiting:"请在打开的 xAI 页面完成授权。授权完成后窗口会自动关闭。",xaiOpenLink:"打开 xAI 授权页",xaiApproved:"登录成功!",xaiExpired:"授权链接已过期,请重试。",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:"取消全选",builtIn:"内置",customType:"自定义",provider:"Provider",contextLength:"上下文长度",contextLengthPlaceholder:"例如 200000(可选)",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:"切换到",switchConfirm:'切换到配置 "{name}" 将重启网关,是否继续?',switchSuccess:'已切换到配置 "{name}"',switchFailed:"切换配置失败,网关可能需要手动重启",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:"暂无配置,创建一个开始吧。"},logs:{title:"日志",all:"全部",searchPlaceholder:"搜索...",refresh:"刷新",noEntries:"暂无日志"},settings:{title:"设置",saved:"已保存",saveFailed:"保存失败",tabs:{display:"显示",account:"账户",agent:"代理",memory:"记忆",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:"从不"},memory:{enabled:"启用记忆",enabledHint:"允许 AI 记住对话上下文",userProfile:"用户画像",userProfileHint:"允许 AI 记住用户偏好信息",charLimit:"记忆字符上限",charLimitHint:"MEMORY.md 最大字符数",userCharLimit:"用户画像字符上限",userCharLimitHint:"USER.md 最大字符数"},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"},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",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:"例如:用轻快上扬的语调,语速稍快"}},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",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:"该智能体已在房间中",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",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:"跟踪 Hermes 会话中的技能加载和编辑",refresh:"刷新",periodSelector:"技能用量周期",periodLabel:"{days}天",summary:"概览",totalActions:"操作",loads:"加载",edits:"编辑",distinctSkills:"技能数",topSkills:"热门",dailyTrend:"趋势",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暂无技能用量数据",loadFailed:"技能用量加载失败",otherSkills:"其他技能"},files:{title:"文件",fileTree:"文件树",tree:"目录树",list:"文件列表",breadcrumbRoot:"根目录",newFile:"新建文件",newFolder:"新建文件夹",upload:"上传",refresh:"刷新",open:"打开",edit:"编辑",preview:"预览",download:"下载",copyPath:"复制路径",rename:"重命名",delete:"删除",name:"名称",size:"大小",modified:"修改时间",actions:"操作",emptyDir:"空目录",loading:"加载中...",confirmDelete:"确定要删除「{name}」吗?",confirmDeleteDir:"确定要删除目录「{name}」及其所有内容吗?",deleteFailed:"删除失败",deleted:"已删除",renameTo:"重命名为",newFileName:"文件名",newFolderName:"文件夹名",created:"已创建",createFailed:"创建失败",renamed:"已重命名",renameFailed:"重命名失败",uploadSuccess:"已上传 {count} 个文件",uploadFailed:"上传失败",saveFailed:"保存失败",saved:"已保存",unsavedChanges:"有未保存的更改,是否丢弃?",pathCopied:"路径已复制",fileTooLarge:"文件过大(最大 10MB)",permissionDenied:"无法修改受保护的文件",notFound:"文件或目录不存在",backendError:"文件操作失败",dragDropHint:"拖拽文件到此处上传",closeEditor:"关闭编辑器",closePreview:"关闭",saveFile:"保存"},download:{downloading:"正在下载...",downloadFailed:"下载失败",fileNotFound:"文件不存在或已被删除",fileTooLarge:"文件过大(超过限制)",backendError:"文件读取失败,远程环境可能不可用",backendTimeout:"文件读取超时",unsupportedBackend:"当前 terminal backend 暂不支持文件下载",invalidPath:"无效的文件路径",download:"下载",downloadFile:"下载文件"},changelog:{new_0_5_14_1:"新增会话导出功能:支持完整和压缩模式,导出为 JSON 或纯文本",new_0_5_14_2:"修复终端面板启动即连接导致 PTY 资源耗尽的问题,改为懒加载连接",new_0_5_14_3:"修复 WSL2 环境下 IPv6 双栈绑定导致健康检查失败、端口无法访问的问题",new_0_5_14_4:"修复服务关闭时 SQLite 连接未释放导致重启后数据库被锁的问题",new_0_5_14_5:"更新 FUN-Codex/FUN-Claude 模型列表,新增内置标识、API 中转站入口",new_0_5_15_1:"新增看板面板,可视化任务与会话管理",new_0_5_15_2:"新增官网首页与文档站",new_0_5_15_3:"修复群聊 Agent 客户端使用动态端口而非硬编码 8648",new_0_5_15_4:"新增 node-edge-tts 语音模块",new_0_5_15_5:"修复 WSL 默认监听地址绑定问题",new_0_5_15_6:"新增官网首页 SEO 元数据",new_0_5_15_7:"新增基于 IP 的登录暴力破解防护",new_0_5_15_8:"修复 MarkdownRenderer 中下载链接重复包装问题",new_0_5_15_9:"修复 Hermes Markdown 媒体渲染与同步重试",new_0_5_15_10:"重构移除上游环境变量依赖",new_0_5_15_11:"如果看板功能无法使用,请升级 hermes-agent",new_0_5_16_1:"聊天流式接口从 /v1/runs 迁移至 /v1/responses,降低延迟",new_0_5_16_2:"持久化真实 API 用量(token、缓存、推理)到用量统计表",new_0_5_16_3:"官网导航栏新增 QQ 群二维码",new_0_5_16_4:"移除消息 schema 中未使用的 codex_reasoning_items 字段",new_0_5_17_1:"全面兼容 Windows:路径处理、进程管理、终端、日志解析",new_0_5_17_2:"重构 Gateway 进程管理,支持跨平台启动/停止/健康检查",new_0_5_17_3:"修复 Termux 环境下插件发现失败的问题,自动解析 hermes shebang 定位 Python",new_0_5_17_5:"优化认证锁定窗口和开发环境关闭流程",new_0_5_17_4:"YAML 配置解析容忍重复键",new_0_5_17_6:"Comic 主题新增中文(站酷快乐体)、日文(Zen Maru Gothic)、韩文(Gaegu)手写字体",new_0_5_17_7:"新增 Comic/涂鸦主题风格",new_0_5_17_8:"许可证变更为 BSL-1.1",new_0_5_17_9:"新增只读 Hermes 插件页",new_0_5_17_10:"图片上传转为 base64 多模态格式",new_0_5_17_11:"修复 Kanban 看板选择与隔离问题",new_0_5_17_12:"新增语音播放设置,支持 4 种 TTS 提供商",new_0_5_17_13:"降低上下文压缩提示阈值从 200 到 150",new_0_5_17_14:"修复 Web UI 自更新重启逻辑",new_0_5_17_15:"修复 opencode-zen 和 opencode-go 共享环境变量导致配置联动",new_0_5_17_16:"新增繁体中文(zh-TW)语言支持",new_0_5_17_17:"模型页支持在 Web UI 里管理可见模型",new_0_5_17_18:"Kanban:补齐任务操作链路(评论、日志、分配、派发),明确能力边界",new_0_5_17_19:"修复删除 Provider 时未清除认证条目",new_0_5_17_20:"修复 Codex credential-pool 认证识别",new_0_5_17_21:"Edge TTS 新增语速/音调调节",new_0_5_17_22:"config.yaml 重复键不再导致解析崩溃",new_0_5_17_23:"Gateway 端口所有权检查改为基于 PID 文件,防止跨 Profile 端口占用",new_0_5_17_24:"历史页面现在显示 Cron 会话记录",new_0_5_17_25:"修复收起侧边栏时语言切换和主题图标挤压问题",new_0_5_18_1:"新增技能使用情况监控页面,支持每日趋势图和热门技能统计",new_0_5_18_2:"新增 CLI 聊天会话桥接,通过 Python Agent Bridge 实现 WebSocket 会话",new_0_5_18_3:"新增 Ollama Cloud 供应商预设,支持动态模型目录",new_0_5_18_4:"支持模型显示名重命名(别名)",new_0_5_18_5:"支持在 Web UI 中管理模型可见性",new_0_5_18_6:"增强使用量分析仪表盘",new_0_5_18_7:"Docker 单容器部署,更新 docker-compose 配置并修复 gateway 启动问题",new_0_5_18_8:"修复插件页面非默认 profile 下 HERMES_HOME fallback 警告",new_0_5_18_9:"修复 dev 模式重启时网关稳定性,改善 Windows 兼容性",new_0_5_22_1:"修复 Hermes 会话列表接口错误读取 Web UI 本地会话库的问题",new_0_5_23_1:"新增仅 Bridge 会话可用的聊天斜杠命令,并支持本地化命令提示",new_0_5_23_2:"持久化命令历史用于会话回显,同时避免污染模型上下文、用量统计和压缩",new_0_5_23_3:"隔离 gateway profile 环境变量,防止凭据在不同 profile 之间串用",new_0_5_23_4:"gateway 分配端口时保留 Web UI 端口,避免启动端口冲突",new_0_5_23_5:"修复自更新重启逻辑,避免将 restart helper 的成功退出误报为失败",new_0_5_24_1:"对齐 Bridge 聊天与 API Server 的多模态输入、系统提示词和工作区上下文处理",new_0_5_25_1:"新增群聊房间重置和克隆操作",new_0_5_25_2:"支持配置 Web UI 状态目录,方便自定义部署目录结构",new_0_5_25_3:"语音设置新增 MiMo TTS 提供商",new_0_5_25_4:"自定义 Provider 模型列表改由后端代理请求,避免浏览器跨域失败",new_0_5_25_5:"修复 Bridge 会话的工具授权流程",new_0_5_25_6:"移除 Bridge 强制注入的 CLI 平台提示,保留用户自定义媒体和文件输出规则",new_0_5_25_7:"用户消息历史支持正确展示 base64 图片内容",new_0_5_25_8:"新增 Playwright 浏览器测试、聊天流式契约覆盖、Provider 模型测试和覆盖率基线",new_0_5_26_1:"聊天历史和 Markdown 渲染支持 Windows 与本地媒体路径",new_0_5_26_2:"过滤空 Assistant 历史消息,并在新运行开始时清理旧的压缩状态",new_0_5_26_3:"配置与 Profile 写入新增文件锁,降低并发写入导致配置损坏的风险",new_0_5_26_4:"新增 QQBot 与钉钉频道设置",new_0_5_26_5:"CLI 端口检测改为跨平台实现,并优化移动端终端抽屉尺寸",new_0_5_26_6:"隔离 Bridge Profile 环境,并修复不同 Python 环境下的 Hermes 插件发现",new_0_5_26_7:"Gateway 停止状态新增 Web UI 诊断说明,并保持日志加载状态稳定",new_0_5_26_8:"修复会话重置模式选项、自定义 Provider Base URL 处理和动态投递目标",new_0_5_26_9:"聊天输入栏新增本地保存的工具调用记录显示开关",new_0_5_26_10:"支持未找到源码目录时使用包安装的 Hermes Agent",new_0_5_26_11:"新增 xAI Grok OAuth 登录,支持 SuperGrok 订阅用户授权,并更新 Grok 模型预设",new_0_5_26_12:"扩展浏览器、聊天流式、Provider、Gateway、配置、插件和 Bridge 测试覆盖",new_0_5_27_1:"新增 Bridge 会话级模型设置,每个会话可以独立保存 provider 和 model",new_0_5_27_2:"在 Bridge 会话列表中右键会话,选择“设置模型”即可为当前会话切换模型",new_0_5_27_3:"运行时会自动校验会话模型是否可用;不可用时回退到当前默认模型并更新会话",new_0_5_27_4:"上下文压缩默认跟随当前 Profile 的默认选中模型",new_0_5_6_1:"新增语音播放功能:使用 Web Speech API,支持手动播放按钮、自动播放开关、彩虹边框动画和移动端优化",new_0_5_6_2:"新增健壮的 LLM JSON 解析器,兼容 Python 格式并从流式事件中提取文本",new_0_5_6_3:"Skills 功能增强:使用统计、来源过滤、归档技能、来源追溯和置顶切换",new_0_5_6_4:"扩展每日使用统计,包含详细的 token 细分,分离缓存读/写统计",new_0_5_6_5:"优化会话历史范围说明,改进聊天和历史视图的描述",new_0_5_6_6:"重新设计附件处理,采用 Anthropic 风格的 ContentBlock 数组格式,支持类型区分(文本、图片、文件)",new_0_5_6_7:"新增前端文件下载功能,支持 ContentBlock 和 Markdown 两种格式,带身份验证",new_0_5_6_8:"修复多进程冲突导致的 SQLite 数据库重置问题,清理冗余 nodemon 进程",new_0_5_5_1:"🎉 五一劳动节快乐!这个劳动节就不劳动啦,如果有问题大家忍忍",new_0_5_5_2:"新增历史页面,用于浏览 Hermes 会话历史记录",new_0_5_5_3:"历史页面独立管理会话状态,不影响当前聊天页面的活动会话",new_0_5_5_4:"历史页面默认自动加载并选中第一个 CLI 类型的会话",new_0_5_5_5:"新增 HistoryMessageList 组件,支持通过 props 注入会话数据",new_0_5_5_6:"过滤空内容消息和无 toolName 的 tool 消息,提升历史记录显示质量",new_0_5_5_7:"移除 localStorage 会话缓存,所有会话数据改为直接从后端获取",new_0_5_5_8:"优化 profile 切换逻辑,移除废弃的缓存清理调用",new_0_5_4_1:"修复并发聊天会话事件串扰问题,重构 WebSocket 事件路由机制",new_0_5_4_2:"修复 cron job 编辑 payload,支持长提示词的仅名称编辑",new_0_5_4_3:"修复 Docker 部署后 Web 终端无法使用 Hermes CLI 的问题",new_0_5_4_4:"添加工作区对话框标题 i18n 翻译,改进会话持久化",new_0_5_4_5:"支持代码块复制反馈,显示用户通知",new_0_5_4_6:"对齐使用分析与 Hermes 状态数据库架构",new_0_4_8_2:"修复嵌套 Markdown 代码块导致渲染截断",new_0_4_8_3:"修复压缩续接会话投影和搜索问题",new_0_4_8_4:"优化会话列表 N+1 查询,修复非 CJK 搜索 500 错误",new_0_4_8_5:"修复切换标签页返回时强制滚动到底部",new_0_4_8_6:"切换会话时添加加载过渡动画",new_0_4_8_7:"修复登录 Token 验证使用正确的会话端点",new_0_4_8_8:"修复刷新页面后图片附件失效问题",new_0_4_8_9:"点击图片附件可全屏预览",new_0_4_8_10:"上传目录从临时目录迁移到 ~/.hermes-web-ui/upload",new_0_4_7_1:"实时流式显示思考/推理过程",new_0_4_7_2:"Docker 构建时跳过 prepare 脚本",new_0_4_7_3:"群聊移动端体验改进和 UI 优化",new_0_4_7_4:"将剩余上下文 Token 数限制为 0 而非负数",new_0_4_7_5:"新增阿里云编码计划内置 Provider,支持 .env base_url 覆盖",new_0_4_7_6:"启动时跳过远程配置文件以防止卡住",new_0_4_7_7:"检测并展示被静默吞没的运行错误",new_0_4_7_8:"Provider 感知的上下文长度查询",new_0_4_7_9:"切换时重置 config.model 并解析 CLI 自定义 Provider",new_0_4_7_10:"删除内置 Provider 时清除 .env 中的 base_url_env",new_0_4_7_11:"对齐群聊房间侧边栏背景与会话列表",new_0_4_4_1:"新增文件浏览器,支持多后端(本地/Docker/SSH/Singularity)",new_0_4_4_2:"新增聊天消息附件文件下载",new_0_4_4_3:"活跃会话显示实时状态标签",new_0_4_4_4:"新增 StepFun 和 Nous Portal Provider 支持",new_0_4_4_5:"修复特殊字符搜索导致 500 错误",new_0_4_5_1:"新增群聊功能,支持多 Agent 房间、提及路由和输入状态恢复",new_0_4_5_2:"使用 YAML 重写模型上下文配置,新增 context_length 设置",new_0_4_5_3:"新增 gpt-5.5 到 OpenAI Codex 模型列表",new_0_4_5_4:"用本地控制器替换任务代理,优化模型加载",new_0_4_5_5:"ModelSelector 自定义模型功能新增 i18n 支持",new_0_4_5_6:"修复侧边栏 i18n 缺失 key 警告",new_0_4_5_7:"退出登录时清除所有 localStorage",new_0_4_5_8:"新增日志定期轮转,防止日志无限增长",new_0_4_2_1:"新增 Token 用量追踪、上下文显示和动态上下文长度",new_0_4_2_2:"新增会话搜索弹窗",new_0_4_2_3:"恢复群聊系统(Socket.IO + SQLite 持久化)",new_0_4_2_4:"Chat 页面新增固定会话和实时监控",new_0_4_2_5:"修复内置 Provider 检测和模型匹配问题"}},jn={login:{title:"Hermes Web UI",description:"輸入存取權杖以繼續。權杖可在伺服器啟動日誌中查看。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",passwordMismatch:"兩次密碼不一致",passwordTooShort:"密碼長度至少 6 個字元",setupSuccess:"密碼登入設定成功",passwordChanged:"密碼修改成功",passwordRemoved:"密碼登入已移除",setupPassword:"設定密碼登入",changePassword:"修改密碼",changeUsername:"修改使用者名稱",removePasswordLogin:"移除",username:"使用者名稱",currentPassword:"目前密碼",newPassword:"新密碼",confirmPassword:"確認密碼",newUsername:"新使用者名稱",usernameChanged:"使用者名稱修改成功",usernameTooShort:"使用者名稱至少 2 個字元",setupDescription:"設定使用者名稱和密碼以便快速登入。存取權杖仍可繼續使用。",removeConfirm:"確定要移除密碼登入嗎?移除後需使用存取權杖登入。",passwordLoginNotConfigured:"密碼登入未設定",passwordLoginConfigured:"密碼登入已啟用({username})"},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:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",groupConversation:"對話",groupPlatform:"平台",groupAgent:"代理",groupSystem:"系統",groupMonitoring:"監控",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:"目前無更新日誌"},drawer:{terminal:"終端機",files:"工作區"},chat:{contextRemaining:"剩餘",contextClickToEdit:"點擊編輯上下文長度",contextEditTitle:"編輯上下文長度",contextEditDesc:"設定目前模型的上下文長度限制(token 數量)",contextEditPlaceholder:"請輸入上下文長度",contextEditHint:"常見值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"儲存",contextEditCancel:"取消",contextEditInvalid:"請輸入有效的上下文長度",contextEditSuccess:"上下文長度已更新",contextEditFailed:"更新失敗",emptyState:"開始與 Hermes Agent 對話",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:"工作階段",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:"拒絕",deleteSession:"確定刪除此工作階段?",sessionDeleted:"工作階段已刪除",toggleBatchMode:"批次選取",selectAll:"全選",confirmBatchDelete:"確定刪除選取的 {count} 個工作階段?",batchDeleteSuccess:"已刪除 {count} 個工作階段",batchDeletePartial:"{failed} 個工作階段刪除失敗",batchDeleteFailed:"批次刪除失敗",rename:"重新命名",pin:"釘選",unpin:"取消釘選",pinned:"已釘選",chatMode:"聊天",liveMode:"即時",liveSessions:"即時工作階段",recentBadge:"最近",linkedSessions:"關聯 {count} 個工作階段",noVisibleMessages:"沒有人類可見訊息。",monitorRoleUser:"使用者",monitorRoleAssistant:"助手",copySessionId:"複製工作階段 ID",export:"匯出",exportFull:"完整匯出 (JSON)",exportCompressed:"壓縮匯出 (TXT)",exportCompressing:"正在壓縮上下文,請稍候...",exportSuccess:"工作階段已匯出",exportFailed:"匯出失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",renameSession:"重新命名工作階段",sessionNotFound:"找不到工作階段",enterNewTitle:"輸入新標題",workspace:"工作區",setWorkspace:"設定工作區",setWorkspaceTitle:"設定工作階段工作區",workspacePlaceholder:"輸入專案路徑,例如 /home/user/project",workspaceSet:"工作區已設定",workspaceSetFailed:"設定工作區失敗",other:"其他",runFailed:"執行失敗",error:"錯誤",tool:"工具",arguments:"參數",result:"結果",truncated:"... (已截斷)",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 插件 manifest。發現元資料讀取不會載入插件程式碼。v1 管理動作仍保留在 CLI,新 Hermes 工作階段生效。",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",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 憑證,點擊「新增」即可在 Hermes 中啟用 Copilot。",copilotAddSourceEnv:"來源:~/.hermes/.env(COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"來源:gh CLI(gh auth token)",copilotAddSourceAppsJson:"來源:VS Code Copilot 插件(apps.json)",copilotDeleteHintEnv:"此操作會清除 ~/.hermes/.env 中的 COPILOT_GITHUB_TOKEN,不影響其他工具。",copilotDeleteHintGhCli:"Copilot 將從 Hermes 清單移除。不會影響 gh CLI —— `gh auth status` 仍顯示已登入。",copilotDeleteHintAppsJson:"Copilot 將從 Hermes 清單移除。不會影響 VS Code Copilot 插件的登入。",customBadge:"自訂",previewBadge:"預覽",disabledBadge:"不可用",disabledTooltip:"此模型目前帳號不可用",customModelPlaceholder:"自訂模型名稱",customModelHint:"按 Enter 載入",removeCustomModel:"移除這個未列出的模型",noProviders:"目前無 Provider,新增一個開始吧。",models:"模型清單",count:"個模型",more:"個更多",builtIn:"內建",customType:"自訂",provider:"Provider",contextLength:"上下文長度",contextLengthPlaceholder:"例如 200000(選填)",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:"取消全選",aliasEdit:"重新命名",aliasTitle:"模型顯示名",aliasTitleFor:"{model} 的顯示名",aliasPlaceholder:"留空則使用原始模型 ID",aliasHint:"僅修改 Web UI 顯示名,傳送給 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢復原始 ID",aliasManage:"顯示名",aliasManageFor:"{provider} 的顯示名",aliasSaveFailed:"儲存顯示名失敗",visibilitySelectOne:"至少保留一個可見模型"},profiles:{title:"設定檔",create:"建立設定檔",import:"匯入",export:"匯出",rename:"重新命名",delete:"刪除",switchTo:"切換至",switchConfirm:"切換至設定檔「{name}」將重新啟動閘道,是否繼續?",switchSuccess:"已切換至設定檔「{name}」",switchFailed:"切換設定檔失敗,閘道可能需要手動重新啟動",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:"目前無設定檔,建立一個開始吧。"},logs:{title:"日誌",all:"全部",searchPlaceholder:"搜尋...",refresh:"重新整理",noEntries:"目前無日誌"},settings:{title:"設定",saved:"已儲存",saveFailed:"儲存失敗",tabs:{display:"顯示",account:"帳號",agent:"代理",memory:"記憶",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:"從不"},memory:{enabled:"啟用記憶",enabledHint:"允許 AI 記住對話上下文",userProfile:"使用者畫像",userProfileHint:"允許 AI 記住使用者偏好資訊",charLimit:"記憶字元上限",charLimitHint:"MEMORY.md 最大字元數",userCharLimit:"使用者畫像字元上限",userCharLimitHint:"USER.md 最大字元數"},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"},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",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:"例如:用輕快上揚的語調,語速稍快"}},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",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:"該智慧代理已在房間中",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",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:"追蹤 Hermes 工作階段中的技能載入與編輯",refresh:"重新整理",periodSelector:"技能用量期間",periodLabel:"{days}天",summary:"總覽",totalActions:"操作",loads:"載入",edits:"編輯",distinctSkills:"技能數",topSkills:"熱門",dailyTrend:"趨勢",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暫無技能用量資料",loadFailed:"技能用量載入失敗",otherSkills:"其他技能"},files:{title:"檔案",fileTree:"檔案樹",tree:"目錄樹",list:"檔案清單",breadcrumbRoot:"根目錄",newFile:"新增檔案",newFolder:"新增資料夾",upload:"上傳",refresh:"重新整理",open:"開啟",edit:"編輯",preview:"預覽",download:"下載",copyPath:"複製路徑",rename:"重新命名",delete:"刪除",name:"名稱",size:"大小",modified:"修改時間",actions:"操作",emptyDir:"空目錄",loading:"載入中...",confirmDelete:"確定要刪除「{name}」嗎?",confirmDeleteDir:"確定要刪除目錄「{name}」及其所有內容嗎?",deleteFailed:"刪除失敗",deleted:"已刪除",renameTo:"重新命名為",newFileName:"檔案名稱",newFolderName:"資料夾名稱",created:"已建立",createFailed:"建立失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",uploadSuccess:"已上傳 {count} 個檔案",uploadFailed:"上傳失敗",saveFailed:"儲存失敗",saved:"已儲存",unsavedChanges:"有未儲存的變更,是否捨棄?",pathCopied:"路徑已複製",fileTooLarge:"檔案過大(最大 10MB)",permissionDenied:"無法修改受保護的檔案",notFound:"檔案或目錄不存在",backendError:"檔案操作失敗",dragDropHint:"拖曳檔案至此處上傳",closeEditor:"關閉編輯器",closePreview:"關閉",saveFile:"儲存"},download:{downloading:"正在下載...",downloadFailed:"下載失敗",fileNotFound:"檔案不存在或已被刪除",fileTooLarge:"檔案過大(超過限制)",backendError:"檔案讀取失敗,遠端環境可能不可用",backendTimeout:"檔案讀取逾時",unsupportedBackend:"目前 terminal backend 暫不支援檔案下載",invalidPath:"無效的檔案路徑",download:"下載",downloadFile:"下載檔案"},changelog:{new_0_5_14_1:"新增工作階段匯出功能:支援完整和壓縮模式,匯出為 JSON 或純文字",new_0_5_14_2:"修復終端機面板啟動即連線導致 PTY 資源耗盡的問題,改為延遲載入連線",new_0_5_14_3:"修復 WSL2 環境下 IPv6 雙堆疊綁定導致健康檢查失敗、連接埠無法存取的問題",new_0_5_14_4:"修復服務關閉時 SQLite 連線未釋放導致重啟後資料庫被鎖的問題",new_0_5_14_5:"更新 FUN-Codex/FUN-Claude 模型清單,新增內建標識、API 中轉站入口",new_0_5_15_1:"新增看板面板,視覺化任務與工作階段管理",new_0_5_15_2:"新增官網首頁與文件站",new_0_5_15_3:"修復群聊 Agent 客戶端使用動態連接埠而非硬式編碼 8648",new_0_5_15_4:"新增 node-edge-tts 語音模組",new_0_5_15_5:"修復 WSL 預設監聽位址綁定問題",new_0_5_15_6:"新增官網首頁 SEO 元資料",new_0_5_15_7:"新增基於 IP 的登入暴力破解防護",new_0_5_15_8:"修復 MarkdownRenderer 中下載連結重複包裝問題",new_0_5_15_9:"修復 Hermes Markdown 媒體渲染與同步重試",new_0_5_15_10:"重構移除上游環境變數依賴",new_0_5_15_11:"如果看板功能無法使用,請升級 hermes-agent",new_0_5_16_1:"聊天串流介面從 /v1/runs 遷移至 /v1/responses,降低延遲",new_0_5_16_2:"持久化真實 API 用量(token、快取、推理)到用量統計表",new_0_5_16_3:"官網導覽列新增 QQ 群 QR Code",new_0_5_16_4:"移除訊息 schema 中未使用的 codex_reasoning_items 欄位",new_0_5_17_1:"全面相容 Windows:路徑處理、程序管理、終端機、日誌解析",new_0_5_17_2:"重構 Gateway 程序管理,支援跨平台啟動/停止/健康檢查",new_0_5_17_3:"修復 Termux 環境下外掛發現失敗的問題,自動解析 hermes shebang 定位 Python",new_0_5_17_4:"YAML 配置解析容忍重複鍵",new_0_5_17_5:"最佳化認證鎖定視窗和開發環境關閉流程",new_0_5_17_6:"Comic 佈景主題新增中文(站酷快樂體)、日文(Zen Maru Gothic)、韓文(Gaegu)手寫字體",new_0_5_17_7:"新增 Comic/塗鴉佈景主題風格",new_0_5_17_8:"授權條款變更為 BSL-1.1",new_0_5_17_9:"新增唯讀 Hermes 外掛頁",new_0_5_17_10:"圖片上傳轉為 base64 多模態格式",new_0_5_17_11:"修復 Kanban 看板選擇與隔離問題",new_0_5_17_12:"新增語音播放設定,支援 4 種 TTS 提供商",new_0_5_17_13:"降低上下文壓縮提示閾值從 200 到 150",new_0_5_17_14:"修復 Web UI 自更新重啟邏輯",new_0_5_17_15:"修復 opencode-zen 和 opencode-go 共享環境變數導致配置聯動",new_0_5_17_16:"新增繁體中文(zh-TW)語言支援",new_0_5_17_17:"模型頁支援在 Web UI 裡管理可見模型",new_0_5_17_18:"Kanban:補齊任務操作鏈路(評論、日誌、分配、派發),明確能力邊界",new_0_5_17_19:"修復刪除 Provider 時未清除認證條目",new_0_5_17_20:"修復 Codex credential-pool 認證識別",new_0_5_17_21:"Edge TTS 新增語速/音調調節",new_0_5_17_22:"config.yaml 重複鍵不再導致解析崩潰",new_0_5_17_23:"Gateway 連接埠所有權檢查改為基於 PID 檔案,防止跨 Profile 連接埠佔用",new_0_5_17_24:"歷史頁面現在顯示 Cron 工作階段記錄",new_0_5_17_25:"修復收起側邊欄時語言切換和佈景主題圖示擠壓問題",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"修復 Hermes 會話列表介面錯誤讀取 Web UI 本地會話庫的問題",new_0_5_23_1:"新增僅 Bridge 會話可用的聊天斜線命令,並支援本地化命令提示",new_0_5_23_2:"持久化命令歷史用於會話回顯,同時避免污染模型上下文、用量統計和壓縮",new_0_5_23_3:"隔離 gateway profile 環境變數,防止憑證在不同 profile 之間串用",new_0_5_23_4:"gateway 分配連接埠時保留 Web UI 連接埠,避免啟動連接埠衝突",new_0_5_23_5:"修復自更新重啟邏輯,避免將 restart helper 的成功退出誤報為失敗",new_0_5_24_1:"對齊 Bridge 聊天與 API Server 的多模態輸入、系統提示詞和工作區上下文處理",new_0_5_25_1:"新增群聊房間重設和複製操作",new_0_5_25_2:"支援設定 Web UI 狀態目錄,方便自訂部署目錄結構",new_0_5_25_3:"語音設定新增 MiMo TTS 提供商",new_0_5_25_4:"自訂 Provider 模型清單改由後端代理請求,避免瀏覽器跨域失敗",new_0_5_25_5:"修復 Bridge 工作階段的工具授權流程",new_0_5_25_6:"移除 Bridge 強制注入的 CLI 平台提示,保留使用者自訂媒體和檔案輸出規則",new_0_5_25_7:"使用者訊息歷史支援正確展示 base64 圖片內容",new_0_5_25_8:"新增 Playwright 瀏覽器測試、聊天串流契約覆蓋、Provider 模型測試和覆蓋率基線",new_0_5_26_1:"聊天歷史和 Markdown 渲染支援 Windows 與本機媒體路徑",new_0_5_26_2:"過濾空 Assistant 歷史訊息,並在新執行開始時清理舊的壓縮狀態",new_0_5_26_3:"設定與 Profile 寫入新增檔案鎖,降低並發寫入導致設定損壞的風險",new_0_5_26_4:"新增 QQBot 與釘釘頻道設定",new_0_5_26_5:"CLI 連接埠偵測改為跨平台實作,並最佳化行動端終端機抽屜尺寸",new_0_5_26_6:"隔離 Bridge Profile 環境,並修復不同 Python 環境下的 Hermes 外掛發現",new_0_5_26_7:"Gateway 停止狀態新增 Web UI 診斷說明,並保持日誌載入狀態穩定",new_0_5_26_8:"修復工作階段重設模式選項、自訂 Provider Base URL 處理和動態投遞目標",new_0_5_26_9:"聊天輸入列新增本機保存的工具呼叫記錄顯示開關",new_0_5_26_10:"支援未找到原始碼目錄時使用套件安裝的 Hermes Agent",new_0_5_26_11:"新增 xAI Grok OAuth 登入,支援 SuperGrok 訂閱使用者授權,並更新 Grok 模型預設",new_0_5_26_12:"擴展瀏覽器、聊天串流、Provider、Gateway、設定、外掛和 Bridge 測試覆蓋",new_0_5_27_1:"新增 Bridge 工作階段級模型設定,每個工作階段可獨立保存 provider 和 model",new_0_5_27_2:"在 Bridge 工作階段列表中右鍵工作階段,選擇「設定模型」即可為目前工作階段切換模型",new_0_5_27_3:"執行時會自動校驗工作階段模型是否可用;不可用時回退到目前預設模型並更新工作階段",new_0_5_27_4:"上下文壓縮預設跟隨目前 Profile 的預設選中模型",new_0_5_6_1:"新增語音播放功能:使用 Web Speech API,支援手動播放按鈕、自動播放開關、彩虹邊框動畫和行動端最佳化",new_0_5_6_2:"新增強健的 LLM JSON 解析器,相容 Python 格式並從串流事件中擷取文字",new_0_5_6_3:"Skills 功能增強:使用統計、來源過濾、封存技能、來源追溯和釘選切換",new_0_5_6_4:"擴展每日使用統計,包含詳細的 token 細分,分離快取讀/寫統計",new_0_5_6_5:"最佳化工作階段歷史範圍說明,改進聊天和歷史視圖的描述",new_0_5_6_6:"重新設計附件處理,採用 Anthropic 風格的 ContentBlock 陣列格式,支援類型區分(文字、圖片、檔案)",new_0_5_6_7:"新增前端檔案下載功能,支援 ContentBlock 和 Markdown 兩種格式,附身份驗證",new_0_5_6_8:"修復多程序衝突導致的 SQLite 資料庫重設問題,清理冗餘 nodemon 程序",new_0_5_5_1:"🎉 勞動節快樂!祝大家勞動愉快",new_0_5_5_2:"新增歷史頁面,用於瀏覽 Hermes 工作階段歷史記錄",new_0_5_5_3:"歷史頁面獨立管理工作階段狀態,不影響目前聊天頁面的使用中工作階段",new_0_5_5_4:"歷史頁面預設自動載入並選取第一個 CLI 類型的工作階段",new_0_5_5_5:"新增 HistoryMessageList 元件,支援透過 props 注入工作階段資料",new_0_5_5_6:"過濾空內容訊息和無 toolName 的 tool 訊息,提升歷史記錄顯示品質",new_0_5_5_7:"移除 localStorage 工作階段快取,所有工作階段資料改為直接從後端取得",new_0_5_5_8:"最佳化 profile 切換邏輯,移除已棄用的快取清理呼叫",new_0_5_4_1:"修復並發聊天工作階段事件串擾問題,重構 WebSocket 事件路由機制",new_0_5_4_2:"修復 cron job 編輯 payload,支援長提示詞的僅名稱編輯",new_0_5_4_3:"修復 Docker 部署後 Web 終端機無法使用 Hermes CLI 的問題",new_0_5_4_4:"新增工作區對話框標題 i18n 翻譯,改進工作階段持久化",new_0_5_4_5:"支援程式碼區塊複製回饋,顯示使用者通知",new_0_5_4_6:"對齊使用分析與 Hermes 狀態資料庫架構",new_0_4_8_2:"修復巢狀 Markdown 程式碼區塊導致渲染截斷",new_0_4_8_3:"修復壓縮續接工作階段投影和搜尋問題",new_0_4_8_4:"最佳化工作階段清單 N+1 查詢,修復非 CJK 搜尋 500 錯誤",new_0_4_8_5:"修復切換標籤頁返回時強制捲動到底部",new_0_4_8_6:"切換工作階段時新增載入過渡動畫",new_0_4_8_7:"修復登入 Token 驗證使用正確的工作階段端點",new_0_4_8_8:"修復重新整理頁面後圖片附件失效問題",new_0_4_8_9:"點擊圖片附件可全螢幕預覽",new_0_4_8_10:"上傳目錄從暫存目錄遷移到 ~/.hermes-web-ui/upload",new_0_4_7_1:"即時串流顯示思考/推理過程",new_0_4_7_2:"Docker 建置時跳過 prepare 指令碼",new_0_4_7_3:"群聊行動端體驗改進和 UI 最佳化",new_0_4_7_4:"將剩餘上下文 Token 數限制為 0 而非負數",new_0_4_7_5:"新增阿里雲編碼計畫內建 Provider,支援 .env base_url 覆蓋",new_0_4_7_6:"啟動時跳過遠端設定檔以防止卡住",new_0_4_7_7:"偵測並展示被靜默吞沒的執行錯誤",new_0_4_7_8:"Provider 感知的上下文長度查詢",new_0_4_7_9:"切換時重設 config.model 並解析 CLI 自訂 Provider",new_0_4_7_10:"刪除內建 Provider 時清除 .env 中的 base_url_env",new_0_4_7_11:"對齊群聊房間側邊欄背景與工作階段清單",new_0_4_4_1:"新增檔案瀏覽器,支援多後端(本地/Docker/SSH/Singularity)",new_0_4_4_2:"新增聊天訊息附件檔案下載",new_0_4_4_3:"使用中工作階段顯示即時狀態標籤",new_0_4_4_4:"新增 StepFun 和 Nous Portal Provider 支援",new_0_4_4_5:"修復特殊字元搜尋導致 500 錯誤",new_0_4_5_1:"新增群聊功能,支援多 Agent 房間、提及路由和輸入狀態恢復",new_0_4_5_2:"使用 YAML 重寫模型上下文設定,新增 context_length 設定",new_0_4_5_3:"新增 gpt-5.5 到 OpenAI Codex 模型清單",new_0_4_5_4:"用本地控制器替換任務代理,最佳化模型載入",new_0_4_5_5:"ModelSelector 自訂模型功能新增 i18n 支援",new_0_4_5_6:"修復側邊欄 i18n 缺失 key 警告",new_0_4_5_7:"登出時清除所有 localStorage",new_0_4_5_8:"新增日誌定期輪替,防止日誌無限增長",new_0_4_2_1:"新增 Token 用量追蹤、上下文顯示和動態上下文長度",new_0_4_2_2:"新增工作階段搜尋彈窗",new_0_4_2_3:"恢復群聊系統(Socket.IO + SQLite 持久化)",new_0_4_2_4:"Chat 頁面新增釘選工作階段和即時監控",new_0_4_2_5:"修復內建 Provider 偵測和模型匹配問題"}},Wn={login:{title:"Hermes Web UI",description:"アクセストークンを入力して続行してください。サーバーの起動ログで確認できます。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",passwordMismatch:"パスワードが一致しません",passwordTooShort:"パスワードは6文字以上必要です",setupSuccess:"パスワードログインが設定されました",passwordChanged:"パスワードが変更されました",passwordRemoved:"パスワードログインが削除されました",setupPassword:"パスワードログインを設定",changePassword:"パスワードを変更",changeUsername:"ユーザー名を変更",removePasswordLogin:"削除",username:"ユーザー名",currentPassword:"現在のパスワード",newPassword:"新しいパスワード",confirmPassword:"パスワード確認",newUsername:"新しいユーザー名",usernameChanged:"ユーザー名が変更されました",usernameTooShort:"ユーザー名は2文字以上必要です",setupDescription:"ユーザー名とパスワードを設定して、簡単にログインできるようにします。アクセストークンは引き続きバックアップとして使用できます。",removeConfirm:"パスワードログインを削除しますか?アクセストークンを使用してログインする必要があります。",passwordLoginNotConfigured:"パスワードログイン未設定",passwordLoginConfigured:"パスワードログイン有効({username})"},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:"折りたたむ"},sidebar:{chat:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",groupChat:"グループチャット",groupConversation:"会話",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:'ターミナルで "hermes-web-ui update" を実行して更新してください',updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません"},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 と会話を開始しましょう",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",clear:"現在の表示をクリア",clearHistory:"このセッションの保存済みメッセージ履歴を削除",title:"このセッション名を変更",compress:"アイドル時にコンテキスト圧縮を実行",steer:"実行中の Bridge に誘導テキストを送信",destroy:"このセッションの Bridge Agent を解放"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"Hermes 履歴",historyScopeHint:"ソース別にグループ化された Hermes 履歴セッションを読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",approvalKicker:"ターミナル権限",approvalTitle:"実行前にコマンドを確認",approvalAllowOnce:"一度だけ許可",approvalAllowSession:"セッション中は許可",approvalAlways:"常に許可",approvalDeny:"拒否",deleteSession:"このセッションを削除しますか?",toggleBatchMode:"一括選択",selectAll:"すべて選択",confirmBatchDelete:"{count}件のセッションを削除しますか?",batchDeleteSuccess:"{count}件のセッションを削除しました",batchDeletePartial:"{failed}件の削除に失敗しました",batchDeleteFailed:"一括削除に失敗しました",sessionDeleted:"セッションを削除しました",rename:"名前変更",pin:"ピン留め",unpin:"ピン留め解除",pinned:"ピン留め",chatMode:"チャット",liveMode:"ライブ",liveSessions:"ライブセッション",recentBadge:"最近",linkedSessions:"{count} 件の関連",noVisibleMessages:"人間向けに表示できるメッセージはありません。",monitorRoleUser:"ユーザー",monitorRoleAssistant:"アシスタント",copySessionId:"セッション ID をコピー",export:"エクスポート",exportFull:"フルエクスポート (JSON)",exportCompressed:"圧縮エクスポート (TXT)",exportCompressing:"コンテキストを圧縮中、お待ちください...",exportSuccess:"セッションをエクスポートしました",exportFailed:"エクスポートに失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",truncated:"... (省略)",executionDuration:"Execution time",thinkingLabel:"思考過程",thinkingInProgress:"思考中…",thinkingShow:"思考過程を表示",thinkingHide:"思考過程を隠す",thinkingDuration:"観測 {duration}",thinkingChars:"{count} 文字",copyBubble:"メッセージをコピー",copiedBubble:"コピーしました",copyFailed:"コピーに失敗しました",playSpeech:"音声を読み上げ",pauseSpeech:"一時停止",resumeSpeech:"再開",stopSpeech:"停止",speechNotSupported:"このブラウザは音声読み上げをサポートしていません"},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:"ローカル"}},plugins:{title:"プラグイン",refresh:"更新",notice:"検出可能な Hermes プラグイン manifest の読み取り専用インベントリです。検出メタデータはプラグインコードを読み込まずに取得します。v1 の管理操作は CLI のままで、変更は新しい Hermes セッションで有効になります。",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:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"プロジェクトプラグイン"}},memory:{title:"メモリ",refresh:"更新",loadFailed:"メモリの読み込みに失敗しました",myNotes:"メモ",noNotes:"メモはまだありません。",notesPlaceholder:"メモを入力...",userProfile:"ユーザープロファイル",noProfile:"プロファイルはまだありません。",profilePlaceholder:"プロファイルを入力...",soul:"ソウル",noSoul:"ソウル設定はまだありません。",soulPlaceholder:"ソウル設定を入力..."},models:{title:"モデル",addProvider:"プロバイダーを追加",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 トークンを検出しました。「追加」をクリックして Hermes で Copilot を有効化します。",copilotAddSourceEnv:"ソース: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"ソース: gh CLI (gh auth token)",copilotAddSourceAppsJson:"ソース: VS Code Copilot 拡張機能 (apps.json)",copilotDeleteHintEnv:"この操作で ~/.hermes/.env の COPILOT_GITHUB_TOKEN を消去します。他のツールには影響しません。",copilotDeleteHintGhCli:"Copilot は Hermes 上で非表示になります。gh CLI のログインには影響しません — `gh auth status` は引き続きログイン状態を表示します。",copilotDeleteHintAppsJson:"Copilot は Hermes 上で非表示になります。VS Code Copilot 拡張機能のログインには影響しません。",customBadge:"カスタム",previewBadge:"プレビュー",disabledBadge:"利用不可",disabledTooltip:"このモデルは現在のアカウントでは利用できません。",customModelPlaceholder:"未掲載のモデル ID",customModelHint:"プロバイダーは対応しているが API が返さないモデル用です。表示名の変更ではありません。Enter で読み込み。",noProviders:"プロバイダーがありません。カスタムプロバイダーを追加して始めましょう。",clearVisibleModels:"選択をクリア",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:"切り替え",switchConfirm:"プロファイル「{name}」に切り替えるとゲートウェイが再起動されます。続行しますか?",switchSuccess:"プロファイル「{name}」に切り替えました",switchFailed:"プロファイルの切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。",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:"プロファイルがありません。作成して始めましょう。"},logs:{title:"ログ",all:"すべて",searchPlaceholder:"検索...",refresh:"更新",noEntries:"ログエントリがありません"},settings:{title:"設定",saved:"保存しました",saveFailed:"保存に失敗しました",tabs:{display:"表示",account:"アカウント",agent:"エージェント",memory:"メモリ",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:"しない"},memory:{enabled:"メモリを有効化",enabledHint:"AI に会話コンテキストを記憶させる",userProfile:"ユーザープロファイル",userProfileHint:"AI にユーザーの設定を記憶させる",charLimit:"メモリ文字数上限",charLimitHint:"MEMORY.md の最大文字数",userCharLimit:"ユーザープロファイル文字数上限",userCharLimitHint:"USER.md の最大文字数"},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",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をロック解除しました"}},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",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:"スキャン済み、スマートフォンで確認してください..."},language:{label:"言語",zh:"中文",en:"English",ja:"日本語"},terminal:{sessions:"セッション",newTab:"新しいターミナル",closeSession:"このセッションを閉じますか?",sessionExited:"終了しました",processExited:"プロセスが終了しました(コード {code})"},usage:{title:"使用統計",refresh:"更新",totalTokens:"総トークン数",inputTokens:"入力",outputTokens:"出力",totalSessions:"総セッション数",avgPerDay:"1日平均 ~{n}",estimatedCost:"推定コスト",cacheHitRate:"キャッシュヒット率",modelBreakdown:"モデル別内訳",dailyTrend:"日別使用量",date:"日付",tokens:"トークン",cache:"キャッシュ",cacheRead:"キャッシュ読み取り",cacheWrite:"キャッシュ書き込み",sessions:"セッション",cost:"コスト",noData:"使用データがありません"},skillsUsage:{title:"スキル使用状況",subtitle:"Hermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_5_6_1:"音声再生機能:Web Speech API使用、手動再生ボタン、自動再生スイッチ、虹色ボーダーアニメーション、モバイル最適化",new_0_5_6_2:"堅牢なLLM JSONパーサー:Python形式対応、ストリーミングイベントからのテキスト抽出",new_0_5_6_3:"Skills機能強化:使用統計、ソースフィルター、アーカイブ済みスキル、来歴、ピン留め切替",new_0_5_6_4:"日次使用統計の拡張:キャッシュ読み取り/書き込み分離を含む詳細なトークン内訳",new_0_5_6_5:"セッション履歴範囲の明確化:チャットと履歴ビューの説明を改善",new_0_5_6_6:"AnthropicスタイルのContentBlock配列形式(テキスト、画像、ファイル)を使用して添付ファイル処理を再設計",new_0_5_6_7:"ContentBlockおよびMarkdown形式をサポートし、認証付きのフロントエンドファイルダウンロード機能を追加",new_0_5_6_8:"重複するnodemonインスタンスを削除し、SQLiteデータベースのリセットを引き起こすマルチプロセス競合を修正",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"カンバンボードでタスクとセッションを視覚的に管理",new_0_5_15_2:"公式ランディングページとドキュメントサイトを追加",new_0_5_15_3:"グループチャットエージェントクライアントがハードコード8648の代わりに動的ポートを使用",new_0_5_15_4:"node-edge-tts 音声モジュールを追加",new_0_5_15_5:"WSLデフォルトリッスンホストバインディングを修正",new_0_5_15_6:"ウェブサイトホームページのSEOメタデータを追加",new_0_5_15_7:"IPベースのログインブルートフォース保護を追加",new_0_5_15_8:"MarkdownRendererのダウンロードURL二重ラップを修正",new_0_5_15_9:"Hermes Markdownメディアレンダリングと同期リトライを修正",new_0_5_15_10:"アップストリーム環境変数依存をリファクタリングで削除",new_0_5_15_11:"カンバン機能が使用できない場合は、hermes-agent をアップグレードしてください",new_0_5_16_1:"チャットストリーミングを /v1/runs から /v1/responses API に移行し、レイテンシを削減",new_0_5_16_2:"実際の API 使用量(トークン、キャッシュ、推論)を統計テーブルに保存",new_0_5_16_3:"ウェブサイトのナビゲーションバーにQQグループのQRコードを追加",new_0_5_16_4:"メッセージスキーマから未使用の codex_reasoning_items フィールドを削除",new_0_5_17_1:"Windows完全対応:パス処理、プロセス管理、ターミナル、ログ解析",new_0_5_17_2:"Gatewayプロセス管理をリファクタリング、クロスプラットフォームの起動/停止/ヘルスチェックに対応",new_0_5_17_3:"Termuxでhermesのshebangを解析してPythonを見つけ、プラグイン検出を修正",new_0_5_17_4:"設定解析時のYAML重複キーを許容するように変更",new_0_5_17_5:"認証ロックウィンドウと開発環境のシャットダウンフローを改善",new_0_5_17_6:"Comicテーマに中国語(ZCOOL KuaiLe)、日本語(Zen Maru Gothic)、韓国語(Gaegu)の手書きフォントを追加",new_0_5_17_7:"Comic/ドゥードゥルテーマスタイルを追加",new_0_5_17_8:"ライセンスをBSL-1.1に変更",new_0_5_17_9:"読み取り専用のHermesプラグインページを追加",new_0_5_17_10:"画像アップロードをBase64マルチモーダル形式に変換",new_0_5_17_11:"カンバンボードの選択と分離を修正",new_0_5_17_12:"4プロバイダーTTS対応の音声再生設定を追加",new_0_5_17_13:"コンテキスト圧縮のメッセージしきい値を200から150に引き下げ",new_0_5_17_14:"Web UI自動更新の再起動ロジックを修正",new_0_5_17_15:"opencode-zenとopencode-goの共有環境変数による設定連動を修正",new_0_5_17_16:"繁体字中国語(zh-TW)言語サポートを追加",new_0_5_17_17:"Web UIで表示モデルを管理する機能を追加",new_0_5_17_18:"カンバン:タスクの完全なアクションチェーン(コメント、ログ、割り当て、ディスパッチ)と能力境界を追加",new_0_5_17_19:"プロバイダー削除時に認証エントリがクリアされない問題を修正",new_0_5_17_20:"Codex credential-pool認証の認識を修正",new_0_5_17_21:"音声設定にEdge TTSの速度/ピッチスライダーを追加",new_0_5_17_22:"設定YAMLの重複キーが解析クラッシュを起こさないように修正",new_0_5_17_23:"ゲートウェイポートの所有権をPIDファイルベースに変更し、プロファイル間のポート乗っ取りを防止",new_0_5_17_24:"履歴ページにCronセッションレコードを表示するように変更",new_0_5_17_25:"折りたたまれたサイドバーでの言語切替・テーマアイコンの圧縮表示を修正",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 労働者の日!今日はお休みです、何卒ご理解ください",new_0_5_5_2:"Hermesセッション履歴ページを追加",new_0_5_5_3:"履歴ページはアクティブチャットに干渉せずにセッション管理",new_0_5_5_4:"履歴ページは最初のCLIセッションを自動選択",new_0_5_5_5:"HistoryMessageListコンポーネントを追加",new_0_5_5_6:"空のメッセージとtoolNameなしのtoolメッセージをフィルタリング",new_0_5_5_7:"localStorageセッションキャッシュを削除、バックエンドから直接取得",new_0_5_5_8:"プロフィール切り替えを最適化",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"思考/推論ブロックのリアルタイムストリーミング表示",new_0_4_7_2:"Dockerビルド時にprepareスクリプトをスキップ",new_0_4_7_3:"グループチャットのモバイルUX改善とUIのブラッシュアップ",new_0_4_7_4:"コンテキスト残りトークン数をマイナスではなく0に制限",new_0_4_7_5:"Alibaba Coding Planビルトインプロバイダーを追加(.env base_urlオーバーライド対応)",new_0_4_7_6:"起動時にリモートプロファイルをスキップしてハングを防止",new_0_4_7_7:"黙って飲み込まれた実行エラーを検出して表示",new_0_4_7_8:"プロバイダー対応のコンテキスト長さルックアップ",new_0_4_7_9:"切り替え時にconfig.modelをリセットしCLIカスタムプロバイダーを解決",new_0_4_7_10:"ビルトインプロバイダー削除時に.envからbase_url_envをクリア",new_0_4_7_11:"グループチャットルームのサイドバー背景をセッションリストに合わせる",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"トークン使用量追跡と動的コンテキスト長を追加",new_0_4_2_2:"セッション検索モーダルを追加",new_0_4_2_3:"Socket.IOとSQLiteによるグループチャットシステムを復元",new_0_4_2_4:"チャットページにピン留めセッションとライブモニターを追加",new_0_4_2_5:"組み込みプロバイダー検出とモデルマッチングを修正"},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:"保存"},groupChat:{title:"グループチャット",createRoom:"ルームを作成",joinByCode:"コードで参加",roomName:"ルーム名",roomNamePlaceholder:"ルーム名を入力",inviteCode:"招待コード",autoGenerate:"自動生成",noRooms:"ルームがありません",selectOrCreate:"ルームを選択または作成してチャットを開始",agents:"エージェント",addAgent:"エージェントを追加",selectProfile:"プロファイルを選択",agentAdded:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",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:"無効なファイルパス",download:"ダウンロード",downloadFile:"ファイルをダウンロード"}},Vn={login:{title:"Hermes Web UI",description:"계속하려면 액세스 토큰을 입력하세요. 서버 시작 로그에서 확인할 수 있습니다.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",passwordMismatch:"비밀번호가 일치하지 않습니다",passwordTooShort:"비밀번호는 6자 이상이어야 합니다",setupSuccess:"비밀번호 로그인이 설정되었습니다",passwordChanged:"비밀번호가 변경되었습니다",passwordRemoved:"비밀번호 로그인이 제거되었습니다",setupPassword:"비밀번호 로그인 설정",changePassword:"비밀번호 변경",changeUsername:"사용자 이름 변경",removePasswordLogin:"제거",username:"사용자 이름",currentPassword:"현재 비밀번호",newPassword:"새 비밀번호",confirmPassword:"비밀번호 확인",newUsername:"새 사용자 이름",usernameChanged:"사용자 이름이 변경되었습니다",usernameTooShort:"사용자 이름은 2자 이상이어야 합니다",setupDescription:"사용자 이름과 비밀번호를 설정하여 편리하게 로그인하세요. 액세스 토큰은 백업으로 계속 사용할 수 있습니다.",removeConfirm:"비밀번호 로그인을 제거하시겠습니까? 액세스 토큰을 사용하여 로그인해야 합니다.",passwordLoginNotConfigured:"비밀번호 로그인 미설정",passwordLoginConfigured:"비밀번호 로그인 활성화됨 ({username})"},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:"접기"},sidebar:{chat:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",groupChat:"그룹 채팅",groupConversation:"대화",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:'터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트 실패",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다"},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와 대화를 시작하세요",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",clear:"현재 표시 내용 지우기",clearHistory:"이 세션의 저장된 메시지 기록 삭제",title:"이 세션 이름 변경",compress:"유휴 상태에서 컨텍스트 압축 실행",steer:"활성 Bridge 실행에 지시 텍스트 보내기",destroy:"이 세션의 Bridge Agent 해제"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"Hermes 기록",historyScopeHint:"소스별로 그룹화된 Hermes 기록 세션을 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",approvalKicker:"터미널 권한",approvalTitle:"실행 전에 명령 확인",approvalAllowOnce:"한 번만 허용",approvalAllowSession:"이 세션에서 허용",approvalAlways:"항상 허용",approvalDeny:"거부",deleteSession:"이 세션을 삭제하시겠습니까?",toggleBatchMode:"일괄 선택",selectAll:"모두 선택",confirmBatchDelete:"선택한 {count}개의 세션을 삭제하시겠습니까?",batchDeleteSuccess:"{count}개의 세션을 삭제했습니다",batchDeletePartial:"{failed}개의 세션 삭제 실패",batchDeleteFailed:"일괄 삭제 실패",sessionDeleted:"세션이 삭제되었습니다",rename:"이름 변경",pin:"고정",unpin:"고정 해제",pinned:"고정됨",chatMode:"채팅",liveMode:"라이브",liveSessions:"라이브 세션",recentBadge:"최근",linkedSessions:"{count}개 연결됨",noVisibleMessages:"사람이 볼 수 있는 메시지가 없습니다.",monitorRoleUser:"사용자",monitorRoleAssistant:"어시스턴트",copySessionId:"세션 ID 복사",export:"내보내기",exportFull:"전체 내보내기 (JSON)",exportCompressed:"압축 내보내기 (TXT)",exportCompressing:"컨텍스트 압축 중, 잠시 기다려주세요...",exportSuccess:"세션을 내보냈습니다",exportFailed:"내보내기 실패",renamed:"이름이 변경되었습니다",renameFailed:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",truncated:"... (잘림)",executionDuration:"Execution time",thinkingLabel:"사고 과정",thinkingInProgress:"사고 중…",thinkingShow:"사고 과정 펼치기",thinkingHide:"사고 과정 접기",thinkingDuration:"관측 {duration}",thinkingChars:"{count}자",copyBubble:"메시지 복사",copiedBubble:"복사됨",copyFailed:"복사 실패",playSpeech:"음성 재생",pauseSpeech:"일시정지",resumeSpeech:"재개",stopSpeech:"중지",speechNotSupported:"이 브라우저는 음성 재생을 지원하지 않습니다"},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:"로컬"}},plugins:{title:"플러그인",refresh:"새로고침",notice:"탐색 가능한 Hermes 플러그인 manifest의 읽기 전용 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. v1의 관리 작업은 CLI에 유지되며, 변경 사항은 새 Hermes 세션에서 적용됩니다.",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:"Agent root",python:"Python",scanCwd:"Scan cwd",projectPlugins:"프로젝트 플러그인"}},memory:{title:"메모리",refresh:"새로고침",loadFailed:"메모리를 불러오지 못했습니다",myNotes:"내 메모",noNotes:"메모가 없습니다.",notesPlaceholder:"메모를 작성하세요...",userProfile:"사용자 프로필",noProfile:"프로필이 없습니다.",profilePlaceholder:"프로필을 작성하세요...",soul:"소울",noSoul:"소울 설정이 없습니다.",soulPlaceholder:"소울 설정을 작성하세요..."},models:{title:"모델",addProvider:"Provider 추가",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 토큰이 감지되었습니다. 추가를 클릭하여 Hermes에서 Copilot을 활성화하세요.",copilotAddSourceEnv:"출처: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"출처: gh CLI (gh auth token)",copilotAddSourceAppsJson:"출처: VS Code Copilot 확장 (apps.json)",copilotDeleteHintEnv:"이 작업은 ~/.hermes/.env의 COPILOT_GITHUB_TOKEN을 지웁니다. 다른 도구에는 영향이 없습니다.",copilotDeleteHintGhCli:"Copilot이 Hermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.",copilotDeleteHintAppsJson:"Copilot이 Hermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.",customBadge:"커스텀",previewBadge:"프리뷰",disabledBadge:"사용 불가",disabledTooltip:"이 모델은 현재 계정에서 사용할 수 없습니다.",customModelPlaceholder:"목록에 없는 모델 ID",customModelHint:"제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.",noProviders:"Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.",clearVisibleModels:"선택 지우기",builtIn:"내장",customType:"사용자 지정",provider:"Provider",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 200000 (선택사항)",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:"전환",switchConfirm:'프로필 "{name}"(으)로 전환하면 게이트웨이가 재시작됩니다. 계속하시겠습니까?',switchSuccess:'프로필 "{name}"(으)로 전환되었습니다',switchFailed:"프로필 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.",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:"프로필이 없습니다. 새로 만들어 시작하세요."},logs:{title:"로그",all:"전체",searchPlaceholder:"검색...",refresh:"새로고침",noEntries:"로그 항목 없음"},settings:{title:"설정",saved:"저장됨",saveFailed:"저장 실패",tabs:{display:"표시",account:"계정",agent:"에이전트",memory:"메모리",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:"사용 안 함"},memory:{enabled:"메모리 활성화",enabledHint:"AI가 대화 컨텍스트를 기억하도록 허용",userProfile:"사용자 프로필",userProfileHint:"AI가 사용자 선호를 기억하도록 허용",charLimit:"메모리 문자 제한",charLimitHint:"MEMORY.md 최대 문자 수",userCharLimit:"사용자 프로필 문자 제한",userCharLimitHint:"USER.md 최대 문자 수"},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",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 잠금 해제됨"}},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 Access Token",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",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:"스캔됨, 휴대폰에서 확인해 주세요..."},language:{label:"언어",zh:"中文",en:"English",ko:"한국어"},terminal:{sessions:"세션",newTab:"새 터미널",closeSession:"이 세션을 닫으시겠습니까?",sessionExited:"종료됨",processExited:"프로세스가 종료되었습니다 (코드 {code})"},usage:{title:"사용량 통계",refresh:"새로고침",totalTokens:"총 토큰 수",inputTokens:"입력",outputTokens:"출력",totalSessions:"총 세션 수",avgPerDay:"일평균 ~{n}",estimatedCost:"예상 비용",cacheHitRate:"캐시 적중률",modelBreakdown:"모델별 분포",dailyTrend:"일별 사용량",date:"날짜",tokens:"토큰",cache:"캐시",cacheRead:"캐시 읽기",cacheWrite:"캐시 쓰기",sessions:"세션",cost:"비용",noData:"사용량 데이터 없음"},skillsUsage:{title:"스킬 사용량",subtitle:"Hermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_5_6_1:"음성 재생 기능: Web Speech API, 수동 재생 버튼, 자동 재생 스위치, 무지개 테두리 애니메이션, 모바일 최적화",new_0_5_6_2:"강력한 LLM JSON 파서: Python 형식 허용, 스트리밍 이벤트에서 텍스트 추출",new_0_5_6_3:"Skils 기능 향상: 사용 통계, 소스 필터링, 보관된 스킬, 출처, 고정 토글",new_0_5_6_4:"확장된 일일 사용 통계: 캐시 읽기/쓰기 분리를 포함한 상세한 토큰 분석",new_0_5_6_5:"세션 기록 범위 명확화: 채팅 및 기록 보기의 설명 개선",new_0_5_6_6:"Anthropic 스타일의 ContentBlock 배열 형식(텍스트, 이미지, 파일)을 사용하여 첨부파일 처리를 재설계",new_0_5_6_7:"인증이 포함된 ContentBlock 및 Markdown 형식을 지원하는 프론트엔드 파일 다운로드 기능 추가",new_0_5_6_8:"중복된 nodemon 인스턴스를 제거하여 SQLite 데이터베이스 재설정을 일으키는 다중 프로세스 충돌 수정",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"칸반 보드로 작업 및 세션 시각적 관리",new_0_5_15_2:"공식 랜딩 페이지 및 문서 사이트 추가",new_0_5_15_3:"그룹 채팅 에이전트 클라이언트가 하드코딩 8648 대신 동적 포트 사용",new_0_5_15_4:"node-edge-tts 음성 모듈 추가",new_0_5_15_5:"WSL 기본 리슨 호스트 바인딩 수정",new_0_5_15_6:"웹사이트 홈페이지 SEO 메타데이터 추가",new_0_5_15_7:"IP 기반 로그인 무차별 대입 공격 보호 추가",new_0_5_15_8:"MarkdownRenderer 다운로드 URL 이중 래핑 수정",new_0_5_15_9:"Hermes Markdown 미디어 렌더링 및 동기화 재시도 수정",new_0_5_15_10:"업스트림 환경 변수 종속성 제거",new_0_5_15_11:"칸반 기능을 사용할 수 없는 경우 hermes-agent를 업그레이드하세요",new_0_5_16_1:"채팅 스트리밍을 /v1/runs에서 /v1/responses API로 마이그레이션하여 지연 시간 단축",new_0_5_16_2:"실제 API 사용량(토큰, 캐시, 추론)을 사용량 통계 테이블에 저장",new_0_5_16_3:"웹사이트 내비게이션 바에 QQ 그룹 QR 코드 추가",new_0_5_16_4:"메시지 스키마에서 사용하지 않는 codex_reasoning_items 필드 제거",new_0_5_17_1:"Windows 완전 호환: 경로 처리, 프로세스 관리, 터미널, 로그 파싱",new_0_5_17_2:"Gateway 프로세스 관리 리팩토링, 크로스 플랫폼 시작/중지/헬스체크 지원",new_0_5_17_3:"Termux에서 hermes shebang을 파싱하여 Python을 찾아 플러그인 발견 수정",new_0_5_17_4:"설정 파싱 시 중복 YAML 키 허용",new_0_5_17_5:"인증 잠금 창 및 개발 환경 종료 흐름 개선",new_0_5_17_6:"Comic 테마에 중국어(ZCOOL KuaiLe), 일본어(Zen Maru Gothic), 한국어(Gaegu) 필기 폰트 추가",new_0_5_17_7:"Comic/낙서 테마 스타일 추가",new_0_5_17_8:"라이선스를 BSL-1.1로 변경",new_0_5_17_9:"읽기 전용 Hermes 플러그인 페이지 추가",new_0_5_17_10:"이미지 업로드를 base64 멀티모달 형식으로 변환",new_0_5_17_11:"칸반 보드 선택 및 격리 수정",new_0_5_17_12:"4개 제공자 TTS 지원 음성 재생 설정 추가",new_0_5_17_13:"컨텍스트 압축 메시지 임계값을 200에서 150으로 낮춤",new_0_5_17_14:"Web UI 자동 업데이트 재시작 로직 수정",new_0_5_17_15:"opencode-zen과 opencode-go 공유 환경 변수로 인한 설정 결합 문제 수정",new_0_5_17_16:"번체 중국어(zh-TW) 언어 지원 추가",new_0_5_17_17:"Web UI에서 보이는 모델 관리 지원",new_0_5_17_18:"칸반: 작업의 전체 액션 체인(댓글, 로그, 할당, 발송)과 기능 경계 구현",new_0_5_17_19:"프로바이더 삭제 시 인증 항목이 지워지지 않는 문제 수정",new_0_5_17_20:"Codex credential-pool 인증 인식 수정",new_0_5_17_21:"음성 설정에 Edge TTS 속도/피치 슬라이더 추가",new_0_5_17_22:"설정 YAML 중복 키가 더 이상 파싱 충돌을 일으키지 않음",new_0_5_17_23:"게이트웨이 포트 소유권이 PID 파일 기반으로 변경되어 프로필 간 포트 탈취 방지",new_0_5_17_24:"기록 페이지에 Cron 세션 기록 표시",new_0_5_17_25:"접힌 사이드바에서 언어 전환 및 테마 아이콘이 눌리는 문제 수정",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 노동절 감사합니다! 오늘은 쉬니까 양해 부탁드립니다",new_0_5_5_2:"Hermes 세션 기록 페이지 추가",new_0_5_5_3:"기록 페이지는 독립적으로 세션 관리",new_0_5_5_4:"기록 페이지는 첫 번째 CLI 세션 자동 선택",new_0_5_5_5:"HistoryMessageList 컴포넌트 추가",new_0_5_5_6:"빈 메시지와 toolName 없는 tool 메시지 필터링",new_0_5_5_7:"localStorage 세션 캐시 제거, 백엔드에서 직접 가져오기",new_0_5_5_8:"프로필 전환 최적화",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"생각/추론 블록의 실시간 스트리밍 표시",new_0_4_7_2:"Docker 빌드 중 prepare 스크립트 건너뛰기",new_0_4_7_3:"그룹 채팅 모바일 UX 개선 및 UI 다듬기",new_0_4_7_4:"컨텍스트 남은 토큰을 음수 대신 0으로 제한",new_0_4_7_5:".env base_url 재정의를 지원하는 Alibaba Coding Plan 내장 프로바이더 추가",new_0_4_7_6:"시작 시 원격 프로필 건너뛰어 중지 방지",new_0_4_7_7:"조용히 삼켜진 실행 오류 감지 및 표시",new_0_4_7_8:"프로바이더 인식 컨텍스트 길이 조회",new_0_4_7_9:"전환 시 config.model 재설정 및 CLI 커스텀 프로바이더 해결",new_0_4_7_10:"내장 프로바이더 삭제 시 .env에서 base_url_env 정리",new_0_4_7_11:"그룹 채팅 방 사이드바 배경을 세션 목록과 맞추기",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"토큰 사용량 추적 및 동적 컨텍스트 길이 추가",new_0_4_2_2:"세션 검색 모달 추가",new_0_4_2_3:"Socket.IO 및 SQLite로 그룹 채팅 시스템 복원",new_0_4_2_4:"채팅 페이지에 고정 세션 및 라이브 모니터 추가",new_0_4_2_5:"내장 프로바이더 감지 및 모델 매칭 수정"},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:"저장"},groupChat:{title:"그룹 채팅",createRoom:"방 만들기",joinByCode:"코드로 참여",roomName:"방 이름",roomNamePlaceholder:"방 이름을 입력하세요",inviteCode:"초대 코드",autoGenerate:"자동 생성",noRooms:"아직 방이 없습니다",selectOrCreate:"방을 선택하거나 만들어 채팅을 시작하세요",agents:"에이전트",addAgent:"에이전트 추가",selectProfile:"프로필 선택",agentAdded:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",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:"잘못된 파일 경로",download:"다운로드",downloadFile:"파일 다운로드"}},Kn={login:{title:"Hermes 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",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",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:"Configurez un nom d'utilisateur et un mot de passe pour un login rapide. Le jeton d'acces reste disponible.",removeConfirm:"Voulez-vous vraiment supprimer le login par mot de passe? Vous devrez utiliser le jeton d'acces.",passwordLoginNotConfigured:"Login par mot de passe non configure",passwordLoginConfigured:"Login par mot de passe active ({username})"},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"},sidebar:{chat:"Discussion",search:"Rechercher",apiRelay:"API Relay",history:"Historique",jobs:"Taches planifiees",models:"Modeles",profiles:"Profils",plugins:"Plugins",skills:"Competences",memory:"Memoire",logs:"Journaux",usage:"Utilisation",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",files:"Fichiers",groupChat:"Chat de groupe",groupConversation:"Conversation",settings:"Parametres",connected:"Connecte",disconnected:"Deconnecte",updateTip:'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',updateVersion:"Mettre a jour vers v{version}",reloadClientVersion:"Recharger pour v{version}",updating:"Mise a jour...",updateSuccess:"Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.",updateFailed:"Echec de la mise a jour",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible"},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 : 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Enregistrer",contextEditCancel:"Annuler",contextEditInvalid:"Veuillez entrer une longueur de contexte valide",contextEditSuccess:"Longueur du contexte mise à jour",contextEditFailed:"Échec de la mise à jour",emptyState:"Demarrer une conversation avec Hermes Agent",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",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"},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",sessionScopeHint:"Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.",openHistory:"Ouvrir l’historique",hermesHistory:"Historique Hermes",historyScopeHint:"Sessions d’historique Hermes 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",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",sessionDeleted:"Session supprimee",rename:"Renommer",pin:"Épingler",unpin:"Désépingler",pinned:"Épinglés",chatMode:"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",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Actualiser",notice:"Inventaire en lecture seule des manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Type de fournisseur",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Source : ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Source : gh CLI (gh auth token)",copilotAddSourceAppsJson:"Source : extension Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Cela supprimera COPILOT_GITHUB_TOKEN dans ~/.hermes/.env. Les autres outils ne sont pas affectés.",copilotDeleteHintGhCli:"Copilot sera masqué dans Hermes. Votre connexion gh CLI n'est pas affectée — `gh auth status` indiquera toujours que vous êtes connecté.",copilotDeleteHintAppsJson:"Copilot sera masqué dans Hermes. Votre extension Copilot de VS Code reste connectée.",customBadge:"PERSONNALISÉ",previewBadge:"APERÇU",disabledBadge:"INDISPONIBLE",disabledTooltip:"Ce modèle n'est pas disponible pour votre compte.",customModelPlaceholder:"ID de modèle non listé",customModelHint:"Pour les modèles pris en charge par le fournisseur mais non renvoyés par l’API ; ce n’est pas un renommage affiché. Entrée pour charger.",noProviders:"Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.",clearVisibleModels:"Effacer la sélection",builtIn:"Integre",customType:"Personnalise",provider:"Fournisseur",contextLength:"Longueur du contexte",contextLengthPlaceholder:"ex. 200000 (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"},profiles:{title:"Profils",create:"Creer un profil",import:"Importer",export:"Exporter",rename:"Renommer",delete:"Supprimer",switchTo:"Passer a",switchConfirm:'Le passage au profil "{name}" redemarrera la passerelle. Continuer ?',switchSuccess:'Profil "{name}" actif',switchFailed:"Echec du changement de profil. 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."},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",agent:"Agent",memory:"Memoire",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:"Theme",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"},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"},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",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"}},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:"Reactions",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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessions",cost:"Cout",noData:"Aucune donnee d'utilisation"},skillsUsage:{title:"Utilisation des compétences",subtitle:"Suivre les chargements et modifications de compétences dans les sessions Hermes",refresh:"Actualiser",periodSelector:"Période d'utilisation des compétences",periodLabel:"{days} j",summary:"Résumé",totalActions:"Act.",loads:"Charg.",edits:"Modif.",distinctSkills:"Comp.",topSkills:"Top comp.",dailyTrend:"Tendance",periodSummary:"{days} derniers jours",skill:"Comp.",share:"%",lastUsed:"Dern. usage",noData:"Aucune donnée d'utilisation des compétences",loadFailed:"Impossible de charger l'utilisation des compétences",otherSkills:"Autres comp."},changelog:{new_0_5_6_1:"Lecture vocale avec Web Speech API: bouton manuel, interrupteur auto-play, animation bordure arc-en-ciel et optimisation mobile",new_0_5_6_2:"Parseur JSON LLM robuste avec tolérance au format Python et extraction de texte des événements streaming",new_0_5_6_3:"Améliorations des Skills: statistiques d'utilisation, filtrage par source, compétences archivées, provenance et toggle d'épinglage",new_0_5_6_4:"Statistiques d'utilisation quotidiennes étendues avec répartition détaillée des tokens incluant la séparation lecture/écriture du cache",new_0_5_6_5:"Portée de l'historique des sessions clarifiée avec descriptions améliorées dans les vues chat et historique",new_0_5_6_6:"Repensé la gestion des pièces jointes en utilisant le format de tableau ContentBlock style Anthropic (texte, image, fichier)",new_0_5_6_7:"Ajouté la fonctionnalité de téléchargement de fichiers frontend supportant les formats ContentBlock et Markdown avec authentification",new_0_5_6_8:"Corrigé le conflit multi-processus causant des réinitialisations de base de données SQLite en éliminant les instances nodemon redondantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Tableau Kanban pour la gestion visuelle des tâches et sessions",new_0_5_15_2:"Page d'accueil officielle et site de documentation",new_0_5_15_3:"Client agent group-chat utilise port dynamique au lieu de 8648",new_0_5_15_4:"Module vocal node-edge-tts ajouté",new_0_5_15_5:"Correction liaison hôte d'écoute WSL par défaut",new_0_5_15_6:"Métadonnées SEO pour la page d'accueil du site",new_0_5_15_7:"Protection contre les attaques brute-force basée sur l'IP",new_0_5_15_8:"Correction double enveloppement des URLs de téléchargement dans MarkdownRenderer",new_0_5_15_9:"Correction rendu média Markdown et retry synchronisation",new_0_5_15_10:"Suppression dépendance variable d'environnement amont",new_0_5_15_11:"Si la fonction Kanban n'est pas disponible, veuillez mettre à niveau hermes-agent",new_0_5_16_1:"Migration du streaming de chat de /v1/runs vers l'API /v1/responses pour une latence réduite",new_0_5_16_2:"Persistance de l'utilisation réelle de l'API (tokens, cache, raisonnement) dans la table des statistiques",new_0_5_16_3:"Ajout du code QR du groupe QQ dans la barre de navigation du site",new_0_5_16_4:"Suppression du champ codex_reasoning_items inutilisé du schéma de messages",new_0_5_17_1:"Compatibilité Windows complète : gestion des chemins, des processus, terminal, analyse des logs",new_0_5_17_2:"Refonte de la gestion des processus Gateway avec démarrage/arrêt/health-check multiplateforme",new_0_5_17_3:"Correction de la découverte des plugins sur Termux en analysant le shebang hermes pour localiser Python",new_0_5_17_4:"Tolérer les clés YAML en double lors de l'analyse de la configuration",new_0_5_17_5:"Amélioration de la fenêtre de verrouillage d'authentification et du processus d'arrêt en dev",new_0_5_17_6:"Thème Comic : polices manuscrites pour chinois (ZCOOL KuaiLe), japonais (Zen Maru Gothic), coréen (Gaegu)",new_0_5_17_7:"Ajouter le style de thème Comic/doodle",new_0_5_17_8:"Changer la licence en BSL-1.1",new_0_5_17_9:"Ajouter une page de plugins Hermes en lecture seule",new_0_5_17_10:"Convertir les téléchargements d'images au format multimodal base64",new_0_5_17_11:"Corriger la sélection et l'isolation du tableau Kanban",new_0_5_17_12:"Ajouter les paramètres de lecture vocale avec support TTS de 4 fournisseurs",new_0_5_17_13:"Réduire le seuil de compression de contexte de 200 à 150 messages",new_0_5_17_14:"Corriger la logique de redémarrage de la mise à jour automatique de la Web UI",new_0_5_17_15:"Corriger la variable d'environnement partagée opencode-zen et opencode-go causant un couplage de configuration",new_0_5_17_16:"Ajouter la prise en charge du chinois traditionnel (zh-TW)",new_0_5_17_17:"Gérer les modèles visibles dans la Web UI",new_0_5_17_18:"Kanban : chaîne d'action complète des tâches (commentaires, logs, affectation, envoi) avec limites de capacités",new_0_5_17_19:"Corriger les entrées d'authentification fournisseur non effacées lors de la suppression",new_0_5_17_20:"Corriger la reconnaissance d'authentification credential-pool de Codex",new_0_5_17_21:"Ajouter les curseurs de vitesse/hauteur Edge TTS aux paramètres vocaux",new_0_5_17_22:"Les clés YAML en double dans la configuration ne provoquent plus de crash lors de l'analyse",new_0_5_17_23:"La propriété du port de passerelle est maintenant basée sur un fichier PID, empêchant le détournement de port entre profils",new_0_5_17_24:"La page d'historique affiche désormais les enregistrements de sessions Cron",new_0_5_17_25:"Corriger les icônes de changement de langue et de thème écrasées dans la barre latérale réduite",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Joyeuse Fête du Travail! Pas de travail aujourd'hui, merci de votre compréhension",new_0_5_5_2:"Ajout d'une page d'historique pour les sessions Hermes",new_0_5_5_3:"La page d'historique gère les sessions de manière indépendante",new_0_5_5_4:"Chargement automatique de la première session CLI",new_0_5_5_5:"Composant HistoryMessageList avec injection de props",new_0_5_5_6:"Filtrage des messages vides et des tools sans toolName",new_0_5_5_7:"Suppression du cache localStorage des sessions",new_0_5_5_8:"Optimisation du changement de profil",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Affichage en streaming en temps reel des blocs de reflexion/raisonnement",new_0_4_7_2:"Ignorer le script de preparation lors du build Docker",new_0_4_7_3:"Ameliorations UX mobile du chat de groupe et polissage de l'interface",new_0_4_7_4:"Limiter les jetons restants du contexte a 0 au lieu de negatif",new_0_4_7_5:"Ajouter le fournisseur integre Alibaba Coding Plan avec remplacement base_url dans .env",new_0_4_7_6:"Ignorer les profils distants au demarrage pour eviter le blocage",new_0_4_7_7:"Detecter et afficher les erreurs d'execution silencieusement ignorees",new_0_4_7_8:"Recherche de longueur de contexte sensible au fournisseur",new_0_4_7_9:"Reinitialiser config.model lors du changement et resoudre le fournisseur personnalise CLI",new_0_4_7_10:"Supprimer base_url_env du .env lors de la suppression du fournisseur integre",new_0_4_7_11:"Aligner le fond de la barre laterale du chat de groupe avec la liste des sessions",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Ajouter le suivi de l'utilisation des tokens et la longueur de contexte dynamique",new_0_4_2_2:"Ajouter la modal de recherche de sessions",new_0_4_2_3:"Restaurer le systeme de chat de groupe avec Socket.IO et SQLite",new_0_4_2_4:"Ajouter les sessions epinglees et le moniteur en direct",new_0_4_2_5:"Corriger la detection des fournisseurs integres et l'appariement des modeles"},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"},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",noAgents:"Aucun agent dans ce salon",members:"Membres",roomCreated:"Salon cree",roomDeleted:"Salon supprime",roomCloned:"Salon clone",cloneRoom:"Cloner le 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",download:"Telecharger",downloadFile:"Telecharger le fichier"}},Gn={login:{title:"Hermes 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",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",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:"Configure un nombre de usuario y contrasena para un inicio de sesion rapido. El token de acceso seguira funcionando.",removeConfirm:"Esta seguro de eliminar el login con contrasena? Necesitara usar el token de acceso.",passwordLoginNotConfigured:"Login con contrasena no configurado",passwordLoginConfigured:"Login con contrasena habilitado ({username})"},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"},sidebar:{chat:"Chat",search:"Buscar",apiRelay:"API Relay",history:"Historial",jobs:"Tareas programadas",models:"Modelos",profiles:"Perfiles",plugins:"Plugins",skills:"Habilidades",memory:"Memoria",logs:"Registros",usage:"Uso",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",files:"Archivos",groupChat:"Chat grupal",groupConversation:"Conversación",settings:"Configuracion",connected:"Conectado",disconnected:"Desconectado",updateTip:'Ejecuta "hermes-web-ui update" en la terminal para actualizar',updateVersion:"Actualizar a v{version}",reloadClientVersion:"Recargar para v{version}",updating:"Actualizando...",updateSuccess:"Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.",updateFailed:"Error al actualizar",logout:"Cerrar sesion",nodeVersionWarning:"Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.",changelog:"Registro de cambios",noChangelog:"No hay registro de cambios"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Guardar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor ingresa una longitud de contexto válida",contextEditSuccess:"Longitud del contexto actualizada",contextEditFailed:"Error en la actualización",emptyState:"Inicia una conversacion con Hermes Agent",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",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"},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",sessionScopeHint:"Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.",openHistory:"Abrir historial",hermesHistory:"Historial de Hermes",historyScopeHint:"Sesiones del historial de Hermes, 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",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",sessionDeleted:"Sesion eliminada",rename:"Renombrar",pin:"Fijar",unpin:"Desfijar",pinned:"Fijados",chatMode:"Chat",liveMode:"En vivo",liveSessions:"Sesiones en vivo",recentBadge:"Reciente",linkedSessions:"{count} vinculadas",noVisibleMessages:"No hay mensajes visibles para humanos.",monitorRoleUser:"Usuario",monitorRoleAssistant:"Asistente",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Actualizar",notice:"Inventario de solo lectura de manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Tipo de proveedor",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Origen: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origen: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origen: extensión Copilot de VS Code (apps.json)",copilotDeleteHintEnv:"Esto borrará COPILOT_GITHUB_TOKEN en ~/.hermes/.env. Otras herramientas no se verán afectadas.",copilotDeleteHintGhCli:"Copilot se ocultará de Hermes. Tu sesión de gh CLI no se verá afectada — `gh auth status` seguirá mostrando que estás conectado.",copilotDeleteHintAppsJson:"Copilot se ocultará de Hermes. La extensión Copilot de VS Code seguirá conectada.",customBadge:"PERSONALIZADO",previewBadge:"VISTA PREVIA",disabledBadge:"NO DISPONIBLE",disabledTooltip:"Este modelo no está disponible para tu cuenta.",customModelPlaceholder:"ID de modelo no listado",customModelHint:"Para modelos compatibles con el proveedor que la API no devuelve; no es un cambio de nombre visible. Enter para cargar.",noProviders:"No se encontraron proveedores. Anade un proveedor personalizado para comenzar.",clearVisibleModels:"Borrar selección",builtIn:"Integrado",customType:"Personalizado",provider:"Proveedor",contextLength:"Longitud del contexto",contextLengthPlaceholder:"ej. 200000 (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"},profiles:{title:"Perfiles",create:"Crear perfil",import:"Importar",export:"Exportar",rename:"Renombrar",delete:"Eliminar",switchTo:"Cambiar a",switchConfirm:'Cambiar al perfil "{name}" reiniciara la pasarela. Continuar?',switchSuccess:'Se ha cambiado al perfil "{name}"',switchFailed:"Error al cambiar de perfil. 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."},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",agent:"Agente",memory:"Memoria",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"},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"},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",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"}},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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sesiones",cost:"Costo",noData:"Sin datos de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Sigue las cargas y ediciones de habilidades en sesiones de Hermes",refresh:"Actualizar",periodSelector:"Periodo de uso de habilidades",periodLabel:"{days} d",summary:"Resumen",totalActions:"Acciones",loads:"Cargas",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendencia diaria",periodSummary:"Últimos {days} días",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"No hay datos de uso de habilidades",loadFailed:"No se pudo cargar el uso de habilidades",otherSkills:"Otras habs."},changelog:{new_0_5_6_1:"Reproducción de voz con Web Speech API: botón manual, interruptor auto-play, animación de borde arcoíris y optimización móvil",new_0_5_6_2:"Parser LLM JSON robusto con tolerancia a formato Python y extracción de texto de eventos streaming",new_0_5_6_3:"Mejoras de Skills: estadísticas de uso, filtrado de fuentes, skills archivados, procedencia y toggle de fijado",new_0_5_6_4:"Estadísticas diarias de uso expandidas con desglose detallado de tokens incluyendo separación de lectura/escritura de caché",new_0_5_6_5:"Ámbito del historial de sesiones aclarado con descripciones mejoradas en vistas de chat e historial",new_0_5_6_6:"Rediseñado el manejo de adjuntos usando formato de matriz ContentBlock estilo Anthropic (texto, imagen, archivo)",new_0_5_6_7:"Añadida funcionalidad de descarga de archivos en frontend soportando formatos ContentBlock y Markdown con autenticación",new_0_5_6_8:"Corregido conflicto de múltiples procesos que causaba reinicios de base de datos SQLite eliminando instancias nodemon redundantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Tablero Kanban para gestión visual de tareas y sesiones",new_0_5_15_2:"Página de inicio y sitio de documentación oficial",new_0_5_15_3:"Cliente agente group-chat usa puerto dinámico en vez de 8648",new_0_5_15_4:"Módulo de voz node-edge-tts añadido",new_0_5_15_5:"Corregido enlace de host de escucha WSL predeterminado",new_0_5_15_6:"Metadatos SEO para la página de inicio del sitio",new_0_5_15_7:"Protección contra ataques de fuerza bruta basada en IP",new_0_5_15_8:"Corregido envoltura doble de URLs de descarga en MarkdownRenderer",new_0_5_15_9:"Corregido renderizado de medios Markdown y reintento de sincronización",new_0_5_15_10:"Eliminada dependencia de variables de entorno upstream",new_0_5_15_11:"Si la función Kanban no está disponible, actualice hermes-agent",new_0_5_16_1:"Migrar streaming de chat de /v1/runs a /v1/responses API para menor latencia",new_0_5_16_2:"Persistir uso real de API (tokens, caché, razonamiento) en tabla de estadísticas",new_0_5_16_3:"Añadir código QR del grupo QQ a la barra de navegación del sitio web",new_0_5_16_4:"Eliminar campo codex_reasoning_items no utilizado del esquema de mensajes",new_0_5_17_1:"Compatibilidad completa con Windows: manejo de rutas, gestión de procesos, terminal, análisis de logs",new_0_5_17_2:"Refactorizada la gestión de procesos de Gateway con inicio/parada/health-check multiplataforma",new_0_5_17_3:"Corregido el descubrimiento de plugins en Termux analizando el shebang de hermes para localizar Python",new_0_5_17_4:"Tolerar claves YAML duplicadas en el análisis de configuración",new_0_5_17_5:"Mejorada la ventana de bloqueo de autenticación y el flujo de cierre del entorno de desarrollo",new_0_5_17_6:"Tema Comic: fuentes manuales para chino (ZCOOL KuaiLe), japonés (Zen Maru Gothic), coreano (Gaegu)",new_0_5_17_7:"Agregar estilo de tema Comic/doodle",new_0_5_17_8:"Cambiar licencia a BSL-1.1",new_0_5_17_9:"Agregar página de plugins Hermes de solo lectura",new_0_5_17_10:"Convertir subidas de imágenes a formato multimodal base64",new_0_5_17_11:"Corregir selección y aislamiento del tablero Kanban",new_0_5_17_12:"Agregar ajustes de reproducción de voz con soporte TTS de 4 proveedores",new_0_5_17_13:"Reducir umbral de compresión de contexto de 200 a 150 mensajes",new_0_5_17_14:"Corregir lógica de reinicio de autoactualización de Web UI",new_0_5_17_15:"Corregir variable de entorno compartida opencode-zen y opencode-go que causaba acoplamiento de configuración",new_0_5_17_16:"Agregar soporte para idioma chino tradicional (zh-TW)",new_0_5_17_17:"Gestionar modelos visibles en la Web UI",new_0_5_17_18:"Kanban: cadena de acción completa de tareas (comentarios, logs, asignación, despacho) con límites de capacidades",new_0_5_17_19:"Corregir entradas de autenticación de proveedor no limpiadas al eliminar",new_0_5_17_20:"Corregir reconocimiento de autenticación credential-pool de Codex",new_0_5_17_21:"Agregar controles deslizantes de velocidad/tono de Edge TTS a los ajustes de voz",new_0_5_17_22:"Las claves YAML duplicadas en la configuración ya no causan fallos en el análisis",new_0_5_17_23:"La propiedad del puerto del gateway ahora se basa en archivo PID, evitando secuestro de puerto entre perfiles",new_0_5_17_24:"La página de historial ahora muestra registros de sesiones Cron",new_0_5_17_25:"Corregir iconos de cambio de idioma y tema comprimidos en la barra lateral colapsada",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 ¡Feliz Día del Trabajo! Hoy no se trabaja, agradezcan su comprensión",new_0_5_5_2:"Añadida página de historial para sesiones Hermes",new_0_5_5_3:"La página de historial gestiona sesiones de forma independiente",new_0_5_5_4:"Carga automática de primera sesión CLI",new_0_5_5_5:"Componente HistoryMessageList con inyección de props",new_0_5_5_6:"Filtrado de mensajes vacíos y tools sin toolName",new_0_5_5_7:"Eliminado caché de sesiones localStorage, datos del backend",new_0_5_5_8:"Optimizado cambio de perfil, eliminadas llamadas de cachete obsoletas",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Visualizacion en streaming en tiempo real de bloques de pensamiento/razonamiento",new_0_4_7_2:"Omitir script de preparacion durante la construccion Docker",new_0_4_7_3:"Mejoras en la experiencia movil del chat grupal y pulido de UI",new_0_4_7_4:"Limitar los tokens restantes del contexto a 0 en lugar de negativos",new_0_4_7_5:"Agregar proveedor integrado Alibaba Coding Plan con anulacion de base_url en .env",new_0_4_7_6:"Omitir perfiles remotos al inicio para evitar bloqueos",new_0_4_7_7:"Detectar y mostrar errores de ejecucion silenciosamente tragados",new_0_4_7_8:"Consulta de longitud de contexto consciente del proveedor",new_0_4_7_9:"Restablecer config.model al cambiar y resolver proveedor personalizado CLI",new_0_4_7_10:"Limpiar base_url_env de .env al eliminar proveedor integrado",new_0_4_7_11:"Alinear el fondo de la barra lateral del chat grupal con la lista de sesiones",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Agregar seguimiento de uso de tokens y longitud de contexto dinamico",new_0_4_2_2:"Agregar modal de busqueda de sesiones",new_0_4_2_3:"Restaurar sistema de chat grupal con Socket.IO y SQLite",new_0_4_2_4:"Agregar sesiones fijas y monitor en vivo en la pagina de chat",new_0_4_2_5:"Corregir deteccion de proveedores integrados y coincidencia de modelos"},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"},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",noAgents:"No hay agentes en esta sala",members:"Miembros",roomCreated:"Sala creada",roomDeleted:"Sala eliminada",roomCloned:"Sala clonada",cloneRoom:"Clonar 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",download:"Descargar",downloadFile:"Descargar archivo"}},Qn={login:{title:"Hermes 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",credentialsRequired:"Bitte Benutzername und Passwort eingeben",invalidCredentials:"Ungultiger Benutzername oder Passwort",tooManyAttempts:"Zu viele fehlgeschlagene Versuche, bitte versuchen Sie es spater erneut",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:"Richten Sie Benutzername und Passwort fur bequemes Login ein. Der Zugangs-Token bleibt als Backup verfugbar.",removeConfirm:"Mochten Sie das Passwort-Login wirklich entfernen? Sie mussen dann den Zugangs-Token verwenden.",passwordLoginNotConfigured:"Passwort-Login ist nicht konfiguriert",passwordLoginConfigured:"Passwort-Login aktiviert ({username})"},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"},sidebar:{chat:"Chat",search:"Suche",apiRelay:"API-Relay",history:"Verlauf",jobs:"Geplante Aufgaben",models:"Modelle",profiles:"Profile",plugins:"Plugins",skills:"Fahigkeiten",memory:"Gedachtnis",logs:"Protokolle",usage:"Nutzung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Terminal",files:"Dateien",groupChat:"Gruppenchat",groupConversation:"Konversation",settings:"Einstellungen",connected:"Verbunden",disconnected:"Getrennt",updateTip:'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',updateVersion:"Aktualisieren auf v{version}",reloadClientVersion:"Für v{version} neu laden",updating:"Aktualisierung...",updateSuccess:"Aktualisierung erfolgreich. Bitte aktualisieren Sie die Seite in Kurze. Wenn der Dienst langere Zeit nicht startet, starten Sie ihn manuell.",updateFailed:"Aktualisierung fehlgeschlagen",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar"},drawer:{terminal:"Terminal",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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Speichern",contextEditCancel:"Abbrechen",contextEditInvalid:"Bitte geben Sie eine gültige Kontextlänge ein",contextEditSuccess:"Kontextlänge aktualisiert",contextEditFailed:"Aktualisierung fehlgeschlagen",emptyState:"Starten Sie eine Konversation mit Hermes Agent",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",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"},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",sessionScopeHint:"Chat zeigt nur Web-UI/API-Server-Sitzungen. CLI-, Telegram-, Discord-, Cron- und andere Kanal-Sitzungen sind schreibgeschützt im Verlauf.",openHistory:"Verlauf öffnen",hermesHistory:"Hermes-Verlauf",historyScopeHint:"Schreibgeschützte Hermes-Verlaufssitzungen, 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",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",sessionDeleted:"Sitzung geloscht",rename:"Umbenennen",pin:"Anheften",unpin:"Lösen",pinned:"Angeheftet",chatMode:"Chat",liveMode:"Live",liveSessions:"Live-Sitzungen",recentBadge:"Kürzlich",linkedSessions:"{count} verknüpft",noVisibleMessages:"Keine für Menschen sichtbaren Nachrichten.",monitorRoleUser:"Benutzer",monitorRoleAssistant:"Assistent",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)",executionDuration:"Execution time",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:"Pause",resumeSpeech:"Fortsetzen",stopSpeech:"Stoppen",speechNotSupported:"Sprachwiedergabe in diesem Browser nicht unterstützt"},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:"Prompt",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"}},plugins:{title:"Plugins",refresh:"Aktualisieren",notice:"Schreibgeschütztes Inventar erkennbarer Hermes-Plugin-Manifeste. Discovery-Metadaten werden gelesen, ohne Plugin-Code zu laden. Verwaltungsaktionen bleiben in v1 im CLI; Änderungen gelten für neue Hermes-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 root",python:"Python",scanCwd:"Scan cwd",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",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 Login",nousWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein:",nousCopyCode:"Code kopiert",nousOpenLink:"Autorisierungsseite öffnen",nousApproved:"Login erfolgreich",nousDenied:"Autorisierung wurde abgelehnt",nousExpired:"Autorisierung abgelaufen",copilotLoginTitle:"GitHub Copilot Anmeldung",copilotWaiting:"Öffnen Sie GitHub und geben Sie den unten angezeigten Gerätecode ein. Das Fenster schließt sich automatisch nach Genehmigung.",copilotCopyCode:"Code kopiert",copilotOpenLink:"GitHub-Autorisierungsseite öffnen",copilotApproved:"Anmeldung erfolgreich!",copilotDenied:"Autorisierung abgelehnt.",copilotExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",copilotAddDetectedTitle:"GitHub Copilot erkannt",copilotAddDetected:'Auf diesem Rechner wurde ein GitHub Copilot OAuth-Token erkannt. Klicken Sie auf „Hinzufügen", um Copilot in Hermes zu aktivieren.',copilotAddSourceEnv:"Quelle: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Quelle: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Quelle: VS Code Copilot-Erweiterung (apps.json)",copilotDeleteHintEnv:"Dies löscht COPILOT_GITHUB_TOKEN in ~/.hermes/.env. Andere Tools sind nicht betroffen.",copilotDeleteHintGhCli:"Copilot wird aus Hermes ausgeblendet. Ihre gh CLI-Anmeldung bleibt erhalten — `gh auth status` zeigt weiterhin als angemeldet.",copilotDeleteHintAppsJson:"Copilot wird aus Hermes ausgeblendet. Ihre VS Code Copilot-Erweiterung bleibt angemeldet.",customBadge:"BENUTZERDEF.",previewBadge:"VORSCHAU",disabledBadge:"NICHT VERFÜGBAR",disabledTooltip:"Dieses Modell ist für Ihr Konto derzeit nicht verfügbar.",customModelPlaceholder:"Nicht gelistete Modell-ID",customModelHint:"Für vom Provider unterstützte Modelle, die die API nicht zurückgibt; keine Anzeige-Umbenennung. Enter zum Laden.",noProviders:"Keine Anbieter gefunden. Fugen Sie einen benutzerdefinierten Anbieter hinzu, um zu beginnen.",clearVisibleModels:"Auswahl löschen",builtIn:"Integriert",customType:"Benutzerdefiniert",provider:"Anbieter",contextLength:"Kontextlange",contextLengthPlaceholder:"z.B. 200000 (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"},profiles:{title:"Profile",create:"Profil erstellen",import:"Importieren",export:"Exportieren",rename:"Umbenennen",delete:"Loschen",switchTo:"Wechseln zu",switchConfirm:'Das Wechseln zum Profil "{name}" startet das Gateway neu. Fortfahren?',switchSuccess:'Zum Profil "{name}" gewechselt',switchFailed:"Profilwechsel fehlgeschlagen. Moglicherweise muss das Gateway 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."},logs:{title:"Protokolle",all:"Alle",searchPlaceholder:"Suchen...",refresh:"Aktualisieren",noEntries:"Keine Protokolleintrage"},settings:{title:"Einstellungen",saved:"Gespeichert",saveFailed:"Speichern fehlgeschlagen",tabs:{display:"Anzeige",account:"Konto",agent:"Agent",memory:"Gedachtnis",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"},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"},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",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"}},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",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..."},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 Read",cacheWrite:"Cache Write",sessions:"Sitzungen",cost:"Kosten",noData:"Keine Nutzungsdaten"},skillsUsage:{title:"Skill-Nutzung",subtitle:"Skill-Ladevorgänge und -Bearbeitungen aus Hermes-Sitzungen verfolgen",refresh:"Aktualisieren",periodSelector:"Zeitraum der Skill-Nutzung",periodLabel:"{days} T",summary:"Zusammenfassung",totalActions:"Aktionen",loads:"Laden",edits:"Änd.",distinctSkills:"Skillzahl",topSkills:"Top-Skills",dailyTrend:"Trend",periodSummary:"Letzte {days} Tage",skill:"Fähigkeit",share:"%",lastUsed:"Zuletzt",noData:"Keine Skill-Nutzungsdaten",loadFailed:"Skill-Nutzung konnte nicht geladen werden",otherSkills:"Andere Skills"},changelog:{new_0_5_6_1:"Sprachwiedergabe mit Web Speech API: manuelle Taste, Auto-Play-Schalter, Regenbogen-Randanimation und Mobile-Optimierung",new_0_5_6_2:"Robuster LLM-JSON-Parser mit Toleranz für Python-Format und Textextraktion aus Streaming-Events",new_0_5_6_3:"Skills-Verbesserungen: Nutzungsstatistiken, Quellfilterung, archivierte Skills, Herkunft und Pin-Toggle",new_0_5_6_4:"Erweiterte tägliche Nutzungsstatistiken mit detaillierter Token-Aufschlüsselung inkl. Cache-Lese-/Schreibtrennung",new_0_5_6_5:"Sitzungshistorium-Umfang geklärt mit verbesserten Beschreibungen in Chat- und Historienansichten",new_0_5_6_6:"Attachment-Verarbeitung neu gestaltet mit Anthropic-Stil ContentBlock-Array-Format (Text, Bild, Datei)",new_0_5_6_7:"Frontend-Dateidownload-Funktion für ContentBlock- und Markdown-Formate mit Authentifizierung hinzugefügt",new_0_5_6_8:"Multi-Prozess-Konflikt behoben, der SQLite-Database-Resets verursacht hat, durch Entfernen redundanter nodemon-Instanzen",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Kanban-Board für visuelle Aufgaben- und Sitzungsverwaltung hinzugefügt",new_0_5_15_2:"Offizielle Landing Page und Dokumentations-Website hinzugefügt",new_0_5_15_3:"Group-Chat-Agent-Client verwendet dynamischen Port statt fest codiert 8648",new_0_5_15_4:"node-edge-tts Sprachmodul hinzugefügt",new_0_5_15_5:"WSL-Standard-Listen-Host-Binding korrigiert",new_0_5_15_6:"Website-Startseiten-Metadaten für SEO hinzugefügt",new_0_5_15_7:"IP-basierten Schutz vor Login-Brute-Force-Angriffen hinzugefügt",new_0_5_15_8:"Doppelte Download-URL-Verpackung im MarkdownRenderer korrigiert",new_0_5_15_9:"Hermes Markdown-Medien-Rendering und Sync-Wiederholung korrigiert",new_0_5_15_10:"Upstream-Umgebungsvariablenabhängigkeit entfernt",new_0_5_15_11:"Wenn die Kanban-Funktion nicht verfügbar ist, updaten Sie bitte hermes-agent",new_0_5_16_1:"Chat-Streaming von /v1/runs auf /v1/responses API migriert für geringere Latenz",new_0_5_16_2:"Echte API-Nutzung (Tokens, Cache, Reasoning) in Nutzungsstatistik-Tabelle speichern",new_0_5_16_3:"QQ-Gruppen-QR-Code zur Website-Navigationsleiste hinzugefügt",new_0_5_16_4:"Unbenutztes codex_reasoning_items-Feld aus dem Nachrichtenschema entfernt",new_0_5_17_1:"Vollständige Windows-Kompatibilität: Pfadverarbeitung, Prozessverwaltung, Terminal, Log-Parsing",new_0_5_17_2:"Gateway-Prozessverwaltung refaktoriert mit plattformübergreifendem Start/Stop/Health-Check",new_0_5_17_3:"Plugin-Erkennung auf Termux repariert durch Parsen des Hermes-Shebangs zur Python-Lokalisierung",new_0_5_17_4:"Doppelte YAML-Schluessel in der Config-Parsing tolerieren",new_0_5_17_5:"Auth-Sperrfenster und Dev-Shutdown-Ablauf verbessert",new_0_5_17_6:"Comic-Theme: Handschriften-Fonts für Chinesisch (ZCOOL KuaiLe), Japanisch (Zen Maru Gothic), Koreanisch (Gaegu) hinzugefügt",new_0_5_17_7:"Comic/Doodle-Themenstil hinzugefuegt",new_0_5_17_8:"Lizenz auf BSL-1.1 geaendert",new_0_5_17_9:"Schreibgeschuetzte Hermes-Plugins-Seite hinzugefuegt",new_0_5_17_10:"Bild-Uploads in Base64-Multimodalformat konvertieren",new_0_5_17_11:"Kanban-Board-Auswahl und Isolierung korrigiert",new_0_5_17_12:"Sprachwiedergabeeinstellungen mit TTS-Unterstützung für 4 Anbieter hinzugefügt",new_0_5_17_13:"Schwellenwert fuer Kontextkomprimierung von 200 auf 150 Nachrichten gesenkt",new_0_5_17_14:"Web-UI-Selbstupdate-Neustartlogik korrigiert",new_0_5_17_15:"Gemeinsame Umgebungsvariable opencode-zen und opencode-go korrigiert, die Konfigurationskopplung verursachte",new_0_5_17_16:"Unterstützung für Traditionelles Chinesisch (zh-TW) hinzugefügt",new_0_5_17_17:"Sichtbare Modelle in der Web-UI verwalten",new_0_5_17_18:"Kanban: Vollständige Aktionskette für Aufgaben (Kommentare, Logs, Zuweisung, Versand) mit Fähigkeitsgrenzen",new_0_5_17_19:"Provider-Auth-Einträge werden beim Löschen nicht mehr gelöscht – korrigiert",new_0_5_17_20:"Codex credential-pool Auth-Erkennung korrigiert",new_0_5_17_21:"Edge TTS Geschwindigkeits-/Tonhoehen-Slider zu den Spracheinstellungen hinzugefuegt",new_0_5_17_22:"Doppelte YAML-Schluessel in der Config verursachen keinen Parsing-Absturz mehr",new_0_5_17_23:"Gateway-Port-Eigentum basiert jetzt auf PID-Datei und verhindert profiluebergreifende Port-Entfuehrung",new_0_5_17_24:"Verlaufsseite zeigt jetzt Cron-Sitzungsaufzeichnungen an",new_0_5_17_25:"Sprachwechsel- und Themen-Symbole in eingeklappter Seitenleiste nicht mehr gequetscht",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Tag der Arbeit! Heute wird nicht gearbeitet, bitte habt Verständnis",new_0_5_5_2:"Verlaufsseite für Hermes-Sitzungshistorie hinzugefügt",new_0_5_5_3:"Verlaufsseite verwaltet Sitzungen unabhängig ohne Störung des aktiven Chats",new_0_5_5_4:"Verlaufsseite lädt automatisch erste CLI-Sitzung",new_0_5_5_5:"HistoryMessageList-Komponente mit Session-Prop-Injection",new_0_5_5_6:"Leere Nachrichten und Tool-Nachrichten ohne toolName gefiltert",new_0_5_5_7:"LocalStorage-Sitzungscache entfernt, Daten direkt vom Backend",new_0_5_5_8:"Profile-Umschaltung optimiert, veraltete Cache-Aufrufe entfernt",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Echtzeit-Streaming-Anzeige von Denk-/Argumentationsblocken",new_0_4_7_2:"Prepare-Skript wahrend Docker-Build uberspringen",new_0_4_7_3:"Gruppenchat-Mobile-UX-Verbesserungen und UI-Aufpolierung",new_0_4_7_4:"Verbleibende Kontext-Token auf 0 statt auf negativ begrenzen",new_0_4_7_5:"Alibaba Coding Plan integrierter Provider mit .env base_url-Uberschreibung hinzugefugt",new_0_4_7_6:"Remote-Profile beim Start uberspringen, um Hanger zu vermeiden",new_0_4_7_7:"Stillschweigend verschluckte Laufzeitfehler erkennen und anzeigen",new_0_4_7_8:"Provider-bewusste Kontextlangen-Abfrage",new_0_4_7_9:"config.model beim Wechsel zurucksetzen und CLI-Custom-Provider auflosen",new_0_4_7_10:"base_url_env aus .env beim Loschen des integrierten Providers entfernen",new_0_4_7_11:"Gruppenchat-Raum-Seitenleistenhintergrund an die Sitzungsliste anpassen",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Token-Nutzungsverfolgung und dynamische Kontextlange hinzugefugt",new_0_4_2_2:"Sitzungssuche-Modal hinzugefugt",new_0_4_2_3:"Gruppenchat-System mit Socket.IO und SQLite wiederhergestellt",new_0_4_2_4:"Angeheftete Sitzungen und Live-Monitor hinzugefugt",new_0_4_2_5:"Eingebaute Provider-Erkennung und Modellabgleich behoben"},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"},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",noAgents:"Keine Agenten in diesem Raum",members:"Mitglieder",roomCreated:"Raum erstellt",roomDeleted:"Raum gelöscht",roomCloned:"Raum geklont",cloneRoom:"Raum klonen",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",download:"Herunterladen",downloadFile:"Datei herunterladen"}},Jn={login:{title:"Hermes 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",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",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:"Configure um nome de usuario e senha para login conveniente. O token de acesso continuara funcionando como backup.",removeConfirm:"Tem certeza de que deseja remover o login por senha? Voce precisara usar o token de acesso.",passwordLoginNotConfigured:"Login por senha nao configurado",passwordLoginConfigured:"Login por senha habilitado ({username})"},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"},sidebar:{chat:"Chat",search:"Pesquisar",apiRelay:"API Relay",history:"Historico",jobs:"Tarefas agendadas",models:"Modelos",profiles:"Perfis",plugins:"Plugins",skills:"Habilidades",memory:"Memoria",logs:"Logs",usage:"Uso",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",files:"Arquivos",groupChat:"Chat em grupo",groupConversation:"Conversa",settings:"Configuracoes",connected:"Conectado",disconnected:"Desconectado",updateTip:'Execute "hermes-web-ui update" no terminal para atualizar',updateVersion:"Atualizar para v{version}",reloadClientVersion:"Recarregar para v{version}",updating:"Atualizando...",updateSuccess:"Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.",updateFailed:"Falha na atualizacao",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel"},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: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"Salvar",contextEditCancel:"Cancelar",contextEditInvalid:"Por favor, insira um tamanho de contexto válido",contextEditSuccess:"Tamanho do contexto atualizado",contextEditFailed:"Falha na atualização",emptyState:"Inicie uma conversa com o Hermes Agent",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",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"},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",sessionScopeHint:"O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.",openHistory:"Abrir histórico",hermesHistory:"Histórico Hermes",historyScopeHint:"Sessões do histórico Hermes 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",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",sessionDeleted:"Sessao excluida",rename:"Renomear",pin:"Fixar",unpin:"Desafixar",pinned:"Fixadas",chatMode:"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",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)",executionDuration:"Execution time",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"},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"}},plugins:{title:"Plugins",refresh:"Atualizar",notice:"Inventário somente leitura dos manifests de plugins Hermes 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 Hermes.",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:"Agent root",python:"Python",scanCwd:"Scan 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",providerType:"Tipo de provedor",preset:"Preset",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 Hermes.",copilotAddSourceEnv:"Origem: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)",copilotAddSourceGhCli:"Origem: gh CLI (gh auth token)",copilotAddSourceAppsJson:"Origem: extensão Copilot do VS Code (apps.json)",copilotDeleteHintEnv:"Isto irá limpar o COPILOT_GITHUB_TOKEN em ~/.hermes/.env. Outras ferramentas não são afetadas.",copilotDeleteHintGhCli:"O Copilot ficará oculto no Hermes. Sua sessão no gh CLI não é afetada — `gh auth status` continuará indicando que está conectado.",copilotDeleteHintAppsJson:"O Copilot ficará oculto no Hermes. A extensão Copilot do VS Code continuará conectada.",customBadge:"PERSONALIZADO",previewBadge:"PRÉVIA",disabledBadge:"INDISPONÍVEL",disabledTooltip:"Este modelo não está disponível para sua conta.",customModelPlaceholder:"ID de modelo não listado",customModelHint:"Para modelos compatíveis com o provedor que a API não retorna; não é uma renomeação de exibição. Enter para carregar.",noProviders:"Nenhum provedor encontrado. Adicione um provedor personalizado para comecar.",clearVisibleModels:"Limpar seleção",builtIn:"Integrado",customType:"Personalizado",provider:"Provedor",contextLength:"Tamanho do contexto",contextLengthPlaceholder:"ex: 200000 (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"},profiles:{title:"Perfis",create:"Criar perfil",import:"Importar",export:"Exportar",rename:"Renomear",delete:"Excluir",switchTo:"Mudar para",switchConfirm:'Mudar para o perfil "{name}" reiniciara o gateway. Continuar?',switchSuccess:'Mudou para o perfil "{name}"',switchFailed:"Falha ao mudar de perfil. 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."},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",agent:"Agente",memory:"Memoria",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"},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"},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",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"}},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",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..."},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}"},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:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessoes",cost:"Custo",noData:"Sem dados de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Acompanhe carregamentos e edições de habilidades nas sessões Hermes",refresh:"Atualizar",periodSelector:"Período de uso de habilidades",periodLabel:"{days} d",summary:"Resumo",totalActions:"Ações",loads:"Carga",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendência diária",periodSummary:"Últimos {days} dias",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"Nenhum dado de uso de habilidades",loadFailed:"Falha ao carregar o uso de habilidades",otherSkills:"Outras habs."},changelog:{new_0_5_6_1:"Reprodução de voz: Web Speech API, botão manual, interruptor auto-play, animação de borda arco-íris e otimização móvel",new_0_5_6_2:"Parser JSON LLM robusto com tolerância ao formato Python e extração de texto de eventos streaming",new_0_5_6_3:"Melhorias de Skills: estatísticas de uso, filtragem de fonte, skills arquivados, procedência e toggle de fixação",new_0_5_6_4:"Estatísticas diárias de uso expandidas com breakdown detalhado de tokens incluindo separação de leitura/escrita de cache",new_0_5_6_5:"Escopo do histórico de sessões clarificado com descrições melhoradas nas visualizações de chat e histórico",new_0_5_6_6:"Processamento de anexos reprojetado usando formato de matriz ContentBlock estilo Anthropic (texto, imagem, arquivo)",new_0_5_6_7:"Adicionada funcionalidade de download de arquivos frontend suportando formatos ContentBlock e Markdown com autenticação",new_0_5_6_8:"Corrigido conflito de múltiplos processos que causava redefinições do banco de dados SQLite eliminando instâncias nodemon redundantes",new_0_5_14_1:"Add session export with full and compressed modes (JSON or plain text)",new_0_5_14_2:"Fix terminal PTY resource exhaustion, switch to lazy connect",new_0_5_14_3:"Fix WSL2 health check failure caused by IPv6 dual-stack binding",new_0_5_14_4:"Fix SQLite connection not released on shutdown causing database lock",new_0_5_14_5:"Update FUN provider models, add builtin badge and API relay link",new_0_5_15_1:"Quadro Kanban para gestão visual de tarefas e sessões",new_0_5_15_2:"Página inicial e site de documentação oficiais",new_0_5_15_3:"Cliente agente group-chat usa porta dinâmica em vez de 8648",new_0_5_15_4:"Módulo de voz node-edge-tts adicionado",new_0_5_15_5:"Corrigido bind de host de escuta WSL padrão",new_0_5_15_6:"Metadados SEO para página inicial do site",new_0_5_15_7:"Proteção contra ataques de força bruta baseada em IP",new_0_5_15_8:"Corrigido empacotamento duplo de URLs de download no MarkdownRenderer",new_0_5_15_9:"Corrigido renderização de mídia Markdown e retry de sincronização",new_0_5_15_10:"Removida dependência de variável de ambiente upstream",new_0_5_15_11:"Se o recurso Kanban não estiver disponível, atualize o hermes-agent",new_0_5_16_1:"Migrar streaming de chat de /v1/runs para /v1/responses API para menor latência",new_0_5_16_2:"Persistir uso real da API (tokens, cache, raciocínio) na tabela de estatísticas",new_0_5_16_3:"Adicionar código QR do grupo QQ à barra de navegação do site",new_0_5_16_4:"Remover campo codex_reasoning_items não utilizado do esquema de mensagens",new_0_5_17_1:"Compatibilidade total com Windows: manipulação de caminhos, gerenciamento de processos, terminal, análise de logs",new_0_5_17_2:"Refatorado gerenciamento de processos do Gateway com início/parada/health-check multiplataforma",new_0_5_17_3:"Corrigida descoberta de plugins no Termux analisando o shebang do hermes para localizar o Python",new_0_5_17_4:"Tolerar chaves YAML duplicadas na análise de configuração",new_0_5_17_5:"Melhorada janela de bloqueio de autenticação e fluxo de desligamento do ambiente de desenvolvimento",new_0_5_17_6:"Tema Comic: fontes manuscritas para chinês (ZCOOL KuaiLe), japonês (Zen Maru Gothic), coreano (Gaegu)",new_0_5_17_7:"Adicionar estilo de tema Comic/doodle",new_0_5_17_8:"Alterar licença para BSL-1.1",new_0_5_17_9:"Adicionar página de plugins Hermes somente leitura",new_0_5_17_10:"Converter uploads de imagem para formato multimodal base64",new_0_5_17_11:"Corrigir seleção e isolamento do quadro Kanban",new_0_5_17_12:"Adicionar configurações de reprodução de voz com suporte TTS de 4 provedores",new_0_5_17_13:"Reduzir limiar de compressão de contexto de 200 para 150 mensagens",new_0_5_17_14:"Corrigir lógica de reinicialização de autoatualização da Web UI",new_0_5_17_15:"Corrigir variável de ambiente compartilhada opencode-zen e opencode-go causando acoplamento de configuração",new_0_5_17_16:"Adicionar suporte ao idioma Chinês Tradicional (zh-TW)",new_0_5_17_17:"Suportar gerenciamento de modelos visíveis na Web UI",new_0_5_17_18:"Kanban: cadeia completa de ações de tarefas (comentários, logs, atribuição, despacho) com limites de capacidades",new_0_5_17_19:"Corrigir entradas de autenticação do provedor não limpas ao excluir",new_0_5_17_20:"Corrigir reconhecimento de autenticação credential-pool do Codex",new_0_5_17_21:"Adicionar controles deslizantes de velocidade/tom do Edge TTS às configurações de voz",new_0_5_17_22:"Chaves YAML duplicadas na configuração não causam mais falhas na análise",new_0_5_17_23:"Propriedade da porta do gateway agora baseada em arquivo PID, prevenindo sequestro de porta entre perfis",new_0_5_17_24:"Página de histórico agora exibe registros de sessões Cron",new_0_5_17_25:"Corrigir ícones de troca de idioma e tema comprimidos na barra lateral recolhida",new_0_5_18_1:"Add Skills Usage monitoring page with daily trend chart and top skills statistics",new_0_5_18_2:"Add CLI chat session bridge with Python agent bridge for WebSocket-based sessions",new_0_5_18_3:"Add Ollama Cloud provider preset with dynamic model catalog",new_0_5_18_4:"Support model display name renaming (aliases)",new_0_5_18_5:"Support model visibility management in Web UI",new_0_5_18_6:"Enhance usage analytics dashboard",new_0_5_18_7:"Docker single-container deployment with docker-compose and gateway startup fixes",new_0_5_18_8:"Fix plugins page HERMES_HOME fallback warning for non-default profiles",new_0_5_18_9:"Fix gateway stability across dev restarts and improve Windows compatibility",new_0_5_22_1:"Fix Hermes session list API reading the Web UI local session store instead of the Hermes profile database",new_0_5_23_1:"Add bridge-only chat slash commands with localized command suggestions",new_0_5_23_2:"Persist command history for session replay without polluting model context, usage, or compression",new_0_5_23_3:"Isolate gateway profile environment variables to prevent credentials leaking across profiles",new_0_5_23_4:"Reserve the Web UI port during gateway allocation to avoid startup conflicts",new_0_5_23_5:"Fix self-update restart handling so successful helper exits are not reported as failures",new_0_5_24_1:"Align Bridge chat with API Server handling for multimodal input, system prompt, and workspace context",new_0_5_25_1:"Add group chat room reset and clone actions",new_0_5_25_2:"Make the Web UI state directory configurable for custom deployment layouts",new_0_5_25_3:"Add MiMo as a TTS provider in voice settings",new_0_5_25_4:"Fetch custom provider model lists through the backend to avoid browser CORS failures",new_0_5_25_5:"Fix tool approval flow for bridge sessions",new_0_5_25_6:"Remove the forced CLI platform hint from bridge prompts so custom media/file instructions are preserved",new_0_5_25_7:"Show base64 image content correctly in user message history",new_0_5_25_8:"Add Playwright browser tests, chat streaming contract coverage, provider model coverage, and coverage baseline",new_0_5_26_1:"Support Windows and local Markdown media paths in chat history and rendered messages",new_0_5_26_2:"Filter empty assistant history and clear stale compression status when a new run starts",new_0_5_26_3:"Add locked file writes for config and profile updates to reduce concurrent write corruption",new_0_5_26_4:"Add QQBot and DingTalk channel settings",new_0_5_26_5:"Make CLI port detection portable and improve mobile terminal drawer sizing",new_0_5_26_6:"Isolate Bridge profile environments and fix Hermes plugin discovery across Python environments",new_0_5_26_7:"Explain stopped gateway states with Web UI diagnostics and keep log loading state stable",new_0_5_26_8:"Fix session reset mode options, custom provider base URL handling, and dynamic deliver targets",new_0_5_26_9:"Add a local tool-call trace visibility toggle in the chat input bar",new_0_5_26_10:"Support Hermes Agent package installs when no source checkout is available",new_0_5_26_11:"Add xAI Grok OAuth login for SuperGrok subscription users and update Grok model presets",new_0_5_26_12:"Expand browser, chat streaming, provider, gateway, config, plugin, and Bridge test coverage",new_0_5_27_1:"Add session-level model settings for Bridge chats, with independent provider and model saved per session",new_0_5_27_2:"Right-click a Bridge session and choose Set Model to switch the model for that session",new_0_5_27_3:"Runs now validate the session model and fall back to the current default model when the saved model is unavailable",new_0_5_27_4:"Context compression now follows the current Profile default selected model by default",new_0_5_5_1:"🎉 Feliz Dia do Trabalhador! Hoje não se trabalha, obrigado pela compreensão",new_0_5_5_2:"Adicionada página de histórico para sessões Hermes",new_0_5_5_3:"Página de histórico gerencia sessões de forma independente",new_0_5_5_4:"Carregamento automático da primeira sessão CLI",new_0_5_5_5:"Componente HistoryMessageList com injeção de props",new_0_5_5_6:"Filtragem de mensagens vazias e tools sem toolName",new_0_5_5_7:"Removido cache de sessões localStorage, dados do backend",new_0_5_5_8:"Otimizada troca de perfil",new_0_5_4_2:"Fix concurrent chat sessions event cross-talk with WebSocket event routing refactoring",new_0_5_4_3:"Fix cron job edit payloads with partial PATCH to support long prompt name-only edits",new_0_5_4_4:"Fix web terminal Hermes CLI availability after Docker deployment",new_0_5_4_5:"Add workspace dialog i18n translations for title and improve session persistence",new_0_5_4_6:"Support code block copy feedback with user notifications",new_0_5_4_7:"Align usage analytics with Hermes state DB schema",new_0_4_8_2:"Fix nested markdown fence rendering truncation",new_0_4_8_3:"Fix compressed session lineage projection and search",new_0_4_8_4:"Optimize session list N+1 queries and fix search 500 on non-CJK input",new_0_4_8_5:"Fix forced scroll to bottom when switching back from other tabs",new_0_4_8_6:"Smooth session switch with loading transition overlay",new_0_4_8_7:"Fix login token validation using Hermes session endpoint",new_0_4_8_8:"Fix image attachments broken after page refresh (blob URL persistence)",new_0_4_8_9:"Click image attachments to preview in fullscreen overlay",new_0_4_8_10:"Move upload directory from temp to ~/.hermes-web-ui/upload",new_0_4_7_1:"Exibicao em streaming em tempo real de blocos de pensamento/razoamento",new_0_4_7_2:"Ignorar script de preparacao durante o build Docker",new_0_4_7_3:"Melhorias na UX mobile do chat em grupo e polimento da UI",new_0_4_7_4:"Limitar os tokens restantes do contexto a 0 em vez de negativo",new_0_4_7_5:"Adicionar provedor integrado Alibaba Coding Plan com substituicao de base_url no .env",new_0_4_7_6:"Ignorar perfis remotos na inicializacao para evitar travamento",new_0_4_7_7:"Detectar e exibir erros de execucao silenciosamente engolidos",new_0_4_7_8:"Consulta de comprimento de contexto consciente do provedor",new_0_4_7_9:"Redefinir config.model ao trocar e resolver provedor personalizado CLI",new_0_4_7_10:"Limpar base_url_env do .env ao excluir provedor integrado",new_0_4_7_11:"Alinhar o fundo da barra lateral da sala de chat em grupo com a lista de sessoes",new_0_4_5_1:"Add group chat with multi-agent rooms, mention routing, and typing status recovery",new_0_4_5_2:"Rewrite model-context config to use YAML with context_length setting",new_0_4_5_3:"Add gpt-5.5 to OpenAI Codex model list",new_0_4_5_4:"Replace jobs proxy with local controller and optimize model loading",new_0_4_5_5:"Add i18n support for custom model feature in ModelSelector",new_0_4_5_6:"Fix sidebar i18n missing key warnings",new_0_4_5_7:"Clear all localStorage on logout",new_0_4_5_8:"Add periodic log rotation to prevent unbounded log growth",new_0_4_2_1:"Adicionar rastreamento de uso de tokens e comprimento de contexto dinamico",new_0_4_2_2:"Adicionar modal de busca de sessoes",new_0_4_2_3:"Restaurar sistema de chat em grupo com Socket.IO e SQLite",new_0_4_2_4:"Adicionar sessoes fixas e monitor ao vivo na pagina de chat",new_0_4_2_5:"Corrigir deteccao de provedores integrados e combinacao de modelos"},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"},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",noAgents:"Nenhum agente nesta sala",members:"Membros",roomCreated:"Sala criada",roomDeleted:"Sala excluída",roomCloned:"Sala clonada",cloneRoom:"Clonar 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",download:"Baixar",downloadFile:"Baixar arquivo"}},io=["en","zh","zh-TW","ja","ko","fr","es","de","pt"];function Lo(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function Ko(o,e){const t={...o};for(const[r,c]of Object.entries(e)){const i=o[r];t[r]=Lo(i)&&Lo(c)?Ko(i,c):c}return t}var $n={en:Vo,zh:On,"zh-TW":jn,ja:Wn,ko:Vn,fr:Kn,es:Gn,de:Qn,pt:Jn},Go={};for(const[o,e]of Object.entries($n))Go[o]=o==="en"?e:Ko(Vo,e);var Zn=localStorage.getItem("hermes_locale");function Yn(o){if(o&&io.includes(o))return o;function e(t){const r=t.toLowerCase();if(r.startsWith("zh"))return r.includes("hant")||r.includes("-tw")||r.includes("-hk")||r.includes("-mo")?"zh-TW":"zh";const c=t.slice(0,2);return io.includes(t)?t:io.includes(c)?c:null}for(const t of navigator.languages){const r=e(t);if(r)return r}return"en"}var Xn=Yn(Zn),Qo=Fn({legacy:!1,locale:Xn,fallbackLocale:"en",messages:Go});function et(o){Qo.global.locale.value=o}var ot,nt=ve((()=>{ot="/logo.png"}));nt();xe();var tt={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"}},at={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 it(o,e){const t=o?at:tt;return e?{...t,common:{...t.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:t}function st(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function je(){const o=st(be.value);Ue.value=o,Pe.value=Se.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",Pe.value)}function Jo(){const o=se(()=>{const i=Ue.value?"dark":"light";return Pe.value?`comic-${i}`:i});function e(i){be.value=i}function t(i){Se.value=i}function r(){be.value=Ue.value?"light":"dark"}function c(){Se.value=Pe.value?"ink":"comic"}return{brightness:be,style:Se,isDark:Ue,isComic:Pe,themeName:o,setBrightness:e,setStyle:t,toggleBrightness:r,toggleStyle:c}}var so,ro,be,Se,Ue,Pe,$o=ve((()=>{so="hermes_brightness",ro="hermes_style",be=S(localStorage.getItem(so)||"system"),Se=S(localStorage.getItem(ro)||"ink"),Ue=S(!1),Pe=S(!1),je(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{be.value==="system"&&je()}),ke(be,o=>{localStorage.setItem(so,o),je()}),ke(Se,o=>{localStorage.setItem(ro,o),je()})}));$o();_e();Xe();Ce();var rt={class:"model-selector"},lt={class:"model-label"},dt=["title"],ct={class:"model-list"},ut=["onClick"],mt={class:"model-group-label"},pt={class:"model-group-count"},_t={class:"model-group-items"},gt=["title","onClick"],ht={class:"model-item-label"},vt={class:"model-item-name"},ft={key:0,class:"model-item-id"},wt={key:0,class:"model-badge-preview"},bt={key:1,class:"model-badge-disabled"},yt={key:2,class:"model-badge-custom"},Ct=["title","onClick"],kt={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"},St={key:0,class:"model-empty"},Pt={class:"model-custom"},At={class:"model-custom-row"},xt={class:"model-custom-hint"},Tt=ye({__name:"ModelSelector",setup(o){const{t:e}=Te(),t=qe(),r=S(!1),c=S(""),i=S({}),s=S(""),_=S(""),h=se(()=>t.displayModelName(t.selectedModel,t.selectedProvider)),U=se(()=>(_.value=t.selectedProvider,t.modelGroups.map(f=>({label:f.label,value:f.provider})))),x=se(()=>t.modelGroups.map(f=>({...f,models:[...f.models,...(t.customModels[f.provider]||[]).filter(g=>!f.models.includes(g))]})));function k(f,g){return(t.customModels[g]||[]).includes(f)}async function ee(f,g){await t.removeCustomModel(f,g)}function q(f){return typeof f=="string"?f.toLowerCase():""}const te=se(()=>{const f=q(c.value).trim();return f?x.value.map(g=>({...g,models:g.models.filter(D=>{const Q=t.displayModelName(D,g.provider);return q(D).includes(f)||q(Q).includes(f)})})).filter(g=>g.models.length>0||q(g.label).includes(f)):x.value});function X(f){i.value[f]=!i.value[f]}function ae(f){return!!i.value[f]}function O(f,g){t.modelGroups.find(D=>D.provider===g)?.model_meta?.[f]?.disabled||(t.switchModel(f,g),r.value=!1,c.value="")}function l(f,g){return t.displayModelName(f,g)}function z(f,g){return t.getModelAlias(f,g)}function G(){const f=s.value.trim();!f||!_.value||t.modelGroups.find(g=>g.provider===_.value)?.model_meta?.[f]?.disabled||(t.switchModel(f,_.value),r.value=!1,c.value="",s.value="")}function j(){i.value={},c.value="",s.value="",_.value=t.selectedProvider,r.value=!0}return(f,g)=>(I(),F("div",rt,[a("div",lt,C(u(e)("models.title")),1),a("button",{class:"model-trigger",onClick:j},[a("span",{class:"model-name",title:u(t).selectedModel},C(h.value||"—"),9,dt),g[4]||(g[4]=a("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"},[a("polyline",{points:"6 9 12 15 18 9"})],-1))]),de(u(wo),{show:r.value,"onUpdate:show":g[3]||(g[3]=D=>r.value=D),preset:"card",title:u(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:he(()=>[de(u(po),{value:c.value,"onUpdate:value":g[0]||(g[0]=D=>c.value=D),placeholder:u(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),a("div",ct,[(I(!0),F(Ne,null,Be(te.value,D=>(I(),F("div",{key:D.provider,class:"model-group"},[a("div",{class:"model-group-header",onClick:Q=>X(D.provider)},[(I(),F("svg",{class:Y(["model-group-arrow",{collapsed:ae(D.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...g[5]||(g[5]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),a("span",mt,C(D.label),1),a("span",pt,C(D.models.length),1)],8,ut),ze(a("div",_t,[(I(!0),F(Ne,null,Be(D.models,Q=>(I(),F("div",{key:Q,class:Y(["model-item",{active:Q===u(t).selectedModel&&D.provider===u(t).selectedProvider,disabled:!!D.model_meta?.[Q]?.disabled}]),title:D.model_meta?.[Q]?.disabled?u(e)("models.disabledTooltip"):"",onClick:T=>O(Q,D.provider)},[a("span",ht,[a("span",vt,C(l(Q,D.provider)),1),z(Q,D.provider)?(I(),F("span",ft,C(u(e)("models.aliasCanonical",{model:Q})),1)):me("",!0)]),D.model_meta?.[Q]?.preview?(I(),F("span",wt,C(u(e)("models.previewBadge")),1)):me("",!0),D.model_meta?.[Q]?.disabled?(I(),F("span",bt,C(u(e)("models.disabledBadge")),1)):me("",!0),k(Q,D.provider)?(I(),F("span",yt,C(u(e)("models.customBadge")),1)):me("",!0),k(Q,D.provider)?(I(),F("button",{key:3,class:"model-custom-remove",type:"button",title:u(e)("models.removeCustomModel"),onClick:Pn(T=>ee(Q,D.provider),["stop"])}," × ",8,Ct)):me("",!0),Q===u(t).selectedModel&&D.provider===u(t).selectedProvider?(I(),F("svg",kt,[...g[6]||(g[6]=[a("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):me("",!0)],10,gt))),128))],512),[[Fe,!ae(D.provider)]])]))),128)),te.value.length===0?(I(),F("div",St,C(c.value?"No results":"No models"),1)):me("",!0),a("div",Pt,[a("div",At,[de(u(yo),{value:_.value,"onUpdate:value":g[1]||(g[1]=D=>_.value=D),options:U.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),de(u(po),{value:s.value,"onUpdate:value":g[2]||(g[2]=D=>s.value=D),placeholder:u(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:An(G,["enter"])},null,8,["value","placeholder"])]),a("div",xt,C(u(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});He();var Ht=Ie(Tt,[["__scopeId","data-v-146cca78"]]);_e();xe();Po();Ce();var It={class:"profile-selector"},Mt={class:"selector-label"},Dt=ye({__name:"ProfileSelector",setup(o){const{t:e}=Te(),t=Co(),r=Wo(),c=se(()=>r.profiles.map(_=>({label:_.name,value:_.name}))),i=se(()=>r.activeProfileName??"");async function s(_){typeof _=="string"&&_!==i.value&&(await r.switchProfile(_)?(t.success(e("profiles.switchSuccess",{name:_})),window.location.reload()):t.error(e("profiles.switchFailed")))}return Je(()=>{r.profiles.length===0&&r.fetchProfiles()}),(_,h)=>(I(),F("div",It,[a("div",Mt,C(u(e)("sidebar.profiles")),1),de(u(yo),{"data-testid":"profile-selector-select",value:i.value,options:c.value,loading:u(r).switching,size:"small","onUpdate:value":s},null,8,["value","options","loading"])]))}});He();var Rt=Ie(Dt,[["__scopeId","data-v-ace64f6e"]]);_e();Ce();xe();var Et=ye({__name:"LanguageSwitch",setup(o){const{locale:e}=Te(),t=[{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"}];function r(c){et(c),localStorage.setItem("hermes_locale",c)}return(c,i)=>(I(),Ae(u(yo),{value:u(e),options:t,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":r},null,8,["value"]))}}),Lt=Et;_e();var Ft={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},zt=["title"],Ut={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Nt={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Bt=["title"],qt={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Ot={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},jt=ye({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:t,toggleBrightness:r,toggleStyle:c}=Jo();return(i,s)=>(I(),F("div",Ft,[a("button",{class:"theme-switch",title:u(t)?"Ink style":"Comic style",onClick:s[0]||(s[0]=(..._)=>u(c)&&u(c)(..._))},[u(t)?(I(),F("svg",Ut,[...s[2]||(s[2]=[a("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(I(),F("svg",Nt,[...s[3]||(s[3]=[a("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,zt),a("button",{class:"theme-switch",title:u(e)?"Light mode":"Dark mode",onClick:s[1]||(s[1]=(..._)=>u(r)&&u(r)(..._))},[u(e)?(I(),F("svg",qt,[...s[4]||(s[4]=[we('<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)])])):(I(),F("svg",Ot,[...s[5]||(s[5]=[a("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,Bt)]))}});He();var Wt=Ie(jt,[["__scopeId","data-v-4c30f4bd"]]);_e();var lo=S(!1);function Ao(){function o(){lo.value=!0}function e(){lo.value=!1}return{sessionSearchOpen:lo,openSessionSearch:o,closeSessionSearch:e}}var Vt=[{version:"0.5.28",date:"2026-05-17",changes:["changelog.new_0_5_27_1","changelog.new_0_5_27_2","changelog.new_0_5_27_3","changelog.new_0_5_27_4"]},{version:"0.5.26",date:"2026-05-17",changes:["changelog.new_0_5_26_1","changelog.new_0_5_26_2","changelog.new_0_5_26_3","changelog.new_0_5_26_4","changelog.new_0_5_26_5","changelog.new_0_5_26_6","changelog.new_0_5_26_7","changelog.new_0_5_26_8","changelog.new_0_5_26_9","changelog.new_0_5_26_10","changelog.new_0_5_26_11","changelog.new_0_5_26_12"]},{version:"0.5.25",date:"2026-05-16",changes:["changelog.new_0_5_25_1","changelog.new_0_5_25_2","changelog.new_0_5_25_3","changelog.new_0_5_25_4","changelog.new_0_5_25_5","changelog.new_0_5_25_6","changelog.new_0_5_25_7","changelog.new_0_5_25_8"]},{version:"0.5.24",date:"2026-05-15",changes:["changelog.new_0_5_24_1"]},{version:"0.5.23",date:"2026-05-15",changes:["changelog.new_0_5_23_1","changelog.new_0_5_23_2","changelog.new_0_5_23_3","changelog.new_0_5_23_4","changelog.new_0_5_23_5"]},{version:"0.5.22",date:"2026-05-14",changes:["changelog.new_0_5_22_1"]},{version:"0.5.21",date:"2026-05-14",changes:["changelog.new_0_5_18_1","changelog.new_0_5_18_2","changelog.new_0_5_18_3","changelog.new_0_5_18_4","changelog.new_0_5_18_5","changelog.new_0_5_18_6","changelog.new_0_5_18_7","changelog.new_0_5_18_8","changelog.new_0_5_18_9"]},{version:"0.5.17",date:"2026-05-11",changes:["changelog.new_0_5_17_1","changelog.new_0_5_17_2","changelog.new_0_5_17_3","changelog.new_0_5_17_4","changelog.new_0_5_17_5","changelog.new_0_5_17_6","changelog.new_0_5_17_7","changelog.new_0_5_17_8","changelog.new_0_5_17_9","changelog.new_0_5_17_10","changelog.new_0_5_17_11","changelog.new_0_5_17_12","changelog.new_0_5_17_13","changelog.new_0_5_17_14","changelog.new_0_5_17_15","changelog.new_0_5_17_16","changelog.new_0_5_17_17","changelog.new_0_5_17_18","changelog.new_0_5_17_19","changelog.new_0_5_17_20","changelog.new_0_5_17_21","changelog.new_0_5_17_22","changelog.new_0_5_17_23","changelog.new_0_5_17_24","changelog.new_0_5_17_25"]},{version:"0.5.16",date:"2026-05-10",changes:["changelog.new_0_5_16_1","changelog.new_0_5_16_2","changelog.new_0_5_16_3","changelog.new_0_5_16_4"]},{version:"0.5.15",date:"2026-05-09",changes:["changelog.new_0_5_15_1","changelog.new_0_5_15_2","changelog.new_0_5_15_3","changelog.new_0_5_15_4","changelog.new_0_5_15_5","changelog.new_0_5_15_6","changelog.new_0_5_15_7","changelog.new_0_5_15_8","changelog.new_0_5_15_9","changelog.new_0_5_15_10","changelog.new_0_5_15_11"]},{version:"0.5.14",date:"2026-05-07",changes:["changelog.new_0_5_14_1","changelog.new_0_5_14_2","changelog.new_0_5_14_3","changelog.new_0_5_14_4","changelog.new_0_5_14_5"]}];_e();Ce();xe();Xe();var Kt=["title"],Gt={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Qt={key:0,points:"9 18 15 12 9 6"},Jt={key:1,points:"15 18 9 12 15 6"},$t={class:"sidebar-nav"},Zt={class:"nav-group"},Yt={class:"nav-item fun-link",href:"https://apikey.fun/register?aff=LIBAPI",target:"_blank",rel:"noopener noreferrer"},Xt={class:"nav-group"},ea={class:"nav-group"},oa={class:"nav-group"},na={class:"sidebar-footer"},ta={class:"status-row"},aa={class:"status-text"},ia={class:"version-info"},sa={class:"changelog-list"},ra={class:"changelog-version-header"},la={class:"changelog-version-tag"},da={class:"changelog-date"},ca={class:"changelog-changes"},ua="/logo.png",ma=ye({__name:"AppSidebar",setup(o){const{t:e}=Te(),t=Co(),r=qo(),c=$e(),i=qe(),{openSessionSearch:s}=Ao(),_=se(()=>r.name),h=Sn({});function U(O){h[O]=!h[O]}function x(O){return!!h[O]}function k(O){c.push({name:O})}async function ee(){await i.doUpdate()?t.success(e("sidebar.updateSuccess"),{duration:5e3}):t.error(e("sidebar.updateFailed"))}function q(){i.reloadClient()}function te(){localStorage.clear(),c.replace({name:"login"})}const X=S(!1);function ae(){X.value=!0}return(O,l)=>(I(),F("aside",{class:Y(["sidebar",{open:u(i).sidebarOpen,collapsed:u(i).sidebarCollapsed}])},[a("div",{class:"sidebar-logo",onClick:l[0]||(l[0]=z=>u(c).push("/hermes/chat"))},[a("img",{src:ua,alt:"Hermes",class:"logo-img"}),l[24]||(l[24]=a("span",{class:"logo-text"},"Hermes",-1))]),a("button",{class:"collapse-btn",onClick:l[1]||(l[1]=z=>u(i).toggleSidebarCollapsed()),title:u(i).sidebarCollapsed?u(e)("sidebar.expand"):u(e)("sidebar.collapse")},[(I(),F("svg",Gt,[u(i).sidebarCollapsed?(I(),F("polyline",Qt)):(I(),F("polyline",Jt))]))],8,Kt),a("nav",$t,[a("div",Zt,[a("div",{class:"nav-group-label",onClick:l[2]||(l[2]=z=>U("conversation"))},[a("span",null,C(u(e)("sidebar.groupConversation")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[25]||(l[25]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.chat"}]),onClick:l[3]||(l[3]=z=>k("hermes.chat"))},[l[26]||(l[26]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("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)),a("span",null,C(u(e)("sidebar.chat")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.history"}]),onClick:l[4]||(l[4]=z=>k("hermes.history"))},[l[27]||(l[27]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"12",cy:"12",r:"10"}),a("polyline",{points:"12 6 12 12 16 14"})],-1)),a("span",null,C(u(e)("sidebar.history")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.groupChat"}]),onClick:l[5]||(l[5]=z=>k("hermes.groupChat"))},[l[29]||(l[29]=we('<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-592f9b57><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" data-v-592f9b57></path><circle cx="9" cy="7" r="4" data-v-592f9b57></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" data-v-592f9b57></path><path d="M16 3.13a4 4 0 0 1 0 7.75" data-v-592f9b57></path></svg>',1)),a("span",null,[We(C(u(e)("sidebar.groupChat")),1),l[28]||(l[28]=a("span",{class:"beta-tag"},"(beta)",-1))])],2),a("button",{class:"nav-item",onClick:l[6]||(l[6]=(...z)=>u(s)&&u(s)(...z))},[l[30]||(l[30]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"11",cy:"11",r:"7"}),a("path",{d:"m20 20-3.5-3.5"})],-1)),a("span",null,C(u(e)("sidebar.search")),1)]),a("a",Yt,[l[31]||(l[31]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),a("polyline",{points:"15 3 21 3 21 9"}),a("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)),a("span",null,C(u(e)("sidebar.apiRelay")),1)])],512),[[Fe,!x("conversation")]])]),a("div",Xt,[a("div",{class:"nav-group-label",onClick:l[7]||(l[7]=z=>U("agent"))},[a("span",null,C(u(e)("sidebar.groupAgent")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[32]||(l[32]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.jobs"}]),onClick:l[8]||(l[8]=z=>k("hermes.jobs"))},[l[33]||(l[33]=we('<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-592f9b57><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-592f9b57></rect><line x1="16" y1="2" x2="16" y2="6" data-v-592f9b57></line><line x1="8" y1="2" x2="8" y2="6" data-v-592f9b57></line><line x1="3" y1="10" x2="21" y2="10" data-v-592f9b57></line></svg>',1)),a("span",null,C(u(e)("sidebar.jobs")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.kanban"}]),onClick:l[9]||(l[9]=z=>k("hermes.kanban"))},[l[34]||(l[34]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),a("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),a("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),a("span",null,C(u(e)("sidebar.kanban")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.channels"}]),onClick:l[10]||(l[10]=z=>k("hermes.channels"))},[l[35]||(l[35]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),a("span",null,C(u(e)("sidebar.channels")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.skills"}]),onClick:l[11]||(l[11]=z=>k("hermes.skills"))},[l[36]||(l[36]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),a("polyline",{points:"2 17 12 22 22 17"}),a("polyline",{points:"2 12 12 17 22 12"})],-1)),a("span",null,C(u(e)("sidebar.skills")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.plugins"}]),onClick:l[12]||(l[12]=z=>k("hermes.plugins"))},[l[37]||(l[37]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("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"}),a("path",{d:"M5 19l1-1"})],-1)),a("span",null,C(u(e)("sidebar.plugins")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.memory"}]),onClick:l[13]||(l[13]=z=>k("hermes.memory"))},[l[38]||(l[38]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M9 18h6"}),a("path",{d:"M10 22h4"}),a("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),a("span",null,C(u(e)("sidebar.memory")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.models"}]),onClick:l[14]||(l[14]=z=>k("hermes.models"))},[l[39]||(l[39]=we('<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-592f9b57><circle cx="12" cy="12" r="3" data-v-592f9b57></circle><path d="M12 1v4" data-v-592f9b57></path><path d="M12 19v4" data-v-592f9b57></path><path d="M1 12h4" data-v-592f9b57></path><path d="M19 12h4" data-v-592f9b57></path><path d="M4.22 4.22l2.83 2.83" data-v-592f9b57></path><path d="M16.95 16.95l2.83 2.83" data-v-592f9b57></path><path d="M4.22 19.78l2.83-2.83" data-v-592f9b57></path><path d="M16.95 7.05l2.83-2.83" data-v-592f9b57></path></svg>',1)),a("span",null,C(u(e)("sidebar.models")),1)],2)],512),[[Fe,!x("agent")]])]),a("div",ea,[a("div",{class:"nav-group-label",onClick:l[15]||(l[15]=z=>U("monitoring"))},[a("span",null,C(u(e)("sidebar.groupMonitoring")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[40]||(l[40]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.logs"}]),onClick:l[16]||(l[16]=z=>k("hermes.logs"))},[l[41]||(l[41]=we('<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-592f9b57><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-592f9b57></path><polyline points="14 2 14 8 20 8" data-v-592f9b57></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-592f9b57></line><line x1="16" y1="17" x2="8" y2="17" data-v-592f9b57></line><polyline points="10 9 9 9 8 9" data-v-592f9b57></polyline></svg>',1)),a("span",null,C(u(e)("sidebar.logs")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.usage"}]),onClick:l[17]||(l[17]=z=>k("hermes.usage"))},[l[42]||(l[42]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),a("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),a("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),a("span",null,C(u(e)("sidebar.usage")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.skillsUsage"}]),onClick:l[18]||(l[18]=z=>k("hermes.skillsUsage"))},[l[43]||(l[43]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),a("span",null,C(u(e)("sidebar.skillsUsage")),1)],2)],512),[[Fe,!x("monitoring")]])]),a("div",oa,[a("div",{class:"nav-group-label",onClick:l[19]||(l[19]=z=>U("system"))},[a("span",null,C(u(e)("sidebar.groupSystem")),1),(I(),F("svg",{class:Y(["nav-group-arrow",{collapsed:x("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...l[44]||(l[44]=[a("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),ze(a("div",null,[a("button",{class:Y(["nav-item",{active:_.value==="hermes.gateways"}]),onClick:l[20]||(l[20]=z=>k("hermes.gateways"))},[l[45]||(l[45]=we('<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-592f9b57><rect x="2" y="2" width="20" height="8" rx="2" ry="2" data-v-592f9b57></rect><rect x="2" y="14" width="20" height="8" rx="2" ry="2" data-v-592f9b57></rect><line x1="6" y1="6" x2="6.01" y2="6" data-v-592f9b57></line><line x1="6" y1="18" x2="6.01" y2="18" data-v-592f9b57></line></svg>',1)),a("span",null,C(u(e)("sidebar.gateways")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.profiles"}]),onClick:l[21]||(l[21]=z=>k("hermes.profiles"))},[l[46]||(l[46]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),a("circle",{cx:"12",cy:"7",r:"4"})],-1)),a("span",null,C(u(e)("sidebar.profiles")),1)],2),a("button",{class:Y(["nav-item",{active:_.value==="hermes.settings"}]),onClick:l[22]||(l[22]=z=>k("hermes.settings"))},[l[47]||(l[47]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("circle",{cx:"12",cy:"12",r:"3"}),a("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)),a("span",null,C(u(e)("sidebar.settings")),1)],2)],512),[[Fe,!x("system")]])])]),de(Rt),de(Ht),a("div",na,[a("button",{class:"nav-item logout-item",onClick:te},[l[48]||(l[48]=a("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[a("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),a("polyline",{points:"16 17 21 12 16 7"}),a("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),a("span",null,C(u(e)("sidebar.logout")),1)]),a("div",ta,[a("div",{class:Y(["status-indicator",{connected:u(i).connected,disconnected:!u(i).connected}])},[l[49]||(l[49]=a("span",{class:"status-dot"},null,-1)),a("span",aa,C(u(i).connected?u(e)("sidebar.connected"):u(e)("sidebar.disconnected")),1)],2),de(Lt)]),a("div",ia,[l[50]||(l[50]=we('<div class="version-links" data-v-592f9b57><a class="github-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener noreferrer" title="GitHub" data-v-592f9b57><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" data-v-592f9b57><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" data-v-592f9b57></path></svg></a><a class="website-link" href="https://ekkolearnai.com/" target="_blank" rel="noopener noreferrer" title="Website" data-v-592f9b57><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" data-v-592f9b57><circle cx="12" cy="12" r="10" data-v-592f9b57></circle><line x1="2" y1="12" x2="22" y2="12" data-v-592f9b57></line><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" data-v-592f9b57></path></svg></a></div>',1)),a("span",{class:"version-text",onClick:ae},"Web UI v"+C(u(i).serverVersion||"0.1.0"),1),de(Wt)]),u(i).clientOutdated?(I(),Ae(u(mo),{key:0,type:"warning",size:"tiny",block:"",class:"update-btn",onClick:q},{default:he(()=>[We(C(u(e)("sidebar.reloadClientVersion",{version:u(i).serverVersion})),1)]),_:1})):me("",!0),u(i).updateAvailable?(I(),Ae(u(mo),{key:1,type:"primary",size:"tiny",block:"",class:"update-btn",loading:u(i).updating,onClick:ee},{default:he(()=>[We(C(u(i).updating?u(e)("sidebar.updating"):u(e)("sidebar.updateVersion",{version:u(i).latestVersion})),1)]),_:1},8,["loading"])):me("",!0)]),de(u(wo),{show:X.value,"onUpdate:show":l[23]||(l[23]=z=>X.value=z),preset:"dialog",title:u(e)("sidebar.changelog"),style:{width:"520px"}},{default:he(()=>[a("div",sa,[(I(!0),F(Ne,null,Be(u(Vt),z=>(I(),F("div",{key:z.version,class:"changelog-version-block"},[a("div",ra,[a("span",la,"v"+C(z.version),1),a("span",da,C(z.date),1)]),a("ul",ca,[(I(!0),F(Ne,null,Be(z.changes,(G,j)=>(I(),F("li",{key:j},C(u(e)(G)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});He();var pa=Ie(ma,[["__scopeId","data-v-592f9b57"]]);function _a(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onMessageDelta&&t.onMessageDelta(o)}function ga(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onReasoningDelta&&t.onReasoningDelta(o)}function ha(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onThinkingDelta&&t.onThinkingDelta(o)}function va(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onReasoningAvailable&&t.onReasoningAvailable(o)}function fa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onToolStarted&&t.onToolStarted(o)}function wa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onToolCompleted&&t.onToolCompleted(o)}function ba(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunStarted&&t.onRunStarted(o)}function ya(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunCompleted&&t.onRunCompleted(o),!(o.queue_remaining>0)&&K.delete(e)}function Ca(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunFailed&&t.onRunFailed(o),!(o.queue_remaining>0)&&K.delete(e)}function ka(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onRunQueued&&t.onRunQueued(o)}function Sa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onCompressionStarted&&t.onCompressionStarted(o)}function Pa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onCompressionCompleted&&t.onCompressionCompleted(o)}function Aa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onAbortStarted&&t.onAbortStarted(o)}function xa(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onAbortCompleted&&t.onAbortCompleted(o),!(o.queue_length>0)&&K.delete(e)}function Ta(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onUsageUpdated&&t.onUsageUpdated(o)}function Ha(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onSessionCommand&&t.onSessionCommand(o)}function Ia(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onApprovalRequested&&t.onApprovalRequested(o)}function Ma(o){const e=o.session_id;if(!e)return;const t=K.get(e);t?.onApprovalResolved&&t.onApprovalResolved(o)}function Da(o,e){return K.set(o,e),()=>{K.delete(o)}}function Ra(o){K.delete(o)}function Ea(o,e,t){xo().emit("approval.respond",{session_id:o,approval_id:e,choice:t})}function Fo(){return $}function xo(){if($?.connected)return $;$&&($.removeAllListeners(),$.disconnect(),Ve=!1);const o=jo(),e=So();let t="default";try{const{useProfilesStore:r}=(Po(),yn(zn));t=r().activeProfileName||"default"}catch{t=localStorage.getItem("hermes_active_profile_name")||"default"}return $=qn(`${o}/chat-run`,{auth:{token:e},query:{profile:t},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),Ve||($.on("message.delta",_a),$.on("reasoning.delta",ga),$.on("thinking.delta",ha),$.on("reasoning.available",va),$.on("tool.started",fa),$.on("tool.completed",wa),$.on("run.started",ba),$.on("run.failed",Ca),$.on("run.completed",ya),$.on("run.queued",ka),$.on("approval.requested",Ia),$.on("approval.resolved",Ma),$.on("compression.started",Sa),$.on("compression.completed",Pa),$.on("abort.started",Aa),$.on("abort.completed",xa),$.on("usage.updated",Ta),$.on("session.command",Ha),Ve=!0),$}function zo(o,e){const t=xo();return t.once("resumed",e),t.emit("resume",{session_id:o}),t}function La(o,e,t,r,c){const i=o.session_id;if(!i)throw new Error("session_id is required for startRunViaSocket");let s=!1;const _=xo();return K.has(i)?(_.emit("run",o),{abort:()=>{s||_.emit("abort",{session_id:i})}}):(K.set(i,{onMessageDelta:h=>{s||e(h)},onReasoningDelta:h=>{s||e(h)},onThinkingDelta:h=>{s||e(h)},onReasoningAvailable:h=>{s||e(h)},onToolStarted:h=>{s||e(h)},onToolCompleted:h=>{s||e(h)},onRunStarted:h=>{s||(e(h),c?.(h.run_id||""))},onRunCompleted:h=>{s||(e(h),!(h.queue_remaining>0)&&(s=!0,t()))},onRunFailed:h=>{s||(e(h),!(h.queue_remaining>0)&&(s=!0,r(new Error(h.error||"Run failed"))))},onCompressionStarted:h=>{s||e(h)},onCompressionCompleted:h=>{s||e(h)},onAbortStarted:h=>{s||e(h)},onAbortCompleted:h=>{s||(e(h),!(h.queue_length>0)&&(s=!0,t()))},onUsageUpdated:h=>{s||e(h)},onSessionCommand:h=>{s||(e(h),h.terminal!==!1&&(s=!0,K.delete(i),t()))},onRunQueued:h=>{s||e(h)},onApprovalRequested:h=>{s||e(h)},onApprovalResolved:h=>{s||e(h)}}),_.emit("run",o),{abort:()=>{s||_.emit("abort",{session_id:i})}})}var $,Ve,K,Fa=ve((()=>{Bn(),$=null,Ve=!1,K=new Map}));async function Zo(o,e){const t=new URLSearchParams;o&&t.set("source",o),e&&t.set("limit",String(e));const r=t.toString();return(await ce(`/api/hermes/sessions${r?`?${r}`:""}`)).sessions}async function Ni(o,e){const t=new URLSearchParams;o&&t.set("source",o),e&&t.set("limit",String(e));const r=t.toString();return(await ce(`/api/hermes/sessions/hermes${r?`?${r}`:""}`)).sessions}async function za(o,e,t){const r=new URLSearchParams;return r.set("q",o),e&&r.set("source",e),t&&r.set("limit",String(t)),(await ce(`/api/hermes/search/sessions?${r.toString()}`)).results}async function Ua(o){try{return(await ce(`/api/hermes/sessions/${o}`)).session}catch{return null}}async function Bi(o){try{return(await ce(`/api/hermes/sessions/hermes/${o}`)).session}catch{return null}}async function Na(o){try{return await ce(`/api/hermes/sessions/${o}`,{method:"DELETE"}),!0}catch{return!1}}async function qi(o){try{return await ce("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:o})})}catch(e){throw e}}async function Oi(o,e){try{return await ce(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function ji(o,e){try{return await ce(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Ba(o,e,t){try{return await ce(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:t})}),!0}catch{return!1}}async function Wi(o,e="full",t="json"){const r=jo(),c=So(),i=`${r}/api/hermes/sessions/${o}/export?mode=${e}&ext=${t}&token=${encodeURIComponent(c)}`,s=await fetch(i);if(!s.ok)throw new Error("Export failed");const _=await s.blob(),h=s.headers.get("Content-Disposition")||"";let U=`session_${o}.${t}`;const x=h.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);x&&(U=decodeURIComponent(x[1].replace(/"/g,"")));const k=document.createElement("a");k.href=URL.createObjectURL(_),k.download=U,k.click(),URL.revokeObjectURL(k.href)}async function Vi(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,t=new URLSearchParams;return t.set("days",String(e)),ce(`/api/hermes/usage/stats?${t}`)}async function Ki(o){const e=new URLSearchParams;o&&e.set("profile",o);const t=e.toString();return(await ce(`/api/hermes/sessions/context-length${t?`?${t}`:""}`)).context_length}var Yo=ve((()=>{Ye()}));async function qa(o){return ce(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function Oa(o,e){await ce("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e})})}async function Gi(o,e){await ce("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function Qi(){return ce("/api/hermes/weixin/qrcode")}async function Ji(o){return ce(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function $i(o){await ce("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var ja=ve((()=>{Ye()})),_o,Wa=ve((()=>{_e(),ja(),_o=Oo("settings",()=>{const o=S(!1),e=S(!1),t=S({}),r=S({}),c=S({}),i=S({}),s=S({}),_=S({}),h=S({}),U=S({}),x=S({}),k=S({}),ee=S({}),q=S({}),te=S({}),X=S({}),ae=S({}),O=S({}),l=S({});async function z(){o.value=!0;try{const f=await qa();t.value=f.display||{},r.value=f.agent||{},c.value=f.memory||{},i.value=f.session_reset||{},s.value=f.privacy||{},_.value=f.approvals||{},h.value=f.telegram||{},U.value=f.discord||{},x.value=f.slack||{},k.value=f.whatsapp||{},ee.value=f.matrix||{},q.value=f.wecom||{},te.value=f.feishu||{},X.value=f.dingtalk||{},ae.value=f.qqbot||{},O.value=f.weixin||{},l.value=f.platforms||{}}catch(f){console.error("Failed to fetch settings:",f)}finally{o.value=!1}}function G(f,g){switch(f){case"display":t.value={...t.value,...g};break;case"agent":r.value={...r.value,...g};break;case"memory":c.value={...c.value,...g};break;case"session_reset":i.value={...i.value,...g};break;case"privacy":s.value={...s.value,...g};break;case"approvals":_.value={..._.value,...g};break;case"telegram":h.value={...h.value,...g};break;case"discord":U.value={...U.value,...g};break;case"slack":x.value={...x.value,...g};break;case"whatsapp":k.value={...k.value,...g};break;case"matrix":ee.value={...ee.value,...g};break;case"wecom":q.value={...q.value,...g};break;case"feishu":te.value={...te.value,...g};break;case"dingtalk":X.value={...X.value,...g};break;case"qqbot":ae.value={...ae.value,...g};break;case"weixin":O.value={...O.value,...g};break;case"platforms":for(const[D,Q]of Object.entries(g))l.value={...l.value,[D]:{...l.value[D]||{},...Q}};break}}async function j(f,g){e.value=!0;try{switch(await Oa(f,g),f){case"display":t.value={...t.value,...g};break;case"agent":r.value={...r.value,...g};break;case"memory":c.value={...c.value,...g};break;case"session_reset":i.value={...i.value,...g};break;case"privacy":s.value={...s.value,...g};break;case"approvals":_.value={..._.value,...g};break;case"telegram":h.value={...h.value,...g};break;case"discord":U.value={...U.value,...g};break;case"slack":x.value={...x.value,...g};break;case"whatsapp":k.value={...k.value,...g};break;case"matrix":ee.value={...ee.value,...g};break;case"wechat":case"wecom":q.value={...q.value,...g};break;case"feishu":te.value={...te.value,...g};break;case"dingtalk":X.value={...X.value,...g};break;case"qqbot":ae.value={...ae.value,...g};break;case"weixin":O.value={...O.value,...g};break;case"platforms":for(const[D,Q]of Object.entries(g))l.value={...l.value,[D]:{...l.value[D]||{},...Q}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:t,agent:r,memory:c,sessionReset:i,privacy:s,approvals:_,telegram:h,discord:U,slack:x,whatsapp:k,matrix:ee,wecom:q,feishu:te,dingtalk:X,qqbot:ae,weixin:O,platforms:l,fetchSettings:z,saveSection:j,updateLocal:G}})}));function Xo(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(Ke||(Ke=new o),Ke):null}function Va(){const o=Xo();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function Ka(){const o=Xo();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,t=.16,r=o.createOscillator(),c=o.createGain();return r.type="sine",r.frequency.setValueAtTime(880,e),r.frequency.exponentialRampToValueAtTime(660,e+t),c.gain.setValueAtTime(1e-4,e),c.gain.exponentialRampToValueAtTime(.18,e+.015),c.gain.exponentialRampToValueAtTime(1e-4,e+t),r.connect(c),c.connect(o.destination),r.start(e),r.stop(e+t),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var Ke,Ga=ve((()=>{Ke=null}));function go(o){const e=[];let t=o.replace(en,r=>(e.push(r),`${Ge}${e.length-1}${Qe}`));return t=t.replace(on,r=>(e.push(r),`${Ge}${e.length-1}${Qe}`)),{masked:t,blocks:e}}function co(o,e){if(e.length===0)return o;const t=new RegExp(`${Ge}(\\d+)${Qe}`,"g");let r=o;for(let c=0;c<e.length;c+=1){const i=r.replace(t,(s,_)=>e[Number(_)]??"");if(i===r)break;r=i}return r}function Zi(o,e){const{masked:t,blocks:r}=go(o),c=[];let i=null,s="",_=0;ho.lastIndex=0;let h;for(;(h=ho.exec(t))!==null;)s+=t.slice(_,h.index),c.push(h[2]),_=h.index+h[0].length;const U=t.slice(_),x=U.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return x?(s+=U.slice(0,x.index),e.streaming?i=x[2]:s+=U.slice(x.index)):s+=U,{segments:c.map(k=>co(k,r)),pending:i===null?null:co(i,r),body:co(s,r),hasThinking:c.length>0||i!==null}}function Yi(o){const e=t=>[...t].length;return o.segments.reduce((t,r)=>t+e(r),0)+e(o.pending||"")}function Qa(o,e){const t=go(o).masked,r=go(e).masked;return{startedAtBoundary:!vo.test(t)&&vo.test(r),endedAtBoundary:!fo.test(t)&&fo.test(r)}}var ho,Ge,Qe,en,on,vo,fo,Ja=ve((()=>{ho=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,Ge="\0THKCODE",Qe="\0",en=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,on=/`[^`\n]*`/g,vo=/<(think|thinking|reasoning)>/i,fo=/<\/(think|thinking|reasoning)>/i}));function le(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}async function $a(o){if(o.length===0)return[];const e=new FormData;for(const c of o)c.file&&e.append("file",c.file,c.name);const t=localStorage.getItem("hermes_api_key")||"",r=await fetch("/upload",{method:"POST",body:e,headers:t?{Authorization:`Bearer ${t}`}:{}});if(!r.ok)throw new Error(`Upload failed: ${r.status}`);return(await r.json()).files}async function Za(o,e,t){const r=[];if(o.trim()&&r.push({type:"text",text:o.trim()}),e&&e.length>0&&t)for(let c=0;c<t.length;c++){const i=t[c],s=e[c];s?.type.startsWith("image/")?r.push({type:"image",name:i.name,path:i.path,media_type:s.type}):r.push({type:"file",name:i.name,path:i.path,media_type:s?.type})}return r}function uo(o){const e=o.filter(i=>i.role==="assistant"?(i.tool_calls?.length||0)>0||i.content&&i.content.trim()!=="":!0),t=new Map,r=new Map;for(const i of e)if(i.role==="assistant"&&i.tool_calls)for(const s of i.tool_calls)s.id&&(s.function?.name&&t.set(s.id,s.function.name),s.function?.arguments&&r.set(s.id,s.function.arguments));const c=[];for(const i of e){if(i.role==="assistant"&&i.tool_calls?.length&&!i.content?.trim()){for(const s of i.tool_calls)c.push({id:String(i.id)+"_"+s.id,role:"tool",content:"",timestamp:Math.round(i.timestamp*1e3),toolName:s.function?.name||void 0,toolCallId:s.id,toolArgs:s.function?.arguments||void 0,toolStatus:"done"});continue}if(i.role==="tool"){const s=i.tool_call_id||"",_=i.tool_name||t.get(s)||void 0,h=r.get(s)||void 0;let U="";if(i.content)try{const k=JSON.parse(i.content);U=k.url||k.title||k.preview||k.summary||""}catch{U=i.content.slice(0,80)}const x=c.findIndex(k=>k.role==="tool"&&k.toolName===_&&!k.toolResult&&k.id.includes("_"+s));x!==-1&&c.splice(x,1),c.push({id:String(i.id),role:"tool",content:"",timestamp:Math.round(i.timestamp*1e3),toolName:_,toolCallId:s||void 0,toolArgs:h,toolPreview:typeof U=="string"&&U.slice(0,100)||void 0,toolResult:i.content||void 0,toolStatus:"done"});continue}c.push({id:String(i.id),role:i.role,content:i.content||"",timestamp:Math.round(i.timestamp*1e3),reasoning:i.reasoning?i.reasoning:void 0,systemType:i.role==="command"?"command":void 0})}return c}function Ya(o){return{id:o.id,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,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 nn(){try{return Wo().activeProfileName||"default"}catch{return"default"}}function tn(){return sn+nn()}function Xa(){return nn()==="default"?To:null}function ei(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function oi(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let t=0;t<localStorage.length;t++){const r=localStorage.key(t);r&&(r===tn()||r===To||o.some(c=>r.startsWith(c))&&e.push(r))}e.forEach(t=>an(t)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function ni(o,e){try{localStorage.setItem(o,e);return}catch(t){if(!ei(t))return}oi();try{localStorage.setItem(o,e)}catch{}}function an(o){try{localStorage.removeItem(o)}catch{}}var sn,To,Ho,rn=ve((()=>{Fa(),Yo(),Ye(),ko(),_e(),Xe(),Po(),Wa(),Ga(),Ja(),sn="hermes_active_session_",To="hermes_active_session",Ho=Oo("chat",()=>{const o=S([]),e=S(null),t=S(null),r=S(new Map),c=S(new Set),i=S(new Map),s=S(new Map),_=S(new Map),h=se(()=>{const n=e.value;return n&&_.value.get(n)||null}),U=S(!1);function x(n){U.value=n}const k=se(()=>{const n=e.value;return n==null?!1:r.value.has(n)||c.value.has(n)}),ee=S(!1),q=S(!1),te=S(!1),X=se(()=>k.value),ae=S(null);function O(n){ae.value=n}const l=S(null),z=se(()=>l.value?.aborting===!0);function G(n){l.value=n}const j=S(null),f=se(()=>j.value?.messages||[]);function g(n){return r.value.has(n)||c.value.has(n)}async function D(){ee.value=!0;try{const n=(await Zo()).map(Ya),m=new Map(o.value.map(P=>[P.id,P.messages]));for(const P of n){const N=m.get(P.id);N&&N.length&&(P.messages=N)}o.value=n;const d=e.value,w=d&&o.value.some(P=>P.id===d)?d:o.value[0]?.id;w&&await Z(w)}catch(n){console.error("Failed to load sessions:",n)}finally{ee.value=!1,q.value=!0}}async function Q(){const n=e.value;if(!n)return!1;try{const m=await Ua(n);if(!m)return!1;const d=o.value.find(w=>w.id===n);return d?(d.messages=uo(m.messages||[]),m.title&&(d.title=m.title),!0):!1}catch(m){return console.error("Failed to refresh active session:",m),!1}}function T(){const n={id:le(),title:"",source:"api_server",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(n),n}function J(){const n=new Date,m={id:`${[n.getFullYear(),String(n.getMonth()+1).padStart(2,"0"),String(n.getDate()).padStart(2,"0"),"_",String(n.getHours()).padStart(2,"0"),String(n.getMinutes()).padStart(2,"0"),String(n.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(m),m}async function Z(n,m){Eo(n),e.value=n,t.value=m??null,ni(tn(),n);const d=Xa();if(d&&an(d),j.value=o.value.find(w=>w.id===n)||null,!!j.value){te.value=!0;try{await new Promise((w,P)=>{const N=setTimeout(()=>P(new Error("resume timeout")),15e3);zo(n,ne=>{if(clearTimeout(N),ne.isWorking?c.value.add(n):c.value.delete(n),ne.queueLength&&ne.queueLength>0?i.value.set(n,ne.queueLength):i.value.delete(n),ne.isAborting?G({aborting:!0,synced:null}):ne.isWorking||G(null),ne.inputTokens!=null&&(j.value.inputTokens=ne.inputTokens),ne.outputTokens!=null&&(j.value.outputTokens=ne.outputTokens),ne.messages?.length&&(j.value.messages=uo(ne.messages)),!j.value.title){const pe=j.value.messages.find(b=>b.role==="user");if(pe){const b=pe.content.slice(0,40);j.value.title=b+(pe.content.length>40?"...":"")}}if(ne.events?.length)for(const pe of ne.events){const b=pe.data;if(b.event==="compression.started")O({compressing:!0,messageCount:b.message_count||0,beforeTokens:b.token_count||0,afterTokens:0,compressed:null});else if(b.event==="compression.completed")O({compressing:!1,messageCount:b.totalMessages||0,beforeTokens:b.beforeTokens||0,afterTokens:b.afterTokens||0,compressed:b.compressed??!1,error:b.error});else if(b.event==="abort.started")G({aborting:!0,synced:null});else if(b.event==="abort.completed")G({aborting:!1,synced:b.synced??!1});else if(b.event==="approval.requested")no({...b,session_id:n});else if(b.event==="approval.resolved")to({...b,session_id:n});else if(b.event==="tool.started"){const p=W(n),R=b.tool_call_id,H=R?p.find(E=>E.role==="tool"&&E.toolCallId===R):null;H?oe(n,H.id,{toolName:b.tool||b.name,toolArgs:typeof b.arguments=="string"?b.arguments:H.toolArgs,toolPreview:b.preview||H.toolPreview,toolStatus:H.toolStatus||"running"}):re(n,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:b.tool||b.name,toolCallId:R,toolPreview:b.preview,toolArgs:typeof b.arguments=="string"?b.arguments:void 0,toolStatus:"running"})}else if(b.event==="tool.completed"){const p=W(n),R=b.tool_call_id,H=R?p.filter(E=>E.role==="tool"&&E.toolCallId===R):p.filter(E=>E.role==="tool"&&E.toolStatus==="running");H.length>0&&oe(n,H[H.length-1].id,{toolStatus:b.error===!0?"error":"done",toolDuration:b.duration,toolResult:typeof b.output=="string"?b.output:void 0})}}w()})})}catch(w){console.error("Failed to load session messages via resume:",w)}finally{te.value=!1}Ro(n)}}function Oe(){const n=T(),m=qe();n.model=m.selectedModel||void 0,n.provider=m.selectedProvider||"",Z(n.id)}async function oo(n,m,d){const w=d||j.value?.id;if(!w||!await Ba(w,n,m||""))return!1;const P=o.value.find(N=>N.id===w);return P&&(P.model=n,P.provider=m||""),j.value?.id===w&&(j.value.model=n,j.value.provider=m||""),!0}async function ln(n){await Na(n),o.value=o.value.filter(m=>m.id!==n),e.value===n&&(o.value.length>0?await Z(o.value[0].id):Z(T().id))}function W(n){return o.value.find(m=>m.id===n)?.messages||[]}function re(n,m){const d=o.value.find(w=>w.id===n);d&&d.messages.push(m)}function dn(n){const m=o.value.findIndex(d=>d.id===n.id);m!==-1?o.value[m]=n:o.value.push(n)}function oe(n,m,d){const w=o.value.find(N=>N.id===n);if(!w)return;const P=w.messages.findIndex(N=>N.id===m);P!==-1&&(w.messages[P]={...w.messages[P],...d})}function Io(n){const m=n.session_id;if(!m)return;const d=o.value.find(N=>N.id===m),w=n.action;if(w==="clear"){if(d&&(d.messages=[]),s.value.delete(m),i.value.delete(m),n.clearHistory){const N=String(n.message||"");N&&re(m,{id:le(),role:"command",content:N,timestamp:Date.now(),systemType:n.ok===!1?"error":"command",commandAction:w,commandData:{...n}})}return}w==="title"&&d&&typeof n.title=="string"&&(d.title=n.title,d.updatedAt=Date.now()),w==="usage"&&d&&(d.inputTokens=n.inputTokens,d.outputTokens=n.outputTokens),w==="destroy"&&(r.value.delete(m),c.value.delete(m),i.value.delete(m),s.value.delete(m),G(null),W(m).forEach(N=>{N.isStreaming&&oe(m,N.id,{isStreaming:!1}),N.role==="tool"&&N.toolStatus==="running"&&(N.toolStatus="error")}));const P=String(n.message||"");P&&re(m,{id:le(),role:"command",content:P,timestamp:Date.now(),systemType:n.ok===!1?"error":"command",commandAction:w,commandData:{...n}})}function cn(n,m){const d=s.value.get(n)||[];d.push({...m,queued:!0}),s.value.set(n,d)}function un(n,m){const d=s.value.get(n);if(!d?.length)return;const w=d.filter(P=>P.id!==m);w.length>0?s.value.set(n,w):s.value.delete(n),i.value.set(n,w.length),Fo()?.emit("cancel_queued_run",{session_id:n,queue_id:m})}function no(n){const m=n.session_id,d=n.approval_id;if(!m||!d)return;const w=(Array.isArray(n.choices)?n.choices:["once","session","deny"]).filter(P=>P==="once"||P==="session"||P==="always"||P==="deny");_.value.set(m,{sessionId:m,approvalId:d,command:String(n.command||""),description:String(n.description||""),choices:w.length?w:["once","session","deny"],allowPermanent:!!n.allow_permanent,requestedAt:Date.now()}),_.value=new Map(_.value)}function to(n){const m=n.session_id;if(!m)return;const d=_.value.get(m);if(!d)return;const w=n.approval_id;w&&d.approvalId!==w||(_.value.delete(m),_.value=new Map(_.value))}function mn(n){const m=h.value;m&&(Ea(m.sessionId,m.approvalId,n),_.value.delete(m.sessionId),_.value=new Map(_.value))}function Mo(n){const m=s.value.get(n);if(!m?.length)return;const d=m.shift();m.length>0?s.value.set(n,m):s.value.delete(n),re(n,{...d,queued:!1}),Me(n)}function Me(n){const m=o.value.find(d=>d.id===n);if(m){if(!m.title){const d=m.messages.find(w=>w.role==="user");if(d){const w=d.attachments?.length?d.attachments.map(P=>P.name).join(", "):d.content;m.title=w.slice(0,40)+(w.length>40?"...":"")}}m.updatedAt=Date.now()}}function pn(){_o().display.bell_on_complete&&Va()}function Do(){_o().display.bell_on_complete&&Ka()}async function _n(n,m){if(!n.trim()&&!(m&&m.length>0))return;pn(),j.value||Z(T().id);const d=e.value,w=j.value?.source==="cli"&&n.trim().startsWith("/"),P=w&&/^\/compress(?:\s|$)/i.test(n.trim()),N=g(d)&&!w,ne={id:le(),role:w?"command":"user",content:n.trim(),timestamp:Date.now(),attachments:m&&m.length>0?m:void 0,queued:N,systemType:w?"command":void 0};N||(re(d,ne),Me(d));try{let pe;if(m&&m.length>0){const v=await $a(m),M=So(),B=new Map(v.map(A=>{const y=`/api/hermes/download?path=${encodeURIComponent(A.path)}&name=${encodeURIComponent(A.name)}`;return[A.name,M?`${y}&token=${encodeURIComponent(M)}`:y]}));if(N&&ne.attachments)ne.attachments=ne.attachments.map(A=>{const y=B.get(A.name);return y?{...A,url:y}:A});else{const A=W(d).findLast(y=>y.id===ne.id);A?.attachments&&(A.attachments=A.attachments.map(y=>{const ue=B.get(y.name);return ue?{...y,url:ue}:y}))}pe=await Za(n,m,v)}else pe=n.trim();const b=qe();await b.waitForModelsForRun();const p=j.value?.model||b.selectedModel,R=j.value?.source==="cli",H=j.value?.provider||b.selectedProvider,E={input:pe,session_id:d,model:R?void 0:p||void 0,provider:R?void 0:H||void 0,model_groups:b.modelGroups.map(v=>({provider:v.provider,models:v.models})),queue_id:ne.id,source:R?"cli":"api_server"};N&&cn(d,ne);const L=()=>{r.value.delete(d),c.value.delete(d)};let V=!1,ge=!1,ie=null;const fn=()=>{Mo(d)},wn=()=>{W(d).forEach(v=>{v.role==="assistant"&&v.isStreaming&&oe(d,v.id,{isStreaming:!1})}),ie=null},bn=La(E,v=>{switch(v.event){case"run.started":G(null),O(null),V=!1,ge=!1,wn(),fn(),v.queue_length>0?i.value.set(d,v.queue_length):i.value.delete(d);break;case"run.queued":i.value.set(d,v.queue_length||0);break;case"session.command":Io(v);break;case"compression.started":O({compressing:!0,messageCount:v.message_count||0,beforeTokens:v.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":O({compressing:!1,messageCount:v.totalMessages||0,beforeTokens:v.beforeTokens||0,afterTokens:v.afterTokens||0,compressed:v.compressed??!1,error:v.error}),setTimeout(()=>{ae.value&&!ae.value.compressing&&O(null)},5e3);break;case"abort.started":G({aborting:!0,synced:null});break;case"abort.completed":{if(G({aborting:!1,synced:v.synced??!1}),v.queue_length>0){i.value.set(d,v.queue_length),G(null);break}const M=W(d),B=M[M.length-1];B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"done"})}),L(),G(null);break}case"reasoning.delta":case"thinking.delta":{const M=v.text||v.delta||"";if(!M)break;V=!0;const B=W(d),A=ie?B.find(y=>y.id===ie):null;if(A?.role==="assistant"&&A.isStreaming)A.reasoning=(A.reasoning||"")+M,Re(A.id);else{const y=le();re(d,{id:y,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:M}),ie=y,Re(y)}break}case"reasoning.available":{const M=W(d),B=M[M.length-1];B?.role==="assistant"&&B.isStreaming&&Ee(B.id);break}case"message.delta":{v.delta&&(V=!0);const M=W(d),B=ie?M.find(A=>A.id===ie):null;if(B?.role==="assistant"&&B.isStreaming){const A=B.content,y=A+(v.delta||"");De(B.id,A,y),B.reasoning&&Ee(B.id),B.content=y}else{const A=le(),y=v.delta||"";De(A,"",y),re(d,{id:A,role:"assistant",content:y,timestamp:Date.now(),isStreaming:!0}),ie=A}break}case"tool.started":{ge=!0;const M=W(d),B=v.tool_call_id,A=ie?M.find(ue=>ue.id===ie):M[M.length-1];A?.isStreaming&&oe(d,A.id,{isStreaming:!1}),ie=null;const y=B?M.find(ue=>ue.role==="tool"&&ue.toolCallId===B):null;if(y){oe(d,y.id,{toolName:v.tool||v.name,toolArgs:typeof v.arguments=="string"?v.arguments:y.toolArgs,toolPreview:v.preview||y.toolPreview,toolStatus:y.toolStatus||"running"});break}re(d,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:v.tool||v.name,toolCallId:B,toolPreview:v.preview,toolArgs:typeof v.arguments=="string"?v.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{ge=!0;const M=W(d),B=v.tool_call_id,A=B?M.filter(y=>y.role==="tool"&&y.toolCallId===B):M.filter(y=>y.role==="tool"&&y.toolStatus==="running");if(A.length>0){const y=A[A.length-1],ue=v.error===!0,Le=v.duration;oe(d,y.id,{toolStatus:ue?"error":"done",toolDuration:Le,toolResult:typeof v.output=="string"?v.output:void 0})}break}case"approval.requested":no(v);break;case"approval.resolved":to(v);break;case"run.completed":{const M=W(d),B=ie?M.find(y=>y.id===ie):M[M.length-1];if(B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),v.inputTokens!=null){const y=o.value.find(ue=>ue.id===d);y&&(y.inputTokens=v.inputTokens,y.outputTokens=v.outputTokens)}let A="";if(v.parsed_content!==void 0){const y=W(d),ue=ie?y.find(Le=>Le.id===ie):[...y].reverse().find(Le=>Le.role==="assistant");ue&&(oe(d,ue.id,{content:v.parsed_content||""}),v.parsed_reasoning&&oe(d,ue.id,{reasoning:v.parsed_reasoning}),A=(v.parsed_content||"").trim())}else{const y=typeof v.output=="string"?v.output:"";A=y.trim(),!V&&A!==""&&(re(d,{id:le(),role:"assistant",content:y,timestamp:Date.now()}),V=!0)}if(!V&&!ge&&A===""?re(d,{id:le(),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()}):Do(),U.value){const y=[...W(d)].reverse().find(ue=>ue.role==="assistant");y?.content&&setTimeout(()=>{ao(y.id,y.content)},300)}v.queue_remaining>0?i.value.set(d,v.queue_remaining):L(),ie=null,Me(d);break}case"run.failed":{const M=W(d),B=M[M.length-1];B?.isStreaming?oe(d,B.id,{isStreaming:!1,content:v.error?`Error: ${v.error}`:"Run failed",role:"system"}):re(d,{id:le(),role:"system",content:v.error?`Error: ${v.error}`:"Run failed",timestamp:Date.now()}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"error"})}),v.queue_remaining>0?i.value.set(d,v.queue_remaining):L();break}case"usage.updated":{const M=o.value.find(B=>B.id===d);M&&(M.inputTokens=v.inputTokens,M.outputTokens=v.outputTokens);break}}},()=>{const v=W(d),M=v[v.length-1];M?.isStreaming&&oe(d,M.id,{isStreaming:!1}),L(),Me(d)},v=>{console.warn("Socket.IO run stream error:",v.message);const M=W(d),B=M[M.length-1];B?.isStreaming&&oe(d,B.id,{isStreaming:!1}),M.forEach((A,y)=>{A.role==="tool"&&A.toolStatus==="running"&&(M[y]={...A,toolStatus:"done"})}),L(),d===e.value&&Q()},void 0);(!w||P)&&r.value.set(d,bn)}catch(pe){re(d,{id:le(),role:"system",content:`Error: ${pe.message}`,timestamp:Date.now()})}}function Ro(n){if(r.value.has(n)||!c.value.has(n))return;let m=!1,d=!1,w=!1,P=null;const N=()=>{m||(m=!0,r.value.delete(n),c.value.delete(n),Ra(n))},ne=()=>{Mo(n)},pe=()=>{W(n).forEach(p=>{p.role==="assistant"&&p.isStreaming&&oe(n,p.id,{isStreaming:!1})}),P=null};function b(p){if(!m&&!(p.session_id&&p.session_id!==n))switch(p.event){case"run.queued":i.value.set(n,p.queue_length||0);break;case"session.command":Io(p);break;case"run.started":G(null),O(null),d=!1,w=!1,pe(),ne(),p.queue_length>0?i.value.set(n,p.queue_length):i.value.delete(n);break;case"compression.started":O({compressing:!0,messageCount:p.message_count||0,beforeTokens:p.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":O({compressing:!1,messageCount:p.totalMessages||0,beforeTokens:p.beforeTokens||0,afterTokens:p.afterTokens||0,compressed:p.compressed??!1,error:p.error}),setTimeout(()=>{ae.value&&!ae.value.compressing&&O(null)},5e3);break;case"abort.started":G({aborting:!0,synced:null});break;case"abort.completed":{if(G({aborting:!1,synced:p.synced??!1}),p.queue_length>0){i.value.set(n,p.queue_length),G(null);break}const R=W(n),H=R[R.length-1];H?.isStreaming&&oe(n,H.id,{isStreaming:!1}),R.forEach((E,L)=>{E.role==="tool"&&E.toolStatus==="running"&&(R[L]={...E,toolStatus:"done"})}),N(),G(null);break}case"reasoning.delta":case"thinking.delta":{const R=p.text||p.delta||"";if(!R)break;d=!0;const H=W(n),E=P?H.find(L=>L.id===P):null;if(E?.role==="assistant"&&E.isStreaming)E.reasoning=(E.reasoning||"")+R,Re(E.id);else{const L=le();re(n,{id:L,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:R}),P=L,Re(L)}break}case"reasoning.available":{const R=W(n),H=R[R.length-1];H?.role==="assistant"&&H.isStreaming&&Ee(H.id);break}case"message.delta":{p.delta&&(d=!0);const R=W(n),H=P?R.find(E=>E.id===P):null;if(H?.role==="assistant"&&H.isStreaming){const E=H.content,L=E+(p.delta||"");De(H.id,E,L),H.reasoning&&Ee(H.id),H.content=L}else{const E=le(),L=p.delta||"";De(E,"",L),re(n,{id:E,role:"assistant",content:L,timestamp:Date.now(),isStreaming:!0}),P=E}break}case"tool.started":{w=!0;const R=W(n),H=p.tool_call_id,E=P?R.find(V=>V.id===P):R[R.length-1];E?.isStreaming&&oe(n,E.id,{isStreaming:!1}),P=null;const L=H?R.find(V=>V.role==="tool"&&V.toolCallId===H):null;if(L){oe(n,L.id,{toolName:p.tool||p.name,toolArgs:typeof p.arguments=="string"?p.arguments:L.toolArgs,toolPreview:p.preview||L.toolPreview,toolStatus:L.toolStatus||"running"});break}re(n,{id:le(),role:"tool",content:"",timestamp:Date.now(),toolName:p.tool||p.name,toolCallId:H,toolPreview:p.preview,toolArgs:typeof p.arguments=="string"?p.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{w=!0;const R=W(n),H=p.tool_call_id,E=H?R.filter(L=>L.role==="tool"&&L.toolCallId===H):R.filter(L=>L.role==="tool"&&L.toolStatus==="running");if(E.length>0){const L=p.error===!0;oe(n,E[E.length-1].id,{toolStatus:L?"error":"done",toolDuration:p.duration,toolResult:typeof p.output=="string"?p.output:void 0})}break}case"approval.requested":no(p);break;case"approval.resolved":to(p);break;case"run.completed":{const R=p.queue_remaining>0;R?i.value.set(n,p.queue_remaining):i.value.delete(n);const H=W(n),E=P?H.find(V=>V.id===P):H[H.length-1];if(E?.isStreaming&&oe(n,E.id,{isStreaming:!1}),p.inputTokens!=null){const V=o.value.find(ge=>ge.id===n);V&&(V.inputTokens=p.inputTokens,V.outputTokens=p.outputTokens)}let L="";if(p.parsed_content!==void 0){const V=W(n),ge=P?V.find(ie=>ie.id===P):[...V].reverse().find(ie=>ie.role==="assistant");ge&&(oe(n,ge.id,{content:p.parsed_content||""}),p.parsed_reasoning&&oe(n,ge.id,{reasoning:p.parsed_reasoning}),L=(p.parsed_content||"").trim())}else{const V=typeof p.output=="string"?p.output:"";L=V.trim(),!d&&L!==""&&re(n,{id:le(),role:"assistant",content:V,timestamp:Date.now()})}if(!d&&!w&&L===""?re(n,{id:le(),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()}):Do(),U.value){const V=[...W(n)].reverse().find(ge=>ge.role==="assistant");V?.content&&setTimeout(()=>{ao(V.id,V.content)},300)}R||N(),P=null,Me(n);break}case"run.failed":{const R=p.queue_remaining>0;R?i.value.set(n,p.queue_remaining):i.value.delete(n);const H=W(n),E=H[H.length-1];E?.isStreaming?oe(n,E.id,{isStreaming:!1,content:p.error?`Error: ${p.error}`:"Run failed",role:"system"}):re(n,{id:le(),role:"system",content:p.error?`Error: ${p.error}`:"Run failed",timestamp:Date.now()}),H.forEach((L,V)=>{L.role==="tool"&&L.toolStatus==="running"&&(H[V]={...L,toolStatus:"error"})}),R||N();break}case"usage.updated":{const R=o.value.find(H=>H.id===n);R&&(R.inputTokens=p.inputTokens,R.outputTokens=p.outputTokens);break}}}Da(n,{onMessageDelta:p=>b(p),onReasoningDelta:p=>b(p),onThinkingDelta:p=>b(p),onReasoningAvailable:p=>b(p),onToolStarted:p=>b(p),onToolCompleted:p=>b(p),onRunStarted:p=>b(p),onRunCompleted:p=>b(p),onRunFailed:p=>b(p),onCompressionStarted:p=>b(p),onCompressionCompleted:p=>b(p),onAbortStarted:p=>b(p),onAbortCompleted:p=>b(p),onUsageUpdated:p=>b(p),onSessionCommand:p=>b(p),onRunQueued:p=>b(p)}),r.value.set(n,{abort:()=>{Fo()?.emit("abort",{session_id:n})}})}function gn(){const n=e.value;if(!n||z.value)return;const m=r.value.get(n);if(m){G({aborting:!0,synced:null}),m.abort();const d=W(n),w=d[d.length-1];w?.isStreaming&&oe(n,w.id,{isStreaming:!1}),window.setTimeout(()=>{e.value===n&&l.value?.aborting&&(r.value.delete(n),c.value.delete(n),G(null))},2e4)}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&e.value&&!k.value){const n=e.value;n&&!r.value.has(n)&&zo(n,m=>{m.isWorking?c.value.add(n):c.value.delete(n),m.isAborting?G({aborting:!0,synced:null}):m.isWorking||G(null),m.messages?.length&&j.value&&(j.value.messages=uo(m.messages)),Ro(n)})}});const fe=new Map;function hn(n){return fe.get(n)}function De(n,m,d){const{startedAtBoundary:w,endedAtBoundary:P}=Qa(m,d);if(!w&&!P)return;const N=fe.get(n)||{};w&&N.startedAt===void 0&&(N.startedAt=Date.now()),P&&N.endedAt===void 0&&(N.endedAt=Date.now()),fe.set(n,N)}function Re(n){const m=fe.get(n)||{};m.startedAt===void 0&&(m.startedAt=Date.now(),fe.set(n,m))}function Ee(n){const m=fe.get(n);!m||m.startedAt===void 0||m.endedAt===void 0&&(m.endedAt=Date.now(),fe.set(n,m))}function vn(n){if(!n)return;const m=n.toLowerCase();for(const d of o.value)(d.provider||"").toLowerCase()===m&&(d.model=void 0,d.provider="")}function Eo(n){fe.clear()}function ao(n,m){const d=new CustomEvent("auto-play-speech",{detail:{messageId:n,content:m}});window.dispatchEvent(d)}return{sessions:o,activeSessionId:e,activeSession:j,focusMessageId:t,messages:f,isStreaming:k,isRunActive:X,isSessionLive:g,compressionState:ae,abortState:l,isAborting:z,queueLengths:i,queuedUserMessages:s,pendingApprovals:_,activePendingApproval:h,removeQueuedMessage:un,isLoadingSessions:ee,sessionsLoaded:q,isLoadingMessages:te,newChat:Oe,newCliSession:J,switchSession:Z,switchSessionModel:oo,addOrUpdateSession:dn,clearProviderFromSessions:vn,deleteSession:ln,sendMessage:_n,stopStreaming:gn,respondApproval:mn,loadSessions:D,refreshActiveSession:Q,getThinkingObservation:hn,noteThinkingDelta:De,noteReasoningStart:Re,noteReasoningEnd:Ee,clearThinkingObservationFor:Eo,setAutoPlaySpeech:x,playMessageSpeech:ao}})}));_e();Ze();rn();function ti(){const o=$e(),e=Ho(),{sessionSearchOpen:t,openSessionSearch:r,closeSessionSearch:c}=Ao();function i(s){const _=s.ctrlKey||s.metaKey;if(_&&s.key==="n"){s.preventDefault(),e.newChat();return}if(_&&s.key==="j"){s.preventDefault(),o.push({name:"hermes.jobs"});return}if(_&&s.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;s.preventDefault(),r();return}if(s.key==="Escape"){if(t.value){s.preventDefault(),c();return}const h=document.querySelector(".n-modal-mask");h&&h.querySelector(".n-base-close")?.click()}}Je(()=>{window.addEventListener("keydown",i)}),bo(()=>{window.removeEventListener("keydown",i)})}_e();Ze();xe();Ce();Yo();rn();var ai={class:"session-search-modal"},ii={class:"search-header"},si={class:"search-title"},ri={class:"search-hint"},li={class:"search-scope"},di={class:"search-body"},ci={key:0,class:"search-empty"},ui={key:1,class:"result-list"},mi=["onClick","onMouseenter"],pi={class:"result-main"},_i={class:"result-title-row"},gi={class:"result-title"},hi={class:"result-source"},vi={class:"result-snippet"},fi={class:"result-meta"},wi={class:"result-time"},bi={key:0,class:"result-match"},yi={class:"search-footer"},Ci=ye({__name:"SessionSearchModal",setup(o){const{t:e}=Te(),t=Co(),r=$e(),c=Ho(),{sessionSearchOpen:i}=Ao(),s=S(""),_=S(!1),h=S([]),U=S([]),x=S(0),k=S(null);let ee=null,q=0;const te=se(()=>s.value.trim().length>0),X=se(()=>te.value?U.value:h.value.map(T=>({...T,matched_message_id:null,snippet:T.preview||"",rank:0})));function ae(T){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[T]||T}function O(T){return T?new Date(T*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function l(T){const J=T.title?.trim();return J||(T.preview?.trim()?T.preview.trim():T.id)}async function z(){const T=++q;_.value=!0;try{const J=await Zo(void 0,8);if(T!==q)return;h.value=J,U.value=[],x.value=0}catch(J){if(T!==q)return;t.error(J instanceof Error?J.message:e("chat.searchFailed"))}finally{T===q&&(_.value=!1)}}async function G(T){const J=++q;_.value=!0;try{const Z=T.trim()?await za(T.trim(),void 0,10):[];if(J!==q)return;U.value=Z,x.value=0}catch(Z){if(J!==q)return;t.error(Z instanceof Error?Z.message:e("chat.searchFailed"))}finally{J===q&&(_.value=!1)}}async function j(){c.sessions.length===0&&await c.loadSessions()}async function f(T){const J=T.matched_message_id!=null?String(T.matched_message_id):null;i.value=!1,await j(),await c.switchSession(T.id,J),r.currentRoute.value.name!=="hermes.chat"&&await r.push({name:"hermes.chat"})}function g(){i.value=!1}function D(T){const J=X.value;J.length!==0&&(x.value=(x.value+T+J.length)%J.length)}async function Q(T){if(i.value){if(T.key==="ArrowDown"){T.preventDefault(),D(1);return}if(T.key==="ArrowUp"){T.preventDefault(),D(-1);return}if(T.key==="Enter"){T.preventDefault();const J=X.value[x.value];J&&await f(J);return}T.key==="Escape"&&(T.preventDefault(),g())}}return ke(()=>i.value,async T=>{if(!T){s.value="",U.value=[],h.value=[],x.value=0;return}s.value="",U.value=[],x.value=0,await z(),await Mn(),k.value?.focus?.()}),ke(s,T=>{ee&&(clearTimeout(ee),ee=null),ee=setTimeout(()=>{i.value&&G(T)},160)}),ke(X,()=>{x.value>=X.value.length&&(x.value=0)}),Je(()=>{window.addEventListener("keydown",Q)}),bo(()=>{window.removeEventListener("keydown",Q),ee&&clearTimeout(ee)}),(T,J)=>(I(),Ae(u(wo),{show:u(i),"onUpdate:show":J[1]||(J[1]=Z=>Tn(i)?i.value=Z:null),preset:"card",title:u(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:he(()=>[a("div",ai,[a("div",ii,[a("div",si,C(u(e)("chat.searchSubtitle")),1),a("div",ri,C(u(e)("chat.searchHint")),1)]),a("div",li,C(u(e)("chat.searchScope")),1),de(u(po),{ref_key:"inputRef",ref:k,value:s.value,"onUpdate:value":J[0]||(J[0]=Z=>s.value=Z),placeholder:u(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),a("div",di,[de(u(Hn),{show:_.value},{default:he(()=>[X.value.length===0?(I(),F("div",ci,C(te.value?u(e)("chat.searchNoResults"):u(e)("chat.searchEmpty")),1)):(I(),F("div",ui,[(I(!0),F(Ne,null,Be(X.value,(Z,Oe)=>(I(),F("button",{key:Z.id,class:Y(["result-item",{active:Oe===x.value}]),onClick:oo=>f(Z),onMouseenter:oo=>x.value=Oe},[a("div",pi,[a("div",_i,[a("span",gi,C(l(Z)),1),a("span",hi,C(ae(Z.source)),1)]),a("div",vi,C(te.value?Z.snippet||u(e)("chat.searchNoSnippet"):Z.preview||u(e)("chat.searchRecent")),1)]),a("div",fi,[a("span",wi,C(O(Z.last_active||Z.started_at)),1),te.value&&Z.matched_message_id!=null?(I(),F("span",bi," #"+C(Z.matched_message_id),1)):me("",!0)])],42,mi))),128))]))]),_:1},8,["show"])]),a("div",yi,[a("span",null,C(u(e)("chat.searchEnterHint")),1),de(u(mo),{quaternary:"",size:"small",onClick:g},{default:he(()=>[We(C(u(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});He();var ki=Ie(Ci,[["__scopeId","data-v-8818182c"]]);_e();Ze();xe();Ce();$o();Xe();var Si={key:0,class:"node-warning-bar"},Pi={class:"app-main"},Ai=ye({__name:"App",setup(o){const{isDark:e,isComic:t}=Jo(),{t:r}=Te(),c=qe(),i=qo(),s=$e(),_=S(!1),h=se(()=>it(e.value,t.value)),U=se(()=>e.value?In:null),x=se(()=>i.name==="login"),k=se(()=>{const ee=c.nodeVersion,q=parseInt(ee.split(".")[0],10);return!isNaN(q)&&q<23});return ke(()=>i.path,()=>{c.closeSidebar()}),s.isReady().then(()=>{_.value=!0}),Je(()=>{x.value||(c.loadModels(),c.startHealthPolling())}),bo(()=>{c.stopHealthPolling()}),ti(),(ee,q)=>{const te=En("router-view");return I(),Ae(u(Cn),{theme:U.value,"theme-overrides":h.value},{default:he(()=>[de(u(xn),null,{default:he(()=>[de(u(Rn),null,{default:he(()=>[de(u(Dn),null,{default:he(()=>[k.value&&_.value?(I(),F("div",Si,C(u(r)("sidebar.nodeVersionWarning",{version:u(c).nodeVersion})),1)):me("",!0),_.value?(I(),F("div",{key:1,class:Y(["app-layout",{"no-sidebar":x.value}])},[x.value?me("",!0):(I(),F("button",{key:0,class:"hamburger-btn",onClick:q[0]||(q[0]=(...X)=>u(c).toggleSidebar&&u(c).toggleSidebar(...X))},[...q[2]||(q[2]=[a("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!x.value&&u(c).sidebarOpen?(I(),F("div",{key:1,class:"mobile-backdrop",onClick:q[1]||(q[1]=(...X)=>u(c).closeSidebar&&u(c).closeSidebar(...X))})):me("",!0),x.value?me("",!0):(I(),Ae(pa,{key:2})),a("main",Pi,[de(te)])],2)):me("",!0),de(ki)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});He();var xi=Ie(Ai,[["__scopeId","data-v-f6c7ab5c"]]);_e();ko();var Uo=localStorage.getItem("hermes_brightness")||"system",Ti=localStorage.getItem("hermes_style")||"ink",Hi=window.matchMedia("(prefers-color-scheme: dark)").matches,Ii=Uo==="dark"||Uo==="system"&&Hi,Mi=Ti==="comic";Ii&&document.documentElement.classList.add("dark");Mi&&document.documentElement.classList.add("comic");var Di=new URLSearchParams(window.location.search),No=window.location.hash.split("?")[1],Bo=Di.get("token")||(No?new URLSearchParams(No).get("token"):null);Bo&&(window.__LOGIN_TOKEN__=Bo);var eo=kn(xi);eo.use(Ln());eo.use(Qo);eo.use(Un);eo.mount("#app");export{Jo as C,$o as S,ot as T,Ni as _,Zi as a,Oi as b,Qi as c,Gi as d,$i as f,Bi as g,Ki as h,Ja as i,ja as l,Wi as m,Ho as n,Wa as o,qi as p,Yi as r,_o as s,rn as t,Ji as u,Vi as v,nt as w,ji as x,Yo as y};