hermes-web-ui 0.6.0-beta.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/js/{ChannelsView-9bNGmPOL.js → ChannelsView-CvORJMzg.js} +1 -1
- package/dist/client/assets/js/{ChatView-CrMN1j5u.js → ChatView-DihfBNUf.js} +1 -1
- package/dist/client/assets/js/{FileRenameModal-C4oWOgjw.js → FileRenameModal-DN-U6DZT.js} +1 -1
- package/dist/client/assets/js/{FilesView-pDP8mSTZ.js → FilesView-BxW5kOlO.js} +1 -1
- package/dist/client/assets/js/{GroupChatView-BV3Dxn4i.js → GroupChatView-Cdyg0EOz.js} +1 -1
- package/dist/client/assets/js/{HistoryMessageList-CHk-rOIr.js → HistoryMessageList-S77rD1zj.js} +1 -1
- package/dist/client/assets/js/{HistoryView-RE-m9Yx6.js → HistoryView-DM7qDtZb.js} +1 -1
- package/dist/client/assets/js/{JobsView-BkXCTE4b.js → JobsView-BqylpVBm.js} +1 -1
- package/dist/client/assets/js/{KanbanView-Bwlm-lFI.js → KanbanView-C8uXrTRt.js} +1 -1
- package/dist/client/assets/js/{LoginView-Cil7q9fA.js → LoginView-ISxozFfh.js} +1 -1
- package/dist/client/assets/js/{LogsView-BRXZpNpB.js → LogsView-CtCOjFb5.js} +1 -1
- package/dist/client/assets/js/{MarkdownRenderer-BbsOzYq-.js → MarkdownRenderer-BJbqsrMI.js} +1 -1
- package/dist/client/assets/js/{MemoryView-BeY8xybk.js → MemoryView-Bc-a9i1U.js} +1 -1
- package/dist/client/assets/js/{MessageItem-DWHvbLzg.js → MessageItem-DOA2nFJg.js} +1 -1
- package/dist/client/assets/js/{ModelsView-C33B9WXE.js → ModelsView-CmcXLgHA.js} +1 -1
- package/dist/client/assets/js/{OutlinePanel-CxJshR71.js → OutlinePanel-D2LVzKPs.js} +1 -1
- package/dist/client/assets/js/{PerformanceView-Bcs2X6p5.js → PerformanceView-BIMfq0BU.js} +1 -1
- package/dist/client/assets/js/{PluginsView-ClPgLZw1.js → PluginsView-DfSS_RTl.js} +1 -1
- package/dist/client/assets/js/{ProfilesView-C4kzKN1z.js → ProfilesView-CVh7LT-n.js} +1 -1
- package/dist/client/assets/js/{SettingRow-BAmGrtcn.js → SettingRow-Dt5XWkpQ.js} +1 -1
- package/dist/client/assets/js/{SettingsView-BuKFsiAz.js → SettingsView-hA4C1YcG.js} +1 -1
- package/dist/client/assets/js/{SkillsUsageView-CRcgWp1p.js → SkillsUsageView-_ToBXkb1.js} +1 -1
- package/dist/client/assets/js/{SkillsView-B2j4jJMz.js → SkillsView-DMUkyn3M.js} +1 -1
- package/dist/client/assets/js/{TerminalView-0vvlfSha.js → TerminalView-CS_MwrJD.js} +1 -1
- package/dist/client/assets/js/{UsageView-3v8bYw4Z.js → UsageView-D6o-9cR-.js} +1 -1
- package/dist/client/assets/js/{_plugin-vue_export-helper-B8gz9Iqn.js → _plugin-vue_export-helper-CHoatqkO.js} +2 -2
- package/dist/client/assets/js/{index-Cuk9R8hy.js → index-DpU5R9KV.js} +1 -1
- package/dist/client/assets/js/{models-Of46_lGf.js → models-CDdUhb_e.js} +1 -1
- package/dist/client/assets/js/profiles-CyjgPK1f.js +1 -0
- package/dist/client/assets/js/{session-browser-prefs-IGK7Xpdn.js → session-browser-prefs-C6G-jnbR.js} +1 -1
- package/dist/client/assets/js/{skills-BQ2jtPxK.js → skills-vuknhTFJ.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/client/assets/js/profiles-DiEn61KW.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Qa,i as Ja,n as be}from"./rolldown-runtime-BKwlnUi0.js";import{A as wa,At as Za,Bt as re,Ct as Re,Et as Qe,Ht as b,I as Se,Nt as Ya,Pt as S,Q as qe,S as Be,St as Xa,Tt as ce,Vt as et,W as ve,X as ot,Y as Je,Z as at,_t as vo,at as L,b as tt,bt as Oe,ct as X,gt as eo,it as he,j as nt,l as ba,lt as Pe,mt as it,n as rt,nt as n,ot as ze,q as st,rt as Le,st as we,t as xe,tt as se,v as lt,vt as I,x as dt,y as _o,z as zo,zt as u}from"./ui-vendor-BMwF7QXa.js";import{c as oo,d as Go,l as ct,n as Ce,o as ao,r as He,s as Ko,t as ut,u as ka}from"./vue-vendor-kBYBtqCg.js";import{a as ya,d as le,i as mt,l as Ie,n as Me,o as wo,r as pt,s as Vo,t as De,u as gt}from"./_plugin-vue_export-helper-B8gz9Iqn.js";import{A as ht,O as ft,k as vt}from"./vendor-CGQjY-CL.js";import{a as _t,c as bo,i as wt,l as Ye,n as bt,o as kt,r as Xe,s as yt,t as ko}from"./profiles-DiEn61KW.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const l of r)if(l.type==="childList")for(const d of l.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&i(d)}).observe(document,{childList:!0,subtree:!0});function a(r){const l={};return r.integrity&&(l.integrity=r.integrity),r.referrerPolicy&&(l.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?l.credentials="include":r.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function i(r){if(r.ep)return;r.ep=!0;const l=a(r);fetch(r.href,l)}})();ve();Go();ao();Ie();pt();Ce();var Sa={login:{title:"Hermes Web UI",description:"Enter your username and password to continue.",placeholder:"Access token",submit:"Login",tokenRequired:"Please enter your access token",invalidToken:"Invalid token",connectionFailed:"Cannot connect to server",passwordLogin:"Password",tokenLogin:"Token",usernamePlaceholder:"Username",passwordPlaceholder:"Password",defaultCredentialsHint:"Default username: admin. Default password: 123456.",credentialsRequired:"Please enter username and password",invalidCredentials:"Invalid username or password",tooManyAttempts:"Too many failed attempts, please try again later",sessionExpired:"Login expired. Please sign in again.",accessDenied:"You do not have permission to access this resource.",passwordMismatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",setupSuccess:"Password login configured successfully",passwordChanged:"Password changed successfully",passwordRemoved:"Password login removed",setupPassword:"Set Up Password Login",changePassword:"Change Password",changeUsername:"Change Username",removePasswordLogin:"Remove",username:"Username",currentPassword:"Current Password",newPassword:"New Password",confirmPassword:"Confirm Password",newUsername:"New Username",usernameChanged:"Username changed successfully",usernameTooShort:"Username must be at least 2 characters",setupDescription:"Manage the username and password used to sign in.",removeConfirm:"Password login is required for user accounts.",passwordLoginNotConfigured:"Password login is not configured",passwordLoginConfigured:"Current account: {username}",defaultCredentialTitle:"Change the default account credentials",defaultCredentialMessage:"This account is still using the default username or password. To prevent unauthorized access, update the username and password as soon as possible.",defaultCredentialAction:"Update now",defaultCredentialLater:"Remind me later"},users:{title:"Account Management",description:"Create users, assign roles, and control which profiles regular admins can access.",create:"Create User",edit:"Edit User",username:"Username",role:"Role",statusLabel:"Status",profiles:"Accessible Profiles",profilesPlaceholder:"Select accessible profiles",allProfiles:"All profiles",noProfiles:"No profiles assigned",lastLogin:"Last Login",newPasswordOptional:"New Password (leave blank to keep)",loadFailed:"Failed to load users",deleteConfirm:"Delete this user?",enable:"Enable",disable:"Disable",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Active",disabled:"Disabled"}},common:{loading:"Loading...",cancel:"Cancel",delete:"Delete",edit:"Edit",save:"Save",retry:"Retry",saved:"Saved",update:"Update",create:"Create",saveFailed:"Save failed",deleteFailed:"Delete failed",ok:"OK",copied:"Copied",copy:"Copy",noData:"No data",expired:"Expired",fetch:"Fetch",add:"Add",enable:"Enable",disable:"Disable",configured:"Configured",notConfigured:"Not configured",confirm:"Confirm",expand:"Expand",collapse:"Collapse",start:"Start",stop:"Stop"},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",performance:"Performance",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",groupChat:"Group Chat",files:"Files",groupConversation:"Conversation",groupConversationShort:"Conv",groupPlatform:"Platform",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Monitoring",groupMonitoringShort:"Mon",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"},performance:{title:"Performance",subtitle:"Inspect system resources, bridge broker, workers, and active sessions",refresh:"Refresh",autoRefreshOn:"Auto refresh",autoRefreshOff:"Manual refresh",loadFailed:"Failed to load performance metrics",systemCpu:"System CPU",systemMemory:"System Memory",activeSessions:"Active Sessions",runningSessions:"Running {count}",workers:"Workers",totalWorkerMemory:"Worker memory",processes:"Processes",uptime:"Uptime",running:"Running",stopped:"Stopped",workerMemory:"Worker Memory",lastUpdated:"Updated",profile:"Profile",memory:"Memory",sessions:"Sessions",runningActiveSessions:"Running / Active",lastUsed:"Last Used",status:"Status",noWorkers:"No workers",sessionsByProfile:"Sessions by Profile",noActiveSessions:"No active sessions"},drawer:{terminal:"Terminal",files:"Workspace"},chat:{contextRemaining:"remaining",contextClickToEdit:"Click to edit context length",contextEditTitle:"Edit Context Length",contextEditDesc:"Set context length limit for current model (in tokens)",contextEditPlaceholder:"Enter context length",contextEditHint:"Common values: 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",outlineTitle:"Conversation Outline",outlineEmpty:"No conversation content",outlineUserQuestion:"User question",inputPlaceholder:"Type a message... (Enter to send, Shift+Enter for new line)",slashCommandArgs:{message:"<message>",title:"<title>",text:"<text>"},slashCommands:{usage:"Calculate current session usage",status:"Show session status and queue",abort:"Stop the active bridge run",queue:"Queue a message behind the active run",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",allProfiles:"All profiles",profileMissingModelsTip:'Profile "{profile}" has no available provider or model for this session',sessionScopeHint:"Chat shows Web UI/API Server sessions only. CLI, Telegram, Discord, Cron, and other channel sessions are read-only in History.",openHistory:"Open History",hermesHistory:"Hermes History",historyScopeHint:"Read-only Hermes history sessions for the current profile, grouped by source.",noSessions:"No sessions",searchTitle:"Search Sessions",searchSubtitle:"Search by title or message content",searchScope:"Search scope: Web UI local session database only. Read-only Hermes history sessions are not included.",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"Search sessions...",searchEmpty:"Recent sessions",searchRecent:"Recent session",searchNoResults:"No sessions match your search",searchNoSnippet:"No snippet available",searchEnterHint:"Enter to open · Esc to close",searchFailed:"Failed to search sessions",newChat:"New Chat",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",copySessionLink:"Copy Session Link",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",xaiCopyLink:"Copy authorization link",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",currentDefault:"Current default",defaultShort:"Default",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 Hermes Profile",switchConfirm:"This will run `hermes profile use {name}` and change the active Hermes CLI profile. Continue?",switchSuccess:'Hermes active profile switched to "{name}"',switchFailed:"Failed to switch Hermes profile. Gateway may need manual restart.",createSuccess:'Profile "{name}" created',createFailed:"Failed to create profile",renameSuccess:"Profile renamed",renameFailed:"Failed to rename profile",deleteConfirm:'Are you sure you want to delete profile "{name}"?',deleteSuccess:"Profile deleted",deleteFailed:"Failed to delete profile",exportSuccess:"Profile exported",exportFailed:"Failed to export profile",importSuccess:"Profile imported",importFailed:"Failed to import profile",importSelectFile:"Select archive file",importInvalidFile:"Please select a valid archive (.tar.gz, .tgz, .gz, .zip)",name:"Profile Name",namePlaceholder:"Lowercase letters, numbers, hyphens only",nameValidation:"Profile name can only contain lowercase letters, numbers, underscores, and hyphens",newName:"New Name",newNamePlaceholder:"Lowercase letters, numbers, hyphens",cloneFromCurrent:"Clone from current profile",cloneCleanupNotice:"Cloning automatically skips exclusive platform credentials (Weixin / Telegram / Slack, etc.) to avoid conflicts with the source profile",cloneStrippedCredentials:"Stripped {count} exclusive credential(s): {list}",cloneDisabledPlatforms:"Disabled {count} platform(s): {list}",cloneStrippedConfigCredentials:"Stripped {count} embedded credential(s) from config.yaml: {list}",archivePath:"Archive Path",archivePathPlaceholder:"Server path to archive file",importName:"Profile Name (optional)",importNamePlaceholder:"Leave empty to use archive name",active:"Active",model:"Model",gateway:"Gateway",alias:"Alias",provider:"Provider",path:"Path",skills:"Skills",hasEnv:"Has .env",hasSoulMd:"Has soul.md",noProfiles:"No profiles found. Create one to get started.",avatar:{title:"Custom Avatar",customize:"Avatar",upload:"Upload Image",random:"Randomize",reset:"Use Default",hint:"PNG, JPEG, or WebP. Max 1MB.",invalidType:"Please choose a PNG, JPEG, or WebP image",tooLarge:"Avatar image must be 1MB or smaller",saveSuccess:"Avatar saved",saveFailed:"Failed to save avatar",resetSuccess:"Default avatar restored",resetFailed:"Failed to restore default avatar"},runtime:{activeProfile:"Active: {name}",bridgeWorker:"Bridge worker",gateway:"Gateway",active:"Active",activeTag:"Active",idle:"Idle",running:"Running",stopped:"Stopped",restartGateway:"Restart Gateway",restartProfile:"Restart Profile",switchProfile:"Switch Frontend Profile",gatewayRestarted:"Gateway restarted: {name}",gatewayRestartFailed:"Failed to restart gateway",profileRestarted:"Profile restarted: {name}",profileRestartFailed:"Failed to restart profile"}},logs:{title:"Logs",all:"All",searchPlaceholder:"Search...",refresh:"Refresh",noEntries:"No log entries"},settings:{title:"Settings",saved:"Saved",saveFailed:"Save failed",tabs:{display:"Display",account:"Current Account",users:"Account Management",agent:"Agent",memory:"Memory",compression:"Compression",session:"Session",privacy:"Privacy",apiServer:"API Server",models:"Models",voice:"Voice"},models:{apiKey:"API Key",apiKeyPlaceholder:"Enter API key",save:"Save",saved:"Saved",saveFailed:"Save failed",noProviders:"No providers configured"},display:{streaming:"Stream Responses",streamingHint:"Show AI replies in real-time",compact:"Compact Mode",compactHint:"Reduce message spacing",showReasoning:"Show Reasoning",showReasoningHint:"Show model thinking process",showCost:"Show Cost",showCostHint:"Show token usage in replies",inlineDiffs:"Inline Diffs",inlineDiffsHint:"Show code changes inline",bellOnComplete:"Completion Sound",bellOnCompleteHint:"Play sound when AI finishes",busyInputMode:"Busy Input Mode",busyInputModeHint:"Allow input while AI is processing",theme:"Theme",themeHint:"Choose light, dark, or follow system preference",themeLight:"Light",themeDark:"Dark",themeSystem:"System"},agent:{maxTurns:"Max Turns",maxTurnsHint:"Maximum interaction rounds per conversation",gatewayTimeout:"Gateway Timeout",gatewayTimeoutHint:"Request timeout in seconds",restartDrainTimeout:"Restart Drain Timeout",restartDrainTimeoutHint:"Drain timeout before restart in seconds",toolEnforcement:"Tool Enforcement",toolEnforcementHint:"Control tool call execution mode",auto:"Auto",always:"Always",never:"Never"},memory:{enabled:"Enable Memory",enabledHint:"Allow AI to remember conversation context",userProfile:"User Profile",userProfileHint:"Allow AI to remember user preferences",charLimit:"Memory Char Limit",charLimitHint:"Max characters for MEMORY.md",userCharLimit:"User Profile Char Limit",userCharLimitHint:"Max characters for USER.md"},compression:{enabled:"Enable Compression",enabledHint:"Automatically compress long chat history before it exceeds the model context",threshold:"Compression Threshold",thresholdHint:"Start compression when estimated tokens exceed this context ratio",targetRatio:"Target Ratio",targetRatioHint:"Target history size after compression as a context ratio",protectLastN:"Protect Recent Messages",protectLastNHint:"Keep this many latest messages uncompressed",protectFirstN:"Protect First Messages",protectFirstNHint:"Keep this many earliest messages uncompressed"},session:{mode:"Reset Mode",modeHint:"Trigger condition for session reset",modeBoth:"Idle + Scheduled",modeIdle:"Idle Only",modeDaily:"Scheduled Only",modeNone:"Never (Manual Only)",idleMinutes:"Idle Timeout",idleMinutesHint:"Wait time before auto-reset (minutes)",atHour:"Scheduled Reset Time",humanOnly:"Show human sessions only",humanOnlyHint:"Hide sub-agent/session monitor noise by default",liveMonitorHumanOnly:"Live monitor: show human sessions only",liveMonitorHumanOnlyHint:"Hide sub-agent/session monitor noise in the Live monitor by default",atHourHint:"Reset session at this hour daily",requireAuth:"Session Authorization",requireAuthHint:"Require authorization for session operations"},privacy:{redactPii:"Redact PII",redactPiiHint:"Auto-detect and hide sensitive info (passwords, keys, etc.)"},apiServer:{enable:"Enable",enableHint:"Enable API server",host:"Host",hostHint:"Listen address",port:"Port",portHint:"Listen port",key:"Key",keyHint:"API access key",cors:"CORS Origins",corsHint:"Allowed cross-origin sources"},lockedIps:{title:"Locked IPs",count:"{count} locked",empty:"No locked IPs",unlock:"Unlock",unlockAll:"Unlock All",unlockAllConfirm:"Unlock all locked IPs?",unlocked:"IP unlocked",allUnlocked:"{count} IPs unlocked"},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",agentAddFailedCount:"{count} agent(s) were not added: {details}",noAgents:"No agents in this room",members:"members",roomCreated:"Room created",roomDeleted:"Room deleted",roomCloned:"Room cloned",cloneRoom:"Clone room",copyRoomLink:"Copy Room Link",deleteRoomConfirm:"Delete this room?",clearContext:"Clear context",clearContextConfirm:"Clear this room context? Messages and compression snapshots will be removed, but agents and members stay.",contextCleared:"Context cleared",you:"You",joined:"Joined room",joinFailed:"Failed to join room",inputPlaceholder:"Type a message... (Enter to send)",enterCode:"Enter invite code",yourName:"Your Name",yourNamePlaceholder:"Enter your display name",yourDescription:"Description (optional)",yourDescriptionPlaceholder:"Tell others who you are...",agentName:"Agent Name",agentNamePlaceholder:"Custom name (leave empty to use profile name)",agentDesc:"Agent Description",agentDescPlaceholder:"Describe what this agent does...",agentReplying:"is replying...",agentCompressing:"is compressing context...",compressionSettings:"Compression Settings",triggerTokens:"Trigger Tokens",triggerTokensDesc:"Token threshold to trigger context compression",maxHistoryTokens:"Max History Tokens",maxHistoryTokensDesc:"Maximum tokens for compressed context sent to LLM",tailMessageCount:"Tail Message Count",tailMessageCountDesc:"Number of recent messages to keep verbatim after compression",compressionConfig:"Compression Config",compressionSaved:"Compression config saved",compressNow:"Compress Now",compressingInProgress:"Compression in progress, please wait"},usage:{title:"Usage Statistics",refresh:"Refresh",totalTokens:"Total Tokens",inputTokens:"Input",outputTokens:"Output",totalSessions:"Total Sessions",avgPerDay:"~{n}/day avg",estimatedCost:"Est. Cost",cacheHitRate:"Cache Hit Rate",modelBreakdown:"Model Breakdown",dailyTrend:"Daily Usage",date:"Date",tokens:"Tokens",cache:"Cache",cacheRead:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessions",cost:"Cost",noData:"No usage data"},skillsUsage:{title:"Skills Usage",subtitle:"Track skill loads and edits from Hermes sessions",refresh:"Refresh",periodSelector:"Skill usage period",periodLabel:"{days}d",summary:"Summary",totalActions:"Actions",loads:"Loads",edits:"Edits",distinctSkills:"Skills",topSkills:"Top Skills",dailyTrend:"Daily Trend",periodSummary:"Last {days} days",skill:"Skill",share:"Share",lastUsed:"Last Used",noData:"No skill usage data",loadFailed:"Failed to load skill usage",otherSkills:"Other skills"},files:{title:"Files",fileTree:"File Tree",tree:"Directory Tree",list:"File List",breadcrumbRoot:"Home",newFile:"New File",newFolder:"New Folder",upload:"Upload",refresh:"Refresh",open:"Open",edit:"Edit",preview:"Preview",download:"Download",copyPath:"Copy Path",rename:"Rename",delete:"Delete",name:"Name",size:"Size",modified:"Modified",actions:"Actions",emptyDir:"Empty directory",loading:"Loading...",confirmDelete:'Are you sure you want to delete "{name}"?',confirmDeleteDir:'Are you sure you want to delete directory "{name}" and all its contents?',deleteFailed:"Delete failed",deleted:"Deleted",renameTo:"Rename to",newFileName:"File name",newFolderName:"Folder name",created:"Created",createFailed:"Create failed",renamed:"Renamed",renameFailed:"Rename failed",uploadSuccess:"Uploaded {count} file(s)",uploadFailed:"Upload failed",saveFailed:"Save failed",saved:"Saved",unsavedChanges:"You have unsaved changes. Discard?",pathCopied:"Path copied",fileTooLarge:"File too large (max 10MB)",permissionDenied:"Cannot modify protected file",notFound:"File or directory not found",backendError:"File operation failed",dragDropHint:"Drag files here to upload",closeEditor:"Close Editor",closePreview:"Close",saveFile:"Save"},download:{downloading:"Downloading...",downloadFailed:"Download failed",fileNotFound:"File not found or deleted",fileTooLarge:"File too large (exceeds limit)",backendError:"File read failed, remote environment may be unavailable",backendTimeout:"File read timed out",unsupportedBackend:"Current terminal backend does not support file download",invalidPath:"Invalid file path",contentDisplay:"Content display",download:"Download",downloadFile:"Download file"},changelog:{new_0_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_30_1:"Bridge chat now preserves structured history, fixing intermittent no-response and skipped tool execution caused by text-flattened tool history",new_0_5_30_2:"Group chat mention routing is more reliable for multiple agents, removes each agent’s own @ mention before delivery, and keeps user display names bound after refresh",new_0_5_30_3:"Model pages, chat model dropdowns, and session model selection now scope providers and models to the active Profile with accurate default markers",new_0_5_30_4:"Gateway management is simplified: the standalone Gateway page is removed, each Profile is checked for platform configuration before starting the needed gateway, and a lightweight gateway runner handles starts and restarts",new_0_5_30_5:"Improve Gateway startup across Docker, Termux, and Windows with runtime-lock handling, port-conflict cleanup, background execution, and restart support",new_0_5_30_6:"Harden Windows compatibility for path detection, file downloads, and job/update subprocesses so they no longer flash terminal windows",new_0_5_30_7:"Fix config writes and provider presets: validate .env keys, route FUN-Codex through the Responses API, and refresh Z.AI/GLM model lists",new_0_5_30_8:"Polish frontend details including collapsed sidebar layout, short group labels, sidebar divider, and conversation outline styling",new_0_5_30_9:"Context compression now follows Profile compression settings and hardens stale snapshots by reusing previous summaries with a safe tail instead of recompressing full history",new_0_5_31_1:"Harden Bridge broker restarts, fix final group-chat stream rendering, and add {'@'}all routing for group chat",new_0_5_31_2:"File manager can copy absolute paths, and the mobile session drawer overlay no longer falls behind chat content",new_0_5_31_3:"Profile selector now shows avatars, custom avatar uploads, runtime status modal, and gateway/profile restart actions",new_0_5_31_4:"Profile avatars now appear in single chat, group chat, and collapsed sidebar, with Web UI profile metadata storage and Windows-safe paths",new_0_5_31_5:"Improve Docker, Termux, and Windows gateway detection and restart checks by using gateway_state/gateway.pid for managed gateway liveness",new_0_5_31_6:"Add APIKEY.FUN image-generation media endpoint and bundled apikey-image-gen skill for text-to-image, image-to-image, and image editing via the active Profile fun-codex provider",new_0_5_33_1:"Single chat and group chat now keep run failures and socket errors as red Agent messages in the message list instead of flashing them briefly",new_0_5_33_2:"Session search can now scope results to the selected Profile, while still searching all Profiles when no Profile is selected",new_0_5_33_3:"Skills page now shows Chinese and English recommendation documents when no skill is selected, and clicking the selected skill again clears the selection",new_0_5_33_4:"Remove unused changelog localization entries to reduce frontend i18n size",new_0_5_33_5:"Fix agent bridge startup failures on Chinese Windows systems caused by netstat output encoding",new_0_5_33_6:"Refresh the Nous Portal preset model list from the public catalog and Portal recommendations",new_0_5_33_7:"Profile lists and runtime status now read Profile names from disk and default models from config, avoiding CLI table column-width parsing errors",new_0_5_34_1:"Normalize multimodal tool results while storing session and group-chat messages, avoiding base64 image payloads in replays",new_0_5_34_2:"Persist custom Hermes models through backend-managed configuration and expose add/remove model endpoints",new_0_5_34_3:"Keep Bridge final context usage and tool status updates accurate after runs complete",new_0_5_34_4:"Improve Kanban board filtering, assignee display, card actions, and task detail handling",new_0_5_34_5:"Fix compression usage accounting by caching fixed prompt/tool context and reporting full-context token totals",new_0_5_34_6:"Cache fixed context per group-chat agent and only show compression progress when compression actually starts",new_0_5_34_7:"Sync Web UI bundled skills into every Profile and log the target Profile for each injection",new_0_5_34_8:"If Kanban fails on Windows, upgrade Hermes to pick up the latest kanban database migration fixes",new_0_5_35_1:"Bridge sessions can now run concurrently across different sessions while same-session runs stay serialized to preserve message order",new_0_5_35_2:"Add the Performance Monitor page for system CPU/memory, Web UI, Bridge Broker, Workers, and active session status",new_0_5_35_3:"Add per-worker resource metrics showing CPU, memory, Profile, session count, and running state",new_0_5_35_4:"Improve Bridge worker lifecycle cleanup so broker shutdowns and parent-process exits reclaim workers and reduce orphan Python processes",new_0_5_35_5:"Harden monitoring compatibility with resource collection fallbacks for macOS, Windows, Linux, Docker, and Termux",new_0_5_35_6:"Performance monitoring no longer blocks on worker requests while agents are initializing, reducing request timeouts on Windows",new_0_5_35_7:"Chat Markdown now supports inline text-content previews, and download icons download files directly instead of opening the preview drawer",new_0_5_35_8:"Polish the content preview drawer with a mobile close action, full-width mobile layout, 800px desktop width, and consistent text/Markdown backgrounds",new_0_6_0_1:"Account- and Profile-scoped management now consistently protects sessions, models, usage, Kanban, jobs, uploads, media, and related Hermes APIs",new_0_6_0_2:"Bundled media skills use the generated server token only for media endpoints and resolve fun-codex/xAI credentials from the requested Profile",new_0_6_0_3:"Single chat and group chat now inject the current Hermes Profile into run instructions so skills can send X-Hermes-Profile",new_0_6_0_4:"delegate_task subagent progress now streams into the chat UI with start, tool, progress, and completion updates",new_0_6_0_5:"Stopping or aborting a run clears transient events so stale abort state does not leak into the next chat",new_0_6_0_6:"Update docs and website copy for account management, default credentials, account/Profile management, uploads/downloads, and bundled media skills",new_0_6_0_7:"Add CLI maintenance commands for clearing login IP locks and resetting the default admin / 123456 login",new_0_6_0_8:"Version 0.6.0 is the boundary between single-user and multi-user Web UI. If multi-user mode causes issues, please file an issue and roll back to the 0.5.35 single-user release if needed"}},St={login:{title:"Hermes Web UI",description:"输入用户名和密码以继续。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",defaultCredentialsHint:"默认登录名:admin,默认密码:123456",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",sessionExpired:"登录已过期,请重新登录",accessDenied:"你没有权限访问该资源",passwordMismatch:"两次密码不一致",passwordTooShort:"密码长度至少 6 个字符",setupSuccess:"密码登录配置成功",passwordChanged:"密码修改成功",passwordRemoved:"密码登录已移除",setupPassword:"设置密码登录",changePassword:"修改密码",changeUsername:"修改用户名",removePasswordLogin:"移除",username:"用户名",currentPassword:"当前密码",newPassword:"新密码",confirmPassword:"确认密码",newUsername:"新用户名",usernameChanged:"用户名修改成功",usernameTooShort:"用户名至少 2 个字符",setupDescription:"管理用于登录的用户名和密码。",removeConfirm:"用户账号必须保留密码登录。",passwordLoginNotConfigured:"密码登录未配置",passwordLoginConfigured:"当前账户:{username}",defaultCredentialTitle:"请修改默认账户和密码",defaultCredentialMessage:"当前登录账户仍在使用默认用户名或默认密码。为了避免未授权访问,请尽快进入当前账户修改用户名和密码。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍后提醒"},users:{title:"账户管理",description:"创建用户、分配角色,并控制普通管理员可访问的配置。",create:"创建用户",edit:"编辑用户",username:"用户名",role:"角色",statusLabel:"状态",profiles:"可访问配置",profilesPlaceholder:"选择可访问的配置",allProfiles:"全部配置",noProfiles:"未关联配置",lastLogin:"最后登录",newPasswordOptional:"新密码(留空不修改)",loadFailed:"用户列表加载失败",deleteConfirm:"确认删除该用户?",enable:"启用",disable:"禁用",roles:{superAdmin:"超级管理员",admin:"普通管理员"},status:{active:"启用",disabled:"禁用"}},common:{loading:"加载中...",cancel:"取消",delete:"删除",retry:"重试",edit:"编辑",save:"保存",saved:"已保存",saveFailed:"保存失败",deleteFailed:"删除失败",ok:"确定",copied:"已复制",copy:"复制",update:"更新",create:"创建",noData:"暂无数据",expired:"已过期",fetch:"获取",add:"添加",enable:"启用",disable:"禁用",configured:"已配置",notConfigured:"未配置",confirm:"确定",expand:"展开",collapse:"收起",start:"启动",stop:"停止"},sidebar:{chat:"对话",search:"搜索",apiRelay:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",performance:"性能监控",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",groupConversation:"对话",groupConversationShort:"对话",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系统",groupSystemShort:"系统",groupMonitoring:"监控",groupMonitoringShort:"监控",groupTools:"工具",settings:"设置",connected:"已连接",disconnected:"未连接",collapse:"收起菜单",expand:"展开菜单",updateTip:'在终端运行 "hermes-web-ui update" 即可更新',updateVersion:"升级版本 v{version}",reloadClientVersion:"刷新到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,请稍后刷新页面,如长时间未启动,请手动启动",updateFailed:"更新失败",logout:"退出登录",nodeVersionWarning:"检测到 Node.js v{version},请升级到23以上版本。",changelog:"更新日志",noChangelog:"暂无更新日志"},performance:{title:"性能监控",subtitle:"查看系统资源、Bridge Broker、Workers 和活跃会话",refresh:"刷新",autoRefreshOn:"自动刷新",autoRefreshOff:"手动刷新",loadFailed:"性能数据加载失败",systemCpu:"系统 CPU",systemMemory:"系统内存",activeSessions:"活跃会话",runningSessions:"运行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 总内存",processes:"进程",uptime:"运行",running:"运行中",stopped:"已停止",workerMemory:"Worker 内存",lastUpdated:"更新时间",profile:"Profile",memory:"内存",sessions:"会话",runningActiveSessions:"运行中 / 活跃",lastUsed:"最后使用",status:"状态",noWorkers:"暂无 Worker",sessionsByProfile:"按 Profile 统计会话",noActiveSessions:"暂无活跃会话"},drawer:{terminal:"终端",files:"工作区"},chat:{contextRemaining:"剩余",contextClickToEdit:"点击编辑上下文长度",contextEditTitle:"编辑上下文长度",contextEditDesc:"设置当前模型的上下文长度限制(token 数量)",contextEditPlaceholder:"请输入上下文长度",contextEditHint:"常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"取消",contextEditInvalid:"请输入有效的上下文长度",contextEditSuccess:"上下文长度已更新",contextEditFailed:"更新失败",emptyState:"开始与 Hermes Agent 对话",cliEmptyState:"开始 CLI 对话",outlineTitle:"会话大纲",outlineEmpty:"暂无会话内容",outlineUserQuestion:"用户问题",inputPlaceholder:"输入消息... (Enter 发送,Shift+Enter 换行)",slashCommandArgs:{message:"<消息>",title:"<标题>",text:"<文本>"},slashCommands:{usage:"计算当前会话用量",status:"查看会话状态和队列",abort:"停止当前 Bridge 运行",queue:"把消息加入当前运行后的队列",clear:"清空当前显示内容",clearHistory:"删除当前会话已入库的消息历史",title:"重命名当前会话",compress:"空闲时触发上下文压缩",steer:"向当前 Bridge 运行发送引导文本",destroy:"释放当前会话的 Bridge Agent"},attachFiles:"添加附件",autoPlaySpeech:"自动播放语音",showToolCalls:"显示工具调用",hideToolCalls:"隐藏工具调用",messageQueue:"消息队列",removeQueuedMessage:"移除队列消息",stop:"停止",start:"启动",stopGateway:"停止网关",send:"发送",contextUsed:"上下文已用:",sessions:"会话",webUiSessions:"会话",allProfiles:"全部配置",profileMissingModelsTip:"该会话所属配置「{profile}」没有可用的 provider 或模型",sessionScopeHint:"这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。",openHistory:"打开历史",hermesHistory:"Hermes 历史",historyScopeHint:"这里按来源只读查看当前 profile 的 Hermes 历史会话。",noSessions:"暂无会话",searchTitle:"搜索会话",searchSubtitle:"按标题或消息内容搜索",searchScope:"搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜索会话...",searchEmpty:"最近会话",searchRecent:"最近会话",searchNoResults:"没有匹配的会话",searchNoSnippet:"没有可显示的摘要",searchEnterHint:"Enter 打开 · Esc 关闭",searchFailed:"搜索会话失败",newChat:"新建对话",approvalKicker:"终端授权",approvalTitle:"运行前请确认命令",approvalAllowOnce:"仅本次允许",approvalAllowSession:"本会话允许",approvalAlways:"始终允许",approvalDeny:"拒绝",newCliChat:"新建 CLI",deleteSession:"确定删除此会话?",sessionDeleted:"会话已删除",toggleBatchMode:"批量选择",selectAll:"全选",confirmBatchDelete:"确定删除选中的 {count} 个会话?",batchDeleteSuccess:"已删除 {count} 个会话",batchDeletePartial:"{failed} 个会话删除失败",batchDeleteFailed:"批量删除失败",rename:"重命名",pin:"置顶",unpin:"取消置顶",pinned:"已置顶",chatMode:"聊天",liveMode:"实时",liveSessions:"实时会话",recentBadge:"最近",linkedSessions:"关联 {count} 个会话",noVisibleMessages:"没有人类可见消息。",monitorRoleUser:"用户",monitorRoleAssistant:"助手",copySessionLink:"复制会话链接",copySessionId:"复制会话 ID",export:"导出",exportFull:"全量导出 (JSON)",exportCompressed:"压缩导出 (TXT)",exportCompressing:"正在压缩上下文,请稍候...",exportSuccess:"会话已导出",exportFailed:"导出失败",renamed:"已重命名",renameFailed:"重命名失败",renameSession:"重命名会话",sessionNotFound:"会话未找到",enterNewTitle:"输入新标题",workspace:"工作区",setWorkspace:"设置工作区",setWorkspaceTitle:"设置会话工作区",workspacePlaceholder:"输入项目路径,例如 /home/user/project",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 授权页",xaiCopyLink:"复制授权链接",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:"取消全选",currentDefault:"当前默认",defaultShort:"默认",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:"切换 Hermes Profile",switchConfirm:"将执行 `hermes profile use {name}` 并切换 Hermes CLI 的 active profile,是否继续?",switchSuccess:'Hermes active profile 已切换为 "{name}"',switchFailed:"切换 Hermes Profile 失败,网关可能需要手动重启",createSuccess:'配置 "{name}" 已创建',createFailed:"创建配置失败",renameSuccess:"配置已重命名",renameFailed:"重命名配置失败",deleteConfirm:'确定删除配置 "{name}" 吗?',deleteSuccess:"配置已删除",deleteFailed:"删除配置失败",exportSuccess:"配置已导出",exportFailed:"导出配置失败",importSuccess:"配置已导入",importFailed:"导入配置失败",importSelectFile:"选择归档文件",importInvalidFile:"请选择有效的归档文件 (.tar.gz, .tgz, .gz, .zip)",name:"配置名称",namePlaceholder:"仅限小写字母、数字、连字符",nameValidation:"配置名称只能包含小写字母、数字、下划线和连字符",newName:"新名称",newNamePlaceholder:"小写字母、数字、连字符",cloneFromCurrent:"从当前配置克隆",cloneCleanupNotice:"克隆时会自动跳过独占型平台凭据(Weixin / Telegram / Slack 等),避免与源配置冲突",cloneStrippedCredentials:"已清理 {count} 项独占凭据:{list}",cloneDisabledPlatforms:"已禁用 {count} 个平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 项内嵌凭据:{list}",archivePath:"归档路径",archivePathPlaceholder:"归档文件的服务器路径",importName:"配置名称(可选)",importNamePlaceholder:"留空则使用归档名称",active:"活跃",model:"模型",gateway:"网关",alias:"别名",provider:"Provider",path:"路径",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"暂无配置,创建一个开始吧。",avatar:{title:"自定义头像",customize:"头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},runtime:{activeProfile:"当前:{name}",bridgeWorker:"桥接状态",gateway:"网关",active:"活跃",activeTag:"当前",idle:"空闲",running:"运行中",stopped:"已停止",restartGateway:"重启网关",restartProfile:"重启配置",switchProfile:"切换前端配置",gatewayRestarted:"网关已重启:{name}",gatewayRestartFailed:"重启网关失败",profileRestarted:"配置已重启:{name}",profileRestartFailed:"重启配置失败"}},logs:{title:"日志",all:"全部",searchPlaceholder:"搜索...",refresh:"刷新",noEntries:"暂无日志"},settings:{title:"设置",saved:"已保存",saveFailed:"保存失败",tabs:{display:"显示",account:"当前账户",users:"账户管理",agent:"代理",memory:"记忆",compression:"上下文压缩",session:"会话",privacy:"隐私",apiServer:"API 服务器",models:"模型",voice:"语音"},models:{apiKey:"API Key",apiKeyPlaceholder:"输入 API Key",save:"保存",saved:"已保存",saveFailed:"保存失败",noProviders:"暂无已配置的模型"},display:{streaming:"流式响应",streamingHint:"实时显示 AI 回复",compact:"紧凑模式",compactHint:"减少消息间距",showReasoning:"显示推理过程",showReasoningHint:"展示模型思考过程",showCost:"显示费用",showCostHint:"在回复中显示 token 使用量",inlineDiffs:"内联差异",inlineDiffsHint:"代码变更以内联方式显示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回复完成时播放提示音",busyInputMode:"忙碌输入模式",busyInputModeHint:"AI 处理中仍可输入",theme:"主题",themeHint:"选择浅色、暗色或跟随系统",themeLight:"浅色",themeDark:"暗色",themeSystem:"跟随系统"},agent:{maxTurns:"最大轮次",maxTurnsHint:"单次对话最大交互轮数",gatewayTimeout:"网关超时",gatewayTimeoutHint:"单次请求超时时间(秒)",restartDrainTimeout:"重启排空超时",restartDrainTimeoutHint:"重启前排空请求的超时时间(秒)",toolEnforcement:"工具执行策略",toolEnforcementHint:"控制工具调用的执行模式",auto:"自动",always:"始终",never:"从不"},memory:{enabled:"启用记忆",enabledHint:"允许 AI 记住对话上下文",userProfile:"用户画像",userProfileHint:"允许 AI 记住用户偏好信息",charLimit:"记忆字符上限",charLimitHint:"MEMORY.md 最大字符数",userCharLimit:"用户画像字符上限",userCharLimitHint:"USER.md 最大字符数"},compression:{enabled:"启用压缩",enabledHint:"长对话接近模型上下文上限前自动压缩历史",threshold:"压缩阈值",thresholdHint:"预计 token 超过上下文比例时开始压缩",targetRatio:"目标比例",targetRatioHint:"压缩后历史保留到上下文的目标比例",protectLastN:"保护最近消息",protectLastNHint:"最近多少条消息不参与压缩",protectFirstN:"保护开头消息",protectFirstNHint:"最早多少条消息不参与压缩"},session:{mode:"重置模式",modeHint:"会话重置的触发条件",modeBoth:"空闲 + 定时",modeIdle:"仅空闲",modeDaily:"仅定时",modeNone:"永不(仅手动)",idleMinutes:"空闲超时",idleMinutesHint:"无操作后自动重置的等待时间(分钟)",atHour:"定时重置时间",humanOnly:"仅显示人类会话",humanOnlyHint:"默认隐藏子代理和会话监看噪音",liveMonitorHumanOnly:"实时监看:仅显示人类会话",liveMonitorHumanOnlyHint:"在实时监看中默认隐藏子代理和会话监看噪音",atHourHint:"每天在指定小时重置会话",requireAuth:"会话授权",requireAuthHint:"修改会话操作是否授权"},privacy:{redactPii:"脱敏 PII",redactPiiHint:"自动检测并隐藏敏感信息(密码、密钥等)"},apiServer:{enable:"启用",enableHint:"启用 API 服务器",host:"主机",hostHint:"监听地址",port:"端口",portHint:"监听端口",key:"密钥",keyHint:"API 访问密钥",cors:"CORS 来源",corsHint:"允许的跨域来源"},lockedIps:{title:"锁定 IP 管理",count:"{count} 个 IP 被锁定",empty:"暂无锁定 IP",unlock:"解锁",unlockAll:"全部解锁",unlockAllConfirm:"确认解锁所有锁定的 IP?",unlocked:"IP 已解锁",allUnlocked:"已解锁 {count} 个 IP"},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:"该智能体已在房间中",agentAddFailedCount:"{count} 个智能体未添加:{details}",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",copyRoomLink:"复制房间链接",deleteRoomConfirm:"确定删除这个房间吗?",clearContext:"清理上下文",clearContextConfirm:"确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房间",joinFailed:"加入房间失败",inputPlaceholder:"输入消息... (Enter 发送)",enterCode:"输入邀请码",yourName:"你的名称",yourNamePlaceholder:"输入你的群聊昵称",yourDescription:"自我描述(选填)",yourDescriptionPlaceholder:"介绍一下你自己...",agentName:"Agent 名称",agentNamePlaceholder:"自定义名称(留空则使用 profile 名称)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述这个 agent 的作用...",agentReplying:"正在回复...",agentCompressing:"正在压缩上下文...",compressionSettings:"压缩设置",triggerTokens:"触发压缩 Token 数",triggerTokensDesc:"消息 token 数超过此值时触发上下文压缩",maxHistoryTokens:"最大历史 Token 数",maxHistoryTokensDesc:"压缩后发送给 LLM 的最大 token 数",tailMessageCount:"保留最近消息数",tailMessageCountDesc:"压缩后保留最近的原始消息条数",compressionConfig:"压缩配置",compressionSaved:"压缩配置已保存",compressNow:"立即压缩",compressingInProgress:"正在压缩中,请稍后"},usage:{title:"用量统计",refresh:"刷新",totalTokens:"总 Token 数",inputTokens:"输入",outputTokens:"输出",totalSessions:"总会话数",avgPerDay:"日均 ~{n}",estimatedCost:"预估费用",cacheHitRate:"缓存命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"缓存",cacheRead:"缓存读取",cacheWrite:"缓存写入",sessions:"会话",cost:"费用",noData:"暂无用量数据"},skillsUsage:{title:"技能用量",subtitle:"跟踪 Hermes 会话中的技能加载和编辑",refresh:"刷新",periodSelector:"技能用量周期",periodLabel:"{days}天",summary:"概览",totalActions:"操作",loads:"加载",edits:"编辑",distinctSkills:"技能数",topSkills:"热门",dailyTrend:"趋势",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暂无技能用量数据",loadFailed:"技能用量加载失败",otherSkills:"其他技能"},files:{title:"文件",fileTree:"文件树",tree:"目录树",list:"文件列表",breadcrumbRoot:"根目录",newFile:"新建文件",newFolder:"新建文件夹",upload:"上传",refresh:"刷新",open:"打开",edit:"编辑",preview:"预览",download:"下载",copyPath:"复制路径",rename:"重命名",delete:"删除",name:"名称",size:"大小",modified:"修改时间",actions:"操作",emptyDir:"空目录",loading:"加载中...",confirmDelete:"确定要删除「{name}」吗?",confirmDeleteDir:"确定要删除目录「{name}」及其所有内容吗?",deleteFailed:"删除失败",deleted:"已删除",renameTo:"重命名为",newFileName:"文件名",newFolderName:"文件夹名",created:"已创建",createFailed:"创建失败",renamed:"已重命名",renameFailed:"重命名失败",uploadSuccess:"已上传 {count} 个文件",uploadFailed:"上传失败",saveFailed:"保存失败",saved:"已保存",unsavedChanges:"有未保存的更改,是否丢弃?",pathCopied:"路径已复制",fileTooLarge:"文件过大(最大 10MB)",permissionDenied:"无法修改受保护的文件",notFound:"文件或目录不存在",backendError:"文件操作失败",dragDropHint:"拖拽文件到此处上传",closeEditor:"关闭编辑器",closePreview:"关闭",saveFile:"保存"},download:{downloading:"正在下载...",downloadFailed:"下载失败",fileNotFound:"文件不存在或已被删除",fileTooLarge:"文件过大(超过限制)",backendError:"文件读取失败,远程环境可能不可用",backendTimeout:"文件读取超时",unsupportedBackend:"当前 terminal backend 暂不支持文件下载",invalidPath:"无效的文件路径",contentDisplay:"内容展示",download:"下载",downloadFile:"下载文件"},changelog:{new_0_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_30_1:"Bridge 聊天改为保留结构化历史,修复工具调用历史转文本后导致模型偶发不返回、工具不执行的问题",new_0_5_30_2:"群聊 @ 多 Agent 路由更可靠,发送给每个 Agent 时会移除自己的 @,并改善刷新后的用户昵称绑定",new_0_5_30_3:"模型页、聊天模型下拉和会话模型选择改为按当前 Profile 展示,默认模型标记更准确",new_0_5_30_4:"精简 Gateway 管理:移除独立网关页面,按各 Profile 的平台配置检查并拉起需要运行的 gateway,并改用轻量 gateway runner 管理启动和重启",new_0_5_30_5:"增强 Docker、Termux 和 Windows 的 Gateway 启动流程,处理运行锁、端口冲突、后台执行和重启场景",new_0_5_30_6:"优化 Windows 兼容性:路径识别、文件下载、任务/更新子进程不再弹出额外终端窗口",new_0_5_30_7:"修复配置写入和 Provider 预设:加强 .env 校验,FUN-Codex 改走 Responses API,并更新 Z.AI/GLM 模型列表",new_0_5_30_8:"前端体验细节优化:折叠侧边栏布局、分组短标题、侧边栏分隔线和对话大纲样式更稳定",new_0_5_30_9:"上下文压缩现在跟随 Profile 压缩配置,并在旧快照失效时复用旧摘要和安全尾部,避免重新压缩完整历史",new_0_5_31_1:"增强 Bridge Broker 重启稳定性,修复群聊最终流式渲染,并新增群聊 {'@'}all 路由",new_0_5_31_2:"文件管理支持复制绝对路径,并修复移动端会话抽屉层级遮挡问题",new_0_5_31_3:"Profile 选择器新增头像展示、自定义头像、运行状态弹窗,以及网关/Profile 重启操作",new_0_5_31_4:"Profile 头像会同步用于单聊、群聊和折叠侧边栏,头像元数据保存到 Web UI 目录并兼容 Windows 路径",new_0_5_31_5:"改进 Docker、Termux、Windows 的 gateway 检测和重启逻辑,优先使用 gateway_state/gateway.pid 判断 managed gateway 是否存活",new_0_5_31_6:"新增 APIKEY.FUN 生图媒体接口和内置 apikey-image-gen skill,支持文生图、图生图和图片编辑,并从 active Profile 的 fun-codex 配置读取凭据",new_0_5_33_1:"单聊和群聊的运行失败、Socket 错误会作为红色 Agent 消息保留在消息列表中,不再一闪而过",new_0_5_33_2:"会话搜索支持按当前选中的 Profile 限定范围,未选择 Profile 时仍可搜索全部 Profile",new_0_5_33_3:"Skills 页面新增中英文推荐清单,未选中 Skill 时展示推荐内容,并支持再次点击已选 Skill 取消选中",new_0_5_33_4:"清理未使用的 changelog 国际化内容,减少前端 i18n 体积",new_0_5_33_5:"修复 Windows 中文系统下 agent bridge 解析 netstat 输出编码失败导致启动异常的问题",new_0_5_33_6:"更新 Nous Portal 预设模型列表,对齐公开 catalog 和 Portal 推荐模型",new_0_5_33_7:"Profile 列表和运行状态改为从目录读取 Profile 名称、从 config 读取默认模型,避免 CLI 表格列宽导致 name/model/gateway 解析错位",new_0_5_34_1:"存储会话和群聊消息时会规范化多模态工具结果,避免 base64 图片污染回放内容",new_0_5_34_2:"自定义 Hermes 模型改为由后端配置持久化,并新增添加/移除模型接口",new_0_5_34_3:"修复 Bridge 运行结束后的最终上下文用量和工具状态更新",new_0_5_34_4:"优化看板过滤、负责人展示、卡片操作和任务详情处理",new_0_5_34_5:"修复压缩用量统计:缓存固定 prompt/tool 上下文,并展示完整上下文 token 总量",new_0_5_34_6:"群聊 Agent 缓存各自固定上下文,仅在真正开始压缩时显示压缩进度",new_0_5_34_7:"Web UI 内置 Skills 会同步注入到所有 Profile,并在日志中标明目标 Profile",new_0_5_34_8:"如果 Windows 下看板功能异常,请升级 Hermes 以获取最新的看板数据库迁移修复",new_0_5_35_1:"Bridge 会话支持不同 session 并发运行,同一 session 仍保持串行,避免消息顺序错乱",new_0_5_35_2:"新增“性能监控”页面,可查看系统 CPU/内存、Web UI、Bridge Broker、Workers 和活跃会话状态",new_0_5_35_3:"新增 Worker 级资源统计,展示每个 worker 的 CPU、内存、Profile、会话数和运行状态",new_0_5_35_4:"优化 Bridge worker 生命周期清理,Broker 关闭或父进程退出时会回收 worker,减少残留 Python 进程",new_0_5_35_5:"监控接口增强跨平台兼容,支持 macOS、Windows、Linux、Docker 和 Termux 的资源采集降级",new_0_5_35_6:"性能监控不再因为 Agent 初始化中的 worker 请求而阻塞,降低 Windows 上 request timed out 的概率",new_0_5_35_7:"聊天 Markdown 新增文本内容内联预览,下载图标会直接下载文件,避免被预览弹窗拦截",new_0_5_35_8:"优化内容展示抽屉:移动端全宽并提供关闭入口,桌面端加宽到 800px,文本与 Markdown 背景保持一致",new_0_6_0_1:"分账户、分 Profile 管理现在统一覆盖会话、模型、用量、看板、任务、上传、媒体以及相关 Hermes API",new_0_6_0_2:"内置媒体 Skills 仅在媒体接口使用生成的服务端 token,并按请求的 Profile 读取 fun-codex/xAI 凭据",new_0_6_0_3:"单聊和群聊都会向运行提示词注入当前 Hermes Profile,方便 Skills 请求时带上 X-Hermes-Profile",new_0_6_0_4:"delegate_task 的 subagent 进度会实时展示到聊天界面,包含开始、工具调用、进度和完成状态",new_0_6_0_5:"停止或中断运行时会清理临时事件,避免旧的 abort 状态带入下一次聊天",new_0_6_0_6:"同步更新文档和官网文案,覆盖账户管理、默认凭据、分账户分 Profile 管理、上传下载和内置媒体 Skills",new_0_6_0_7:"新增 CLI 维护命令,用于清理登录 IP 锁和重置默认 admin / 123456 登录账户",new_0_6_0_8:"0.6.0 是 Web UI 从单用户走向多用户的分界版本;如果多用户模式遇到问题,请提交 issue,必要时可回退到 0.5.35 单用户版本"}},Pt={login:{title:"Hermes Web UI",description:"輸入使用者名稱和密碼以繼續。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",defaultCredentialsHint:"預設登入名:admin,預設密碼:123456",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",sessionExpired:"登入已過期,請重新登入",accessDenied:"你沒有權限存取此資源",passwordMismatch:"兩次密碼不一致",passwordTooShort:"密碼長度至少 6 個字元",setupSuccess:"密碼登入設定成功",passwordChanged:"密碼修改成功",passwordRemoved:"密碼登入已移除",setupPassword:"設定密碼登入",changePassword:"修改密碼",changeUsername:"修改使用者名稱",removePasswordLogin:"移除",username:"使用者名稱",currentPassword:"目前密碼",newPassword:"新密碼",confirmPassword:"確認密碼",newUsername:"新使用者名稱",usernameChanged:"使用者名稱修改成功",usernameTooShort:"使用者名稱至少 2 個字元",setupDescription:"管理用於登入的使用者名稱和密碼。",removeConfirm:"使用者帳號必須保留密碼登入。",passwordLoginNotConfigured:"密碼登入未設定",passwordLoginConfigured:"目前帳號:{username}",defaultCredentialTitle:"請修改預設帳號和密碼",defaultCredentialMessage:"目前登入帳號仍在使用預設使用者名稱或預設密碼。為避免未授權存取,請盡快進入目前帳號修改使用者名稱和密碼。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍後提醒"},users:{title:"帳號管理",description:"建立使用者、分配角色,並控制一般管理員可存取的設定檔。",create:"建立使用者",edit:"編輯使用者",username:"使用者名稱",role:"角色",statusLabel:"狀態",profiles:"可存取設定檔",profilesPlaceholder:"選擇可存取的設定檔",allProfiles:"全部設定檔",noProfiles:"未關聯設定檔",lastLogin:"最後登入",newPasswordOptional:"新密碼(留空不修改)",loadFailed:"使用者列表載入失敗",deleteConfirm:"確認刪除此使用者?",enable:"啟用",disable:"停用",roles:{superAdmin:"超級管理員",admin:"一般管理員"},status:{active:"啟用",disabled:"停用"}},common:{loading:"載入中...",cancel:"取消",delete:"刪除",retry:"重試",edit:"編輯",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",deleteFailed:"刪除失敗",ok:"確定",copied:"已複製",copy:"複製",update:"更新",create:"建立",noData:"目前無資料",expired:"已過期",fetch:"取得",add:"新增",enable:"啟用",disable:"停用",configured:"已設定",notConfigured:"未設定",confirm:"確定",expand:"展開",collapse:"收起",start:"啟動",stop:"停止"},sidebar:{chat:"對話",search:"搜尋",apiRelay:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",performance:"效能監控",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",groupConversation:"對話",groupConversationShort:"對話",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系統",groupSystemShort:"系統",groupMonitoring:"監控",groupMonitoringShort:"監控",groupTools:"工具",settings:"設定",connected:"已連線",disconnected:"未連線",collapse:"收起選單",expand:"展開選單",updateTip:'在終端機執行 "hermes-web-ui update" 即可更新',updateVersion:"升級版本 v{version}",reloadClientVersion:"重新整理到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,請稍後重新整理頁面,如長時間未啟動,請手動啟動",updateFailed:"更新失敗",logout:"登出",nodeVersionWarning:"偵測到 Node.js v{version},請升級至 23 以上版本。",changelog:"更新日誌",noChangelog:"目前無更新日誌"},performance:{title:"效能監控",subtitle:"查看系統資源、Bridge Broker、Workers 和活躍會話",refresh:"重新整理",autoRefreshOn:"自動重新整理",autoRefreshOff:"手動重新整理",loadFailed:"效能資料載入失敗",systemCpu:"系統 CPU",systemMemory:"系統記憶體",activeSessions:"活躍會話",runningSessions:"執行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 總記憶體",processes:"程序",uptime:"執行",running:"執行中",stopped:"已停止",workerMemory:"Worker 記憶體",lastUpdated:"更新時間",profile:"Profile",memory:"記憶體",sessions:"會話",runningActiveSessions:"執行中 / 活躍",lastUsed:"最後使用",status:"狀態",noWorkers:"暫無 Worker",sessionsByProfile:"按 Profile 統計會話",noActiveSessions:"暫無活躍會話"},drawer:{terminal:"終端機",files:"工作區"},chat:{contextRemaining:"剩餘",contextClickToEdit:"點擊編輯上下文長度",contextEditTitle:"編輯上下文長度",contextEditDesc:"設定目前模型的上下文長度限制(token 數量)",contextEditPlaceholder:"請輸入上下文長度",contextEditHint:"常見值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"儲存",contextEditCancel:"取消",contextEditInvalid:"請輸入有效的上下文長度",contextEditSuccess:"上下文長度已更新",contextEditFailed:"更新失敗",emptyState:"開始與 Hermes Agent 對話",outlineTitle:"會話大綱",outlineEmpty:"暫無會話內容",outlineUserQuestion:"使用者問題",inputPlaceholder:"輸入訊息... (Enter 發送,Shift+Enter 換行)",slashCommandArgs:{message:"<訊息>",title:"<標題>",text:"<文字>"},slashCommands:{usage:"計算目前會話用量",status:"查看會話狀態和佇列",abort:"停止目前 Bridge 執行",queue:"將訊息加入目前執行後的佇列",clear:"清空目前顯示內容",clearHistory:"刪除目前會話已儲存的訊息歷史",title:"重新命名目前會話",compress:"空閒時觸發上下文壓縮",steer:"向目前 Bridge 執行傳送引導文字",destroy:"釋放目前會話的 Bridge Agent"},attachFiles:"新增附件",autoPlaySpeech:"自動播放語音",showToolCalls:"顯示工具呼叫",hideToolCalls:"隱藏工具呼叫",messageQueue:"訊息佇列",removeQueuedMessage:"移除佇列訊息",stop:"停止",start:"啟動",stopGateway:"停止閘道",send:"發送",contextUsed:"上下文已用:",sessions:"工作階段",webUiSessions:"工作階段",allProfiles:"全部設定",profileMissingModelsTip:"此工作階段所屬設定「{profile}」沒有可用的 provider 或模型",sessionScopeHint:"這裡只顯示目前工作階段;CLI、Telegram、Discord、Cron 等頻道工作階段在歷史中以唯讀方式查看。",openHistory:"開啟歷史",hermesHistory:"Hermes 歷史",historyScopeHint:"這裡按來源以唯讀方式查看目前 profile 的 Hermes 歷史工作階段。",noSessions:"目前無工作階段",searchTitle:"搜尋工作階段",searchSubtitle:"依標題或訊息內容搜尋",searchScope:"搜尋範圍:僅 Web UI 本地工作階段資料庫;不包含唯讀 Hermes 歷史工作階段。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜尋工作階段...",searchEmpty:"最近工作階段",searchRecent:"最近工作階段",searchNoResults:"沒有符合的工作階段",searchNoSnippet:"沒有可顯示的摘要",searchEnterHint:"Enter 開啟 · Esc 關閉",searchFailed:"搜尋工作階段失敗",newChat:"新增對話",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:"助手",copySessionLink:"複製工作階段連結",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:"此瀏覽器不支援語音播放",modelSetFailed:"設定模型失敗",modelSet:"模型已設定",setModelTitle:"設定工作階段模型",setModel:"設定模型",newCliChat:"新增 CLI",cliEmptyState:"開始 CLI 對話"},kanban:{title:"看板",createTask:"新增任務",noTasks:"目前無任務",allStatuses:"所有狀態",allAssignees:"所有負責人",board:{create:"新增看板",archive:"封存看板",slugPlaceholder:"看板識別碼,例如 project-a",namePlaceholder:"顯示名稱(選填)",slugRequired:"看板識別碼不能為空",created:"看板已建立",archived:"看板已封存",archiveConfirm:"確定封存目前看板?"},columns:{triage:"待分類",todo:"待辦",ready:"就緒",running:"進行中",blocked:"阻塞",done:"已完成",archived:"已封存"},form:{title:"標題",titlePlaceholder:"任務標題",titleRequired:"標題不能為空",body:"描述",bodyPlaceholder:"任務描述(選填)",assignee:"負責人",selectAssignee:"選擇負責人...",priority:"優先級",selectPriority:"選擇優先級..."},card:{assigneeTooltip:"負責人",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"剛剛",minutes:"{count} 分鐘前",hours:"{count} 小時前",days:"{count} 天前"}},detail:{status:"狀態",assignee:"負責人",priority:"優先級",tenant:"租戶",createdAt:"建立時間",startedAt:"開始時間",completedAt:"完成時間",comments:"評論",events:"事件",runs:"執行記錄",result:"完成結果",sessions:"關聯工作階段",sessionMessages:"工作階段記錄",noSessions:"找不到關聯工作階段。",artifacts:"產出檔案",sources:"資料來源",highlights:"關鍵資訊"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(選填)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"指派",assignTo:"指派給..."},message:{taskCreated:"任務已建立",taskCompleted:"任務已完成",taskBlocked:"任務已阻塞",taskUnblocked:"任務已解除阻塞",taskAssigned:"任務已指派",loadFailed:"載入任務失敗"},stats:{total:"總計",tasks:"任務數"}},jobs:{title:"排程任務",createJob:"建立任務",editJob:"編輯任務",noJobs:"目前無排程任務,建立一個開始吧。",name:"名稱",namePlaceholder:"任務名稱",schedule:"排程運算式 (Cron)",schedulePlaceholder:"例如 0 9 * * *",quickPresets:"快速預設",selectPreset:"選擇預設...",presetEveryMinute:"每分鐘",presetEvery5Min:"每 5 分鐘",presetEveryHour:"每小時",presetEveryDay:"每天 00:00",presetEveryDay9:"每天 09:00",presetEveryMonday:"每週一 09:00",presetEveryMonth:"每月 1 日 09:00",prompt:"提示詞",promptPlaceholder:"要執行的內容",deliverTarget:"投遞目標",origin:"來源",local:"本地",repeatCount:"重複次數(選填)",modelPlaceholder:"預設模型",repeatPlaceholder:"留空表示無限重複",jobCreated:"任務已建立",jobUpdated:"任務已更新",nameRequired:"名稱為必填項",scheduleRequired:"排程運算式為必填項",loadFailed:"載入任務失敗",jobPaused:"任務已暫停",jobResumed:"任務已恢復",jobTriggered:"任務已觸發",modelUpdated:"模型已更新",jobDeleted:"任務已刪除",status:{running:"執行中",paused:"已暫停",disabled:"已停用",scheduled:"已排程"},info:{model:"模型",schedule:"排程",lastRun:"上次執行",nextRun:"下次執行",deliver:"投遞",repeat:"重複"},action:{pause:"暫停",pauseJob:"暫停任務",resume:"恢復",resumeJob:"恢復任務",runNow:"立即執行",triggerImmediately:"立即觸發"},runHistory:{title:"執行歷史",runs:"次執行",noRuns:"目前無執行歷史。"}},skills:{title:"技能",searchPlaceholder:"搜尋技能...",noMatch:"沒有符合的技能",noSkills:"目前無技能",backTo:"返回",attachedFiles:"附件檔案",loadFailed:"載入技能失敗",fileLoadFailed:"載入檔案失敗",modified:"使用者已修改",archived:"已封存",pinned:"已釘選",pin:"釘選技能",unpin:"取消釘選",pinFailed:"變更釘選狀態失敗",toggleFailed:"切換技能狀態失敗",source:{builtin:"內建",hub:"Hub 安裝",local:"本地安裝"}},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:"取消全選",currentDefault:"目前預設",defaultShort:"預設",aliasEdit:"重新命名",aliasTitle:"模型顯示名",aliasTitleFor:"{model} 的顯示名",aliasPlaceholder:"留空則使用原始模型 ID",aliasHint:"僅修改 Web UI 顯示名,傳送給 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢復原始 ID",aliasManage:"顯示名",aliasManageFor:"{provider} 的顯示名",aliasSaveFailed:"儲存顯示名失敗",visibilitySelectOne:"至少保留一個可見模型",xaiWaiting:"請在開啟的 xAI 頁面完成授權。授權完成後視窗會自動關閉。",xaiOpenLink:"開啟 xAI 授權頁",xaiLoginTitle:"xAI Grok OAuth 登入",xaiExpired:"授權連結已過期,請重試。",xaiCopyLink:"複製授權連結",xaiApproved:"登入成功!"},profiles:{title:"設定檔",create:"建立設定檔",import:"匯入",export:"匯出",rename:"重新命名",delete:"刪除",switchTo:"切換 Hermes Profile",switchConfirm:"將執行 `hermes profile use {name}` 並切換 Hermes CLI 的 active profile,是否繼續?",switchSuccess:"Hermes active profile 已切換為「{name}」",switchFailed:"切換 Hermes Profile 失敗,閘道可能需要手動重新啟動",createSuccess:"設定檔「{name}」已建立",createFailed:"建立設定檔失敗",renameSuccess:"設定檔已重新命名",renameFailed:"重新命名設定檔失敗",deleteConfirm:"確定刪除設定檔「{name}」嗎?",deleteSuccess:"設定檔已刪除",deleteFailed:"刪除設定檔失敗",exportSuccess:"設定檔已匯出",exportFailed:"匯出設定檔失敗",importSuccess:"設定檔已匯入",importFailed:"匯入設定檔失敗",importSelectFile:"選擇封存檔案",importInvalidFile:"請選擇有效的封存檔案 (.tar.gz, .tgz, .gz, .zip)",name:"設定檔名稱",namePlaceholder:"僅限小寫字母、數字、連字號",nameValidation:"設定檔名稱只能包含小寫字母、數字、底線和連字號",newName:"新名稱",newNamePlaceholder:"小寫字母、數字、連字號",cloneFromCurrent:"從目前設定檔複製",cloneCleanupNotice:"複製時會自動略過獨占型平台憑證(Weixin / Telegram / Slack 等),避免與來源設定檔衝突",cloneStrippedCredentials:"已清理 {count} 項獨占憑證:{list}",cloneDisabledPlatforms:"已停用 {count} 個平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 項嵌入憑證:{list}",archivePath:"封存路徑",archivePathPlaceholder:"封存檔案的伺服器路徑",importName:"設定檔名稱(選填)",importNamePlaceholder:"留空則使用封存名稱",active:"使用中",model:"模型",gateway:"閘道",alias:"別名",provider:"Provider",path:"路徑",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"目前無設定檔,建立一個開始吧。",avatar:{title:"自訂頭像",customize:"頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},runtime:{activeProfile:"目前:{name}",bridgeWorker:"橋接狀態",gateway:"閘道",active:"使用中",activeTag:"目前",idle:"閒置",running:"執行中",stopped:"已停止",restartGateway:"重啟閘道",restartProfile:"重啟設定檔",switchProfile:"切換前端設定檔",gatewayRestarted:"閘道已重啟:{name}",gatewayRestartFailed:"重啟閘道失敗",profileRestarted:"設定檔已重啟:{name}",profileRestartFailed:"重啟設定檔失敗"}},logs:{title:"日誌",all:"全部",searchPlaceholder:"搜尋...",refresh:"重新整理",noEntries:"目前無日誌"},settings:{title:"設定",saved:"已儲存",saveFailed:"儲存失敗",tabs:{display:"顯示",account:"目前帳號",users:"帳號管理",agent:"代理",memory:"記憶",compression:"上下文壓縮",session:"工作階段",privacy:"隱私",apiServer:"API 伺服器",models:"模型",voice:"語音"},models:{apiKey:"API Key",apiKeyPlaceholder:"輸入 API Key",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",noProviders:"目前無已設定的模型"},display:{streaming:"串流回應",streamingHint:"即時顯示 AI 回覆",compact:"緊湊模式",compactHint:"減少訊息間距",showReasoning:"顯示推理過程",showReasoningHint:"展示模型思考過程",showCost:"顯示費用",showCostHint:"在回覆中顯示 token 使用量",inlineDiffs:"內嵌差異",inlineDiffsHint:"程式碼變更以內嵌方式顯示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回覆完成時播放提示音",busyInputMode:"忙碌輸入模式",busyInputModeHint:"AI 處理中仍可輸入",theme:"主題",themeHint:"選擇淺色、暗色或跟隨系統",themeLight:"淺色",themeDark:"暗色",themeSystem:"跟隨系統"},agent:{maxTurns:"最大輪次",maxTurnsHint:"單次對話最大互動輪數",gatewayTimeout:"閘道逾時",gatewayTimeoutHint:"單次請求逾時時間(秒)",restartDrainTimeout:"重啟排空逾時",restartDrainTimeoutHint:"重啟前排空請求的逾時時間(秒)",toolEnforcement:"工具執行策略",toolEnforcementHint:"控制工具呼叫的執行模式",auto:"自動",always:"始終",never:"從不"},memory:{enabled:"啟用記憶",enabledHint:"允許 AI 記住對話上下文",userProfile:"使用者畫像",userProfileHint:"允許 AI 記住使用者偏好資訊",charLimit:"記憶字元上限",charLimitHint:"MEMORY.md 最大字元數",userCharLimit:"使用者畫像字元上限",userCharLimitHint:"USER.md 最大字元數"},compression:{enabled:"啟用壓縮",enabledHint:"長對話接近模型上下文上限前自動壓縮歷史",threshold:"壓縮閾值",thresholdHint:"預估 token 超過上下文比例時開始壓縮",targetRatio:"目標比例",targetRatioHint:"壓縮後歷史保留到上下文的目標比例",protectLastN:"保護最近訊息",protectLastNHint:"最近多少則訊息不參與壓縮",protectFirstN:"保護開頭訊息",protectFirstNHint:"最早多少則訊息不參與壓縮"},session:{mode:"重設模式",modeHint:"工作階段重設的觸發條件",modeBoth:"閒置 + 定時",modeIdle:"僅閒置",modeDaily:"僅定時",modeNone:"永不(僅手動)",idleMinutes:"閒置逾時",idleMinutesHint:"無操作後自動重設的等待時間(分鐘)",atHour:"定時重設時間",humanOnly:"僅顯示人類工作階段",humanOnlyHint:"預設隱藏子代理和工作階段監看雜訊",liveMonitorHumanOnly:"即時監看:僅顯示人類工作階段",liveMonitorHumanOnlyHint:"在即時監看中預設隱藏子代理和工作階段監看雜訊",atHourHint:"每天在指定小時重設工作階段",requireAuth:"工作階段授權",requireAuthHint:"修改工作階段操作是否授權"},privacy:{redactPii:"遮蔽 PII",redactPiiHint:"自動偵測並隱藏敏感資訊(密碼、金鑰等)"},apiServer:{enable:"啟用",enableHint:"啟用 API 伺服器",host:"主機",hostHint:"監聽位址",port:"連接埠",portHint:"監聽連接埠",key:"金鑰",keyHint:"API 存取金鑰",cors:"CORS 來源",corsHint:"允許的跨域來源"},lockedIps:{title:"鎖定 IP 管理",count:"{count} 個 IP 被鎖定",empty:"目前無鎖定 IP",unlock:"解鎖",unlockAll:"全部解鎖",unlockAllConfirm:"確認解鎖所有鎖定的 IP?",unlocked:"IP 已解鎖",allUnlocked:"已解鎖 {count} 個 IP"},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:"該智慧代理已在房間中",agentAddFailedCount:"{count} 個智慧代理未新增:{details}",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",copyRoomLink:"複製房間連結",deleteRoomConfirm:"確定刪除這個房間嗎?",clearContext:"清理上下文",clearContextConfirm:"確定清理目前房間上下文嗎?訊息和壓縮快照會被刪除,智慧代理和成員會保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房間",joinFailed:"加入房間失敗",inputPlaceholder:"輸入訊息... (Enter 發送)",enterCode:"輸入邀請碼",yourName:"你的名稱",yourNamePlaceholder:"輸入你的群聊暱稱",yourDescription:"自我介紹(選填)",yourDescriptionPlaceholder:"介紹一下你自己...",agentName:"Agent 名稱",agentNamePlaceholder:"自訂名稱(留空則使用 profile 名稱)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述這個 agent 的作用...",agentReplying:"正在回覆...",agentCompressing:"正在壓縮上下文...",compressionSettings:"壓縮設定",triggerTokens:"觸發壓縮 Token 數",triggerTokensDesc:"訊息 token 數超過此值時觸發上下文壓縮",maxHistoryTokens:"最大歷史 Token 數",maxHistoryTokensDesc:"壓縮後傳送給 LLM 的最大 token 數",tailMessageCount:"保留最近訊息數",tailMessageCountDesc:"壓縮後保留最近的原始訊息條數",compressionConfig:"壓縮設定",compressionSaved:"壓縮設定已儲存",compressNow:"立即壓縮",compressingInProgress:"正在壓縮中,請稍後"},usage:{title:"用量統計",refresh:"重新整理",totalTokens:"總 Token 數",inputTokens:"輸入",outputTokens:"輸出",totalSessions:"總工作階段數",avgPerDay:"日均 ~{n}",estimatedCost:"預估費用",cacheHitRate:"快取命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"快取",cacheRead:"快取讀取",cacheWrite:"快取寫入",sessions:"工作階段",cost:"費用",noData:"目前無用量資料"},skillsUsage:{title:"技能用量",subtitle:"追蹤 Hermes 工作階段中的技能載入與編輯",refresh:"重新整理",periodSelector:"技能用量期間",periodLabel:"{days}天",summary:"總覽",totalActions:"操作",loads:"載入",edits:"編輯",distinctSkills:"技能數",topSkills:"熱門",dailyTrend:"趨勢",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暫無技能用量資料",loadFailed:"技能用量載入失敗",otherSkills:"其他技能"},files:{title:"檔案",fileTree:"檔案樹",tree:"目錄樹",list:"檔案清單",breadcrumbRoot:"根目錄",newFile:"新增檔案",newFolder:"新增資料夾",upload:"上傳",refresh:"重新整理",open:"開啟",edit:"編輯",preview:"預覽",download:"下載",copyPath:"複製路徑",rename:"重新命名",delete:"刪除",name:"名稱",size:"大小",modified:"修改時間",actions:"操作",emptyDir:"空目錄",loading:"載入中...",confirmDelete:"確定要刪除「{name}」嗎?",confirmDeleteDir:"確定要刪除目錄「{name}」及其所有內容嗎?",deleteFailed:"刪除失敗",deleted:"已刪除",renameTo:"重新命名為",newFileName:"檔案名稱",newFolderName:"資料夾名稱",created:"已建立",createFailed:"建立失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",uploadSuccess:"已上傳 {count} 個檔案",uploadFailed:"上傳失敗",saveFailed:"儲存失敗",saved:"已儲存",unsavedChanges:"有未儲存的變更,是否捨棄?",pathCopied:"路徑已複製",fileTooLarge:"檔案過大(最大 10MB)",permissionDenied:"無法修改受保護的檔案",notFound:"檔案或目錄不存在",backendError:"檔案操作失敗",dragDropHint:"拖曳檔案至此處上傳",closeEditor:"關閉編輯器",closePreview:"關閉",saveFile:"儲存"},download:{downloading:"正在下載...",downloadFailed:"下載失敗",fileNotFound:"檔案不存在或已被刪除",fileTooLarge:"檔案過大(超過限制)",backendError:"檔案讀取失敗,遠端環境可能不可用",backendTimeout:"檔案讀取逾時",unsupportedBackend:"目前 terminal backend 暫不支援檔案下載",invalidPath:"無效的檔案路徑",contentDisplay:"內容展示",download:"下載",downloadFile:"下載檔案"},changelog:{new_0_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_30_1:"Bridge 聊天改為保留結構化歷史,修復工具調用歷史轉文本後導致模型偶發不返回、工具不執行的問題",new_0_5_30_2:"群聊 @ 多 Agent 路由更可靠,發送給每個 Agent 時會移除自己的 @,並改善刷新後的使用者暱稱綁定",new_0_5_30_3:"模型頁、聊天模型下拉和工作階段模型選擇改為按目前 Profile 展示,預設模型標記更準確",new_0_5_30_4:"精簡 Gateway 管理:移除獨立網關頁面,按各 Profile 的平台配置檢查並拉起需要運行的 gateway,並改用輕量 gateway runner 管理啟動和重啟",new_0_5_30_5:"增強 Docker、Termux 和 Windows 的 Gateway 啟動流程,處理運行鎖、端口衝突、後台執行和重啟場景",new_0_5_30_6:"優化 Windows 相容性:路徑識別、檔案下載、任務/更新子程序不再彈出額外終端視窗",new_0_5_30_7:"修復配置寫入和 Provider 預設:加強 .env 校驗,FUN-Codex 改走 Responses API,並更新 Z.AI/GLM 模型列表",new_0_5_30_8:"前端體驗細節優化:折疊側邊欄布局、分組短標題、側邊欄分隔線和對話大綱樣式更穩定",new_0_5_30_9:"上下文壓縮現在跟隨 Profile 壓縮配置,並在舊快照失效時複用舊摘要和安全尾部,避免重新壓縮完整歷史",new_0_5_31_1:"增強 Bridge Broker 重啟穩定性,修復群聊最終串流渲染,並新增群聊 {'@'}all 路由",new_0_5_31_2:"檔案管理支援複製絕對路徑,並修復行動端工作階段抽屜層級遮擋問題",new_0_5_31_3:"Profile 選擇器新增頭像展示、自訂頭像、執行狀態彈窗,以及網關/Profile 重啟操作",new_0_5_31_4:"Profile 頭像會同步用於單聊、群聊和折疊側邊欄,頭像中繼資料保存到 Web UI 目錄並相容 Windows 路徑",new_0_5_31_5:"改進 Docker、Termux、Windows 的 gateway 偵測和重啟邏輯,優先使用 gateway_state/gateway.pid 判斷 managed gateway 是否存活",new_0_5_31_6:"新增 APIKEY.FUN 生圖媒體接口和內建 apikey-image-gen skill,支援文生圖、圖生圖和圖片編輯,並從 active Profile 的 fun-codex 配置讀取憑據",new_0_5_33_1:"單聊和群聊的執行失敗、Socket 錯誤會作為紅色 Agent 訊息保留在訊息列表中,不再一閃而過",new_0_5_33_2:"會話搜尋支援按目前選中的 Profile 限定範圍,未選擇 Profile 時仍可搜尋全部 Profile",new_0_5_33_3:"Skills 頁面新增中英文推薦清單,未選中 Skill 時展示推薦內容,並支援再次點擊已選 Skill 取消選中",new_0_5_33_4:"清理未使用的 changelog 國際化內容,減少前端 i18n 體積",new_0_5_33_5:"修復 Windows 中文系統下 agent bridge 解析 netstat 輸出編碼失敗導致啟動異常的問題",new_0_5_33_6:"更新 Nous Portal 預設模型列表,對齊公開 catalog 和 Portal 推薦模型",new_0_5_33_7:"Profile 列表和執行狀態改為從目錄讀取 Profile 名稱、從 config 讀取預設模型,避免 CLI 表格欄寬導致 name/model/gateway 解析錯位",new_0_5_34_1:"儲存工作階段和群聊訊息時會規範化多模態工具結果,避免 base64 圖片污染回放內容",new_0_5_34_2:"自訂 Hermes 模型改由後端設定持久化,並新增新增/移除模型介面",new_0_5_34_3:"修復 Bridge 執行結束後的最終上下文用量和工具狀態更新",new_0_5_34_4:"最佳化看板篩選、負責人展示、卡片操作和任務詳情處理",new_0_5_34_5:"修復壓縮用量統計:快取固定 prompt/tool 上下文,並顯示完整上下文 token 總量",new_0_5_34_6:"群聊 Agent 快取各自固定上下文,僅在真正開始壓縮時顯示壓縮進度",new_0_5_34_7:"Web UI 內建 Skills 會同步注入到所有 Profile,並在日誌中標明目標 Profile",new_0_5_34_8:"如果 Windows 下看板功能異常,請升級 Hermes 以取得最新的看板資料庫遷移修復",new_0_5_35_1:"Bridge 工作階段支援不同 session 並發執行,同一 session 仍保持串行以避免訊息順序錯亂",new_0_5_35_2:"新增「效能監控」頁面,可查看系統 CPU/記憶體、Web UI、Bridge Broker、Workers 和活躍工作階段狀態",new_0_5_35_3:"新增 Worker 級資源統計,展示每個 worker 的 CPU、記憶體、Profile、工作階段數和執行狀態",new_0_5_35_4:"最佳化 Bridge worker 生命週期清理,Broker 關閉或父行程退出時會回收 worker,減少殘留 Python 行程",new_0_5_35_5:"監控介面增強跨平台相容,支援 macOS、Windows、Linux、Docker 和 Termux 的資源採集降級",new_0_5_35_6:"效能監控不再因 Agent 初始化中的 worker 請求而阻塞,降低 Windows 上 request timed out 的機率",new_0_5_35_7:"聊天 Markdown 新增文字內容內嵌預覽,下載圖示會直接下載檔案,避免被預覽抽屜攔截",new_0_5_35_8:"最佳化內容展示抽屜:行動端全寬並提供關閉入口,桌面端加寬到 800px,文字與 Markdown 背景保持一致",new_0_6_0_1:"分帳戶、分 Profile 管理現在一致保護工作階段、模型、用量、看板、任務、上傳、媒體與相關 Hermes API",new_0_6_0_2:"內建媒體 Skills 只會在媒體端點使用產生的伺服器 token,並依請求的 Profile 讀取 fun-codex/xAI 憑證",new_0_6_0_3:"單聊與群聊都會把目前 Hermes Profile 注入執行提示,方便 Skills 請求時帶上 X-Hermes-Profile",new_0_6_0_4:"delegate_task 的 subagent 進度會即時顯示在聊天介面,包含開始、工具、進度與完成狀態",new_0_6_0_5:"停止或中止執行時會清理暫時事件,避免舊的 abort 狀態帶入下一次聊天",new_0_6_0_6:"同步更新文件與官網文案,涵蓋帳戶管理、預設憑證、分帳戶分 Profile 管理、上傳下載與內建媒體 Skills",new_0_6_0_7:"新增 CLI 維護命令,用於清理登入 IP 鎖與重設預設 admin / 123456 登入帳戶",new_0_6_0_8:"0.6.0 是 Web UI 從單使用者走向多使用者的分界版本;如果多使用者模式遇到問題,請提交 issue,必要時可回退到 0.5.35 單使用者版本"}},Ct={login:{title:"Hermes Web UI",description:"ユーザー名とパスワードを入力して続行してください。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",defaultCredentialsHint:"既定のユーザー名:admin、既定のパスワード:123456",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",sessionExpired:"ログインの有効期限が切れました。再度ログインしてください。",accessDenied:"このリソースにアクセスする権限がありません。",passwordMismatch:"パスワードが一致しません",passwordTooShort:"パスワードは6文字以上必要です",setupSuccess:"パスワードログインが設定されました",passwordChanged:"パスワードが変更されました",passwordRemoved:"パスワードログインが削除されました",setupPassword:"パスワードログインを設定",changePassword:"パスワードを変更",changeUsername:"ユーザー名を変更",removePasswordLogin:"削除",username:"ユーザー名",currentPassword:"現在のパスワード",newPassword:"新しいパスワード",confirmPassword:"パスワード確認",newUsername:"新しいユーザー名",usernameChanged:"ユーザー名が変更されました",usernameTooShort:"ユーザー名は2文字以上必要です",setupDescription:"ログインに使用するユーザー名とパスワードを管理します。",removeConfirm:"ユーザーアカウントにはパスワードログインが必要です。",passwordLoginNotConfigured:"パスワードログイン未設定",passwordLoginConfigured:"現在のアカウント:{username}",defaultCredentialTitle:"既定のアカウント情報を変更してください",defaultCredentialMessage:"現在のログインアカウントは、既定のユーザー名または既定のパスワードをまだ使用しています。不正アクセスを防ぐため、できるだけ早く現在のアカウントでユーザー名とパスワードを変更してください。",defaultCredentialAction:"変更する",defaultCredentialLater:"後で通知"},users:{title:"アカウント管理",description:"ユーザーを作成し、ロールを割り当て、通常管理者がアクセスできるプロファイルを制御します。",create:"ユーザー作成",edit:"ユーザー編集",username:"ユーザー名",role:"ロール",statusLabel:"ステータス",profiles:"アクセス可能なプロファイル",profilesPlaceholder:"アクセス可能なプロファイルを選択",allProfiles:"すべてのプロファイル",noProfiles:"プロファイル未割り当て",lastLogin:"最終ログイン",newPasswordOptional:"新しいパスワード(空欄なら変更なし)",loadFailed:"ユーザー一覧の読み込みに失敗しました",deleteConfirm:"このユーザーを削除しますか?",enable:"有効化",disable:"無効化",roles:{superAdmin:"スーパー管理者",admin:"管理者"},status:{active:"有効",disabled:"無効"}},common:{loading:"読み込み中...",cancel:"キャンセル",retry:"再試行",delete:"削除",edit:"編集",save:"保存",saved:"保存しました",update:"更新",create:"作成",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",ok:"OK",copied:"コピーしました",copy:"コピー",noData:"データがありません",fetch:"取得",add:"追加",enable:"有効化",disable:"無効化",configured:"設定済み",notConfigured:"未設定",confirm:"確認",expand:"展開",collapse:"折りたたむ",stop:"停止",start:"開始",expired:"期限切れ"},sidebar:{chat:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",performance:"パフォーマンス",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",groupChat:"グループチャット",groupConversation:"会話",groupConversationShort:"会話",groupAgent:"エージェント",groupAgentShort:"エージェント",groupSystem:"システム",groupSystemShort:"シス",groupMonitoring:"監視",groupMonitoringShort:"監視",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:'ターミナルで "hermes-web-ui update" を実行して更新してください',updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません",kanban:"カンバン",groupTools:"ツール",groupPlatform:"プラットフォーム",gateways:"ゲートウェイ",expand:"メニューを展開",collapse:"メニューを折りたたむ"},performance:{title:"パフォーマンス",subtitle:"システムリソース、Bridge Broker、Workers、アクティブセッションを確認",refresh:"更新",autoRefreshOn:"自動更新",autoRefreshOff:"手動更新",loadFailed:"パフォーマンスデータの読み込みに失敗しました",systemCpu:"システム CPU",systemMemory:"システムメモリ",activeSessions:"アクティブセッション",runningSessions:"実行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 合計メモリ",processes:"プロセス",uptime:"稼働時間",running:"実行中",stopped:"停止",workerMemory:"Worker メモリ",lastUpdated:"更新時刻",profile:"Profile",memory:"メモリ",sessions:"セッション",runningActiveSessions:"実行中 / アクティブ",lastUsed:"最終使用",status:"状態",noWorkers:"Worker はありません",sessionsByProfile:"Profile 別セッション",noActiveSessions:"アクティブセッションはありません"},drawer:{terminal:"ターミナル",files:"ワークスペース"},chat:{contextRemaining:"残り",contextClickToEdit:"クリックしてコンテキスト長を編集",contextEditTitle:"コンテキスト長を編集",contextEditDesc:"現在のモデルのコンテキスト長制限を設定(トークン数)",contextEditPlaceholder:"コンテキスト長を入力",contextEditHint:"一般的な値:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"キャンセル",contextEditInvalid:"有効なコンテキスト長を入力してください",contextEditSuccess:"コンテキスト長を更新しました",contextEditFailed:"更新に失敗しました",emptyState:"Hermes Agent と会話を開始しましょう",outlineTitle:"会話アウトライン",outlineEmpty:"会話内容はありません",outlineUserQuestion:"ユーザーの質問",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",clear:"現在の表示をクリア",clearHistory:"このセッションの保存済みメッセージ履歴を削除",title:"このセッション名を変更",compress:"アイドル時にコンテキスト圧縮を実行",steer:"実行中の Bridge に誘導テキストを送信",destroy:"このセッションの Bridge Agent を解放"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",allProfiles:"すべてのプロファイル",profileMissingModelsTip:"このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"Hermes 履歴",historyScopeHint:"現在の profile の Hermes 履歴セッションをソース別に読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",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:"アシスタント",copySessionLink:"セッションリンクをコピー",copySessionId:"セッション ID をコピー",export:"エクスポート",exportFull:"フルエクスポート (JSON)",exportCompressed:"圧縮エクスポート (TXT)",exportCompressing:"コンテキストを圧縮中、お待ちください...",exportSuccess:"セッションをエクスポートしました",exportFailed:"エクスポートに失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",truncated:"... (省略)",executionDuration:"実行時間",thinkingLabel:"思考過程",thinkingInProgress:"思考中…",thinkingShow:"思考過程を表示",thinkingHide:"思考過程を隠す",thinkingDuration:"観測 {duration}",thinkingChars:"{count} 文字",copyBubble:"メッセージをコピー",copiedBubble:"コピーしました",copyFailed:"コピーに失敗しました",playSpeech:"音声を読み上げ",pauseSpeech:"一時停止",resumeSpeech:"再開",stopSpeech:"停止",speechNotSupported:"このブラウザは音声読み上げをサポートしていません",searchEnterHint:"Enter で開く · Esc で閉じる",searchHint:"Cmd/Ctrl+K",searchScope:"検索範囲: Web UI のローカルセッション DB のみ。読み取り専用の Hermes 履歴セッションは含まれません。",searchFailed:"セッション検索に失敗しました",searchNoSnippet:"表示できる要約がありません",searchNoResults:"一致するセッションがありません",searchRecent:"最近のセッション",searchEmpty:"最近のセッション",searchPlaceholder:"セッションを検索...",searchSubtitle:"タイトルまたはメッセージ内容で検索",searchTitle:"セッション検索",stopGateway:"Gateway を停止",start:"開始",workspaceSetFailed:"Workspace の設定に失敗しました",workspaceSet:"Workspace を設定しました",workspacePlaceholder:"プロジェクトパスを入力 例: /home/user/project",workspace:"ワークスペース",setWorkspaceTitle:"セッション Workspace を設定",setWorkspace:"Workspace を設定",modelSetFailed:"モデルの設定に失敗しました",modelSet:"モデルを設定しました",setModelTitle:"セッションモデルを設定",setModel:"モデルを設定",newCliChat:"新規 CLI",cliEmptyState:"CLI チャットを開始",autoPlaySpeech:"音声を自動再生"},jobs:{title:"スケジュールジョブ",createJob:"ジョブを作成",editJob:"ジョブを編集",noJobs:"スケジュールジョブがありません。作成して始めましょう。",name:"名前",namePlaceholder:"ジョブ名",schedule:"スケジュール (Cron 式)",schedulePlaceholder:"例: 0 9 * * *",quickPresets:"クイックプリセット",selectPreset:"プリセットを選択...",presetEveryMinute:"毎分",presetEvery5Min:"5分ごと",presetEveryHour:"毎時",presetEveryDay:"毎日 00:00",presetEveryDay9:"毎日 09:00",presetEveryMonday:"毎週月曜 09:00",presetEveryMonth:"毎月1日 09:00",prompt:"プロンプト",promptPlaceholder:"実行するプロンプト",deliverTarget:"配信先",origin:"配信元",local:"ローカル",repeatCount:"繰り返し回数(任意)",modelPlaceholder:"デフォルトモデル",repeatPlaceholder:"空白の場合は無制限",jobCreated:"ジョブを作成しました",jobUpdated:"ジョブを更新しました",nameRequired:"名前は必須です",scheduleRequired:"スケジュールは必須です",loadFailed:"ジョブの読み込みに失敗しました",jobPaused:"ジョブを一時停止しました",jobResumed:"ジョブを再開しました",jobTriggered:"ジョブをトリガーしました",modelUpdated:"モデルを更新しました",jobDeleted:"ジョブを削除しました",status:{running:"実行中",paused:"一時停止",disabled:"無効",scheduled:"スケジュール済み"},info:{model:"モデル",schedule:"スケジュール",lastRun:"前回実行",nextRun:"次回実行",deliver:"配信",repeat:"繰り返し"},action:{pause:"一時停止",pauseJob:"ジョブを一時停止",resume:"再開",resumeJob:"ジョブを再開",runNow:"今すぐ実行",triggerImmediately:"すぐにトリガー"},runHistory:{title:"実行履歴",runs:"件",noRuns:"実行履歴がありません。"}},skills:{title:"スキル",searchPlaceholder:"スキルを検索...",noMatch:"検索に一致するスキルがありません",noSkills:"スキルがありません",backTo:"戻る",attachedFiles:"添付ファイル",loadFailed:"スキルの読み込みに失敗しました",fileLoadFailed:"ファイルの読み込みに失敗しました",modified:"ユーザー変更あり",archived:"アーカイブ済み",pinned:"ピン留め",pin:"スキルをピン留め",unpin:"ピン留めを解除",pinFailed:"ピン留め状態の変更に失敗しました",toggleFailed:"スキルの切り替えに失敗しました",source:{builtin:"組み込み",hub:"Hub",local:"ローカル"}},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:"プロバイダー管理"},status:{enabled:"有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},statusLabel:{enabled:"設定で有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},configStatuses:{enabled:"有効",disabled:"無効","not-enabled":"未有効",auto:"自動","provider-managed":"プロバイダー管理"},table:{plugin:"プラグイン",status:"ステータス",source:"ソース",kind:"種類",capabilities:"機能",path:"パス / entrypoint",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"エージェントルート",python:"Python",scanCwd:"cwd をスキャン",projectPlugins:"プロジェクトプラグイン"}},memory:{title:"メモリ",refresh:"更新",loadFailed:"メモリの読み込みに失敗しました",myNotes:"メモ",noNotes:"メモはまだありません。",notesPlaceholder:"メモを入力...",userProfile:"ユーザープロファイル",noProfile:"プロファイルはまだありません。",profilePlaceholder:"プロファイルを入力...",soul:"ソウル",noSoul:"ソウル設定はまだありません。",soulPlaceholder:"ソウル設定を入力..."},models:{title:"モデル",addProvider:"プロバイダーを追加",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:"選択をクリア",currentDefault:"現在のデフォルト",defaultShort:"デフォルト",builtIn:"組み込み",customType:"カスタム",provider:"プロバイダー",contextLength:"コンテキスト長",contextLengthPlaceholder:"例: 200000(任意)",local:"ローカル ({host})",selectProviderRequired:"プロバイダーを選択してください",baseUrlRequired:"ベース URL は必須です",apiKeyRequired:"API キーは必須です",modelRequired:"デフォルトモデルは必須です",enterBaseUrl:"ベース URL を先に入力してください",unexpectedFormat:"予期しないレスポンス形式です",foundModels:"{count} 個のモデルが見つかりました",fetchFailed:"モデルの取得に失敗しました",xaiWaiting:"開いた xAI ページで認可を完了してください。承認後、このウィンドウは自動で閉じます。",xaiOpenLink:"xAI 認可ページを開く",xaiLoginTitle:"xAI Grok OAuth ログイン",xaiExpired:"認可リンクの期限が切れました。再試行してください。",xaiCopyLink:"認可リンクをコピー",xaiApproved:"ログイン成功!",visibilitySelectOne:"少なくとも 1 つの表示モデルを残してください",visibilitySaved:"表示モデルを保存しました",visibilitySaveFailed:"表示モデルの保存に失敗しました",visibilityHint:"Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。",showAllModels:"すべてのモデルを表示",searchPlaceholder:"モデルを検索...",removeCustomModel:"この一覧外モデルを削除",more:"件追加",models:"モデル一覧",manageVisibleModelsFor:"{name} の表示モデルを管理",manageVisibleModels:"表示モデルを管理",getApiKey:"API Key を取得",count:"個のモデル",aliasUseOriginal:"元の ID に戻す",aliasTitleFor:"{model} の表示名",aliasTitle:"モデル表示名",aliasSaveFailed:"表示名の保存に失敗しました",aliasPlaceholder:"空欄の場合は元のモデル ID を使用",aliasManageFor:"{provider} の表示名",aliasManage:"表示名",aliasHint:"Web UI の表示名だけを変更します。Hermes には元のモデル ID が送信されます。",aliasEdit:"名前変更",aliasCanonical:"元の ID: {model}"},profiles:{title:"プロファイル",create:"プロファイルを作成",import:"インポート",export:"エクスポート",rename:"名前変更",delete:"削除",switchTo:"Hermes Profile を切り替え",switchConfirm:"`hermes profile use {name}` を実行し、Hermes CLI の active profile を切り替えます。続行しますか?",switchSuccess:"Hermes active profile を「{name}」に切り替えました",switchFailed:"Hermes Profile の切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。",createSuccess:"プロファイル「{name}」を作成しました",createFailed:"プロファイルの作成に失敗しました",renameSuccess:"プロファイル名を変更しました",renameFailed:"プロファイル名の変更に失敗しました",deleteConfirm:"プロファイル「{name}」を削除しますか?",deleteSuccess:"プロファイルを削除しました",deleteFailed:"プロファイルの削除に失敗しました",exportSuccess:"プロファイルをエクスポートしました",exportFailed:"プロファイルのエクスポートに失敗しました",importSuccess:"プロファイルをインポートしました",importFailed:"プロファイルのインポートに失敗しました",importSelectFile:"アーカイブファイルを選択",importInvalidFile:"有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)",name:"プロファイル名",namePlaceholder:"英数字、ハイフンのみ",nameValidation:"プロファイル名には小文字、数字、アンダースコア、ハイフンのみ使用できます",newName:"新しい名前",newNamePlaceholder:"新しい名前を入力",cloneFromCurrent:"現在のプロファイルから複製",cloneCleanupNotice:"複製時、独占型プラットフォーム認証情報(Weixin / Telegram / Slack など)は自動的にスキップされ、ソースプロファイルとの競合を回避します",cloneStrippedCredentials:"{count} 件の独占認証情報を削除しました:{list}",cloneDisabledPlatforms:"{count} 個のプラットフォームを無効化しました:{list}",cloneStrippedConfigCredentials:"config.yaml から {count} 件の埋め込み認証情報を削除しました:{list}",archivePath:"アーカイブパス",archivePathPlaceholder:"アーカイブファイルのサーバーパス",importName:"プロファイル名(任意)",importNamePlaceholder:"空白の場合はアーカイブ名を使用",active:"アクティブ",model:"モデル",gateway:"ゲートウェイ",alias:"エイリアス",provider:"プロバイダー",path:"パス",skills:"スキル",hasEnv:".env あり",hasSoulMd:"soul.md あり",noProfiles:"プロファイルがありません。作成して始めましょう。",avatar:{title:"カスタムアバター",customize:"アバター",upload:"画像をアップロード",random:"ランダム生成",reset:"デフォルトに戻す",hint:"PNG、JPEG、WebP 対応、最大 1MB",invalidType:"PNG、JPEG、WebP 画像を選択してください",tooLarge:"アバター画像は 1MB 以下にしてください",saveSuccess:"アバターを保存しました",saveFailed:"アバターの保存に失敗しました",resetSuccess:"デフォルトアバターに戻しました",resetFailed:"デフォルトアバターへの復元に失敗しました"},runtime:{activeProfile:"現在: {name}",bridgeWorker:"Bridge 状態",gateway:"ゲートウェイ",active:"アクティブ",activeTag:"現在",idle:"待機中",running:"実行中",stopped:"停止中",restartGateway:"Gateway を再起動",restartProfile:"プロファイルを再起動",switchProfile:"フロントエンドプロファイルを切り替え",gatewayRestarted:"Gateway を再起動しました: {name}",gatewayRestartFailed:"Gateway の再起動に失敗しました",profileRestarted:"プロファイルを再起動しました: {name}",profileRestartFailed:"プロファイルの再起動に失敗しました"}},logs:{title:"ログ",all:"すべて",searchPlaceholder:"検索...",refresh:"更新",noEntries:"ログエントリがありません"},settings:{title:"設定",saved:"保存しました",saveFailed:"保存に失敗しました",tabs:{display:"表示",account:"現在のアカウント",users:"アカウント管理",agent:"エージェント",memory:"メモリ",compression:"圧縮",session:"セッション",privacy:"プライバシー",apiServer:"API サーバー",models:"モデル",voice:"音声"},display:{streaming:"ストリームレスポンス",streamingHint:"AI の返信をリアルタイムで表示",compact:"コンパクトモード",compactHint:"メッセージの間隔を狭める",showReasoning:"推論過程を表示",showReasoningHint:"モデルの思考プロセスを表示",showCost:"コストを表示",showCostHint:"返信にトークン使用量を表示",inlineDiffs:"インライン差分",inlineDiffsHint:"コード変更をインラインで表示",bellOnComplete:"完了通知音",bellOnCompleteHint:"AI の応答完了時に通知音を再生",busyInputMode:"処理中入力モード",busyInputModeHint:"AI 処理中でも入力を許可",theme:"テーマ",themeHint:"ライト、ダーク、またはシステム設定に従う",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム"},agent:{maxTurns:"最大ターン数",maxTurnsHint:"1回の会話の最大インタラクション回数",gatewayTimeout:"ゲートウェイタイムアウト",gatewayTimeoutHint:"リクエストタイムアウト(秒)",restartDrainTimeout:"再起動ドレインタイムアウト",restartDrainTimeoutHint:"再起動前のドレインタイムアウト(秒)",toolEnforcement:"ツール実行ポリシー",toolEnforcementHint:"ツール呼び出しの実行モードを制御",auto:"自動",always:"常に",never:"しない"},memory:{enabled:"メモリを有効化",enabledHint:"AI に会話コンテキストを記憶させる",userProfile:"ユーザープロファイル",userProfileHint:"AI にユーザーの設定を記憶させる",charLimit:"メモリ文字数上限",charLimitHint:"MEMORY.md の最大文字数",userCharLimit:"ユーザープロファイル文字数上限",userCharLimitHint:"USER.md の最大文字数"},compression:{enabled:"圧縮を有効化",enabledHint:"長いチャット履歴がモデルコンテキストを超える前に自動圧縮",threshold:"圧縮しきい値",thresholdHint:"推定トークンがこのコンテキスト比率を超えたら圧縮を開始",targetRatio:"目標比率",targetRatioHint:"圧縮後の履歴サイズをコンテキスト比率で指定",protectLastN:"直近メッセージを保護",protectLastNHint:"この数の最新メッセージは圧縮しない",protectFirstN:"先頭メッセージを保護",protectFirstNHint:"この数の最初のメッセージは圧縮しない"},session:{mode:"リセットモード",modeHint:"セッションリセットのトリガー条件",modeBoth:"アイドル + スケジュール",modeIdle:"アイドルのみ",modeDaily:"スケジュールのみ",modeNone:"無し(手動のみ)",idleMinutes:"アイドルタイムアウト",idleMinutesHint:"自動リセットまでの待機時間(分)",atHour:"スケジュールリセット時刻",humanOnly:"人間のセッションのみ表示",humanOnlyHint:"サブエージェントやセッション監視ノイズを既定で隠します",liveMonitorHumanOnly:"ライブモニター: 人間のセッションのみ表示",liveMonitorHumanOnlyHint:"ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します",atHourHint:"毎日指定時刻にセッションをリセット",requireAuth:"セッション認証",requireAuthHint:"セッション操作に認証を必要とする"},privacy:{redactPii:"個人情報のマスキング",redactPiiHint:"機密情報を自動検出して隠す(パスワード、キーなど)"},apiServer:{enable:"有効化",enableHint:"API サーバーを有効にする",host:"ホスト",hostHint:"リッスンアドレス",port:"ポート",portHint:"リッスンポート",key:"キー",keyHint:"API アクセスキー",cors:"CORS 許可元",corsHint:"許可するクロスオリジン"},voice:{ttsProvider:"TTS プロバイダー",ttsProviderHint:"メッセージ読み上げに使用する音声合成エンジンを選択",providerWebSpeech:"WebSpeech API(ブラウザ)",providerOpenai:"OpenAI TTS",providerCustom:"カスタムエンドポイント(OpenAI 互換)",providerEdge:"Edge TTS(無料、API Key 不要)",webspeechVoice:"音声",webspeechVoiceHint:"ブラウザまたは OS から音声を選択",webspeechVoicePlaceholder:"自動(デフォルト音声)",openaiKey:"API キー",openaiKeyHint:"TTS アクセス権のある OpenAI API キー",openaiUrl:"API ベース URL",openaiUrlHint:"例: https://api.openai.com/v1/audio/speech",openaiModel:"モデル",openaiModelHint:"tts-1(高速)/ tts-1-hd(高音質)",openaiVoice:"音声",openaiVoiceHint:"合成に使用する音色",customHint:"OpenAI 互換の TTS API を使用可能 — GPT-SoVITS、CosyVoice などに対応",customUrl:"API URL",customUrlHint:"TTS サービスのベース URL",customUrlPlaceholder:"ローカルアダプターで設定したアドレス(例:http://127.0.0.1:9880)",customApiKey:"API キー(オプション)",customApiKeyHint:"一部のカスタムエンドポイントは認証が必要",customApiKeyPlaceholder:"不要な場合は空欄",edgeHint:"Microsoft Edge TTS を搭載(node-edge-tts)。",edgeUrl:"アダプター URL",edgeUrlHint:"Edge TTS アダプターのアドレス(例:http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"音声",edgeVoiceHint:"音声合成に使用する音色を選択",edgeRate:"速度",edgeRateHint:"音声の速度を調整(0.5~2.0倍)",edgePitch:"ピッチ",edgePitchHint:"音声のピッチを調整(-20~+20 Hz)",testTitle:"音声テスト",testText:"テストテキスト",testTextPlaceholder:"テストするテキストを入力...",testTextDefault:"こんにちは、これは音声テストです。",testButton:"テスト",testButtonPlaying:"再生中...",testFailed:"テスト失敗:{error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — プリセット音声、音声デザイン、音声クローンの3つのモードをサポート",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com で取得",mimoApiKeyPlaceholder:"MiMo API Key",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をロック解除しました"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key を入力",noProviders:"設定済みプロバイダーがありません",save:"保存",saveFailed:"保存に失敗しました",saved:"保存しました"}},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:"スキャン済み、スマートフォンで確認してください...",qqSandboxHint:"サンドボックス環境を有効化(テスト用)",qqSandbox:"サンドボックスモード",qqQrScanHint:"QQ で上の QR コードをスキャンするか、スマホでリンクを開いて連携を完了します",qqMarkdownHint:"Markdown 形式メッセージを有効化(一部クライアントでは未対応の場合があります)",qqMarkdown:"Markdown サポート",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"ユーザー ID または OpenID の許可リスト。カンマ区切り",allowedUsers:"許可ユーザー",allowAllUsersHint:"任意のユーザーからのメッセージを許可します。オフの場合は許可リストを使用します",allowAllUsers:"すべてのユーザーを許可"},language:{label:"言語",zh:"中文",en:"English",ja:"日本語"},terminal:{sessions:"セッション",newTab:"新しいターミナル",closeSession:"このセッションを閉じますか?",sessionExited:"終了しました",processExited:"プロセスが終了しました(コード {code})",noSessions:"ターミナルセッションがありません",connectionFailed:"ターミナルに接続できませんでした",connectionError:"接続エラー",connectionClosed:"接続が閉じられました"},usage:{title:"使用統計",refresh:"更新",totalTokens:"総トークン数",inputTokens:"入力",outputTokens:"出力",totalSessions:"総セッション数",avgPerDay:"1日平均 ~{n}",estimatedCost:"推定コスト",cacheHitRate:"キャッシュヒット率",modelBreakdown:"モデル別内訳",dailyTrend:"日別使用量",date:"日付",tokens:"トークン",cache:"キャッシュ",cacheRead:"キャッシュ読み取り",cacheWrite:"キャッシュ書き込み",sessions:"セッション",cost:"コスト",noData:"使用データがありません"},skillsUsage:{title:"スキル使用状況",subtitle:"Hermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_5_22_1:"Hermes セッション一覧 API が Web UI ローカルストアではなく Profile データベースを読むよう修正",new_0_5_23_1:"Bridge 専用チャットスラッシュコマンドとローカライズ済み候補を追加",new_0_5_23_2:"モデルコンテキスト、使用量、圧縮を汚さずセッション再生用のコマンド履歴を永続化",new_0_5_23_3:"認証情報が Profile 間で漏れないよう gateway Profile 環境変数を分離",new_0_5_23_4:"起動競合を避けるため gateway 割り当て時に Web UI ポートを予約",new_0_5_23_5:"self-update restart で成功した helper 終了を失敗として報告しないよう修正",new_0_5_24_1:"Bridge チャットを API Server のマルチモーダル入力、システムプロンプト、workspace コンテキスト処理に合わせる",new_0_5_25_1:"グループチャットルームのリセットと複製アクションを追加",new_0_5_25_2:"カスタムデプロイ構成向けに Web UI 状態ディレクトリを設定可能に変更",new_0_5_25_3:"音声設定に MiMo TTS プロバイダーを追加",new_0_5_25_4:"ブラウザ CORS エラーを避けるためカスタムプロバイダーのモデル一覧をバックエンド経由で取得",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 ブラウザテスト、チャットストリーミング契約カバレッジ、プロバイダーモデルカバレッジ、カバレッジ基準を追加",new_0_5_26_1:"チャット履歴とレンダリング済みメッセージで Windows およびローカル Markdown メディアパスをサポート",new_0_5_26_2:"空の assistant 履歴をフィルタし、新しい実行開始時に古い圧縮状態をクリア",new_0_5_26_3:"同時書き込みによる破損を減らすため config と Profile 更新にファイルロック書き込みを追加",new_0_5_26_4:"QQBot と DingTalk チャンネル設定を追加",new_0_5_26_5:"CLI ポート検出をポータブル化し、モバイル端末ドロワーのサイズを改善",new_0_5_26_6:"Bridge Profile 環境を分離し、Python 環境をまたぐ Hermes plugin 検出を修正",new_0_5_26_7:"停止中 gateway 状態に Web UI 診断説明を追加し、ログ読み込み状態を安定化",new_0_5_26_8:"セッションリセットモード、カスタムプロバイダー Base URL、動的配信先を修正",new_0_5_26_9:"チャット入力バーにローカル保存の tool-call trace 表示切替を追加",new_0_5_26_10:"ソース checkout がない場合の Hermes Agent パッケージインストールをサポート",new_0_5_26_11:"SuperGrok サブスクユーザー向け xAI Grok OAuth ログインを追加し Grok モデルプリセットを更新",new_0_5_26_12:"ブラウザ、チャットストリーミング、プロバイダー、gateway、config、plugin、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_30_1:"Bridge チャットが構造化履歴を保持し、tool 履歴のテキスト化による応答なしや tool 実行スキップを修正",new_0_5_30_2:"複数 Agent のグループチャット mention ルーティングを改善し、配信前に各 Agent 自身の @ mention を削除し、更新後も表示名を保持",new_0_5_30_3:"モデルページ、チャットモデルドロップダウン、セッションモデル選択を active Profile にスコープし、デフォルト表示を正確化",new_0_5_30_4:"Gateway 管理を簡素化:独立 Gateway ページを削除し、各 Profile の平台設定を確認して必要な gateway を起動、軽量 runner で起動/再起動を管理",new_0_5_30_5:"Docker、Termux、Windows での gateway 起動を改善し、runtime lock、ポート競合、バックグラウンド実行、再起動をサポート",new_0_5_30_6:"Windows 互換性を強化し、パス検出、ファイルダウンロード、job/update サブプロセスで端末ウィンドウが点滅しないよう修正",new_0_5_30_7:"config 書き込みと provider preset を修正:.env キー検証、FUN-Codex の Responses API 経由、Z.AI/GLM モデル一覧更新",new_0_5_30_8:"折りたたみサイドバー、短いグループラベル、サイドバー区切り、会話アウトラインなど frontend の細部を調整",new_0_5_30_9:"コンテキスト圧縮は Profile 圧縮設定に従い、古いスナップショットでは全文再圧縮せず以前の要約と安全な末尾を再利用",new_0_5_31_1:"Bridge broker の再起動を強化し、グループチャット最終ストリーム表示を修正し、{'@'}all ルーティングを追加",new_0_5_31_2:"ファイルマネージャーで絶対パスをコピー可能にし、モバイルセッションドロワーがチャット内容の背面に回らないよう修正",new_0_5_31_3:"Profile セレクターにアバター、カスタムアバターアップロード、実行状態モーダル、gateway/Profile 再起動操作を追加",new_0_5_31_4:"Profile アバターを単聊、グループチャット、折りたたみサイドバーに反映し、Web UI メタデータ保存と Windows 安全パスに対応",new_0_5_31_5:"Docker、Termux、Windows の gateway 検出と再起動確認を改善し、managed gateway の生存判定に gateway_state/gateway.pid を使用",new_0_5_31_6:"APIKEY.FUN 生画像メディア endpoint と内蔵 apikey-image-gen skill を追加し、active Profile の fun-codex provider で文生図、図生図、画像編集に対応",new_0_5_33_1:"単聊とグループチャットの実行失敗や Socket エラーを赤い Agent メッセージとしてメッセージ一覧に保持し、一瞬で消えないよう修正",new_0_5_33_2:"セッション検索を選択中 Profile に絞り込めるようにし、Profile 未選択時は全 Profile を検索",new_0_5_33_3:"Skills ページに日本語以外では英語へフォールバックする中英推薦ドキュメントを追加し、選択済み Skill の再クリックで選択解除可能に",new_0_5_33_4:"未使用の changelog ローカライズ項目を削除し、frontend i18n サイズを削減",new_0_5_33_5:"中国語 Windows 環境で netstat 出力のエンコード解析に失敗し agent bridge が起動しない問題を修正",new_0_5_33_6:"Nous Portal の preset モデル一覧を公開 catalog と Portal 推奨モデルに合わせて更新",new_0_5_33_7:"Profile 一覧と実行状態は Profile 名をディレクトリから、既定モデルを config から読むようにし、CLI 表の列幅による解析ずれを回避",new_0_5_34_1:"セッション/グループチャット保存時にマルチモーダル tool 結果を正規化し、base64 画像がリプレイに混ざらないよう修正",new_0_5_34_2:"カスタム Hermes モデルを backend 管理設定に永続化し、モデル追加/削除 endpoint を追加",new_0_5_34_3:"Bridge 実行完了後の最終コンテキスト使用量と tool 状態更新を正確化",new_0_5_34_4:"Kanban のボード絞り込み、担当者表示、カード操作、タスク詳細処理を改善",new_0_5_34_5:"固定 prompt/tool コンテキストをキャッシュし、完全コンテキスト token 合計を表示するよう圧縮使用量を修正",new_0_5_34_6:"グループチャット Agent ごとに固定コンテキストをキャッシュし、実際に圧縮が始まった時だけ進捗を表示",new_0_5_34_7:"Web UI 内蔵 Skills をすべての Profile に同期注入し、ログに対象 Profile を記録",new_0_5_34_8:"Windows で Kanban 機能が異常な場合は、最新の Kanban データベース移行修正を取得するため Hermes をアップグレードしてください",new_0_5_35_1:"Bridge セッションは異なる session 間で並行実行でき、同一 session の実行はメッセージ順序を守るため直列化されます",new_0_5_35_2:"Performance Monitor ページを追加し、システム CPU/メモリ、Web UI、Bridge Broker、Workers、アクティブセッション状態を確認できます",new_0_5_35_3:"Worker ごとの CPU、メモリ、Profile、セッション数、実行状態を表示するリソース統計を追加",new_0_5_35_4:"Bridge worker のライフサイクル cleanup を改善し、Broker 終了時や親プロセス終了時に worker を回収して残留 Python プロセスを減らします",new_0_5_35_5:"macOS、Windows、Linux、Docker、Termux 向けの fallback を追加し、監視リソース収集のクロスプラットフォーム互換性を強化",new_0_5_35_6:"Agent 初期化中の worker request で Performance Monitor がブロックされにくくなり、Windows の request timed out を軽減",new_0_5_35_7:"Chat Markdown にテキスト内容のインラインプレビューを追加し、download アイコンはプレビュー drawer を開かず直接ダウンロードします",new_0_5_35_8:"内容表示 drawer を改善し、モバイルの閉じる操作と全幅表示、デスクトップ 800px 幅、テキスト/Markdown 背景の統一に対応",new_0_6_0_1:"アカウント別・Profile 別の管理により、セッション、モデル、使用量、Kanban、ジョブ、アップロード、メディア、関連 Hermes API を一貫して保護します",new_0_6_0_2:"内蔵メディア Skills は生成されたサーバートークンをメディア endpoint のみに使用し、要求された Profile から fun-codex/xAI 認証情報を解決します",new_0_6_0_3:"単一チャットとグループチャットは現在の Hermes Profile を run instructions に注入し、Skills が X-Hermes-Profile を送れるようにします",new_0_6_0_4:"delegate_task の subagent 進行状況をチャット UI に stream 表示し、開始、tool、進行、完了を確認できます",new_0_6_0_5:"停止または中断時に一時イベントをクリアし、古い abort 状態が次のチャットに漏れないようにしました",new_0_6_0_6:"アカウント管理、既定の認証情報、アカウント/Profile 管理、アップロード/ダウンロード、内蔵メディア Skills のドキュメントとサイト文言を更新",new_0_6_0_7:"ログイン IP ロックのクリアと既定の admin / 123456 ログインをリセットする CLI メンテナンスコマンドを追加",new_0_6_0_8:"0.6.0 は Web UI の単一ユーザー版とマルチユーザー版の境界です。マルチユーザー機能に問題がある場合は issue を送信し、必要に応じて 0.5.35 の単一ユーザー版へ戻してください"},files:{title:"ファイル",tree:"ディレクトリツリー",list:"ファイル一覧",breadcrumbRoot:"ホーム",newFile:"新規ファイル",newFolder:"新規フォルダ",upload:"アップロード",refresh:"更新",open:"開く",edit:"編集",preview:"プレビュー",download:"ダウンロード",copyPath:"パスをコピー",rename:"名前の変更",delete:"削除",name:"名前",size:"サイズ",modified:"更新日時",actions:"操作",emptyDir:"空のディレクトリ",loading:"読み込み中...",confirmDelete:"「{name}」を削除してもよろしいですか?",confirmDeleteDir:"ディレクトリ「{name}」とそのすべての内容を削除してもよろしいですか?",deleteFailed:"削除に失敗しました",deleted:"削除しました",renameTo:"名前を変更",newFileName:"ファイル名",newFolderName:"フォルダ名",created:"作成しました",createFailed:"作成に失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",uploadSuccess:"{count} 個のファイルをアップロードしました",uploadFailed:"アップロードに失敗しました",saveFailed:"保存に失敗しました",saved:"保存しました",unsavedChanges:"未保存の変更があります。破棄しますか?",pathCopied:"パスをコピーしました",fileTooLarge:"ファイルが大きすぎます(最大10MB)",permissionDenied:"保護されたファイルは変更できません",notFound:"ファイルまたはディレクトリが見つかりません",backendError:"ファイル操作に失敗しました",dragDropHint:"ここにファイルをドラッグしてアップロード",closeEditor:"エディタを閉じる",closePreview:"閉じる",saveFile:"保存",fileTree:"ファイルツリー"},groupChat:{title:"グループチャット",createRoom:"ルームを作成",joinByCode:"コードで参加",roomName:"ルーム名",roomNamePlaceholder:"ルーム名を入力",inviteCode:"招待コード",autoGenerate:"自動生成",noRooms:"ルームがありません",selectOrCreate:"ルームを選択または作成してチャットを開始",agents:"エージェント",addAgent:"エージェントを追加",selectProfile:"プロファイルを選択",agentAdded:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",agentAddFailedCount:"{count} 件のエージェントを追加できませんでした: {details}",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",copyRoomLink:"ルームリンクをコピー",deleteRoomConfirm:"このルームを削除しますか?",clearContext:"コンテキストを削除",clearContextConfirm:"このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。",contextCleared:"コンテキストを削除しました",you:"あなた",joined:"ルームに参加しました",joinFailed:"ルームへの参加に失敗しました",inputPlaceholder:"メッセージを入力... (Enterで送信)",enterCode:"招待コードを入力",yourName:"あなたの名前",yourNamePlaceholder:"表示名を入力",yourDescription:"自己紹介(任意)",yourDescriptionPlaceholder:"自分について教えてください...",agentName:"エージェント名",agentNamePlaceholder:"カスタム名(空欄ならプロファイル名)",agentDesc:"エージェントの説明",agentDescPlaceholder:"このエージェントの役割を説明...",agentReplying:"が返信中...",agentCompressing:"がコンテキストを圧縮中...",compressionSettings:"圧縮設定",triggerTokens:"圧縮トリガートークン数",triggerTokensDesc:"このトークン数を超えるとコンテキスト圧縮がトリガーされます",maxHistoryTokens:"最大履歴トークン数",maxHistoryTokensDesc:"圧縮後のLLM送信最大トークン数",tailMessageCount:"末尾メッセージ数",tailMessageCountDesc:"圧縮後にそのまま保持する最近のメッセージ数",compressionConfig:"圧縮設定",compressNow:"今すぐ圧縮",compressingInProgress:"圧縮中です、お待ちください",compressionSaved:"圧縮設定を保存しました"},download:{downloading:"ダウンロード中...",downloadFailed:"ダウンロードに失敗しました",fileNotFound:"ファイルが見つからないか削除されています",fileTooLarge:"ファイルが大きすぎます(制限超過)",backendError:"ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります",backendTimeout:"ファイルの読み取りがタイムアウトしました",unsupportedBackend:"現在のターミナルバックエンドはファイルのダウンロードに対応していません",invalidPath:"無効なファイルパス",contentDisplay:"内容表示",download:"ダウンロード",downloadFile:"ファイルをダウンロード"},gateways:{title:"ゲートウェイ",running:"実行中",stopped:"停止中",started:"開始しました",startFailed:"Gateway の起動に失敗しました",stopFailed:"Gateway の停止に失敗しました"},kanban:{title:"Kanban ボード",createTask:"新規タスク",noTasks:"タスクはありません",allStatuses:"すべての状態",allAssignees:"すべての担当者",columns:{triage:"振り分け待ち",todo:"未着手",ready:"準備完了",running:"進行中",blocked:"ブロック中",done:"完了",archived:"アーカイブ済み"},card:{assigneeTooltip:"担当者",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"たった今",minutes:"{count}分前",hours:"{count}時間前",days:"{count}日前"}},board:{create:"新規ボード",archive:"ボードをアーカイブ",archiveConfirm:"現在のボードをアーカイブしますか?",archived:"ボードをアーカイブしました",created:"ボードを作成しました",slugPlaceholder:"ボード識別子 例: project-a",namePlaceholder:"表示名(任意)",slugRequired:"ボード識別子は必須です"},form:{title:"タイトル",titlePlaceholder:"タスクタイトル",titleRequired:"タイトルは必須です",body:"説明",bodyPlaceholder:"タスク説明(任意)",assignee:"担当者",selectAssignee:"担当者を選択...",priority:"優先度",selectPriority:"優先度を選択..."},detail:{status:"状態",priority:"優先度",assignee:"担当者",tenant:"テナント",createdAt:"作成時刻",startedAt:"開始時刻",completedAt:"完了時刻",comments:"コメント",events:"イベント",runs:"実行履歴",artifacts:"成果物",result:"完了結果",highlights:"重要情報",sources:"データソース",sessions:"関連セッション",sessionMessages:"セッション記録",noSessions:"関連セッションが見つかりません。"},action:{title:"操作",assign:"割り当て",assignTo:"割り当て先...",block:"ブロック",blockReason:"ブロック理由",unblock:"ブロック解除",complete:"完了",completeSummary:"完了サマリー(任意)"},message:{loadFailed:"タスクの読み込みに失敗しました",taskCreated:"タスクを作成しました",taskAssigned:"タスクを割り当てました",taskBlocked:"タスクをブロックしました",taskUnblocked:"タスクのブロックを解除しました",taskCompleted:"タスクを完了しました"},stats:{total:"合計",tasks:"タスク数"}}},At={login:{title:"Hermes Web UI",description:"계속하려면 사용자 이름과 비밀번호를 입력하세요.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",defaultCredentialsHint:"기본 로그인 이름: admin, 기본 비밀번호: 123456",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",sessionExpired:"로그인이 만료되었습니다. 다시 로그인해 주세요.",accessDenied:"이 리소스에 접근할 권한이 없습니다.",passwordMismatch:"비밀번호가 일치하지 않습니다",passwordTooShort:"비밀번호는 6자 이상이어야 합니다",setupSuccess:"비밀번호 로그인이 설정되었습니다",passwordChanged:"비밀번호가 변경되었습니다",passwordRemoved:"비밀번호 로그인이 제거되었습니다",setupPassword:"비밀번호 로그인 설정",changePassword:"비밀번호 변경",changeUsername:"사용자 이름 변경",removePasswordLogin:"제거",username:"사용자 이름",currentPassword:"현재 비밀번호",newPassword:"새 비밀번호",confirmPassword:"비밀번호 확인",newUsername:"새 사용자 이름",usernameChanged:"사용자 이름이 변경되었습니다",usernameTooShort:"사용자 이름은 2자 이상이어야 합니다",setupDescription:"로그인에 사용할 사용자 이름과 비밀번호를 관리합니다.",removeConfirm:"사용자 계정에는 비밀번호 로그인이 필요합니다.",passwordLoginNotConfigured:"비밀번호 로그인 미설정",passwordLoginConfigured:"현재 계정: {username}",defaultCredentialTitle:"기본 계정과 비밀번호를 변경하세요",defaultCredentialMessage:"현재 로그인 계정이 아직 기본 사용자 이름 또는 기본 비밀번호를 사용하고 있습니다. 무단 접근을 방지하려면 현재 계정에서 사용자 이름과 비밀번호를 가능한 한 빨리 변경하세요.",defaultCredentialAction:"변경하기",defaultCredentialLater:"나중에 알림"},users:{title:"계정 관리",description:"사용자를 만들고 역할을 할당하며 일반 관리자가 접근할 수 있는 프로필을 제어합니다.",create:"사용자 만들기",edit:"사용자 편집",username:"사용자 이름",role:"역할",statusLabel:"상태",profiles:"접근 가능한 프로필",profilesPlaceholder:"접근 가능한 프로필 선택",allProfiles:"모든 프로필",noProfiles:"할당된 프로필 없음",lastLogin:"마지막 로그인",newPasswordOptional:"새 비밀번호 (비워두면 유지)",loadFailed:"사용자 목록을 불러오지 못했습니다",deleteConfirm:"이 사용자를 삭제하시겠습니까?",enable:"활성화",disable:"비활성화",roles:{superAdmin:"슈퍼 관리자",admin:"관리자"},status:{active:"활성",disabled:"비활성"}},common:{loading:"로딩 중...",cancel:"취소",retry:"재시도",delete:"삭제",edit:"편집",save:"저장",saved:"저장됨",update:"업데이트",create:"생성",saveFailed:"저장 실패",deleteFailed:"삭제 실패",ok:"확인",copied:"복사됨",copy:"복사",noData:"데이터 없음",fetch:"가져오기",add:"추가",enable:"활성화",disable:"비활성화",configured:"구성됨",notConfigured:"미구성",confirm:"확인",expand:"펼치기",collapse:"접기",stop:"중지",start:"시작",expired:"만료됨"},sidebar:{chat:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",performance:"성능 모니터링",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",groupChat:"그룹 채팅",groupConversation:"대화",groupConversationShort:"대화",groupAgent:"에이전트",groupAgentShort:"에전",groupSystem:"시스템",groupSystemShort:"시스템",groupMonitoring:"모니터링",groupMonitoringShort:"모니터",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:'터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트 실패",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다",kanban:"칸반",groupTools:"도구",groupPlatform:"플랫폼",gateways:"게이트웨이",expand:"메뉴 펼치기",collapse:"메뉴 접기"},performance:{title:"성능 모니터링",subtitle:"시스템 리소스, Bridge Broker, Workers, 활성 세션 확인",refresh:"새로고침",autoRefreshOn:"자동 새로고침",autoRefreshOff:"수동 새로고침",loadFailed:"성능 데이터를 불러오지 못했습니다",systemCpu:"시스템 CPU",systemMemory:"시스템 메모리",activeSessions:"활성 세션",runningSessions:"실행 중 {count}",workers:"Workers",totalWorkerMemory:"Worker 총 메모리",processes:"프로세스",uptime:"실행 시간",running:"실행 중",stopped:"중지됨",workerMemory:"Worker 메모리",lastUpdated:"업데이트 시간",profile:"Profile",memory:"메모리",sessions:"세션",runningActiveSessions:"실행 중 / 활성",lastUsed:"마지막 사용",status:"상태",noWorkers:"Worker 없음",sessionsByProfile:"Profile별 세션",noActiveSessions:"활성 세션 없음"},drawer:{terminal:"터미널",files:"작업 공간"},chat:{contextRemaining:"남음",contextClickToEdit:"클릭하여 컨텍스트 길이 편집",contextEditTitle:"컨텍스트 길이 편집",contextEditDesc:"현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)",contextEditPlaceholder:"컨텍스트 길이 입력",contextEditHint:"일반적인 값: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"저장",contextEditCancel:"취소",contextEditInvalid:"유효한 컨텍스트 길이를 입력하세요",contextEditSuccess:"컨텍스트 길이가 업데이트되었습니다",contextEditFailed:"업데이트 실패",emptyState:"Hermes Agent와 대화를 시작하세요",outlineTitle:"대화 개요",outlineEmpty:"대화 내용이 없습니다",outlineUserQuestion:"사용자 질문",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",clear:"현재 표시 내용 지우기",clearHistory:"이 세션의 저장된 메시지 기록 삭제",title:"이 세션 이름 변경",compress:"유휴 상태에서 컨텍스트 압축 실행",steer:"활성 Bridge 실행에 지시 텍스트 보내기",destroy:"이 세션의 Bridge Agent 해제"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",allProfiles:"모든 프로필",profileMissingModelsTip:'이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"Hermes 기록",historyScopeHint:"현재 profile의 Hermes 기록 세션을 소스별로 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",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:"어시스턴트",copySessionLink:"세션 링크 복사",copySessionId:"세션 ID 복사",export:"내보내기",exportFull:"전체 내보내기 (JSON)",exportCompressed:"압축 내보내기 (TXT)",exportCompressing:"컨텍스트 압축 중, 잠시 기다려주세요...",exportSuccess:"세션을 내보냈습니다",exportFailed:"내보내기 실패",renamed:"이름이 변경되었습니다",renameFailed:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",truncated:"... (잘림)",executionDuration:"실행 시간",thinkingLabel:"사고 과정",thinkingInProgress:"사고 중…",thinkingShow:"사고 과정 펼치기",thinkingHide:"사고 과정 접기",thinkingDuration:"관측 {duration}",thinkingChars:"{count}자",copyBubble:"메시지 복사",copiedBubble:"복사됨",copyFailed:"복사 실패",playSpeech:"음성 재생",pauseSpeech:"일시정지",resumeSpeech:"재개",stopSpeech:"중지",speechNotSupported:"이 브라우저는 음성 재생을 지원하지 않습니다",searchEnterHint:"Enter로 열기 · Esc로 닫기",searchHint:"Cmd/Ctrl+K",searchScope:"검색 범위: Web UI 로컬 세션 DB만 포함하며 읽기 전용 Hermes 기록 세션은 포함하지 않습니다.",searchFailed:"세션 검색 실패",searchNoSnippet:"표시할 요약이 없습니다",searchNoResults:"일치하는 세션이 없습니다",searchRecent:"최근 세션",searchEmpty:"최근 세션",searchPlaceholder:"세션 검색...",searchSubtitle:"제목 또는 메시지 내용으로 검색",searchTitle:"세션 검색",stopGateway:"Gateway 중지",start:"시작",workspaceSetFailed:"Workspace 설정 실패",workspaceSet:"Workspace가 설정되었습니다",workspacePlaceholder:"프로젝트 경로 입력, 예: /home/user/project",workspace:"작업 공간",setWorkspaceTitle:"세션 Workspace 설정",setWorkspace:"Workspace 설정",modelSetFailed:"모델 설정 실패",modelSet:"모델이 설정되었습니다",setModelTitle:"세션 모델 설정",setModel:"모델 설정",newCliChat:"새 CLI",cliEmptyState:"CLI 채팅 시작",autoPlaySpeech:"음성 자동 재생"},jobs:{title:"예약 작업",createJob:"작업 생성",editJob:"작업 편집",noJobs:"예약된 작업이 없습니다. 새로 만들어 시작하세요.",name:"이름",namePlaceholder:"작업 이름",schedule:"스케줄 (Cron 표현식)",schedulePlaceholder:"예: 0 9 * * *",quickPresets:"빠른 프리셋",selectPreset:"프리셋 선택...",presetEveryMinute:"매 분",presetEvery5Min:"매 5분",presetEveryHour:"매 시간",presetEveryDay:"매일 00:00",presetEveryDay9:"매일 09:00",presetEveryMonday:"매주 월요일 09:00",presetEveryMonth:"매월 1일 09:00",prompt:"프롬프트",promptPlaceholder:"실행할 프롬프트",deliverTarget:"전송 대상",origin:"출처",local:"로컬",repeatCount:"반복 횟수 (선택)",modelPlaceholder:"기본 모델",repeatPlaceholder:"비워두면 무한 반복",jobCreated:"작업이 생성되었습니다",jobUpdated:"작업이 업데이트되었습니다",nameRequired:"이름을 입력해 주세요",scheduleRequired:"스케줄을 입력해 주세요",loadFailed:"작업을 불러오지 못했습니다",jobPaused:"작업이 일시 정지되었습니다",jobResumed:"작업이 재개되었습니다",jobTriggered:"작업이 실행되었습니다",modelUpdated:"모델이 업데이트되었습니다",jobDeleted:"작업이 삭제되었습니다",status:{running:"실행 중",paused:"일시 정지",disabled:"비활성화",scheduled:"예약됨"},info:{model:"모델",schedule:"일정",lastRun:"마지막 실행",nextRun:"다음 실행",deliver:"전송",repeat:"반복"},action:{pause:"일시 정지",pauseJob:"작업 일시 정지",resume:"재개",resumeJob:"작업 재개",runNow:"즉시 실행",triggerImmediately:"즉시 실행"},runHistory:{title:"실행 기록",runs:"회 실행",noRuns:"실행 기록이 없습니다."}},skills:{title:"스킬",searchPlaceholder:"스킬 검색...",noMatch:"검색과 일치하는 스킬이 없습니다",noSkills:"스킬을 찾을 수 없습니다",backTo:"돌아가기",attachedFiles:"첨부 파일",loadFailed:"스킬을 불러오지 못했습니다",fileLoadFailed:"파일을 불러오지 못했습니다",modified:"사용자 수정됨",archived:"보관됨",pinned:"고정됨",pin:"스킬 고정",unpin:"고정 해제",pinFailed:"고정 상태 변경 실패",toggleFailed:"스킬 상태를 전환하지 못했습니다",source:{builtin:"내장",hub:"Hub",local:"로컬"}},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:"에이전트 루트",python:"Python",scanCwd:"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:"선택 지우기",currentDefault:"현재 기본값",defaultShort:"기본값",builtIn:"내장",customType:"사용자 지정",provider:"공급자",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 200000 (선택사항)",local:"로컬 ({host})",selectProviderRequired:"Provider를 선택해 주세요",baseUrlRequired:"Base URL을 입력해 주세요",apiKeyRequired:"API Key를 입력해 주세요",modelRequired:"기본 모델을 선택해 주세요",enterBaseUrl:"먼저 Base URL을 입력해 주세요",unexpectedFormat:"예상치 못한 응답 형식입니다",foundModels:"{count}개의 모델을 찾았습니다",fetchFailed:"모델을 가져오지 못했습니다",xaiWaiting:"열린 xAI 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.",xaiOpenLink:"xAI 인증 페이지 열기",xaiLoginTitle:"xAI Grok OAuth 로그인",xaiExpired:"인증 링크가 만료되었습니다. 다시 시도하세요.",xaiCopyLink:"인증 링크 복사",xaiApproved:"로그인 성공!",visibilitySelectOne:"최소 하나의 표시 모델을 유지하세요",visibilitySaved:"표시 모델이 저장되었습니다",visibilitySaveFailed:"표시 모델 저장 실패",visibilityHint:"Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.",showAllModels:"모든 모델 표시",searchPlaceholder:"모델 검색...",removeCustomModel:"목록에 없는 이 모델 제거",more:"개 더",models:"모델 목록",manageVisibleModelsFor:"{name} 표시 모델 관리",manageVisibleModels:"표시 모델 관리",getApiKey:"API Key 가져오기",count:"개 모델",aliasUseOriginal:"원본 ID로 복원",aliasTitleFor:"{model}의 표시 이름",aliasTitle:"모델 표시 이름",aliasSaveFailed:"표시 이름 저장 실패",aliasPlaceholder:"비워두면 원본 모델 ID 사용",aliasManageFor:"{provider}의 표시 이름",aliasManage:"표시 이름",aliasHint:"Web UI 표시 이름만 변경합니다. Hermes에는 여전히 원본 모델 ID가 전달됩니다.",aliasEdit:"이름 변경",aliasCanonical:"원본 ID: {model}"},profiles:{title:"프로필",create:"프로필 생성",import:"가져오기",export:"내보내기",rename:"이름 변경",delete:"삭제",switchTo:"Hermes Profile 전환",switchConfirm:"`hermes profile use {name}`를 실행하고 Hermes CLI active profile을 변경합니다. 계속하시겠습니까?",switchSuccess:'Hermes active profile이 "{name}"(으)로 전환되었습니다',switchFailed:"Hermes Profile 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.",createSuccess:'프로필 "{name}"이(가) 생성되었습니다',createFailed:"프로필 생성 실패",renameSuccess:"프로필 이름이 변경되었습니다",renameFailed:"프로필 이름 변경 실패",deleteConfirm:'프로필 "{name}"을(를) 삭제하시겠습니까?',deleteSuccess:"프로필이 삭제되었습니다",deleteFailed:"프로필 삭제 실패",exportSuccess:"프로필이 내보내기되었습니다",exportFailed:"프로필 내보내기 실패",importSuccess:"프로필이 가져오기되었습니다",importFailed:"프로필 가져오기 실패",importSelectFile:"아카이브 파일 선택",importInvalidFile:"유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)",name:"프로필 이름",namePlaceholder:"영문, 숫자, 하이픈만 사용 가능",nameValidation:"프로필 이름에는 소문자, 숫자, 밑줄, 하이픈만 사용할 수 있습니다",newName:"새 이름",newNamePlaceholder:"새 이름을 입력하세요",cloneFromCurrent:"현재 프로필에서 복제",cloneCleanupNotice:"복제 시 독점형 플랫폼 자격 증명(Weixin / Telegram / Slack 등)은 자동으로 건너뛰어 원본 프로필과의 충돌을 방지합니다",cloneStrippedCredentials:"독점 자격 증명 {count}개 제거됨: {list}",cloneDisabledPlatforms:"플랫폼 {count}개 비활성화됨: {list}",cloneStrippedConfigCredentials:"config.yaml에서 임베디드 자격 증명 {count}개 제거됨: {list}",archivePath:"아카이브 경로",archivePathPlaceholder:"아카이브 파일의 서버 경로",importName:"프로필 이름 (선택)",importNamePlaceholder:"비워두면 아카이브 이름을 사용합니다",active:"활성",model:"모델",gateway:"게이트웨이",alias:"별칭",provider:"공급자",path:"경로",skills:"스킬",hasEnv:".env 있음",hasSoulMd:"soul.md 있음",noProfiles:"프로필이 없습니다. 새로 만들어 시작하세요.",avatar:{title:"사용자 지정 아바타",customize:"아바타",upload:"이미지 업로드",random:"무작위 생성",reset:"기본값 복원",hint:"PNG, JPEG, WebP 지원, 최대 1MB",invalidType:"PNG, JPEG 또는 WebP 이미지를 선택하세요",tooLarge:"아바타 이미지는 1MB를 초과할 수 없습니다",saveSuccess:"아바타가 저장되었습니다",saveFailed:"아바타 저장 실패",resetSuccess:"기본 아바타로 복원되었습니다",resetFailed:"기본 아바타 복원 실패"},runtime:{activeProfile:"현재: {name}",bridgeWorker:"Bridge 상태",gateway:"게이트웨이",active:"활성",activeTag:"현재",idle:"대기 중",running:"실행 중",stopped:"중지됨",restartGateway:"Gateway 재시작",restartProfile:"프로필 재시작",switchProfile:"프론트엔드 프로필 전환",gatewayRestarted:"Gateway가 재시작되었습니다: {name}",gatewayRestartFailed:"Gateway 재시작 실패",profileRestarted:"프로필이 재시작되었습니다: {name}",profileRestartFailed:"프로필 재시작 실패"}},logs:{title:"로그",all:"전체",searchPlaceholder:"검색...",refresh:"새로고침",noEntries:"로그 항목 없음"},settings:{title:"설정",saved:"저장됨",saveFailed:"저장 실패",tabs:{display:"표시",account:"현재 계정",users:"계정 관리",agent:"에이전트",memory:"메모리",compression:"압축",session:"세션",privacy:"개인정보",apiServer:"API 서버",models:"모델",voice:"음성"},display:{streaming:"스트리밍 응답",streamingHint:"AI 응답을 실시간으로 표시",compact:"컴팩트 모드",compactHint:"메시지 간격 줄이기",showReasoning:"추론 과정 표시",showReasoningHint:"모델의 생각 과정 표시",showCost:"비용 표시",showCostHint:"응답에 토큰 사용량 표시",inlineDiffs:"인라인 변경사항",inlineDiffsHint:"코드 변경사항을 인라인으로 표시",bellOnComplete:"완료 알림음",bellOnCompleteHint:"AI 응답 완료 시 알림음 재생",busyInputMode:"바쁨 입력 모드",busyInputModeHint:"AI 처리 중에도 입력 허용",theme:"테마",themeHint:"라이트, 다크 또는 시스템 설정 따르기",themeLight:"라이트",themeDark:"다크",themeSystem:"시스템"},agent:{maxTurns:"최대 턴 수",maxTurnsHint:"대화당 최대 상호작용 라운드 수",gatewayTimeout:"게이트웨이 시간초과",gatewayTimeoutHint:"요청 시간초과 (초)",restartDrainTimeout:"재시작 드레인 시간초과",restartDrainTimeoutHint:"재시작 전 드레인 시간초과 (초)",toolEnforcement:"도구 실행 정책",toolEnforcementHint:"도구 호출 실행 모드 제어",auto:"자동",always:"항상",never:"사용 안 함"},memory:{enabled:"메모리 활성화",enabledHint:"AI가 대화 컨텍스트를 기억하도록 허용",userProfile:"사용자 프로필",userProfileHint:"AI가 사용자 선호를 기억하도록 허용",charLimit:"메모리 문자 제한",charLimitHint:"MEMORY.md 최대 문자 수",userCharLimit:"사용자 프로필 문자 제한",userCharLimitHint:"USER.md 최대 문자 수"},compression:{enabled:"압축 활성화",enabledHint:"긴 채팅 기록이 모델 컨텍스트를 넘기 전에 자동 압축",threshold:"압축 임계값",thresholdHint:"추정 토큰이 이 컨텍스트 비율을 넘으면 압축 시작",targetRatio:"목표 비율",targetRatioHint:"압축 후 기록 크기를 컨텍스트 비율로 지정",protectLastN:"최근 메시지 보호",protectLastNHint:"이 수만큼 최신 메시지는 압축하지 않음",protectFirstN:"처음 메시지 보호",protectFirstNHint:"이 수만큼 처음 메시지는 압축하지 않음"},session:{mode:"초기화 모드",modeHint:"세션 초기화 트리거 조건",modeBoth:"유휴 + 예약",modeIdle:"유휴만",modeDaily:"예약만",modeNone:"안함 (수동만)",idleMinutes:"유휴 시간초과",idleMinutesHint:"자동 초기화 대기 시간 (분)",atHour:"예약 초기화 시간",humanOnly:"사람 세션만 표시",humanOnlyHint:"하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",liveMonitorHumanOnly:"라이브 모니터: 사람 세션만 표시",liveMonitorHumanOnlyHint:"라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",atHourHint:"매일 지정한 시간에 세션 초기화",requireAuth:"세션 인증",requireAuthHint:"세션 작업에 인증 필요"},privacy:{redactPii:"개인정보 마스킹",redactPiiHint:"민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)"},apiServer:{enable:"활성화",enableHint:"API 서버 활성화",host:"호스트",hostHint:"수신 주소",port:"포트",portHint:"수신 포트",key:"키",keyHint:"API 접근 키",cors:"CORS 출처",corsHint:"허용된 교차 출처"},voice:{ttsProvider:"TTS 제공자",ttsProviderHint:"메시지 재생에 사용할 텍스트 음성 변환 엔진 선택",providerWebSpeech:"WebSpeech API (브라우저)",providerOpenai:"OpenAI TTS",providerCustom:"사용자 정의 엔드포인트 (OpenAI 호환)",providerEdge:"Edge TTS (무료, API Key 불필요)",webspeechVoice:"음성",webspeechVoiceHint:"브라우저 또는 OS에서 음성 선택",webspeechVoicePlaceholder:"자동 (기본 음성)",openaiKey:"API 키",openaiKeyHint:"TTS 접근 권한이 있는 OpenAI API 키",openaiUrl:"API 기본 URL",openaiUrlHint:"예: https://api.openai.com/v1/audio/speech",openaiModel:"모델",openaiModelHint:"tts-1 (빠름) / tts-1-hd (고음질)",openaiVoice:"음색",openaiVoiceHint:"합성에 사용할 음색",customHint:"모든 OpenAI 호환 TTS API 사용 가능 — GPT-SoVITS, CosyVoice 등 지원",customUrl:"API URL",customUrlHint:"TTS 서비스의 기본 URL",customUrlPlaceholder:"로컬 어댑터에 설정된 주소 (예: http://127.0.0.1:9880)",customApiKey:"API 키 (선택사항)",customApiKeyHint:"일부 사용자 정의 엔드포인트는 인증 필요",customApiKeyPlaceholder:"필요하지 않으면 비워둠",edgeHint:"Microsoft Edge TTS 기반 (node-edge-tts).",edgeUrl:"어댑터 URL",edgeUrlHint:"Edge TTS 어댑터 주소 (예: http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"음색",edgeVoiceHint:"음성 합성에 사용할 음색 선택",edgeRate:"속도",edgeRateHint:"음성 속도 조절 (0.5~2.0배)",edgePitch:"음높이",edgePitchHint:"음성 음높이 조절 (-20~+20 Hz)",testTitle:"음성 테스트",testText:"테스트 텍스트",testTextPlaceholder:"테스트할 텍스트 입력...",testTextDefault:"안녕하세요, 음성 테스트입니다.",testButton:"테스트",testButtonPlaying:"재생 중...",testFailed:"테스트 실패: {error}",providerMimo:"MiMo TTS",mimoHint:"샤오미 MiMo TTS — 프리셋 음성, 음성 디자인, 음성 클론 세 가지 모드 지원",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com에서 발급",mimoApiKeyPlaceholder:"MiMo API Key",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 잠금 해제됨"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key 입력",noProviders:"구성된 공급자가 없습니다",save:"저장",saveFailed:"저장 실패",saved:"저장됨"}},platform:{requireMention:"{'@'}멘션 필요",requireMentionGroup:"그룹에서 {'@'}멘션 시에만 응답",requireMentionChannel:"채널에서 {'@'}멘션 시에만 응답",requireMentionRoom:"방에서 {'@'}멘션 시에만 응답",reactions:"반응",reactionsHint:"메시지에 이모지 반응",freeResponseChats:"자유 응답 채팅",freeResponseChatsHint:"{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)",freeResponseChannels:"자유 응답 채널",freeResponseChannelsHint:"{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)",freeResponseRooms:"자유 응답 방",freeResponseRoomsHint:"{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)",mentionPatterns:"사용자 지정 멘션 패턴",mentionPatternsHint:"추가 트리거 패턴",autoThread:"자동 스레드",autoThreadHint:"{'@'}멘션 후 자동으로 스레드 생성",autoThreadHintRoom:"방에서 자동으로 스레드 생성",dmMentionThreads:"DM 멘션 스레드",dmMentionThreadsHint:"DM에서 멘션 시 스레드로 응답",allowBots:"봇 메시지 허용",allowBotsHint:"다른 봇의 메시지에 응답",allowedChannels:"허용된 채널",allowedChannelsHint:"채널 ID 허용 목록 (쉼표로 구분)",ignoredChannels:"무시할 채널",ignoredChannelsHint:"봇이 응답하지 않는 채널 ID (쉼표로 구분)",noThreadChannels:"스레드 없는 채널",noThreadChannelsHint:"스레드 없이 응답할 채널 ID (쉼표로 구분)",exclusiveTokenWarning:"이 플랫폼은 독점 토큰 잠금을 사용합니다. 각 프로필은 다른 프로필과 충돌하지 않도록 서로 다른 ID 토큰을 사용해야 합니다.",botToken:"Bot Token",botTokenHint:"개발자 포털에서 발급받은 Bot Token",accessToken:"Access Token",accessTokenHint:"Matrix 액세스 토큰",homeserver:"Homeserver URL",homeserverHint:"Matrix 홈서버 URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",clientId:"Client ID",clientIdHint:"DingTalk Client ID",clientSecret:"Client Secret",clientSecretHint:"DingTalk Client Secret",botId:"Bot ID",botIdHint:"WeCom Bot ID",wecomSecretHint:"WeCom Bot Secret",waEnabled:"WhatsApp 활성화",waEnabledHint:"QR 코드 페어링으로 WhatsApp 활성화",weixinToken:"Weixin Token",weixinTokenHint:"weixin CLI QR 로그인에서 가져오기 (hermes weixin)",accountId:"Account ID",accountIdHint:"Weixin Account ID",qrLogin:"QR 로그인",qrRelogin:"다시 로그인",qrFetching:"QR 코드를 가져오는 중...",qrScanHint:"WeChat으로 QR 코드를 스캔하여 로그인",qrScanedHint:"스캔됨, 휴대폰에서 확인해 주세요...",qqSandboxHint:"샌드박스 환경 활성화(테스트용)",qqSandbox:"샌드박스 모드",qqQrScanHint:"QQ로 위 QR 코드를 스캔하거나 휴대폰에서 링크를 열어 바인딩을 완료하세요",qqMarkdownHint:"Markdown 형식 메시지 활성화(일부 클라이언트는 지원하지 않을 수 있음)",qqMarkdown:"Markdown 지원",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"사용자 ID 또는 OpenID 허용 목록, 쉼표로 구분",allowedUsers:"허용 사용자",allowAllUsersHint:"모든 사용자의 메시지를 허용합니다. 끄면 허용 목록을 사용합니다",allowAllUsers:"모든 사용자 허용"},language:{label:"언어",zh:"中文",en:"English",ko:"한국어"},terminal:{sessions:"세션",newTab:"새 터미널",closeSession:"이 세션을 닫으시겠습니까?",sessionExited:"종료됨",processExited:"프로세스가 종료되었습니다 (코드 {code})",noSessions:"터미널 세션이 없습니다",connectionFailed:"터미널에 연결하지 못했습니다",connectionError:"연결 오류",connectionClosed:"연결이 닫혔습니다"},usage:{title:"사용량 통계",refresh:"새로고침",totalTokens:"총 토큰 수",inputTokens:"입력",outputTokens:"출력",totalSessions:"총 세션 수",avgPerDay:"일평균 ~{n}",estimatedCost:"예상 비용",cacheHitRate:"캐시 적중률",modelBreakdown:"모델별 분포",dailyTrend:"일별 사용량",date:"날짜",tokens:"토큰",cache:"캐시",cacheRead:"캐시 읽기",cacheWrite:"캐시 쓰기",sessions:"세션",cost:"비용",noData:"사용량 데이터 없음"},skillsUsage:{title:"스킬 사용량",subtitle:"Hermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_5_22_1:"Hermes 세션 목록 API가 Web UI 로컬 세션 저장소 대신 Profile 데이터베이스를 읽도록 수정",new_0_5_23_1:"Bridge 전용 채팅 슬래시 명령과 지역화된 명령 제안 추가",new_0_5_23_2:"모델 컨텍스트, 사용량, 압축을 오염시키지 않고 세션 재생용 명령 기록 저장",new_0_5_23_3:"자격 증명이 Profile 간에 새지 않도록 gateway Profile 환경 변수 격리",new_0_5_23_4:"시작 충돌 방지를 위해 gateway 할당 중 Web UI 포트 예약",new_0_5_23_5:"self-update 재시작에서 성공한 helper 종료를 실패로 보고하지 않도록 수정",new_0_5_24_1:"Bridge 채팅을 API Server의 멀티모달 입력, 시스템 프롬프트, workspace 컨텍스트 처리와 정렬",new_0_5_25_1:"그룹 채팅 룸 재설정 및 복제 액션 추가",new_0_5_25_2:"사용자 지정 배포 레이아웃을 위해 Web UI 상태 디렉터리 설정 가능",new_0_5_25_3:"음성 설정에 MiMo TTS 공급자 추가",new_0_5_25_4:"브라우저 CORS 실패 방지를 위해 사용자 지정 공급자 모델 목록을 백엔드에서 가져오도록 변경",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 브라우저 테스트, 채팅 스트리밍 계약 커버리지, 공급자 모델 커버리지 및 커버리지 기준선 추가",new_0_5_26_1:"채팅 기록과 렌더링된 메시지에서 Windows 및 로컬 Markdown 미디어 경로 지원",new_0_5_26_2:"빈 assistant 기록을 필터링하고 새 실행 시작 시 오래된 압축 상태 정리",new_0_5_26_3:"동시 쓰기 손상을 줄이기 위해 config 및 Profile 업데이트에 잠금 쓰기 추가",new_0_5_26_4:"QQBot 및 DingTalk 채널 설정 추가",new_0_5_26_5:"CLI 포트 감지를 이식 가능하게 만들고 모바일 터미널 드로어 크기 개선",new_0_5_26_6:"Bridge Profile 환경 격리 및 Python 환경 간 Hermes plugin 발견 수정",new_0_5_26_7:"중지된 gateway 상태를 Web UI 진단으로 설명하고 로그 로딩 상태 안정화",new_0_5_26_8:"세션 재설정 모드 옵션, 사용자 지정 공급자 base URL 처리, 동적 전달 대상 수정",new_0_5_26_9:"채팅 입력 바에 로컬 도구 호출 추적 표시 토글 추가",new_0_5_26_10:"소스 checkout이 없을 때 Hermes Agent 패키지 설치 지원",new_0_5_26_11:"SuperGrok 구독자를 위한 xAI Grok OAuth 로그인 추가 및 Grok 모델 프리셋 업데이트",new_0_5_26_12:"브라우저, 채팅 스트리밍, 공급자, gateway, config, plugin, Bridge 테스트 커버리지 확장",new_0_5_27_1:"Bridge 채팅에 세션별 모델 설정 추가, 각 세션에서 provider와 model 독립 저장",new_0_5_27_2:"Bridge 세션을 우클릭하고 모델 설정을 선택해 해당 세션의 모델 전환",new_0_5_27_3:"실행 시 세션 모델을 검증하고 저장된 모델을 사용할 수 없으면 현재 기본 모델로 fallback",new_0_5_27_4:"컨텍스트 압축은 기본적으로 현재 Profile의 기본 선택 모델을 따름",new_0_5_30_1:"Bridge 채팅이 구조화된 기록을 보존하여 평탄화된 도구 기록으로 인한 간헐적 무응답과 도구 실행 누락 수정",new_0_5_30_2:"여러 agent의 그룹 채팅 mention 라우팅을 개선하고 전달 전 각 agent 자신의 @ mention 제거 및 새로고침 후 표시 이름 유지",new_0_5_30_3:"모델 페이지, 채팅 모델 드롭다운, 세션 모델 선택을 active Profile 범위로 제한하고 기본 표시 정확도 개선",new_0_5_30_4:"Gateway 관리 단순화: 독립 Gateway 페이지 제거, 각 Profile 플랫폼 설정 확인 후 필요한 gateway 시작, 경량 runner로 시작/재시작 관리",new_0_5_30_5:"Docker, Termux, Windows의 gateway 시작 개선: runtime lock 처리, 포트 충돌 정리, 백그라운드 실행, 재시작 지원",new_0_5_30_6:"Windows 호환성 강화: 경로 감지, 파일 다운로드, job/update 하위 프로세스에서 터미널 창이 깜박이지 않음",new_0_5_30_7:"config 쓰기와 provider preset 수정: .env 키 검증, FUN-Codex를 Responses API로 라우팅, Z.AI/GLM 모델 목록 갱신",new_0_5_30_8:"접힌 사이드바 레이아웃, 짧은 그룹 라벨, 사이드바 구분선, 대화 outline 스타일 등 프론트엔드 세부 개선",new_0_5_30_9:"컨텍스트 압축이 Profile 압축 설정을 따르고, 오래된 snapshot은 전체 재압축 대신 이전 요약과 안전한 tail 재사용",new_0_5_31_1:"Bridge broker 재시작 안정화, 그룹 채팅 최종 스트림 렌더링 수정, 그룹 채팅 {'@'}all 라우팅 추가",new_0_5_31_2:"파일 관리자가 절대 경로를 복사할 수 있고 모바일 세션 드로어가 채팅 콘텐츠 뒤로 가지 않음",new_0_5_31_3:"Profile 선택기에 아바타, 사용자 지정 아바타 업로드, 런타임 상태 모달, gateway/Profile 재시작 액션 추가",new_0_5_31_4:"Profile 아바타가 단일 채팅, 그룹 채팅, 접힌 사이드바에 표시되며 Web UI 메타데이터 저장과 Windows 안전 경로 지원",new_0_5_31_5:"Docker, Termux, Windows gateway 감지 및 재시작 확인을 개선하고 managed gateway liveness 판단에 gateway_state/gateway.pid 사용",new_0_5_31_6:"APIKEY.FUN 이미지 생성 미디어 endpoint와 내장 apikey-image-gen skill 추가, active Profile의 fun-codex provider로 텍스트-이미지, 이미지-이미지, 이미지 편집 지원",new_0_5_33_1:"단일 채팅과 그룹 채팅의 실행 실패 및 Socket 오류를 빨간 Agent 메시지로 메시지 목록에 유지하여 잠깐 나타났다 사라지지 않도록 수정",new_0_5_33_2:"세션 검색을 선택된 Profile로 제한할 수 있으며, Profile을 선택하지 않으면 모든 Profile을 검색",new_0_5_33_3:"Skills 페이지에 중국어/영어 추천 문서를 추가하고, 선택된 Skill을 다시 클릭하면 선택을 해제하도록 지원",new_0_5_33_4:"사용하지 않는 changelog 로컬라이즈 항목을 제거해 frontend i18n 크기 축소",new_0_5_33_5:"중국어 Windows 시스템에서 netstat 출력 인코딩 파싱 실패로 agent bridge 시작이 실패하는 문제 수정",new_0_5_33_6:"Nous Portal preset 모델 목록을 공개 catalog와 Portal 추천 모델에 맞춰 갱신",new_0_5_33_7:"Profile 목록과 런타임 상태가 Profile 이름은 디렉터리에서, 기본 모델은 config에서 읽어 CLI 표 열 너비로 인한 파싱 오류를 방지",new_0_5_34_1:"세션/그룹 채팅 저장 시 멀티모달 tool 결과를 정규화해 base64 이미지가 리플레이에 섞이지 않도록 수정",new_0_5_34_2:"사용자 지정 Hermes 모델을 backend 관리 설정에 저장하고 모델 추가/삭제 endpoint 추가",new_0_5_34_3:"Bridge 실행 완료 후 최종 컨텍스트 사용량과 tool 상태 업데이트 정확도 개선",new_0_5_34_4:"Kanban 보드 필터링, 담당자 표시, 카드 작업, 작업 상세 처리 개선",new_0_5_34_5:"고정 prompt/tool 컨텍스트를 캐시하고 전체 컨텍스트 token 합계를 표시하도록 압축 사용량 수정",new_0_5_34_6:"그룹 채팅 Agent별 고정 컨텍스트를 캐시하고 실제 압축이 시작될 때만 진행 상태 표시",new_0_5_34_7:"Web UI 내장 Skills를 모든 Profile에 동기화 주입하고 로그에 대상 Profile 기록",new_0_5_34_8:"Windows에서 Kanban 기능이 비정상이라면 최신 Kanban 데이터베이스 마이그레이션 수정이 포함된 Hermes로 업그레이드하세요",new_0_5_35_1:"Bridge 세션은 서로 다른 session 간 동시 실행을 지원하며, 같은 session 실행은 메시지 순서를 보존하도록 직렬화됩니다",new_0_5_35_2:"Performance Monitor 페이지를 추가해 시스템 CPU/메모리, Web UI, Bridge Broker, Workers, 활성 세션 상태를 확인할 수 있습니다",new_0_5_35_3:"Worker별 CPU, 메모리, Profile, 세션 수, 실행 상태를 보여주는 리소스 지표 추가",new_0_5_35_4:"Bridge worker 수명 주기 정리를 개선해 Broker 종료나 부모 프로세스 종료 시 worker를 회수하고 남는 Python 프로세스를 줄입니다",new_0_5_35_5:"macOS, Windows, Linux, Docker, Termux용 fallback으로 모니터링 리소스 수집의 크로스 플랫폼 호환성 강화",new_0_5_35_6:"Agent 초기화 중 worker request로 Performance Monitor가 막히지 않도록 개선해 Windows의 request timed out 가능성을 낮춤",new_0_5_35_7:"Chat Markdown에 텍스트 콘텐츠 인라인 미리보기를 추가하고, 다운로드 아이콘은 preview drawer 대신 파일을 직접 다운로드합니다",new_0_5_35_8:"콘텐츠 preview drawer 개선: 모바일 닫기 동작, 모바일 전체 너비, 데스크톱 800px 너비, 텍스트/Markdown 배경 통일",new_0_6_0_1:"계정별 및 Profile별 관리가 세션, 모델, 사용량, Kanban, 작업, 업로드, 미디어, 관련 Hermes API를 일관되게 보호합니다",new_0_6_0_2:"내장 미디어 Skills는 생성된 서버 토큰을 미디어 엔드포인트에만 사용하고 요청한 Profile에서 fun-codex/xAI 자격 증명을 확인합니다",new_0_6_0_3:"단일 채팅과 그룹 채팅이 현재 Hermes Profile을 run instructions에 주입해 Skills가 X-Hermes-Profile을 보낼 수 있습니다",new_0_6_0_4:"delegate_task subagent 진행 상황이 시작, 도구, 진행, 완료 상태로 채팅 UI에 스트리밍됩니다",new_0_6_0_5:"실행 중지 또는 중단 시 임시 이벤트를 정리해 이전 abort 상태가 다음 채팅으로 넘어가지 않게 했습니다",new_0_6_0_6:"계정 관리, 기본 자격 증명, 계정/Profile 관리, 업로드/다운로드, 내장 미디어 Skills 문서와 웹사이트 문구를 업데이트했습니다",new_0_6_0_7:"로그인 IP 잠금을 지우고 기본 admin / 123456 로그인을 재설정하는 CLI 유지보수 명령을 추가했습니다",new_0_6_0_8:"0.6.0은 Web UI의 단일 사용자 버전과 다중 사용자 버전의 경계입니다. 다중 사용자 모드에 문제가 있으면 issue를 제출하고, 필요하면 0.5.35 단일 사용자 버전으로 되돌리세요"},files:{title:"파일",tree:"디렉터리 트리",list:"파일 목록",breadcrumbRoot:"홈",newFile:"새 파일",newFolder:"새 폴더",upload:"업로드",refresh:"새로고침",open:"열기",edit:"편집",preview:"미리보기",download:"다운로드",copyPath:"경로 복사",rename:"이름 변경",delete:"삭제",name:"이름",size:"크기",modified:"수정일",actions:"작업",emptyDir:"빈 디렉터리",loading:"불러오는 중...",confirmDelete:'"{name}"을(를) 삭제하시겠습니까?',confirmDeleteDir:'디렉터리 "{name}"과 그 내부 항목을 모두 삭제하시겠습니까?',deleteFailed:"삭제 실패",deleted:"삭제됨",renameTo:"새 이름",newFileName:"파일 이름",newFolderName:"폴더 이름",created:"생성됨",createFailed:"생성 실패",renamed:"이름이 변경됨",renameFailed:"이름 변경 실패",uploadSuccess:"{count}개 파일이 업로드되었습니다",uploadFailed:"업로드 실패",saveFailed:"저장 실패",saved:"저장됨",unsavedChanges:"저장하지 않은 변경 사항이 있습니다. 취소하시겠습니까?",pathCopied:"경로가 복사되었습니다",fileTooLarge:"파일이 너무 큽니다 (최대 10MB)",permissionDenied:"보호된 파일은 수정할 수 없습니다",notFound:"파일 또는 디렉터리를 찾을 수 없습니다",backendError:"파일 작업 실패",dragDropHint:"여기로 파일을 드래그하여 업로드",closeEditor:"편집기 닫기",closePreview:"닫기",saveFile:"저장",fileTree:"파일 트리"},groupChat:{title:"그룹 채팅",createRoom:"방 만들기",joinByCode:"코드로 참여",roomName:"방 이름",roomNamePlaceholder:"방 이름을 입력하세요",inviteCode:"초대 코드",autoGenerate:"자동 생성",noRooms:"아직 방이 없습니다",selectOrCreate:"방을 선택하거나 만들어 채팅을 시작하세요",agents:"에이전트",addAgent:"에이전트 추가",selectProfile:"프로필 선택",agentAdded:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",agentAddFailedCount:"{count}개의 에이전트를 추가하지 못했습니다: {details}",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",copyRoomLink:"방 링크 복사",deleteRoomConfirm:"이 방을 삭제하시겠습니까?",clearContext:"컨텍스트 지우기",clearContextConfirm:"이 방의 컨텍스트를 지우시겠습니까? 메시지와 압축 스냅샷은 삭제되고 에이전트와 멤버는 유지됩니다.",contextCleared:"컨텍스트가 지워졌습니다",you:"나",joined:"방에 참여했습니다",joinFailed:"방 참여에 실패했습니다",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송)",enterCode:"초대 코드를 입력하세요",yourName:"이름",yourNamePlaceholder:"표시 이름을 입력하세요",yourDescription:"설명 (선택)",yourDescriptionPlaceholder:"자신을 소개해 주세요...",agentName:"에이전트 이름",agentNamePlaceholder:"사용자 지정 이름 (빈칸=프로필 이름)",agentDesc:"에이전트 설명",agentDescPlaceholder:"이 에이전트가 하는 일을 설명...",agentReplying:"이(가) 응답 중...",agentCompressing:"이(가) 컨텍스트 압축 중...",compressionSettings:"압축 설정",triggerTokens:"압축 트리거 토큰",triggerTokensDesc:"이 토큰 수를 초과하면 컨텍스트 압축이 시작됩니다",maxHistoryTokens:"최대 기록 토큰",maxHistoryTokensDesc:"압축된 컨텍스트의 최대 토큰 수",tailMessageCount:"최근 메시지 수",tailMessageCountDesc:"압축 후 그대로 유지할 최근 메시지 수",compressionConfig:"압축 설정",compressNow:"지금 압축",compressingInProgress:"압축 진행 중",compressionSaved:"압축 설정이 저장되었습니다"},download:{downloading:"다운로드 중...",downloadFailed:"다운로드 실패",fileNotFound:"파일을 찾을 수 없거나 삭제되었습니다",fileTooLarge:"파일이 너무 큽니다 (제한 초과)",backendError:"파일 읽기에 실패했습니다. 원격 환경이 사용 불가능할 수 있습니다",backendTimeout:"파일 읽기 시간 초과",unsupportedBackend:"현재 터미널 백엔드는 파일 다운로드를 지원하지 않습니다",invalidPath:"잘못된 파일 경로",contentDisplay:"내용 표시",download:"다운로드",downloadFile:"파일 다운로드"},gateways:{title:"게이트웨이",running:"실행 중",stopped:"중지됨",started:"시작됨",startFailed:"Gateway 시작 실패",stopFailed:"Gateway 중지 실패"},kanban:{title:"Kanban 보드",createTask:"새 작업",noTasks:"작업 없음",allStatuses:"모든 상태",allAssignees:"모든 담당자",columns:{triage:"분류 대기",todo:"할 일",ready:"준비됨",running:"진행 중",blocked:"차단됨",done:"완료됨",archived:"보관됨"},card:{assigneeTooltip:"담당자",priority:{low:"낮음",medium:"보통",high:"높음"},timeAgo:{justNow:"방금",minutes:"{count}분 전",hours:"{count}시간 전",days:"{count}일 전"}},board:{create:"새 보드",archive:"보드 보관",archiveConfirm:"현재 보드를 보관하시겠습니까?",archived:"보드가 보관되었습니다",created:"보드가 생성되었습니다",slugPlaceholder:"보드 식별자, 예: project-a",namePlaceholder:"표시 이름 (선택)",slugRequired:"보드 식별자는 필수입니다"},form:{title:"제목",titlePlaceholder:"작업 제목",titleRequired:"제목은 필수입니다",body:"설명",bodyPlaceholder:"작업 설명 (선택)",assignee:"담당자",selectAssignee:"담당자 선택...",priority:"우선순위",selectPriority:"우선순위 선택..."},detail:{status:"상태",priority:"우선순위",assignee:"담당자",tenant:"테넌트",createdAt:"생성 시간",startedAt:"시작 시간",completedAt:"완료 시간",comments:"댓글",events:"이벤트",runs:"실행 기록",artifacts:"산출 파일",result:"완료 결과",highlights:"핵심 정보",sources:"데이터 소스",sessions:"관련 세션",sessionMessages:"세션 기록",noSessions:"관련 세션을 찾을 수 없습니다."},action:{title:"작업",assign:"할당",assignTo:"할당 대상...",block:"차단",blockReason:"차단 이유",unblock:"차단 해제",complete:"완료",completeSummary:"완료 요약 (선택)"},message:{loadFailed:"작업 로드 실패",taskCreated:"작업이 생성되었습니다",taskAssigned:"작업이 할당되었습니다",taskBlocked:"작업이 차단되었습니다",taskUnblocked:"작업 차단이 해제되었습니다",taskCompleted:"작업이 완료되었습니다"},stats:{total:"합계",tasks:"작업 수"}}},Tt={login:{title:"Hermes Web UI",description:"Entrez votre nom d'utilisateur et votre mot de passe pour continuer.",placeholder:"Jeton d'acces",submit:"Connexion",tokenRequired:"Veuillez entrer votre jeton d'acces",invalidToken:"Jeton invalide",connectionFailed:"Impossible de se connecter au serveur",passwordLogin:"Mot de passe",tokenLogin:"Jeton",usernamePlaceholder:"Nom d'utilisateur",passwordPlaceholder:"Mot de passe",defaultCredentialsHint:"Nom d utilisateur par defaut : admin. Mot de passe par defaut : 123456.",credentialsRequired:"Veuillez entrer le nom d'utilisateur et le mot de passe",invalidCredentials:"Nom d'utilisateur ou mot de passe incorrect",tooManyAttempts:"Trop de tentatives echouees, veuillez reessayer plus tard",sessionExpired:"La session a expire. Veuillez vous reconnecter.",accessDenied:"Vous n'avez pas l'autorisation d'acceder a cette ressource.",passwordMismatch:"Les mots de passe ne correspondent pas",passwordTooShort:"Le mot de passe doit contenir au moins 6 caracteres",setupSuccess:"Login par mot de passe configure avec succes",passwordChanged:"Mot de passe change avec succes",passwordRemoved:"Login par mot de passe supprime",setupPassword:"Configurer le login par mot de passe",changePassword:"Changer le mot de passe",changeUsername:"Changer le nom d'utilisateur",removePasswordLogin:"Supprimer",username:"Nom d'utilisateur",currentPassword:"Mot de passe actuel",newPassword:"Nouveau mot de passe",confirmPassword:"Confirmer le mot de passe",newUsername:"Nouveau nom d'utilisateur",usernameChanged:"Nom d'utilisateur change avec succes",usernameTooShort:"Le nom d'utilisateur doit contenir au moins 2 caracteres",setupDescription:"Gerez le nom d'utilisateur et le mot de passe utilises pour vous connecter.",removeConfirm:"Le login par mot de passe est requis pour les comptes utilisateur.",passwordLoginNotConfigured:"Login par mot de passe non configure",passwordLoginConfigured:"Compte actuel : {username}",defaultCredentialTitle:"Modifiez le compte et le mot de passe par defaut",defaultCredentialMessage:"Le compte connecte utilise encore le nom d utilisateur ou le mot de passe par defaut. Pour eviter tout acces non autorise, modifiez rapidement le nom d utilisateur et le mot de passe du compte actuel.",defaultCredentialAction:"Modifier maintenant",defaultCredentialLater:"Me le rappeler plus tard"},users:{title:"Gestion des comptes",description:"Creez des utilisateurs, attribuez des roles et controlez les profils accessibles aux administrateurs standard.",create:"Creer un utilisateur",edit:"Modifier l utilisateur",username:"Nom d utilisateur",role:"Role",statusLabel:"Statut",profiles:"Profils accessibles",profilesPlaceholder:"Selectionner les profils accessibles",allProfiles:"Tous les profils",noProfiles:"Aucun profil assigne",lastLogin:"Derniere connexion",newPasswordOptional:"Nouveau mot de passe (laisser vide pour conserver)",loadFailed:"Echec du chargement des utilisateurs",deleteConfirm:"Supprimer cet utilisateur ?",enable:"Activer",disable:"Desactiver",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Actif",disabled:"Desactive"}},common:{loading:"Chargement...",cancel:"Annuler",retry:"Réessayer",delete:"Supprimer",edit:"Modifier",save:"Enregistrer",saved:"Enregistre",update:"Mettre a jour",create:"Creer",saveFailed:"Echec de l'enregistrement",deleteFailed:"Echec de la suppression",ok:"OK",copied:"Copie",copy:"Copier",noData:"Aucune donnee",fetch:"Recuperer",add:"Ajouter",enable:"Activer",disable:"Desactiver",configured:"Configure",notConfigured:"Non configure",confirm:"Confirmer",expand:"Developper",collapse:"Reduire",stop:"Arrêter",start:"Démarrer",expired:"Expiré"},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",performance:"Performance",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",files:"Fichiers",groupChat:"Chat de groupe",groupConversation:"Conversation",groupConversationShort:"Conv.",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"Systeme",groupSystemShort:"Sys",groupMonitoring:"Suivi",groupMonitoringShort:"Suivi",settings:"Parametres",connected:"Connecte",disconnected:"Deconnecte",updateTip:'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',updateVersion:"Mettre a jour vers v{version}",reloadClientVersion:"Recharger pour v{version}",updating:"Mise a jour...",updateSuccess:"Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.",updateFailed:"Echec de la mise a jour",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible",kanban:"Kanban",groupTools:"Outils",groupPlatform:"Plateforme",gateways:"Passerelles",expand:"Déplier le menu",collapse:"Replier le menu"},performance:{title:"Performance",subtitle:"Surveiller les ressources système, Bridge Broker, Workers et sessions actives",refresh:"Actualiser",autoRefreshOn:"Actualisation auto",autoRefreshOff:"Actualisation manuelle",loadFailed:"Échec du chargement des métriques de performance",systemCpu:"CPU système",systemMemory:"Mémoire système",activeSessions:"Sessions actives",runningSessions:"En cours {count}",workers:"Workers",totalWorkerMemory:"Mémoire totale Worker",processes:"Processus",uptime:"Disponibilité",running:"En cours",stopped:"Arrêté",workerMemory:"Mémoire Worker",lastUpdated:"Mis à jour",profile:"Profile",memory:"Mémoire",sessions:"Sessions",runningActiveSessions:"En cours / Actives",lastUsed:"Dernière utilisation",status:"Statut",noWorkers:"Aucun Worker",sessionsByProfile:"Sessions par Profile",noActiveSessions:"Aucune session active"},drawer:{terminal:"Terminal",files:"Espace de travail"},chat:{contextRemaining:"restant",contextClickToEdit:"Cliquez pour modifier la longueur du contexte",contextEditTitle:"Modifier la longueur du contexte",contextEditDesc:"Définir la limite de longueur du contexte pour le modèle actuel (en tokens)",contextEditPlaceholder:"Entrez la longueur du contexte",contextEditHint:"Valeurs courantes : 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",outlineTitle:"Plan de la conversation",outlineEmpty:"Aucun contenu de conversation",outlineUserQuestion:"Question utilisateur",inputPlaceholder:"Tapez un message... (Entree pour envoyer, Shift+Entree pour un saut de ligne)",slashCommandArgs:{message:"<message>",title:"<titre>",text:"<texte>"},slashCommands:{usage:"Calculer l’utilisation de la session actuelle",status:"Afficher l’état de la session et la file",abort:"Arrêter l’exécution Bridge active",queue:"Mettre un message en file après l’exécution active",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",allProfiles:"Tous les profils",profileMissingModelsTip:'Le profil "{profile}" n’a aucun fournisseur ni modèle disponible pour cette session',sessionScopeHint:"Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.",openHistory:"Ouvrir l’historique",hermesHistory:"Historique Hermes",historyScopeHint:"Sessions d’historique Hermes du profil actuel en lecture seule, regroupées par source.",noSessions:"Aucune session",newChat:"Nouvelle discussion",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:"Mode chat",liveMode:"Direct",liveSessions:"Sessions en direct",recentBadge:"Récent",linkedSessions:"{count} sessions liées",noVisibleMessages:"Aucun message visible par l’humain.",monitorRoleUser:"Utilisateur",monitorRoleAssistant:"Assistant",copySessionLink:"Copier le lien de session",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:"Temps d’exécution",thinkingLabel:"Raisonnement",thinkingInProgress:"En réflexion…",thinkingShow:"Afficher le raisonnement",thinkingHide:"Masquer le raisonnement",thinkingDuration:"Observé {duration}",thinkingChars:"{count} caractères",copyBubble:"Copier le message",copiedBubble:"Message copié",copyFailed:"Échec de la copie",playSpeech:"Lire à voix haute",pauseSpeech:"Pause",resumeSpeech:"Reprendre",stopSpeech:"Arrêter",speechNotSupported:"Reproduction vocale non prise en charge dans ce navigateur",searchEnterHint:"Entrée pour ouvrir · Échap pour fermer",searchHint:"Cmd/Ctrl+K",searchScope:"Portée de recherche : base locale des sessions Web UI uniquement ; les sessions d’historique Hermes en lecture seule ne sont pas incluses.",searchFailed:"Échec de la recherche de sessions",searchNoSnippet:"Aucun extrait disponible",searchNoResults:"Aucune session correspondante",searchRecent:"Session récente",searchEmpty:"Sessions récentes",searchPlaceholder:"Rechercher des sessions...",searchSubtitle:"Rechercher par titre ou contenu des messages",searchTitle:"Rechercher des sessions",stopGateway:"Arrêter le gateway",start:"Démarrer",workspaceSetFailed:"Échec de la définition du workspace",workspaceSet:"Workspace défini",workspacePlaceholder:"Saisissez le chemin du projet, ex. /home/user/project",workspace:"Espace de travail",setWorkspaceTitle:"Définir le workspace de session",setWorkspace:"Définir le workspace",modelSetFailed:"Échec de la définition du modèle",modelSet:"Modèle défini",setModelTitle:"Définir le modèle de session",setModel:"Définir le modèle",newCliChat:"Nouveau CLI",cliEmptyState:"Démarrer un chat CLI",autoPlaySpeech:"Lire la voix automatiquement"},jobs:{title:"Taches planifiees",createJob:"Creer une tache",editJob:"Modifier la tache",noJobs:"Aucune tache planifiee. Creez-en une pour commencer.",name:"Nom",namePlaceholder:"Nom de la tache",schedule:"Planification (expression Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapides",selectPreset:"Selectionner un preset...",presetEveryMinute:"Chaque minute",presetEvery5Min:"Toutes les 5 minutes",presetEveryHour:"Chaque heure",presetEveryDay:"Tous les jours a 00:00",presetEveryDay9:"Tous les jours a 09:00",presetEveryMonday:"Chaque lundi a 09:00",presetEveryMonth:"Le 1er de chaque mois a 09:00",prompt:"Invite",promptPlaceholder:"L'invite a executer",deliverTarget:"Cible de livraison",origin:"Origine",local:"Local",repeatCount:"Nombre de repetitions (facultatif)",modelPlaceholder:"Modele par defaut",repeatPlaceholder:"Laisser vide pour infini",jobCreated:"Tache creee",jobUpdated:"Tache mise a jour",nameRequired:"Le nom est requis",scheduleRequired:"La planification est requise",loadFailed:"Echec du chargement de la tache",jobPaused:"Tache en pause",jobResumed:"Tache reprise",jobTriggered:"Job declenche",modelUpdated:"Modele mis a jour",jobDeleted:"Tache supprimee",status:{running:"En cours",paused:"En pause",disabled:"Desactivee",scheduled:"Planifiee"},info:{model:"Modele",schedule:"Planification",lastRun:"Derniere execution",nextRun:"Prochaine execution",deliver:"Livraison",repeat:"Repetition"},action:{pause:"Pause",pauseJob:"Mettre en pause",resume:"Reprendre",resumeJob:"Reprendre la tache",runNow:"Executer maintenant",triggerImmediately:"Déclencher immédiatement"},runHistory:{title:"Historique",runs:"exécutions",noRuns:"Aucun historique trouvé."}},skills:{title:"Competences",searchPlaceholder:"Rechercher des competences...",noMatch:"Aucune competence ne correspond a votre recherche",noSkills:"Aucune competence trouvee",backTo:"Retour a",attachedFiles:"Fichiers joints",loadFailed:"Echec du chargement de la competence",fileLoadFailed:"Echec du chargement du fichier",modified:"Modifié par l'utilisateur",archived:"Archivé",pinned:"Épinglé",pin:"Épingler la compétence",unpin:"Désépingler la compétence",pinFailed:"Impossible de changer le statut d'épinglage",toggleFailed:"Echec de l'activation/desactivation de la competence",source:{builtin:"Intégré",hub:"Hub",local:"Local"}},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:"Racine de l’agent",python:"Python",scanCwd:"Analyser cwd",projectPlugins:"Plugins du projet"}},memory:{title:"Memoire",refresh:"Actualiser",loadFailed:"Echec du chargement de la memoire",myNotes:"Mes notes",noNotes:"Aucune note pour l'instant.",notesPlaceholder:"Ecrivez vos notes...",userProfile:"Profil utilisateur",noProfile:"Aucun profil pour l'instant.",profilePlaceholder:"Ecrivez votre profil...",soul:"Ame",noSoul:"Aucune configuration d'ame pour l'instant.",soulPlaceholder:"Ecrivez la configuration de l'ame..."},models:{title:"Modeles",addProvider:"Ajouter un fournisseur",providerType:"Type de fournisseur",preset:"Préréglage",custom:"Personnalise",selectProvider:"Selectionner un fournisseur",chooseProvider:"Choisir un fournisseur...",name:"Nom",autoGeneratedName:"Genere automatiquement a partir de l'URL de base",baseUrl:"URL de base",region:"Région",regionIntl:"International",regionCn:"Chine continentale",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Cle API",apiKeyPlaceholder:"sk-...",defaultModel:"Modele par defaut",selectOrInput:"Sélectionner ou saisir un modèle...",selectModel:"Selectionner un modele...",providerAdded:"Fournisseur ajoute",providerDeleted:"Fournisseur supprime",deleteProvider:"Supprimer le fournisseur",deleteConfirm:'Etes-vous sur de vouloir supprimer "{name}" ?',codexLoginTitle:"Connexion OpenAI Codex",codexWaiting:"Entrez ce code sur la page d'autorisation pour vous connecter :",codexCopyCode:"Code copié",codexOpenLink:"Ouvrir la page d'autorisation",codexApproved:"Connexion réussie",codexExpired:"L'autorisation a expiré. Veuillez réessayer.",nousLoginTitle:"Connexion Nous Portal",nousWaiting:"Entrez ce code sur la page d'autorisation:",nousCopyCode:"Code copié",nousOpenLink:"Ouvrir la page d'autorisation",nousApproved:"Connexion réussie",nousDenied:"Autorisation refusée",nousExpired:"Autorisation expirée",copilotLoginTitle:"Connexion GitHub Copilot",copilotWaiting:"Ouvrez GitHub et saisissez le code ci-dessous pour autoriser. La fenêtre se fermera automatiquement après approbation.",copilotCopyCode:"Code copié",copilotOpenLink:"Ouvrir la page d'autorisation GitHub",copilotApproved:"Connexion réussie !",copilotDenied:"Autorisation refusée.",copilotExpired:"Le lien d'autorisation a expiré. Veuillez réessayer.",copilotAddDetectedTitle:"GitHub Copilot détecté",copilotAddDetected:"Un token OAuth GitHub Copilot a été détecté sur cette machine. Cliquez sur Ajouter pour activer Copilot dans 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",currentDefault:"Par défaut actuel",defaultShort:"Défaut",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",xaiWaiting:"Terminez l’autorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.",xaiOpenLink:"Ouvrir la page d’autorisation xAI",xaiLoginTitle:"Connexion OAuth xAI Grok",xaiExpired:"Le lien d’autorisation a expiré. Veuillez réessayer.",xaiCopyLink:"Copier le lien d’autorisation",xaiApproved:"Connexion réussie !",visibilitySelectOne:"Conserver au moins un modèle visible",visibilitySaved:"Modèles visibles enregistrés",visibilitySaveFailed:"Échec de l’enregistrement des modèles visibles",visibilityHint:"Affecte uniquement le sélecteur de modèles et la page Modèles de la Web UI. La configuration provider/model de Hermes CLI n’est pas modifiée ; les appels utilisent toujours l’ID de modèle d’origine.",showAllModels:"Afficher tous les modèles",searchPlaceholder:"Rechercher des modèles...",removeCustomModel:"Retirer ce modèle non listé",more:"de plus",models:"Liste des modèles",manageVisibleModelsFor:"Gérer les modèles visibles de {name}",manageVisibleModels:"Gérer les modèles visibles",getApiKey:"Obtenir une API Key",count:"modèles",aliasUseOriginal:"Restaurer l’ID d’origine",aliasTitleFor:"Nom affiché pour {model}",aliasTitle:"Nom affiché du modèle",aliasSaveFailed:"Échec de l’enregistrement du nom affiché",aliasPlaceholder:"Laisser vide pour utiliser l’ID de modèle d’origine",aliasManageFor:"Noms affichés pour {provider}",aliasManage:"Noms affichés",aliasHint:"Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours l’ID de modèle d’origine.",aliasEdit:"Renommer",aliasCanonical:"ID d’origine : {model}"},profiles:{title:"Profils",create:"Creer un profil",import:"Importer",export:"Exporter",rename:"Renommer",delete:"Supprimer",switchTo:"Changer Hermes Profile",switchConfirm:"Cette action execute `hermes profile use {name}` et change le active profile Hermes CLI. Continuer ?",switchSuccess:'Hermes active profile change vers "{name}"',switchFailed:"Echec du changement Hermes Profile. La passerelle peut necessiter un redemarrage manuel.",createSuccess:'Profil "{name}" cree',createFailed:"Echec de la creation du profil",renameSuccess:"Profil renomme",renameFailed:"Echec du renommage du profil",deleteConfirm:'Etes-vous sur de vouloir supprimer le profil "{name}" ?',deleteSuccess:"Profil supprime",deleteFailed:"Echec de la suppression du profil",exportSuccess:"Profil exporte",exportFailed:"Echec de l'exportation du profil",importSuccess:"Profil importe",importFailed:"Echec de l'importation du profil",importSelectFile:"Selectionner un fichier d'archive",importInvalidFile:"Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)",name:"Nom du profil",namePlaceholder:"Lettres, chiffres et tirets uniquement",nameValidation:"Le nom du profil ne peut contenir que des lettres minuscules, des chiffres, des tirets bas et des tirets",newName:"Nouveau nom",newNamePlaceholder:"Entrez un nouveau nom",cloneFromCurrent:"Cloner depuis le profil actuel",cloneCleanupNotice:"Lors du clonage, les identifiants de plateformes exclusives (Weixin / Telegram / Slack, etc.) sont automatiquement ignorés pour éviter les conflits avec le profil source",cloneStrippedCredentials:"{count} identifiant(s) exclusif(s) supprimé(s) : {list}",cloneDisabledPlatforms:"{count} plateforme(s) désactivée(s) : {list}",cloneStrippedConfigCredentials:"{count} identifiant(s) intégré(s) supprimé(s) de config.yaml : {list}",archivePath:"Chemin de l'archive",archivePathPlaceholder:"Chemin serveur du fichier d'archive",importName:"Nom du profil (facultatif)",importNamePlaceholder:"Laisser vide pour utiliser le nom de l'archive",active:"Actif",model:"Modele",gateway:"Passerelle",alias:"Alias",provider:"Fournisseur",path:"Chemin",skills:"Competences",hasEnv:"A un .env",hasSoulMd:"A un soul.md",noProfiles:"Aucun profil trouve. Creez-en un pour commencer.",avatar:{title:"Avatar personnalisé",customize:"Personnaliser l’avatar",upload:"Importer une image",random:"Générer au hasard",reset:"Restaurer par défaut",hint:"PNG, JPEG ou WebP, 1 Mo maximum",invalidType:"Veuillez choisir une image PNG, JPEG ou WebP",tooLarge:"L’image d’avatar ne doit pas dépasser 1 Mo",saveSuccess:"Avatar enregistré",saveFailed:"Échec de l’enregistrement de l’avatar",resetSuccess:"Avatar par défaut restauré",resetFailed:"Échec de la restauration de l’avatar par défaut"},runtime:{activeProfile:"Actuel : {name}",bridgeWorker:"État du Bridge",gateway:"Passerelle",active:"Actif",activeTag:"Actuel",idle:"Inactif",running:"En cours",stopped:"Arrêté",restartGateway:"Redémarrer le gateway",restartProfile:"Redémarrer le profil",switchProfile:"Changer le profil frontend",gatewayRestarted:"Gateway redémarré : {name}",gatewayRestartFailed:"Échec du redémarrage du gateway",profileRestarted:"Profil redémarré : {name}",profileRestartFailed:"Échec du redémarrage du profil"}},logs:{title:"Journaux",all:"Tout",searchPlaceholder:"Rechercher...",refresh:"Actualiser",noEntries:"Aucune entree de journal"},settings:{title:"Parametres",saved:"Enregistre",saveFailed:"Echec de l'enregistrement",tabs:{display:"Affichage",account:"Compte actuel",users:"Gestion des comptes",agent:"Agent",memory:"Memoire",compression:"Compression",session:"Session",privacy:"Confidentialite",apiServer:"Serveur API",models:"Modèles",voice:"Voix"},display:{streaming:"Reponses en continu",streamingHint:"Afficher les reponses de l'IA en temps reel",compact:"Mode compact",compactHint:"Reduire l'espacement des messages",showReasoning:"Afficher le raisonnement",showReasoningHint:"Afficher le processus de reflexion du modele",showCost:"Afficher le cout",showCostHint:"Afficher l'utilisation des jetons dans les reponses",inlineDiffs:"Diffs en ligne",inlineDiffsHint:"Afficher les changements de code en ligne",bellOnComplete:"Son de fin",bellOnCompleteHint:"Jouer un son lorsque l'IA a termine",busyInputMode:"Mode saisie active",busyInputModeHint:"Permettre la saisie pendant le traitement de l'IA",theme:"Thème",themeHint:"Choisir clair, sombre ou suivre les preferences du systeme",themeLight:"Clair",themeDark:"Sombre",themeSystem:"Systeme"},agent:{maxTurns:"Tours maximum",maxTurnsHint:"Nombre maximum de tours d'interaction par conversation",gatewayTimeout:"Delai d'attente de la passerelle",gatewayTimeoutHint:"Delai d'attente de la requete en secondes",restartDrainTimeout:"Delai de vidange au redemarrage",restartDrainTimeoutHint:"Delai de vidange avant redemarrage en secondes",toolEnforcement:"Application des outils",toolEnforcementHint:"Controler le mode d'execution des appels d'outils",auto:"Automatique",always:"Toujours",never:"Jamais"},memory:{enabled:"Activer la memoire",enabledHint:"Permettre a l'IA de memoriser le contexte de conversation",userProfile:"Profil utilisateur",userProfileHint:"Permettre a l'IA de memoriser les preferences utilisateur",charLimit:"Limite de caracteres de la memoire",charLimitHint:"Nombre maximum de caracteres pour MEMORY.md",userCharLimit:"Limite de caracteres du profil utilisateur",userCharLimitHint:"Nombre maximum de caracteres pour USER.md"},compression:{enabled:"Activer la compression",enabledHint:"Compresser automatiquement un long historique avant de depasser le contexte du modele",threshold:"Seuil de compression",thresholdHint:"Demarrer la compression quand les jetons estimes depassent ce ratio de contexte",targetRatio:"Ratio cible",targetRatioHint:"Taille cible de l'historique apres compression comme ratio du contexte",protectLastN:"Proteger les messages recents",protectLastNHint:"Garder autant de messages recents non compresses",protectFirstN:"Proteger les premiers messages",protectFirstNHint:"Garder autant de premiers messages non compresses"},session:{mode:"Mode de reinitialisation",modeHint:"Condition de declenchement de la reinitialisation de session",modeBoth:"Inactivite + Planifie",modeIdle:"Inactivite uniquement",modeDaily:"Planifie uniquement",modeNone:"Jamais (manuel uniquement)",idleMinutes:"Delai d'inactivite",idleMinutesHint:"Temps d'attente avant reinitialisation automatique (minutes)",atHour:"Heure de reinitialisation planifiee",humanOnly:"Afficher uniquement les sessions humaines",humanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session",liveMonitorHumanOnly:"Moniteur live : n’afficher que les sessions humaines",liveMonitorHumanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live",atHourHint:"Reinitialiser la session a cette heure chaque jour",requireAuth:"Autorisation de session",requireAuthHint:"Requiere l'autorisation pour les operations de session"},privacy:{redactPii:"Masquer les DPI",redactPiiHint:"Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)"},apiServer:{enable:"Activer",enableHint:"Activer le serveur API",host:"Hote",hostHint:"Adresse d'ecoute",port:"Port",portHint:"Port d'ecoute",key:"Cle",keyHint:"Cle d'acces API",cors:"Origines CORS",corsHint:"Sources cross-origin autorisees"},voice:{ttsProvider:"Fournisseur TTS",ttsProviderHint:"Choisir le moteur de synthese vocale pour la lecture des messages",providerWebSpeech:"WebSpeech API (Navigateur)",providerOpenai:"OpenAI TTS",providerCustom:"Point d'acces personnalise (compatible OpenAI)",providerEdge:"Edge TTS (Gratuit, sans cle API)",webspeechVoice:"Voix",webspeechVoiceHint:"Choisir une voix depuis le navigateur ou l'OS",webspeechVoicePlaceholder:"Auto (voix par defaut)",openaiKey:"Cle API",openaiKeyHint:"Votre cle API OpenAI avec acces TTS",openaiUrl:"URL de base API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modele",openaiModelHint:"tts-1 (rapide) / tts-1-hd (haute qualite)",openaiVoice:"Voix",openaiVoiceHint:"Voix a utiliser pour la synthese",customHint:"Utilisez toute API TTS compatible OpenAI — fonctionne avec GPT-SoVITS, CosyVoice, etc.",customUrl:"URL API",customUrlHint:"URL de base de votre service TTS",customUrlPlaceholder:"Adresse configuree dans l'adaptateur local, ex. http://127.0.0.1:9880",customApiKey:"Cle API (optionnelle)",customApiKeyHint:"Certains points d'acces personnalises necessitent une authentification",customApiKeyPlaceholder:"Laisser vide si inutile",edgeHint:"Propulse par Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL de l'adaptateur",edgeUrlHint:"Adresse de l'adaptateur Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voix",edgeVoiceHint:"Choisir une voix pour la synthese vocale",edgeRate:"Vitesse",edgeRateHint:"Ajuster la vitesse de la voix (0.5x ~ 2.0x)",edgePitch:"Hauteur",edgePitchHint:"Ajuster la hauteur de la voix (-20 ~ +20 Hz)",testTitle:"Test vocal",testText:"Texte de test",testTextPlaceholder:"Entrez le texte a tester...",testTextDefault:"Bonjour, ceci est un test vocal.",testButton:"Tester",testButtonPlaying:"Lecture...",testFailed:"Echec du test : {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voices predefinies, conception vocale et clonage vocal",mimoApiKey:"Cle API",mimoApiKeyHint:"Obtenez votre cle sur platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Cle API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Saisir l’API Key",noProviders:"Aucun fournisseur configuré",save:"Enregistrer",saveFailed:"Échec de l’enregistrement",saved:"Enregistré"}},platform:{requireMention:"Exiger une mention {'@'}",requireMentionGroup:"Exiger une mention {'@'} dans les groupes pour repondre",requireMentionChannel:"Exiger une mention {'@'} dans les canaux pour repondre",requireMentionRoom:"Exiger une mention {'@'} dans les salles pour repondre",reactions:"Réactions",reactionsHint:"Reagir aux messages avec des emoji",freeResponseChats:"Discussions en reponse libre",freeResponseChatsHint:"ID de discussions repondant sans mention {'@'} (separes par des virgules)",freeResponseChannels:"Canaux en reponse libre",freeResponseChannelsHint:"ID de canaux repondant sans mention {'@'} (separes par des virgules)",freeResponseRooms:"Salles en reponse libre",freeResponseRoomsHint:"ID de salles repondant sans mention {'@'} (separes par des virgules)",mentionPatterns:"Motifs de mention personnalises",mentionPatternsHint:"Motifs de declenchement supplementaires",autoThread:"Fil automatique",autoThreadHint:"Creer automatiquement des fils de reponse apres une mention {'@'}",autoThreadHintRoom:"Creer automatiquement des fils de reponse dans les salles",dmMentionThreads:"Fils de mention en MP",dmMentionThreadsHint:"Utiliser des fils de reponse pour les mentions en MP",allowBots:"Autoriser les messages de bots",allowBotsHint:"Repondre aux messages d'autres bots",allowedChannels:"Canaux autorises",allowedChannelsHint:"Liste blanche des ID de canaux (separes par des virgules)",ignoredChannels:"Canaux ignores",ignoredChannelsHint:"Canaux ou le bot ne repond jamais (separes par des virgules)",noThreadChannels:"Canaux sans fil",noThreadChannelsHint:"Canaux ou le bot repond sans fil (separes par des virgules)",exclusiveTokenWarning:"Cette plateforme utilise un verrou de jeton exclusif. Chaque profil doit utiliser un jeton d'identite different pour eviter les conflits avec les autres profils.",botToken:"Jeton de bot",botTokenHint:"Jeton de bot depuis le portail developpeur",accessToken:"Jeton d'acces",accessTokenHint:"Jeton d'acces Matrix",homeserver:"URL du serveur domestique",homeserverHint:"URL du serveur domestique Matrix",appId:"ID de l'application",appIdHint:"ID de l'application Feishu",appSecret:"Secret de l'application",appSecretHint:"Secret de l'application Feishu",clientId:"ID client",clientIdHint:"ID client DingTalk",clientSecret:"Secret client",clientSecretHint:"Secret client DingTalk",botId:"ID du bot",botIdHint:"ID du bot WeCom",wecomSecretHint:"Secret du bot WeCom",waEnabled:"Activer WhatsApp",waEnabledHint:"Activer WhatsApp via appairage par code QR",weixinToken:"Jeton Weixin",weixinTokenHint:"Depuis la connexion QR de la CLI weixin (hermes weixin)",accountId:"ID de compte",accountIdHint:"ID du compte Weixin",qrLogin:"Connexion QR",qrRelogin:"Reconnexion",qrFetching:"Recuperation du code QR...",qrScanHint:"Scannez avec WeChat pour vous connecter",qrScanedHint:"Scanne, veuillez confirmer sur le telephone...",qqSandboxHint:"Activer l’environnement sandbox (pour les tests)",qqSandbox:"Mode sandbox",qqQrScanHint:"Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer l’association",qqMarkdownHint:"Activer les messages au format Markdown (certains clients peuvent ne pas le prendre en charge)",qqMarkdown:"Support Markdown",qqAppSecretHint:"App Secret du bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID du bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Liste blanche d’ID utilisateur ou OpenID, séparés par des virgules",allowedUsers:"Utilisateurs autorisés",allowAllUsersHint:"Autoriser les messages de tout utilisateur ; désactivez pour utiliser la liste blanche",allowAllUsers:"Autoriser tous les utilisateurs"},language:{label:"Langue",zh:"中文",en:"English",fr:"Francais"},terminal:{sessions:"Sessions",newTab:"Nouveau terminal",closeSession:"Fermer cette session ?",sessionExited:"Terminee",processExited:"Processus termine avec le code {code}",noSessions:"Aucune session terminal",connectionFailed:"Connexion au terminal impossible",connectionError:"Erreur de connexion",connectionClosed:"Connexion fermée"},usage:{title:"Statistiques d'utilisation",refresh:"Actualiser",totalTokens:"Total des jetons",inputTokens:"Entree",outputTokens:"Sortie",totalSessions:"Total des sessions",avgPerDay:"~{n}/jour en moy.",estimatedCost:"Cout est.",cacheHitRate:"Taux de succes du cache",modelBreakdown:"Repartition par modele",dailyTrend:"Utilisation quotidienne",date:"Date",tokens:"Jetons",cache:"Cache",cacheRead:"Lecture cache",cacheWrite:"Écriture cache",sessions:"Sessions",cost:"Cout",noData:"Aucune donnee d'utilisation"},skillsUsage:{title:"Utilisation des compétences",subtitle:"Suivre les chargements et modifications de compétences dans les sessions Hermes",refresh:"Actualiser",periodSelector:"Période d'utilisation des compétences",periodLabel:"{days} j",summary:"Résumé",totalActions:"Act.",loads:"Charg.",edits:"Modif.",distinctSkills:"Comp.",topSkills:"Top comp.",dailyTrend:"Tendance",periodSummary:"{days} derniers jours",skill:"Comp.",share:"%",lastUsed:"Dern. usage",noData:"Aucune donnée d'utilisation des compétences",loadFailed:"Impossible de charger l'utilisation des compétences",otherSkills:"Autres comp."},changelog:{new_0_5_22_1:"L’API de liste des sessions Hermes lit la base du profil au lieu du store local Web UI",new_0_5_23_1:"Commandes slash de chat réservées au Bridge avec suggestions localisées",new_0_5_23_2:"Historique de commandes persistant pour rejouer les sessions sans polluer le contexte, l’usage ou la compression",new_0_5_23_3:"Variables d’environnement du profil gateway isolées pour éviter les fuites d’identifiants entre profils",new_0_5_23_4:"Port Web UI réservé pendant l’allocation gateway pour éviter les conflits de démarrage",new_0_5_23_5:"Redémarrage d’auto-mise à jour corrigé pour ne pas signaler comme échec les sorties réussies du helper",new_0_5_24_1:"Chat Bridge aligné sur API Server pour l’entrée multimodale, le prompt système et le contexte workspace",new_0_5_25_1:"Actions de réinitialisation et clonage des salons de chat de groupe",new_0_5_25_2:"Répertoire d’état Web UI configurable pour les déploiements personnalisés",new_0_5_25_3:"MiMo ajouté comme fournisseur TTS dans les paramètres vocaux",new_0_5_25_4:"Listes de modèles des fournisseurs personnalisés chargées via le backend pour éviter les erreurs CORS navigateur",new_0_5_25_5:"Flux d’approbation des outils corrigé pour les sessions Bridge",new_0_5_25_6:"Indice de plateforme CLI forcé retiré des prompts Bridge afin de préserver les instructions personnalisées de média/fichier",new_0_5_25_7:"Contenu image base64 affiché correctement dans l’historique des messages utilisateur",new_0_5_25_8:"Tests navigateur Playwright, couverture du contrat de streaming chat, couverture des modèles fournisseur et baseline de couverture ajoutés",new_0_5_26_1:"Chemins média Markdown Windows et locaux pris en charge dans l’historique et les messages rendus",new_0_5_26_2:"Historique assistant vide filtré et état de compression obsolète nettoyé au démarrage d’un nouveau run",new_0_5_26_3:"Écritures verrouillées pour config et profils afin de réduire la corruption par écritures concurrentes",new_0_5_26_4:"Paramètres de canaux QQBot et DingTalk ajoutés",new_0_5_26_5:"Détection de port CLI rendue portable et tiroir terminal mobile amélioré",new_0_5_26_6:"Environnements de profil Bridge isolés et découverte des plugins Hermes corrigée entre environnements Python",new_0_5_26_7:"États gateway arrêtés expliqués avec diagnostics Web UI et état de chargement des logs stabilisé",new_0_5_26_8:"Options de réinitialisation de session, base URL fournisseur personnalisé et cibles de livraison dynamiques corrigées",new_0_5_26_9:"Bascule locale d’affichage des traces tool-call ajoutée dans la barre de saisie du chat",new_0_5_26_10:"Installations du paquet Hermes Agent prises en charge quand aucun checkout source n’est disponible",new_0_5_26_11:"Connexion OAuth xAI Grok pour les abonnés SuperGrok et presets de modèles Grok mis à jour",new_0_5_26_12:"Couverture étendue pour navigateur, streaming chat, fournisseur, gateway, config, plugin et Bridge",new_0_5_27_1:"Paramètres de modèle par session pour les chats Bridge, avec fournisseur et modèle indépendants enregistrés par session",new_0_5_27_2:"Clic droit sur une session Bridge puis Définir le modèle pour changer le modèle de cette session",new_0_5_27_3:"Les runs valident le modèle de session et reviennent au modèle par défaut actuel si le modèle enregistré est indisponible",new_0_5_27_4:"La compression de contexte suit par défaut le modèle sélectionné par défaut du profil courant",new_0_5_30_1:"Bridge chat conserve l’historique structuré, corrigeant les absences de réponse et outils ignorés causés par l’historique d’outils aplati",new_0_5_30_2:"Le routage des mentions en chat de groupe est plus fiable avec plusieurs agents, retire la mention @ de chaque agent avant livraison et garde les noms utilisateur après actualisation",new_0_5_30_3:"Pages modèles, menus de modèle chat et sélection de modèle de session sont limités au profil actif avec marqueurs par défaut précis",new_0_5_30_4:"Gestion gateway simplifiée : page Gateway autonome retirée, chaque profil vérifie sa configuration plateforme avant démarrage et un runner léger gère démarrages/redémarrages",new_0_5_30_5:"Démarrage gateway amélioré sur Docker, Termux et Windows avec gestion runtime-lock, nettoyage des conflits de port, exécution en arrière-plan et support du redémarrage",new_0_5_30_6:"Compatibilité Windows renforcée pour détection de chemins, téléchargements et sous-processus job/update sans fenêtres terminal furtives",new_0_5_30_7:"Écritures config et presets fournisseur corrigés : validation des clés .env, routage FUN-Codex via Responses API et listes modèles Z.AI/GLM actualisées",new_0_5_30_8:"Détails frontend polis : barre latérale repliée, libellés courts de groupe, séparateur latéral et style de plan de conversation",new_0_5_30_9:"La compression de contexte suit les paramètres de profil et durcit les snapshots obsolètes en réutilisant les résumés précédents avec une queue sûre",new_0_5_31_1:"Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {'@'}all ajouté",new_0_5_31_2:"Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat",new_0_5_31_3:"Sélecteur de profils avec avatars, upload d’avatar personnalisé, modal d’état runtime et actions de redémarrage gateway/profil",new_0_5_31_4:"Avatars de profil dans chat individuel, chat de groupe et barre latérale repliée, avec métadonnées Web UI et chemins compatibles Windows",new_0_5_31_5:"Détection et redémarrage gateway améliorés sur Docker, Termux et Windows via gateway_state/gateway.pid pour la vivacité du gateway géré",new_0_5_31_6:"Endpoint média APIKEY.FUN de génération d’images et skill apikey-image-gen intégré pour texte-image, image-image et édition via le fournisseur fun-codex du profil actif",new_0_5_33_1:"Les échecs d’exécution et erreurs Socket en chat individuel et groupe restent maintenant dans la liste comme messages Agent rouges",new_0_5_33_2:"La recherche de sessions peut être limitée au profil sélectionné, ou couvrir tous les profils si aucun profil n’est choisi",new_0_5_33_3:"La page Skills affiche des documents de recommandation chinois/anglais quand aucun skill n’est sélectionné, et un second clic désélectionne le skill",new_0_5_33_4:"Suppression des entrées changelog i18n inutilisées pour réduire la taille frontend",new_0_5_33_5:"Correction du démarrage agent bridge sur Windows chinois lorsque la sortie netstat n’est pas décodée en UTF-8",new_0_5_33_6:"Liste des modèles Nous Portal mise à jour depuis le catalog public et les recommandations Portal",new_0_5_33_7:"Les listes de profils et états runtime lisent les noms depuis les dossiers et les modèles par défaut depuis config, évitant les erreurs de colonnes CLI",new_0_5_34_1:"Normalise les résultats de tools multimodaux lors du stockage des messages session/groupe, afin d’éviter les images base64 dans les replays",new_0_5_34_2:"Persiste les modèles Hermes personnalisés dans une configuration backend et ajoute les endpoints ajout/suppression",new_0_5_34_3:"Maintient corrects l’usage final du contexte Bridge et les états de tools après les exécutions",new_0_5_34_4:"Améliore les filtres Kanban, l’affichage des responsables, les actions de cartes et les détails de tâches",new_0_5_34_5:"Corrige le comptage de compression avec cache du contexte fixe prompt/tools et totaux complets de tokens",new_0_5_34_6:"Met en cache le contexte fixe par agent de chat de groupe et affiche la progression seulement au vrai démarrage de la compression",new_0_5_34_7:"Synchronise les skills intégrées Web UI dans tous les profils et journalise le profil cible",new_0_5_34_8:"Si Kanban échoue sous Windows, mettez Hermes à niveau pour obtenir les derniers correctifs de migration de la base Kanban",new_0_5_35_1:"Les sessions Bridge peuvent maintenant s’exécuter en parallèle entre sessions différentes, tandis que les runs d’une même session restent sérialisés pour préserver l’ordre",new_0_5_35_2:"Ajoute la page Performance Monitor pour le CPU/mémoire système, Web UI, Bridge Broker, Workers et l’état des sessions actives",new_0_5_35_3:"Ajoute des métriques par worker avec CPU, mémoire, Profile, nombre de sessions et état d’exécution",new_0_5_35_4:"Améliore le nettoyage du cycle de vie des Bridge workers afin de récupérer les workers lors de l’arrêt du Broker ou du processus parent et réduire les processus Python orphelins",new_0_5_35_5:"Renforce la compatibilité du monitoring avec des fallbacks de collecte pour macOS, Windows, Linux, Docker et Termux",new_0_5_35_6:"Performance Monitor ne bloque plus sur les requêtes worker pendant l’initialisation des Agents, réduisant les request timeouts sous Windows",new_0_5_35_7:"Chat Markdown prend désormais en charge la prévisualisation inline du contenu texte, et les icônes de téléchargement téléchargent directement les fichiers",new_0_5_35_8:"Améliore le drawer de contenu avec fermeture mobile, largeur complète sur mobile, largeur desktop 800px et fonds texte/Markdown cohérents",new_0_6_0_1:"La gestion par compte et par Profile protège désormais de façon cohérente les sessions, modèles, usage, Kanban, jobs, uploads, médias et APIs Hermes associées",new_0_6_0_2:"Les Skills média intégrés utilisent le token serveur généré uniquement pour les endpoints média et résolvent les identifiants fun-codex/xAI depuis le Profile demandé",new_0_6_0_3:"Le chat individuel et le chat de groupe injectent le Hermes Profile courant dans les instructions de run afin que les Skills envoient X-Hermes-Profile",new_0_6_0_4:"La progression des subagents delegate_task est maintenant diffusée dans l’UI du chat avec les états démarrage, outil, progression et fin",new_0_6_0_5:"L’arrêt ou l’abandon d’un run nettoie les événements temporaires afin que les anciens états abort ne passent pas au chat suivant",new_0_6_0_6:"Met à jour la documentation et le site pour la gestion des comptes, les identifiants par défaut, la gestion compte/Profile, les uploads/downloads et les Skills média",new_0_6_0_7:"Ajoute des commandes CLI de maintenance pour effacer les verrous IP de connexion et réinitialiser le login par défaut admin / 123456",new_0_6_0_8:"La version 0.6.0 marque la limite entre la Web UI mono-utilisateur et multi-utilisateur. En cas de problème avec le mode multi-utilisateur, ouvrez une issue et revenez si besoin à la version mono-utilisateur 0.5.35"},files:{title:"Fichiers",tree:"Arborescence",list:"Liste des fichiers",breadcrumbRoot:"Accueil",newFile:"Nouveau fichier",newFolder:"Nouveau dossier",upload:"Telecharger",refresh:"Actualiser",open:"Ouvrir",edit:"Modifier",preview:"Apercu",download:"Telecharger",copyPath:"Copier le chemin",rename:"Renommer",delete:"Supprimer",name:"Nom",size:"Taille",modified:"Modifie",actions:"Actions",emptyDir:"Dossier vide",loading:"Chargement...",confirmDelete:'Voulez-vous vraiment supprimer "{name}" ?',confirmDeleteDir:'Voulez-vous vraiment supprimer le dossier "{name}" et tout son contenu ?',deleteFailed:"Echec de la suppression",deleted:"Supprime",renameTo:"Renommer en",newFileName:"Nom du fichier",newFolderName:"Nom du dossier",created:"Cree",createFailed:"Echec de la creation",renamed:"Renomme",renameFailed:"Echec du renommage",uploadSuccess:"{count} fichier(s) televerse(s)",uploadFailed:"Echec du televersement",saveFailed:"Echec de l'enregistrement",saved:"Enregistre",unsavedChanges:"Vous avez des modifications non enregistrees. Annuler ?",pathCopied:"Chemin copie",fileTooLarge:"Fichier trop volumineux (max 10 Mo)",permissionDenied:"Impossible de modifier un fichier protege",notFound:"Fichier ou dossier introuvable",backendError:"Echec de l'operation sur le fichier",dragDropHint:"Glissez des fichiers ici pour les televerser",closeEditor:"Fermer l'editeur",closePreview:"Fermer",saveFile:"Enregistrer",fileTree:"Arborescence des fichiers"},groupChat:{title:"Chat de groupe",createRoom:"Creer un salon",joinByCode:"Rejoindre avec un code",roomName:"Nom du salon",roomNamePlaceholder:"Entrez le nom du salon",inviteCode:"Code d'invitation",autoGenerate:"Generer automatiquement",noRooms:"Aucun salon pour le moment",selectOrCreate:"Selectionnez ou creez un salon pour commencer a discuter",agents:"Agents",addAgent:"Ajouter un agent",selectProfile:"Selectionnez un profil",agentAdded:"Agent ajoute",agentAlreadyInRoom:"L'agent est deja dans ce salon",agentAddFailedCount:"{count} agent(s) n'ont pas ete ajoutes : {details}",noAgents:"Aucun agent dans ce salon",members:"Membres",roomCreated:"Salon cree",roomDeleted:"Salon supprime",roomCloned:"Salon clone",cloneRoom:"Cloner le salon",copyRoomLink:"Copier le lien du salon",deleteRoomConfirm:"Supprimer ce salon ?",clearContext:"Effacer le contexte",clearContextConfirm:"Effacer le contexte de ce salon ? Les messages et instantanés de compression seront supprimés, les agents et membres restent.",contextCleared:"Contexte effacé",you:"Vous",joined:"Vous avez rejoint le salon",joinFailed:"Echec de la connexion au salon",inputPlaceholder:"Tapez un message... (Entree pour envoyer)",enterCode:"Entrez le code d'invitation",yourName:"Votre nom",yourNamePlaceholder:"Entrez votre nom d'affichage",yourDescription:"Description (facultatif)",yourDescriptionPlaceholder:"Decrivez-vous aux autres...",agentName:"Nom de l'agent",agentNamePlaceholder:"Nom personnalise (vide = nom du profil)",agentDesc:"Description de l'agent",agentDescPlaceholder:"Decrivez le role de cet agent...",agentReplying:"est en train de répondre...",agentCompressing:"compresse le contexte...",compressionSettings:"Paramètres de compression",triggerTokens:"Seuil de tokens",triggerTokensDesc:"Seuil de tokens pour déclencher la compression",maxHistoryTokens:"Max tokens historique",maxHistoryTokensDesc:"Maximum de tokens pour le contexte compressé",tailMessageCount:"Messages récents",tailMessageCountDesc:"Nombre de messages récents à conserver",compressionConfig:"Config. compression",compressNow:"Comprimer maintenant",compressingInProgress:"Compression en cours",compressionSaved:"Configuration enregistrée"},download:{downloading:"Telechargement...",downloadFailed:"Echec du telechargement",fileNotFound:"Fichier introuvable ou supprime",fileTooLarge:"Fichier trop volumineux (limite depassee)",backendError:"Echec de la lecture du fichier, l'environnement distant est peut-etre indisponible",backendTimeout:"Delai de lecture du fichier depasse",unsupportedBackend:"Le backend de terminal actuel ne prend pas en charge le telechargement de fichiers",invalidPath:"Chemin de fichier invalide",contentDisplay:"Affichage du contenu",download:"Telecharger",downloadFile:"Telecharger le fichier"},gateways:{title:"Passerelles",running:"En cours",stopped:"Arrêté",started:"Démarré",startFailed:"Échec du démarrage du gateway",stopFailed:"Échec de l’arrêt du gateway"},kanban:{title:"Tableau Kanban",createTask:"Nouvelle tâche",noTasks:"Aucune tâche",allStatuses:"Tous les statuts",allAssignees:"Tous les responsables",columns:{triage:"Triage",todo:"À faire",ready:"Prêt",running:"En cours",blocked:"Bloqué",done:"Terminé",archived:"Archivé"},card:{assigneeTooltip:"Responsable",priority:{low:"Basse",medium:"Moyenne",high:"Haute"},timeAgo:{justNow:"à l’instant",minutes:"il y a {count} min",hours:"il y a {count} h",days:"il y a {count} j"}},board:{create:"Nouveau tableau",archive:"Archiver le tableau",archiveConfirm:"Archiver le tableau actuel ?",archived:"Tableau archivé",created:"Tableau créé",slugPlaceholder:"Identifiant du tableau, ex. project-a",namePlaceholder:"Nom affiché (facultatif)",slugRequired:"L’identifiant du tableau est requis"},form:{title:"Titre",titlePlaceholder:"Titre de la tâche",titleRequired:"Le titre est requis",body:"Description",bodyPlaceholder:"Description de la tâche (facultatif)",assignee:"Responsable",selectAssignee:"Choisir un responsable...",priority:"Priorité",selectPriority:"Choisir une priorité..."},detail:{status:"Statut",priority:"Priorité",assignee:"Responsable",tenant:"Locataire",createdAt:"Créé",startedAt:"Démarré",completedAt:"Terminé",comments:"Commentaires",events:"Événements",runs:"Exécutions",artifacts:"Fichiers produits",result:"Résultat",highlights:"Informations clés",sources:"Sources de données",sessions:"Sessions liées",sessionMessages:"Messages de session",noSessions:"Aucune session liée trouvée."},action:{title:"Actions",assign:"Assigner",assignTo:"Assigner à...",block:"Bloquer",blockReason:"Raison du blocage",unblock:"Débloquer",complete:"Terminer",completeSummary:"Résumé de fin (facultatif)"},message:{loadFailed:"Échec du chargement de la tâche",taskCreated:"Tâche créée",taskAssigned:"Tâche assignée",taskBlocked:"Tâche bloquée",taskUnblocked:"Tâche débloquée",taskCompleted:"Tâche terminée"},stats:{total:"Total",tasks:"Tâches"}}},xt={login:{title:"Hermes Web UI",description:"Introduce tu nombre de usuario y contrasena para continuar.",placeholder:"Token de acceso",submit:"Iniciar sesion",tokenRequired:"Por favor, introduce tu token de acceso",invalidToken:"Token invalido",connectionFailed:"No se puede conectar al servidor",passwordLogin:"Contrasena",tokenLogin:"Token",usernamePlaceholder:"Nombre de usuario",passwordPlaceholder:"Contrasena",defaultCredentialsHint:"Nombre de usuario predeterminado: admin. Contrasena predeterminada: 123456.",credentialsRequired:"Por favor, introduzca nombre de usuario y contrasena",invalidCredentials:"Nombre de usuario o contrasena incorrectos",tooManyAttempts:"Demasiados intentos fallidos, por favor intente mas tarde",sessionExpired:"La sesion expiro. Inicia sesion de nuevo.",accessDenied:"No tienes permiso para acceder a este recurso.",passwordMismatch:"Las contrasenas no coinciden",passwordTooShort:"La contrasena debe tener al menos 6 caracteres",setupSuccess:"Login con contrasena configurado correctamente",passwordChanged:"Contrasena cambiada correctamente",passwordRemoved:"Login con contrasena eliminado",setupPassword:"Configurar login con contrasena",changePassword:"Cambiar contrasena",changeUsername:"Cambiar nombre de usuario",removePasswordLogin:"Eliminar",username:"Nombre de usuario",currentPassword:"Contrasena actual",newPassword:"Nueva contrasena",confirmPassword:"Confirmar contrasena",newUsername:"Nuevo nombre de usuario",usernameChanged:"Nombre de usuario cambiado correctamente",usernameTooShort:"El nombre de usuario debe tener al menos 2 caracteres",setupDescription:"Administra el nombre de usuario y la contrasena usados para iniciar sesion.",removeConfirm:"El login con contrasena es obligatorio para las cuentas de usuario.",passwordLoginNotConfigured:"Login con contrasena no configurado",passwordLoginConfigured:"Cuenta actual: {username}",defaultCredentialTitle:"Cambia la cuenta y contrasena predeterminadas",defaultCredentialMessage:"La cuenta actual aun usa el nombre de usuario o la contrasena predeterminados. Para evitar accesos no autorizados, cambia cuanto antes el nombre de usuario y la contrasena de la cuenta actual.",defaultCredentialAction:"Cambiar ahora",defaultCredentialLater:"Recordar mas tarde"},users:{title:"Gestion de cuentas",description:"Crea usuarios, asigna roles y controla que perfiles pueden usar los administradores normales.",create:"Crear usuario",edit:"Editar usuario",username:"Nombre de usuario",role:"Rol",statusLabel:"Estado",profiles:"Perfiles accesibles",profilesPlaceholder:"Selecciona perfiles accesibles",allProfiles:"Todos los perfiles",noProfiles:"Sin perfiles asignados",lastLogin:"Ultimo inicio",newPasswordOptional:"Nueva contrasena (dejar vacio para conservar)",loadFailed:"No se pudieron cargar los usuarios",deleteConfirm:"Eliminar este usuario?",enable:"Activar",disable:"Desactivar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Activo",disabled:"Desactivado"}},common:{loading:"Cargando...",cancel:"Cancelar",retry:"Reintentar",delete:"Eliminar",edit:"Editar",save:"Guardar",saved:"Guardado",update:"Actualizar",create:"Crear",saveFailed:"Error al guardar",deleteFailed:"Error al eliminar",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sin datos",fetch:"Obtener",add:"Anadir",enable:"Activar",disable:"Desactivar",configured:"Configurado",notConfigured:"No configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Contraer",stop:"Detener",start:"Iniciar",expired:"Expirado"},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",performance:"Rendimiento",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",files:"Archivos",groupChat:"Chat grupal",groupConversation:"Conversación",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoreo",groupMonitoringShort:"Mon.",settings:"Configuracion",connected:"Conectado",disconnected:"Desconectado",updateTip:'Ejecuta "hermes-web-ui update" en la terminal para actualizar',updateVersion:"Actualizar a v{version}",reloadClientVersion:"Recargar para v{version}",updating:"Actualizando...",updateSuccess:"Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.",updateFailed:"Error al actualizar",logout:"Cerrar sesion",nodeVersionWarning:"Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.",changelog:"Registro de cambios",noChangelog:"No hay registro de cambios",kanban:"Kanban",groupTools:"Herramientas",groupPlatform:"Plataforma",gateways:"Puertas de enlace",expand:"Expandir menú",collapse:"Contraer menú"},performance:{title:"Rendimiento",subtitle:"Supervisa recursos del sistema, Bridge Broker, Workers y sesiones activas",refresh:"Actualizar",autoRefreshOn:"Actualización automática",autoRefreshOff:"Actualización manual",loadFailed:"No se pudieron cargar las métricas de rendimiento",systemCpu:"CPU del sistema",systemMemory:"Memoria del sistema",activeSessions:"Sesiones activas",runningSessions:"En ejecución {count}",workers:"Workers",totalWorkerMemory:"Memoria total de Worker",processes:"Procesos",uptime:"Tiempo activo",running:"En ejecución",stopped:"Detenido",workerMemory:"Memoria de Worker",lastUpdated:"Actualizado",profile:"Profile",memory:"Memoria",sessions:"Sesiones",runningActiveSessions:"En ejecución / Activas",lastUsed:"Último uso",status:"Estado",noWorkers:"Sin Workers",sessionsByProfile:"Sesiones por Profile",noActiveSessions:"No hay sesiones activas"},drawer:{terminal:"Terminal",files:"Espacio de trabajo"},chat:{contextRemaining:"restante",contextClickToEdit:"Haz clic para editar la longitud del contexto",contextEditTitle:"Editar longitud del contexto",contextEditDesc:"Establecer el límite de longitud del contexto para el modelo actual (en tokens)",contextEditPlaceholder:"Ingresa la longitud del contexto",contextEditHint:"Valores comunes: 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",outlineTitle:"Esquema de la conversación",outlineEmpty:"Sin contenido de conversación",outlineUserQuestion:"Pregunta del usuario",inputPlaceholder:"Escribe un mensaje... (Enter para enviar, Shift+Enter para nueva linea)",slashCommandArgs:{message:"<mensaje>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular el uso de la sesión actual",status:"Mostrar estado de sesión y cola",abort:"Detener la ejecución activa de Bridge",queue:"Poner un mensaje en cola tras la ejecución activa",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",allProfiles:"Todos los perfiles",profileMissingModelsTip:'El perfil "{profile}" no tiene proveedor ni modelo disponible para esta sesión',sessionScopeHint:"Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.",openHistory:"Abrir historial",hermesHistory:"Historial de Hermes",historyScopeHint:"Sesiones del historial de Hermes del perfil actual, de solo lectura y agrupadas por origen.",noSessions:"Sin sesiones",newChat:"Nuevo chat",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:"Modo de chat",liveMode:"En vivo",liveSessions:"Sesiones en vivo",recentBadge:"Reciente",linkedSessions:"{count} vinculadas",noVisibleMessages:"No hay mensajes visibles para humanos.",monitorRoleUser:"Usuario",monitorRoleAssistant:"Asistente",copySessionLink:"Copiar enlace de sesión",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:"Tiempo de ejecución",thinkingLabel:"Pensamiento",thinkingInProgress:"Pensando…",thinkingShow:"Mostrar pensamiento",thinkingHide:"Ocultar pensamiento",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensaje",copiedBubble:"Mensaje copiado",copyFailed:"Error al copiar",playSpeech:"Reproducir voz",pauseSpeech:"Pausa",resumeSpeech:"Reanudar",stopSpeech:"Detener",speechNotSupported:"Reproducción de voz no soportada en este navegador",searchEnterHint:"Enter para abrir · Esc para cerrar",searchHint:"Cmd/Ctrl+K",searchScope:"Alcance de búsqueda: solo base de datos local de sesiones de Web UI; no incluye sesiones históricas Hermes de solo lectura.",searchFailed:"No se pudieron buscar sesiones",searchNoSnippet:"No hay resumen disponible",searchNoResults:"No hay sesiones que coincidan",searchRecent:"Sesión reciente",searchEmpty:"Sesiones recientes",searchPlaceholder:"Buscar sesiones...",searchSubtitle:"Buscar por título o contenido de mensajes",searchTitle:"Buscar sesiones",stopGateway:"Detener gateway",start:"Iniciar",workspaceSetFailed:"No se pudo definir el workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Introduce la ruta del proyecto, p. ej. /home/user/project",workspace:"Espacio de trabajo",setWorkspaceTitle:"Definir workspace de sesión",setWorkspace:"Definir workspace",modelSetFailed:"No se pudo definir el modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo de sesión",setModel:"Definir modelo",newCliChat:"Nuevo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproducir voz automáticamente"},jobs:{title:"Tareas programadas",createJob:"Crear tarea",editJob:"Editar tarea",noJobs:"No hay tareas programadas aun. Crea una para comenzar.",name:"Nombre",namePlaceholder:"Nombre de la tarea",schedule:"Programacion (expresion Cron)",schedulePlaceholder:"ej. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Seleccionar un preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"Cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos los dias a las 00:00",presetEveryDay9:"Todos los dias a las 09:00",presetEveryMonday:"Cada lunes a las 09:00",presetEveryMonth:"El dia 1 de cada mes a las 09:00",prompt:"Prompt",promptPlaceholder:"El prompt a ejecutar",deliverTarget:"Destino de entrega",origin:"Origen",local:"Local",repeatCount:"Repeticiones (opcional)",modelPlaceholder:"Modelo por defecto",repeatPlaceholder:"Dejar vacio para infinito",jobCreated:"Tarea creada",jobUpdated:"Tarea actualizada",nameRequired:"El nombre es obligatorio",scheduleRequired:"La programacion es obligatoria",loadFailed:"Error al cargar la tarea",jobPaused:"Tarea en pausa",jobResumed:"Tarea reanudada",jobTriggered:"Job ejecutado",modelUpdated:"Modelo actualizado",jobDeleted:"Tarea eliminada",status:{running:"En ejecucion",paused:"En pausa",disabled:"Desactivada",scheduled:"Programada"},info:{model:"Modelo",schedule:"Programacion",lastRun:"Ultima ejecucion",nextRun:"Proxima ejecucion",deliver:"Entrega",repeat:"Repeticion"},action:{pause:"Pausar",pauseJob:"Pausar tarea",resume:"Reanudar",resumeJob:"Reanudar tarea",runNow:"Ejecutar ahora",triggerImmediately:"Ejecutar inmediatamente"},runHistory:{title:"Historial",runs:"ejecuciones",noRuns:"No se encontró historial."}},skills:{title:"Habilidades",searchPlaceholder:"Buscar habilidades...",noMatch:"Ninguna habilidad coincide con tu busqueda",noSkills:"No se encontraron habilidades",backTo:"Volver a",attachedFiles:"Archivos adjuntos",loadFailed:"Error al cargar la habilidad",fileLoadFailed:"Error al cargar el archivo",modified:"Modificado por el usuario",archived:"Archivado",pinned:"Fijado",pin:"Fijar habilidad",unpin:"Desfijar habilidad",pinFailed:"Error al cambiar estado de fijacion",toggleFailed:"Error al activar/desactivar la habilidad",source:{builtin:"Integrado",hub:"Hub",local:"Local"}},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:"Raíz del agente",python:"Python",scanCwd:"Escanear cwd",projectPlugins:"Plugins del proyecto"}},memory:{title:"Memoria",refresh:"Actualizar",loadFailed:"Error al cargar la memoria",myNotes:"Mis notas",noNotes:"Sin notas aun.",notesPlaceholder:"Escribe tus notas...",userProfile:"Perfil de usuario",noProfile:"Sin perfil aun.",profilePlaceholder:"Escribe tu perfil...",soul:"Alma",noSoul:"Sin configuracion de alma aun.",soulPlaceholder:"Escribe la configuracion del alma..."},models:{title:"Modelos",addProvider:"Anadir proveedor",providerType:"Tipo de proveedor",preset:"Preajuste",custom:"Personalizado",selectProvider:"Seleccionar proveedor",chooseProvider:"Elige un proveedor...",name:"Nombre",autoGeneratedName:"Generado automaticamente desde la URL base",baseUrl:"URL base",region:"Región",regionIntl:"Internacional",regionCn:"China continental",baseUrlPlaceholder:"ej. https://api.example.com/v1",apiKey:"Clave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo predeterminado",selectOrInput:"Seleccionar o ingresar un modelo...",selectModel:"Seleccionar un modelo...",providerAdded:"Proveedor anadido",providerDeleted:"Proveedor eliminado",deleteProvider:"Eliminar proveedor",deleteConfirm:'Estas seguro de que quieres eliminar "{name}"?',codexLoginTitle:"Inicio de sesión de OpenAI Codex",codexWaiting:"Ingrese este código en la página de autorización para iniciar sesión:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorización",codexApproved:"Inicio de sesión exitoso",codexExpired:"La autorización ha expirado. Por favor, inténtelo de nuevo.",nousLoginTitle:"Inicio de sesión de Nous Portal",nousWaiting:"Ingrese este código en la página de autorización:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorización",nousApproved:"Inicio de sesión exitoso",nousDenied:"Autorización denegada",nousExpired:"Autorización expirada",copilotLoginTitle:"Inicio de sesión de GitHub Copilot",copilotWaiting:"Abra GitHub e introduzca el código de dispositivo a continuación para autorizar. La ventana se cerrará automáticamente tras la aprobación.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir la página de autorización de GitHub",copilotApproved:"¡Inicio de sesión exitoso!",copilotDenied:"Autorización denegada.",copilotExpired:"El enlace de autorización ha caducado. Vuelva a intentarlo.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Se detectó un token OAuth de GitHub Copilot en este equipo. Haz clic en Agregar para habilitar Copilot en 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",currentDefault:"Predeterminado actual",defaultShort:"Predeterminado",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",xaiWaiting:"Completa la autorización en la página de xAI abierta. La ventana se cerrará automáticamente al aprobarse.",xaiOpenLink:"Abrir página de autorización de xAI",xaiLoginTitle:"Inicio de sesión OAuth de xAI Grok",xaiExpired:"El enlace de autorización expiró. Inténtalo de nuevo.",xaiCopyLink:"Copiar enlace de autorización",xaiApproved:"¡Inicio de sesión correcto!",visibilitySelectOne:"Mantén al menos un modelo visible",visibilitySaved:"Modelos visibles guardados",visibilitySaveFailed:"No se pudieron guardar los modelos visibles",visibilityHint:"Solo afecta al selector de modelos y a la página de modelos de Web UI. No modifica la configuración provider/model de Hermes CLI; las llamadas siguen usando el ID original del modelo.",showAllModels:"Mostrar todos los modelos",searchPlaceholder:"Buscar modelos...",removeCustomModel:"Eliminar este modelo no listado",more:"más",models:"Lista de modelos",manageVisibleModelsFor:"Gestionar modelos visibles de {name}",manageVisibleModels:"Gestionar modelos visibles",getApiKey:"Obtener API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nombre visible de {model}",aliasTitle:"Nombre visible del modelo",aliasSaveFailed:"No se pudo guardar el nombre visible",aliasPlaceholder:"Dejar vacío para usar el ID original del modelo",aliasManageFor:"Nombres visibles de {provider}",aliasManage:"Nombres visibles",aliasHint:"Solo cambia el nombre visible en Web UI. Hermes sigue recibiendo el ID original del modelo.",aliasEdit:"Renombrar",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfiles",create:"Crear perfil",import:"Importar",export:"Exportar",rename:"Renombrar",delete:"Eliminar",switchTo:"Cambiar Hermes Profile",switchConfirm:"Esto ejecutara `hermes profile use {name}` y cambiara el active profile de Hermes CLI. Continuar?",switchSuccess:'Hermes active profile cambiado a "{name}"',switchFailed:"Error al cambiar Hermes Profile. Es posible que la pasarela necesite un reinicio manual.",createSuccess:'Perfil "{name}" creado',createFailed:"Error al crear el perfil",renameSuccess:"Perfil renombrado",renameFailed:"Error al renombrar el perfil",deleteConfirm:'Estas seguro de que quieres eliminar el perfil "{name}"?',deleteSuccess:"Perfil eliminado",deleteFailed:"Error al eliminar el perfil",exportSuccess:"Perfil exportado",exportFailed:"Error al exportar el perfil",importSuccess:"Perfil importado",importFailed:"Error al importar el perfil",importSelectFile:"Seleccionar archivo de archivo",importInvalidFile:"Por favor, selecciona un archivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nombre del perfil",namePlaceholder:"Solo letras, numeros y guiones",nameValidation:"El nombre del perfil solo puede contener letras minúsculas, números, guiones bajos y guiones",newName:"Nuevo nombre",newNamePlaceholder:"Introduce un nuevo nombre",cloneFromCurrent:"Clonar desde el perfil actual",cloneCleanupNotice:"Al clonar se omiten automáticamente las credenciales exclusivas de plataforma (Weixin / Telegram / Slack, etc.) para evitar conflictos con el perfil de origen",cloneStrippedCredentials:"Se eliminaron {count} credenciales exclusivas: {list}",cloneDisabledPlatforms:"Se deshabilitaron {count} plataforma(s): {list}",cloneStrippedConfigCredentials:"Se eliminaron {count} credencial(es) integradas de config.yaml: {list}",archivePath:"Ruta del archivo",archivePathPlaceholder:"Ruta del servidor al archivo de archivo",importName:"Nombre del perfil (opcional)",importNamePlaceholder:"Dejar vacio para usar el nombre del archivo",active:"Activo",model:"Modelo",gateway:"Pasarela",alias:"Alias",provider:"Proveedor",path:"Ruta",skills:"Habilidades",hasEnv:"Tiene .env",hasSoulMd:"Tiene soul.md",noProfiles:"No se encontraron perfiles. Crea uno para comenzar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Subir imagen",random:"Generar aleatorio",reset:"Restaurar predeterminado",hint:"PNG, JPEG o WebP, máximo 1 MB",invalidType:"Elige una imagen PNG, JPEG o WebP",tooLarge:"La imagen del avatar no puede superar 1 MB",saveSuccess:"Avatar guardado",saveFailed:"No se pudo guardar el avatar",resetSuccess:"Avatar predeterminado restaurado",resetFailed:"No se pudo restaurar el avatar predeterminado"},runtime:{activeProfile:"Actual: {name}",bridgeWorker:"Estado del Bridge",gateway:"Puerta de enlace",active:"Activo",activeTag:"Actual",idle:"Inactivo",running:"En ejecución",stopped:"Detenido",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Cambiar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"No se pudo reiniciar el gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"No se pudo reiniciar el perfil"}},logs:{title:"Registros",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Actualizar",noEntries:"Sin entradas de registro"},settings:{title:"Configuracion",saved:"Guardado",saveFailed:"Error al guardar",tabs:{display:"Pantalla",account:"Cuenta actual",users:"Gestion de cuentas",agent:"Agente",memory:"Memoria",compression:"Compresion",session:"Sesion",privacy:"Privacidad",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respuestas en streaming",streamingHint:"Mostrar respuestas de la IA en tiempo real",compact:"Modo compacto",compactHint:"Reducir el espaciado entre mensajes",showReasoning:"Mostrar razonamiento",showReasoningHint:"Mostrar el proceso de pensamiento del modelo",showCost:"Mostrar costo",showCostHint:"Mostrar uso de tokens en las respuestas",inlineDiffs:"Diffs en linea",inlineDiffsHint:"Mostrar cambios de codigo en linea",bellOnComplete:"Sonido de finalizacion",bellOnCompleteHint:"Reproducir un sonido cuando la IA termina",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada mientras la IA procesa",theme:"Tema",themeHint:"Elige claro, oscuro o seguir la preferencia del sistema",themeLight:"Claro",themeDark:"Oscuro",themeSystem:"Sistema"},agent:{maxTurns:"Turnos maximos",maxTurnsHint:"Rondas maximas de interaccion por conversacion",gatewayTimeout:"Tiempo de espera de la pasarela",gatewayTimeoutHint:"Tiempo de espera de la peticion en segundos",restartDrainTimeout:"Tiempo de drenado al reiniciar",restartDrainTimeoutHint:"Tiempo de drenado antes de reiniciar en segundos",toolEnforcement:"Aplicacion de herramientas",toolEnforcementHint:"Controlar el modo de ejecucion de llamadas a herramientas",auto:"Automatico",always:"Siempre",never:"Nunca"},memory:{enabled:"Activar memoria",enabledHint:"Permitir que la IA recuerde el contexto de la conversacion",userProfile:"Perfil de usuario",userProfileHint:"Permitir que la IA recuerde las preferencias del usuario",charLimit:"Limite de caracteres de memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres del perfil de usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Activar compresion",enabledHint:"Comprimir automaticamente el historial largo antes de superar el contexto del modelo",threshold:"Umbral de compresion",thresholdHint:"Iniciar compresion cuando los tokens estimados superen esta proporcion del contexto",targetRatio:"Proporcion objetivo",targetRatioHint:"Tamano objetivo del historial tras comprimir como proporcion del contexto",protectLastN:"Proteger mensajes recientes",protectLastNHint:"Mantener sin comprimir esta cantidad de mensajes recientes",protectFirstN:"Proteger primeros mensajes",protectFirstNHint:"Mantener sin comprimir esta cantidad de mensajes iniciales"},session:{mode:"Modo de reinicio",modeHint:"Condicion de activacion del reinicio de sesion",modeBoth:"Inactividad + Programado",modeIdle:"Solo inactividad",modeDaily:"Solo programado",modeNone:"Nunca (solo manual)",idleMinutes:"Tiempo de inactividad",idleMinutesHint:"Tiempo de espera antes del reinicio automatico (minutos)",atHour:"Hora de reinicio programado",humanOnly:"Mostrar solo sesiones humanas",humanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones",liveMonitorHumanOnly:"Monitor en vivo: mostrar solo sesiones humanas",liveMonitorHumanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones en el monitor en vivo",atHourHint:"Reiniciar sesion a esta hora todos los dias",requireAuth:"Autorización de sesión",requireAuthHint:"Requiere autorización para operaciones de sesión"},privacy:{redactPii:"Ocultar informacion personal",redactPiiHint:"Detectar y ocultar automaticamente informacion sensible (contrasenas, claves, etc.)"},apiServer:{enable:"Activar",enableHint:"Activar servidor API",host:"Host",hostHint:"Direccion de escucha",port:"Puerto",portHint:"Puerto de escucha",key:"Clave",keyHint:"Clave de acceso API",cors:"Origenes CORS",corsHint:"Fuentes cross-origin permitidas"},voice:{ttsProvider:"Proveedor TTS",ttsProviderHint:"Elija el motor de texto a voz para la reproduccion de mensajes",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compatible con OpenAI)",providerEdge:"Edge TTS (Gratuito, sin clave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Seleccione una voz de su navegador o sistema operativo",webspeechVoicePlaceholder:"Auto (voz predeterminada)",openaiKey:"Clave API",openaiKeyHint:"Su clave API de OpenAI con acceso TTS",openaiUrl:"URL base de API",openaiUrlHint:"ej. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mas rapido) / tts-1-hd (mayor calidad)",openaiVoice:"Voz",openaiVoiceHint:"Voz a utilizar para la sintesis",customHint:"Utilice cualquier API TTS compatible con OpenAI — funciona con GPT-SoVITS, CosyVoice, etc.",customUrl:"URL de API",customUrlHint:"URL base de su servicio TTS",customUrlPlaceholder:"Direccion configurada en el adaptador local, ej. http://127.0.0.1:9880",customApiKey:"Clave API (opcional)",customApiKeyHint:"Algunos endpoints personalizados requieren autenticacion",customApiKeyPlaceholder:"Dejar en blanco si no es necesario",edgeHint:"Impulsado por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL del adaptador",edgeUrlHint:"Direccion del adaptador Edge TTS, ej. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Seleccione una voz para la sintesis de voz",edgeRate:"Velocidad",edgeRateHint:"Ajustar velocidad del habla (0.5x ~ 2.0x)",edgePitch:"Tono",edgePitchHint:"Ajustar tono del habla (-20 ~ +20 Hz)",testTitle:"Prueba de voz",testText:"Texto de prueba",testTextPlaceholder:"Ingrese texto para probar...",testTextDefault:"Hola, esta es una prueba de voz.",testButton:"Probar",testButtonPlaying:"Reproduciendo...",testFailed:"Prueba fallida: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voces predefinidas, diseño de voz y clonación de voz",mimoApiKey:"Clave API",mimoApiKeyHint:"Obtenga su clave en platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Clave API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Introduce API Key",noProviders:"No hay proveedores configurados",save:"Guardar",saveFailed:"Error al guardar",saved:"Guardado"}},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...",qqSandboxHint:"Habilitar entorno sandbox (para pruebas)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escanea el código QR con QQ o abre el enlace en el teléfono para completar la vinculación",qqMarkdownHint:"Habilitar mensajes con formato Markdown (algunos clientes pueden no soportarlo)",qqMarkdown:"Soporte Markdown",qqAppSecretHint:"App Secret del bot de QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID del bot de QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista blanca de IDs de usuario u OpenID, separados por comas",allowedUsers:"Usuarios permitidos",allowAllUsersHint:"Permite mensajes de cualquier usuario; desactívalo para usar la lista blanca",allowAllUsers:"Permitir todos los usuarios"},language:{label:"Idioma",zh:"中文",en:"English",es:"Espanol"},terminal:{sessions:"Sesiones",newTab:"Nueva terminal",closeSession:"Cerrar esta sesion?",sessionExited:"Finalizada",processExited:"Proceso finalizado con codigo {code}",noSessions:"No hay sesiones de terminal",connectionFailed:"No se pudo conectar al terminal",connectionError:"Error de conexión",connectionClosed:"Conexión cerrada"},usage:{title:"Estadisticas de uso",refresh:"Actualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Salida",totalSessions:"Total de sesiones",avgPerDay:"~{n}/dia de promedio",estimatedCost:"Costo est.",cacheHitRate:"Tasa de acierto de cache",modelBreakdown:"Desglose por modelo",dailyTrend:"Uso diario",date:"Fecha",tokens:"Tokens",cache:"Caché",cacheRead:"Lectura de caché",cacheWrite:"Escritura de caché",sessions:"Sesiones",cost:"Costo",noData:"Sin datos de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Sigue las cargas y ediciones de habilidades en sesiones de Hermes",refresh:"Actualizar",periodSelector:"Periodo de uso de habilidades",periodLabel:"{days} d",summary:"Resumen",totalActions:"Acciones",loads:"Cargas",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendencia diaria",periodSummary:"Últimos {days} días",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"No hay datos de uso de habilidades",loadFailed:"No se pudo cargar el uso de habilidades",otherSkills:"Otras habs."},changelog:{new_0_5_22_1:"La API de lista de sesiones de Hermes lee la base de datos del perfil en vez del almacén local de sesiones de la Web UI",new_0_5_23_1:"Comandos slash de chat solo para Bridge con sugerencias localizadas",new_0_5_23_2:"Historial de comandos persistente para reproducir sesiones sin contaminar contexto, uso ni compresión",new_0_5_23_3:"Variables de entorno del perfil gateway aisladas para evitar filtración de credenciales entre perfiles",new_0_5_23_4:"Reserva del puerto de la Web UI durante la asignación del gateway para evitar conflictos de arranque",new_0_5_23_5:"Corrección del reinicio de autoactualización para no reportar como fallo una salida correcta del helper",new_0_5_24_1:"Chat Bridge alineado con API Server para entrada multimodal, prompt del sistema y contexto de workspace",new_0_5_25_1:"Acciones de restablecer y clonar salas de chat grupal",new_0_5_25_2:"Directorio de estado de la Web UI configurable para diseños de despliegue personalizados",new_0_5_25_3:"MiMo agregado como proveedor TTS en ajustes de voz",new_0_5_25_4:"Listas de modelos de proveedores personalizados cargadas desde backend para evitar errores CORS del navegador",new_0_5_25_5:"Corrección del flujo de aprobación de herramientas en sesiones Bridge",new_0_5_25_6:"Eliminada la pista de plataforma CLI forzada en prompts Bridge para preservar instrucciones personalizadas de medios y archivos",new_0_5_25_7:"Contenido de imagen base64 mostrado correctamente en el historial de mensajes de usuario",new_0_5_25_8:"Pruebas Playwright, cobertura de contrato de streaming de chat, cobertura de modelos de proveedor y línea base de cobertura",new_0_5_26_1:"Soporte para rutas de medios Markdown locales y de Windows en historial y mensajes renderizados",new_0_5_26_2:"Filtrado de historial vacío del assistant y limpieza del estado de compresión obsoleto al iniciar una nueva ejecución",new_0_5_26_3:"Escrituras bloqueadas para actualizaciones de configuración y perfil para reducir corrupción por concurrencia",new_0_5_26_4:"Ajustes de canal QQBot y DingTalk",new_0_5_26_5:"Detección de puerto CLI portable y mejoras de tamaño del cajón de terminal móvil",new_0_5_26_6:"Entornos de perfil Bridge aislados y descubrimiento de plugins Hermes corregido entre entornos Python",new_0_5_26_7:"Estados de gateway detenido explicados con diagnósticos de Web UI y estado de carga de logs estable",new_0_5_26_8:"Corrección de opciones de restablecimiento de sesión, base URL de proveedor personalizado y destinos dinámicos de entrega",new_0_5_26_9:"Interruptor local para mostrar trazas de tool calls en la barra de entrada del chat",new_0_5_26_10:"Instalación del paquete Hermes Agent cuando no hay checkout de código fuente disponible",new_0_5_26_11:"Login OAuth de xAI Grok para usuarios SuperGrok y actualización de presets de modelos Grok",new_0_5_26_12:"Cobertura ampliada de navegador, streaming de chat, proveedor, gateway, configuración, plugins y Bridge",new_0_5_27_1:"Ajustes de modelo por sesión para chats Bridge, con proveedor y modelo independientes guardados por sesión",new_0_5_27_2:"Clic derecho en una sesión Bridge y elegir Definir modelo para cambiar el modelo de esa sesión",new_0_5_27_3:"Las ejecuciones validan el modelo de sesión y vuelven al modelo predeterminado actual si el guardado no está disponible",new_0_5_27_4:"La compresión de contexto sigue por defecto el modelo predeterminado seleccionado en el perfil actual",new_0_5_30_1:"Bridge chat conserva historial estructurado, corrigiendo respuestas intermitentes ausentes y herramientas omitidas por historial de herramientas aplanado",new_0_5_30_2:"El enrutamiento de menciones en chat grupal es más fiable con varios agentes, elimina la propia mención @ antes de entregar y mantiene nombres de usuario tras refrescar",new_0_5_30_3:"Páginas de modelos, desplegables de modelo de chat y selección de modelo de sesión se acotan al perfil activo con marcadores predeterminados precisos",new_0_5_30_4:"Gestión del gateway simplificada: se elimina la página independiente, cada perfil verifica configuración de plataforma antes de iniciar y un runner ligero gestiona arranques y reinicios",new_0_5_30_5:"Arranque del gateway mejorado en Docker, Termux y Windows con manejo de runtime-lock, limpieza de conflictos de puerto, ejecución en segundo plano y soporte de reinicio",new_0_5_30_6:"Compatibilidad Windows reforzada para detección de rutas, descargas de archivos y subprocesos de tareas/actualización sin ventanas de terminal parpadeantes",new_0_5_30_7:"Escritura de configuración y presets de proveedores corregidos: validar claves .env, enrutar FUN-Codex por Responses API y actualizar modelos Z.AI/GLM",new_0_5_30_8:"Detalles del frontend pulidos, incluyendo barra lateral colapsada, etiquetas cortas de grupo, divisor lateral y estilo del esquema de conversación",new_0_5_30_9:"La compresión de contexto sigue ajustes del perfil y endurece snapshots obsoletos reutilizando resúmenes previos con una cola segura",new_0_5_31_1:"Reinicios del Bridge broker reforzados, renderizado final del stream de chat grupal corregido y enrutamiento {'@'}all agregado",new_0_5_31_2:"El gestor de archivos puede copiar rutas absolutas y el cajón móvil de sesiones ya no queda detrás del chat",new_0_5_31_3:"Selector de perfiles con avatares, subida de avatar personalizado, modal de estado runtime y acciones de reinicio de gateway/perfil",new_0_5_31_4:"Avatares de perfil en chat individual, grupal y barra lateral colapsada, con metadatos en Web UI y rutas seguras para Windows",new_0_5_31_5:"Mejoras en detección y reinicio de gateway en Docker, Termux y Windows usando gateway_state/gateway.pid para liveness del gateway gestionado",new_0_5_31_6:"Endpoint multimedia de generación de imágenes APIKEY.FUN y skill apikey-image-gen integrado para texto-a-imagen, imagen-a-imagen y edición desde el proveedor fun-codex del perfil activo",new_0_5_33_1:"Los fallos de ejecución y errores Socket en chat individual y grupal quedan como mensajes Agent rojos en la lista de mensajes",new_0_5_33_2:"La búsqueda de sesiones puede limitarse al Profile seleccionado, o buscar en todos los Profiles si no hay uno seleccionado",new_0_5_33_3:"La página Skills muestra documentos de recomendaciones en chino/inglés cuando no hay skill seleccionado, y un segundo clic deselecciona el skill",new_0_5_33_4:"Se eliminan entradas de changelog i18n sin uso para reducir el tamaño del frontend",new_0_5_33_5:"Se corrige el inicio de agent bridge en Windows chino cuando la salida de netstat falla por codificación",new_0_5_33_6:"Lista de modelos Nous Portal actualizada desde el catalog público y recomendaciones Portal",new_0_5_33_7:"Las listas y estados runtime de Profile leen nombres desde directorios y modelos por defecto desde config, evitando errores por ancho de columnas CLI",new_0_5_34_1:"Normaliza resultados de tools multimodales al guardar mensajes de sesión/grupo para evitar imágenes base64 en los replays",new_0_5_34_2:"Persiste modelos Hermes personalizados en configuración gestionada por backend y añade endpoints para agregar/eliminar modelos",new_0_5_34_3:"Mantiene correctos el uso final de contexto Bridge y los estados de tools al completar ejecuciones",new_0_5_34_4:"Mejora filtros de Kanban, visualización de responsables, acciones de tarjetas y detalles de tareas",new_0_5_34_5:"Corrige la contabilidad de compresión con caché de contexto fijo de prompt/tools y totales completos de tokens",new_0_5_34_6:"Cachea contexto fijo por agent de chat grupal y muestra progreso solo cuando la compresión empieza realmente",new_0_5_34_7:"Sincroniza skills integradas de Web UI en todos los Profiles y registra el Profile destino en logs",new_0_5_34_8:"Si Kanban falla en Windows, actualiza Hermes para recibir las últimas correcciones de migración de la base Kanban",new_0_5_35_1:"Las sesiones Bridge ahora pueden ejecutarse en paralelo entre distintos sessions, mientras los runs del mismo session siguen serializados para conservar el orden",new_0_5_35_2:"Añade la página Performance Monitor para CPU/memoria del sistema, Web UI, Bridge Broker, Workers y estado de sesiones activas",new_0_5_35_3:"Añade métricas por worker con CPU, memoria, Profile, número de sesiones y estado de ejecución",new_0_5_35_4:"Mejora la limpieza del ciclo de vida de Bridge workers para recuperar workers al cerrar el Broker o terminar el proceso padre y reducir procesos Python huérfanos",new_0_5_35_5:"Refuerza la compatibilidad del monitoreo con fallbacks de recursos para macOS, Windows, Linux, Docker y Termux",new_0_5_35_6:"Performance Monitor ya no se bloquea con requests a workers durante la inicialización de Agent, reduciendo request timeouts en Windows",new_0_5_35_7:"Chat Markdown ahora soporta vista previa inline de contenido de texto, y los iconos de descarga bajan archivos directamente sin abrir el drawer",new_0_5_35_8:"Mejora el drawer de contenido con cierre en móvil, ancho completo en móvil, 800px en escritorio y fondos consistentes para texto/Markdown",new_0_6_0_1:"La gestión por cuenta y por Profile protege de forma coherente sesiones, modelos, uso, Kanban, jobs, subidas, medios y APIs Hermes relacionadas",new_0_6_0_2:"Los Skills de medios integrados usan el token de servidor generado solo para endpoints de medios y resuelven credenciales fun-codex/xAI desde el Profile solicitado",new_0_6_0_3:"El chat individual y el grupal inyectan el Hermes Profile actual en las instrucciones del run para que los Skills envíen X-Hermes-Profile",new_0_6_0_4:"El progreso de subagents de delegate_task se muestra en la UI del chat con estados de inicio, herramienta, progreso y finalización",new_0_6_0_5:"Al detener o abortar un run se limpian eventos temporales para que el estado abort anterior no pase al siguiente chat",new_0_6_0_6:"Actualiza documentación y sitio web para gestión de cuentas, credenciales predeterminadas, gestión cuenta/Profile, subidas/descargas y Skills de medios",new_0_6_0_7:"Añade comandos CLI de mantenimiento para limpiar bloqueos de IP de login y restablecer el login predeterminado admin / 123456",new_0_6_0_8:"La versión 0.6.0 marca el límite entre la Web UI de usuario único y multiusuario. Si el modo multiusuario causa problemas, abre un issue y vuelve a la versión 0.5.35 de usuario único si es necesario"},files:{title:"Archivos",tree:"Arbol de directorios",list:"Lista de archivos",breadcrumbRoot:"Inicio",newFile:"Nuevo archivo",newFolder:"Nueva carpeta",upload:"Subir",refresh:"Actualizar",open:"Abrir",edit:"Editar",preview:"Vista previa",download:"Descargar",copyPath:"Copiar ruta",rename:"Renombrar",delete:"Eliminar",name:"Nombre",size:"Tamano",modified:"Modificado",actions:"Acciones",emptyDir:"Directorio vacio",loading:"Cargando...",confirmDelete:'?Seguro que quiere eliminar "{name}"?',confirmDeleteDir:'?Seguro que quiere eliminar el directorio "{name}" y todo su contenido?',deleteFailed:"Error al eliminar",deleted:"Eliminado",renameTo:"Renombrar a",newFileName:"Nombre del archivo",newFolderName:"Nombre de la carpeta",created:"Creado",createFailed:"Error al crear",renamed:"Renombrado",renameFailed:"Error al renombrar",uploadSuccess:"{count} archivo(s) subido(s)",uploadFailed:"Error al subir",saveFailed:"Error al guardar",saved:"Guardado",unsavedChanges:"Tiene cambios sin guardar. ?Descartar?",pathCopied:"Ruta copiada",fileTooLarge:"Archivo demasiado grande (max 10MB)",permissionDenied:"No se puede modificar un archivo protegido",notFound:"Archivo o directorio no encontrado",backendError:"Error en la operacion de archivo",dragDropHint:"Arrastra archivos aqui para subir",closeEditor:"Cerrar editor",closePreview:"Cerrar",saveFile:"Guardar",fileTree:"Árbol de archivos"},groupChat:{title:"Chat grupal",createRoom:"Crear sala",joinByCode:"Unirse con codigo",roomName:"Nombre de la sala",roomNamePlaceholder:"Ingrese el nombre de la sala",inviteCode:"Codigo de invitacion",autoGenerate:"Generar automaticamente",noRooms:"Aun no hay salas",selectOrCreate:"Seleccione o cree una sala para comenzar a chatear",agents:"Agentes",addAgent:"Agregar agente",selectProfile:"Seleccione un perfil",agentAdded:"Agente agregado",agentAlreadyInRoom:"El agente ya esta en esta sala",agentAddFailedCount:"No se agregaron {count} agente(s): {details}",noAgents:"No hay agentes en esta sala",members:"Miembros",roomCreated:"Sala creada",roomDeleted:"Sala eliminada",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar enlace de sala",deleteRoomConfirm:"¿Eliminar esta sala?",clearContext:"Limpiar contexto",clearContextConfirm:"¿Limpiar el contexto de esta sala? Se eliminarán mensajes e instantáneas de compresión, pero se conservan agentes y miembros.",contextCleared:"Contexto limpiado",you:"Tú",joined:"Se unio a la sala",joinFailed:"Error al unirse a la sala",inputPlaceholder:"Escriba un mensaje... (Enter para enviar)",enterCode:"Ingrese el codigo de invitacion",yourName:"Tu nombre",yourNamePlaceholder:"Ingresa tu nombre para mostrar",yourDescription:"Descripcion (opcional)",yourDescriptionPlaceholder:"Cuentales a los demas quien eres...",agentName:"Nombre del agente",agentNamePlaceholder:"Nombre personalizado (vacío = nombre del perfil)",agentDesc:"Descripción del agente",agentDescPlaceholder:"Describe lo que hace este agente...",agentReplying:"está respondiendo...",agentCompressing:"está comprimiendo contexto...",compressionSettings:"Configuración de compresión",triggerTokens:"Tokens de activación",triggerTokensDesc:"Umbral de tokens para activar la compresión",maxHistoryTokens:"Tokens máximos de historial",maxHistoryTokensDesc:"Máximo de tokens para el contexto comprimido",tailMessageCount:"Mensajes recientes",tailMessageCountDesc:"Número de mensajes recientes a conservar sin comprimir",compressionConfig:"Config. de compresión",compressNow:"Comprimir ahora",compressingInProgress:"Compresión en progreso",compressionSaved:"Configuración guardada"},download:{downloading:"Descargando...",downloadFailed:"Error en la descarga",fileNotFound:"Archivo no encontrado o eliminado",fileTooLarge:"Archivo demasiado grande (excede el limite)",backendError:"Error al leer el archivo, el entorno remoto puede no estar disponible",backendTimeout:"Tiempo de lectura del archivo agotado",unsupportedBackend:"El backend del terminal actual no admite la descarga de archivos",invalidPath:"Ruta de archivo invalida",contentDisplay:"Contenido",download:"Descargar",downloadFile:"Descargar archivo"},gateways:{title:"Puertas de enlace",running:"En ejecución",stopped:"Detenido",started:"Iniciado",startFailed:"No se pudo iniciar el gateway",stopFailed:"No se pudo detener el gateway"},kanban:{title:"Tablero Kanban",createTask:"Nueva tarea",noTasks:"Sin tareas",allStatuses:"Todos los estados",allAssignees:"Todos los responsables",columns:{triage:"Clasificación",todo:"Pendiente",ready:"Listo",running:"En curso",blocked:"Bloqueado",done:"Completado",archived:"Archivado"},card:{assigneeTooltip:"Responsable",priority:{low:"Baja",medium:"Media",high:"Alta"},timeAgo:{justNow:"ahora mismo",minutes:"hace {count} min",hours:"hace {count} h",days:"hace {count} d"}},board:{create:"Nuevo tablero",archive:"Archivar tablero",archiveConfirm:"¿Archivar el tablero actual?",archived:"Tablero archivado",created:"Tablero creado",slugPlaceholder:"Identificador del tablero, p. ej. project-a",namePlaceholder:"Nombre visible (opcional)",slugRequired:"El identificador del tablero es obligatorio"},form:{title:"Título",titlePlaceholder:"Título de la tarea",titleRequired:"El título es obligatorio",body:"Descripción",bodyPlaceholder:"Descripción de la tarea (opcional)",assignee:"Responsable",selectAssignee:"Seleccionar responsable...",priority:"Prioridad",selectPriority:"Seleccionar prioridad..."},detail:{status:"Estado",priority:"Prioridad",assignee:"Responsable",tenant:"Inquilino",createdAt:"Creada",startedAt:"Iniciada",completedAt:"Completada",comments:"Comentarios",events:"Eventos",runs:"Ejecuciones",artifacts:"Archivos generados",result:"Resultado",highlights:"Información clave",sources:"Fuentes de datos",sessions:"Sesiones relacionadas",sessionMessages:"Mensajes de sesión",noSessions:"No se encontraron sesiones relacionadas."},action:{title:"Acciones",assign:"Asignar",assignTo:"Asignar a...",block:"Bloquear",blockReason:"Motivo del bloqueo",unblock:"Desbloquear",complete:"Completar",completeSummary:"Resumen de finalización (opcional)"},message:{loadFailed:"No se pudo cargar la tarea",taskCreated:"Tarea creada",taskAssigned:"Tarea asignada",taskBlocked:"Tarea bloqueada",taskUnblocked:"Tarea desbloqueada",taskCompleted:"Tarea completada"},stats:{total:"Total",tasks:"Tareas"}}},Ht={login:{title:"Hermes Web UI",description:"Geben Sie Benutzername und Passwort ein, um fortzufahren.",placeholder:"Zugangs-Token",submit:"Anmelden",tokenRequired:"Bitte geben Sie Ihren Zugangs-Token ein",invalidToken:"Ungultiger Token",connectionFailed:"Verbindung zum Server nicht moglich",passwordLogin:"Passwort",tokenLogin:"Token",usernamePlaceholder:"Benutzername",passwordPlaceholder:"Passwort",defaultCredentialsHint:"Standard-Benutzername: admin. Standard-Passwort: 123456.",credentialsRequired:"Bitte Benutzername und Passwort eingeben",invalidCredentials:"Ungultiger Benutzername oder Passwort",tooManyAttempts:"Zu viele fehlgeschlagene Versuche, bitte versuchen Sie es spater erneut",sessionExpired:"Die Anmeldung ist abgelaufen. Bitte melden Sie sich erneut an.",accessDenied:"Sie haben keine Berechtigung fur diese Ressource.",passwordMismatch:"Passworter stimmen nicht uberein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",setupSuccess:"Passwort-Login erfolgreich konfiguriert",passwordChanged:"Passwort erfolgreich geandert",passwordRemoved:"Passwort-Login entfernt",setupPassword:"Passwort-Login einrichten",changePassword:"Passwort andern",changeUsername:"Benutzername andern",removePasswordLogin:"Entfernen",username:"Benutzername",currentPassword:"Aktuelles Passwort",newPassword:"Neues Passwort",confirmPassword:"Passwort bestatigen",newUsername:"Neuer Benutzername",usernameChanged:"Benutzername erfolgreich geandert",usernameTooShort:"Benutzername muss mindestens 2 Zeichen lang sein",setupDescription:"Verwalten Sie Benutzername und Passwort fur die Anmeldung.",removeConfirm:"Passwort-Login ist fur Benutzerkonten erforderlich.",passwordLoginNotConfigured:"Passwort-Login ist nicht konfiguriert",passwordLoginConfigured:"Aktuelles Konto: {username}",defaultCredentialTitle:"Standardkonto und Passwort andern",defaultCredentialMessage:"Das aktuelle Konto verwendet noch den Standard-Benutzernamen oder das Standard-Passwort. Um unbefugten Zugriff zu vermeiden, andern Sie Benutzername und Passwort des aktuellen Kontos so bald wie moglich.",defaultCredentialAction:"Jetzt andern",defaultCredentialLater:"Spater erinnern"},users:{title:"Kontoverwaltung",description:"Benutzer erstellen, Rollen zuweisen und steuern, auf welche Profile normale Administratoren zugreifen koennen.",create:"Benutzer erstellen",edit:"Benutzer bearbeiten",username:"Benutzername",role:"Rolle",statusLabel:"Status",profiles:"Zugreifbare Profile",profilesPlaceholder:"Zugreifbare Profile auswaehlen",allProfiles:"Alle Profile",noProfiles:"Keine Profile zugewiesen",lastLogin:"Letzte Anmeldung",newPasswordOptional:"Neues Passwort (leer lassen zum Beibehalten)",loadFailed:"Benutzer konnten nicht geladen werden",deleteConfirm:"Diesen Benutzer loeschen?",enable:"Aktivieren",disable:"Deaktivieren",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Aktiv",disabled:"Deaktiviert"}},common:{loading:"Laden...",cancel:"Abbrechen",retry:"Erneutern",delete:"Loschen",edit:"Bearbeiten",save:"Speichern",saved:"Gespeichert",update:"Aktualisieren",create:"Erstellen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Loschen fehlgeschlagen",ok:"OK",copied:"Kopiert",copy:"Kopieren",noData:"Keine Daten",fetch:"Abrufen",add:"Hinzufugen",enable:"Aktivieren",disable:"Deaktivieren",configured:"Konfiguriert",notConfigured:"Nicht konfiguriert",confirm:"Bestatigen",expand:"Aufklappen",collapse:"Zuklappen",stop:"Stoppen",start:"Starten",expired:"Abgelaufen"},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",performance:"Leistung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Konsole",files:"Dateien",groupChat:"Gruppenchat",groupConversation:"Konversation",groupConversationShort:"Konv",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Überwachung",groupMonitoringShort:"Überw.",settings:"Einstellungen",connected:"Verbunden",disconnected:"Getrennt",updateTip:'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',updateVersion:"Aktualisieren auf v{version}",reloadClientVersion:"Für v{version} neu laden",updating:"Aktualisierung...",updateSuccess:"Aktualisierung erfolgreich. Bitte aktualisieren Sie die Seite in Kurze. Wenn der Dienst langere Zeit nicht startet, starten Sie ihn manuell.",updateFailed:"Aktualisierung fehlgeschlagen",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar",kanban:"Kanban",groupTools:"Werkzeuge",groupPlatform:"Plattform",gateways:"Gateways",expand:"Menü ausklappen",collapse:"Menü einklappen"},performance:{title:"Leistung",subtitle:"Systemressourcen, Bridge Broker, Workers und aktive Sitzungen überwachen",refresh:"Aktualisieren",autoRefreshOn:"Automatisch aktualisieren",autoRefreshOff:"Manuell aktualisieren",loadFailed:"Leistungsdaten konnten nicht geladen werden",systemCpu:"System-CPU",systemMemory:"Systemspeicher",activeSessions:"Aktive Sitzungen",runningSessions:"Laufend {count}",workers:"Workers",totalWorkerMemory:"Worker-Gesamtspeicher",processes:"Prozesse",uptime:"Laufzeit",running:"Läuft",stopped:"Gestoppt",workerMemory:"Worker-Speicher",lastUpdated:"Aktualisiert",profile:"Profile",memory:"Speicher",sessions:"Sitzungen",runningActiveSessions:"Laufend / Aktiv",lastUsed:"Zuletzt verwendet",status:"Status",noWorkers:"Keine Workers",sessionsByProfile:"Sitzungen nach Profile",noActiveSessions:"Keine aktiven Sitzungen"},drawer:{terminal:"Konsole",files:"Arbeitsbereich"},chat:{contextRemaining:"übrig",contextClickToEdit:"Klicken zum Bearbeiten der Kontextlänge",contextEditTitle:"Kontextlänge bearbeiten",contextEditDesc:"Kontextlängenlimit für aktuelles Modell festlegen (in Tokens)",contextEditPlaceholder:"Kontextlänge eingeben",contextEditHint:"Häufige Werte: 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",outlineTitle:"Konversationsübersicht",outlineEmpty:"Kein Konversationsinhalt",outlineUserQuestion:"Benutzerfrage",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)",slashCommandArgs:{message:"<Nachricht>",title:"<Titel>",text:"<Text>"},slashCommands:{usage:"Nutzung der aktuellen Sitzung berechnen",status:"Sitzungsstatus und Warteschlange anzeigen",abort:"Aktiven Bridge-Lauf stoppen",queue:"Nachricht hinter dem aktiven Lauf einreihen",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",allProfiles:"Alle Profile",profileMissingModelsTip:'Profil "{profile}" hat keinen verfuegbaren Provider oder kein Modell fuer diese Sitzung',sessionScopeHint:"Chat zeigt nur Web-UI/API-Server-Sitzungen. CLI-, Telegram-, Discord-, Cron- und andere Kanal-Sitzungen sind schreibgeschützt im Verlauf.",openHistory:"Verlauf öffnen",hermesHistory:"Hermes-Verlauf",historyScopeHint:"Schreibgeschützte Hermes-Verlaufssitzungen des aktuellen Profils, nach Quelle gruppiert.",noSessions:"Keine Sitzungen",newChat:"Neuer Chat",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:"Chatmodus",liveMode:"Live-Modus",liveSessions:"Live-Sitzungen",recentBadge:"Kürzlich",linkedSessions:"{count} verknüpft",noVisibleMessages:"Keine für Menschen sichtbaren Nachrichten.",monitorRoleUser:"Benutzer",monitorRoleAssistant:"Assistent",copySessionLink:"Sitzungslink kopieren",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:"Ausführungszeit",thinkingLabel:"Denkprozess",thinkingInProgress:"Denkt…",thinkingShow:"Denkprozess anzeigen",thinkingHide:"Denkprozess ausblenden",thinkingDuration:"Beobachtet {duration}",thinkingChars:"{count} Zeichen",copyBubble:"Nachricht kopieren",copiedBubble:"Nachricht kopiert",copyFailed:"Kopieren fehlgeschlagen",playSpeech:"Sprache abspielen",pauseSpeech:"Pausieren",resumeSpeech:"Fortsetzen",stopSpeech:"Stoppen",speechNotSupported:"Sprachwiedergabe in diesem Browser nicht unterstützt",searchEnterHint:"Enter zum Öffnen · Esc zum Schließen",searchHint:"Cmd/Ctrl+K",searchScope:"Suchbereich: nur lokale Web-UI-Sitzungsdatenbank; schreibgeschützte Hermes-Verlaufssitzungen sind nicht enthalten.",searchFailed:"Sitzungssuche fehlgeschlagen",searchNoSnippet:"Keine Vorschau verfügbar",searchNoResults:"Keine passenden Sitzungen",searchRecent:"Letzte Sitzung",searchEmpty:"Letzte Sitzungen",searchPlaceholder:"Sitzungen suchen...",searchSubtitle:"Nach Titel oder Nachrichteninhalt suchen",searchTitle:"Sitzungen suchen",stopGateway:"Gateway stoppen",start:"Starten",workspaceSetFailed:"Workspace konnte nicht festgelegt werden",workspaceSet:"Workspace festgelegt",workspacePlaceholder:"Projektpfad eingeben, z. B. /home/user/project",workspace:"Arbeitsbereich",setWorkspaceTitle:"Sitzungs-Workspace festlegen",setWorkspace:"Workspace festlegen",modelSetFailed:"Modell konnte nicht festgelegt werden",modelSet:"Modell festgelegt",setModelTitle:"Sitzungsmodell festlegen",setModel:"Modell festlegen",newCliChat:"Neue CLI",cliEmptyState:"CLI-Chat starten",autoPlaySpeech:"Sprache automatisch abspielen"},jobs:{title:"Geplante Aufgaben",createJob:"Aufgabe erstellen",editJob:"Aufgabe bearbeiten",noJobs:"Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.",name:"Name",namePlaceholder:"Aufgabenname",schedule:"Zeitplan (Cron-Ausdruck)",schedulePlaceholder:"z. B. 0 9 * * *",quickPresets:"Schnellvorgaben",selectPreset:"Vorgabe auswahlen...",presetEveryMinute:"Jede Minute",presetEvery5Min:"Alle 5 Minuten",presetEveryHour:"Jede Stunde",presetEveryDay:"Jeden Tag um 00:00",presetEveryDay9:"Jeden Tag um 09:00",presetEveryMonday:"Jeden Montag um 09:00",presetEveryMonth:"Am 1. jedes Monats um 09:00",prompt:"Eingabeaufforderung",promptPlaceholder:"Der auszufuhrende Prompt",deliverTarget:"Zustellziel",origin:"Herkunft",local:"Lokal",repeatCount:"Wiederholungsanzahl (optional)",modelPlaceholder:"Standardmodell",repeatPlaceholder:"Leer lassen fur unendlich",jobCreated:"Aufgabe erstellt",jobUpdated:"Aufgabe aktualisiert",nameRequired:"Name ist erforderlich",scheduleRequired:"Zeitplan ist erforderlich",loadFailed:"Laden der Aufgabe fehlgeschlagen",jobPaused:"Aufgabe pausiert",jobResumed:"Aufgabe fortgesetzt",jobTriggered:"Job ausgelost",modelUpdated:"Modell aktualisiert",jobDeleted:"Aufgabe geloscht",status:{running:"Lauft",paused:"Pausiert",disabled:"Deaktiviert",scheduled:"Geplant"},info:{model:"Modell",schedule:"Zeitplan",lastRun:"Letzte Ausfuhrung",nextRun:"Nachste Ausfuhrung",deliver:"Zustellung",repeat:"Wiederholung"},action:{pause:"Pausieren",pauseJob:"Aufgabe pausieren",resume:"Fortsetzen",resumeJob:"Aufgabe fortsetzen",runNow:"Jetzt ausfuhren",triggerImmediately:"Sofort auslösen"},runHistory:{title:"Verlauf",runs:"Läufe",noRuns:"Kein Verlauf gefunden."}},skills:{title:"Fahigkeiten",searchPlaceholder:"Fahigkeiten suchen...",noMatch:"Keine Fahigkeiten entsprechen Ihrer Suche",noSkills:"Keine Fahigkeiten gefunden",backTo:"Zuruck zu",attachedFiles:"Angehange Dateien",loadFailed:"Laden der Fahigkeit fehlgeschlagen",fileLoadFailed:"Laden der Datei fehlgeschlagen",modified:"Benutzerbearbeitet",archived:"Archiviert",pinned:"Angeheftet",pin:"Fahigkeit anheften",unpin:"Anheften aufheben",pinFailed:"Anheft-Status konnte nicht geandert werden",toggleFailed:"Aktivieren/Deaktivieren der Fahigkeit fehlgeschlagen",source:{builtin:"Integriert",hub:"Hub",local:"Lokal"}},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-Stammverzeichnis",python:"Python",scanCwd:"Arbeitsverzeichnis scannen",projectPlugins:"Projekt-Plugins"}},memory:{title:"Gedachtnis",refresh:"Aktualisieren",loadFailed:"Laden des Gedachtnisses fehlgeschlagen",myNotes:"Meine Notizen",noNotes:"Noch keine Notizen.",notesPlaceholder:"Notizen schreiben...",userProfile:"Benutzerprofil",noProfile:"Noch kein Profil.",profilePlaceholder:"Profil schreiben...",soul:"Seele",noSoul:"Noch keine Seelenkonfiguration.",soulPlaceholder:"Seelenkonfiguration schreiben..."},models:{title:"Modelle",addProvider:"Anbieter hinzufugen",providerType:"Anbietertyp",preset:"Vorgabe",custom:"Benutzerdefiniert",selectProvider:"Anbieter auswahlen",chooseProvider:"Anbieter wahlen...",name:"Name",autoGeneratedName:"Automatisch aus Basis-URL generiert",baseUrl:"Basis-URL",region:"Region",regionIntl:"International",regionCn:"Festlandchina",baseUrlPlaceholder:"z. B. https://api.example.com/v1",apiKey:"API-Schlussel",apiKeyPlaceholder:"sk-...",defaultModel:"Standardmodell",selectOrInput:"Modell auswählen oder eingeben...",selectModel:"Modell auswahlen...",providerAdded:"Anbieter hinzugefugt",providerDeleted:"Anbieter geloscht",deleteProvider:"Anbieter loschen",deleteConfirm:'Mochten Sie "{name}" wirklich loschen?',codexLoginTitle:"OpenAI Codex Anmeldung",codexWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein, um sich anzumelden:",codexCopyCode:"Code kopiert",codexOpenLink:"Autorisierungsseite öffnen",codexApproved:"Anmeldung erfolgreich",codexExpired:"Die Autorisierung ist abgelaufen. Bitte versuchen Sie es erneut.",nousLoginTitle:"Nous-Portal-Anmeldung",nousWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein:",nousCopyCode:"Code kopiert",nousOpenLink:"Autorisierungsseite öffnen",nousApproved:"Login erfolgreich",nousDenied:"Autorisierung wurde abgelehnt",nousExpired:"Autorisierung abgelaufen",copilotLoginTitle:"GitHub Copilot Anmeldung",copilotWaiting:"Öffnen Sie GitHub und geben Sie den unten angezeigten Gerätecode ein. Das Fenster schließt sich automatisch nach Genehmigung.",copilotCopyCode:"Code kopiert",copilotOpenLink:"GitHub-Autorisierungsseite öffnen",copilotApproved:"Anmeldung erfolgreich!",copilotDenied:"Autorisierung abgelehnt.",copilotExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",copilotAddDetectedTitle:"GitHub Copilot erkannt",copilotAddDetected:'Auf diesem Rechner wurde ein GitHub Copilot OAuth-Token erkannt. Klicken Sie auf „Hinzufügen", um Copilot in 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",currentDefault:"Aktueller Standard",defaultShort:"Standard",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",xaiWaiting:"Schließen Sie die Autorisierung auf der geöffneten xAI-Seite ab. Das Fenster schließt sich nach der Freigabe automatisch.",xaiOpenLink:"xAI-Autorisierungsseite öffnen",xaiLoginTitle:"xAI Grok OAuth-Anmeldung",xaiExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",xaiCopyLink:"Autorisierungslink kopieren",xaiApproved:"Anmeldung erfolgreich!",visibilitySelectOne:"Mindestens ein sichtbares Modell behalten",visibilitySaved:"Sichtbare Modelle gespeichert",visibilitySaveFailed:"Sichtbare Modelle konnten nicht gespeichert werden",visibilityHint:"Wirkt sich nur auf Modellauswahl und Modellseite der Web UI aus. Die provider/model-Konfiguration der Hermes CLI wird nicht geändert; Aufrufe verwenden weiterhin die ursprüngliche Modell-ID.",showAllModels:"Alle Modelle anzeigen",searchPlaceholder:"Modelle suchen...",removeCustomModel:"Dieses nicht gelistete Modell entfernen",more:"weitere",models:"Modellliste",manageVisibleModelsFor:"Sichtbare Modelle für {name} verwalten",manageVisibleModels:"Sichtbare Modelle verwalten",getApiKey:"API Key abrufen",count:"Modelle",aliasUseOriginal:"Ursprüngliche ID wiederherstellen",aliasTitleFor:"Anzeigename für {model}",aliasTitle:"Modell-Anzeigename",aliasSaveFailed:"Anzeigename konnte nicht gespeichert werden",aliasPlaceholder:"Leer lassen, um die ursprüngliche Modell-ID zu verwenden",aliasManageFor:"Anzeigenamen für {provider}",aliasManage:"Anzeigenamen",aliasHint:"Ändert nur den Anzeigenamen in der Web UI. Hermes erhält weiterhin die ursprüngliche Modell-ID.",aliasEdit:"Umbenennen",aliasCanonical:"Original-ID: {model}"},profiles:{title:"Profile",create:"Profil erstellen",import:"Importieren",export:"Exportieren",rename:"Umbenennen",delete:"Loschen",switchTo:"Hermes Profile wechseln",switchConfirm:"Dies fuehrt `hermes profile use {name}` aus und aendert das aktive Hermes CLI Profile. Fortfahren?",switchSuccess:'Aktives Hermes Profile ist jetzt "{name}"',switchFailed:"Hermes Profile konnte nicht gewechselt werden. Das Gateway muss eventuell manuell neu gestartet werden.",createSuccess:'Profil "{name}" erstellt',createFailed:"Erstellen des Profils fehlgeschlagen",renameSuccess:"Profil umbenannt",renameFailed:"Umbenennung des Profils fehlgeschlagen",deleteConfirm:'Mochten Sie das Profil "{name}" wirklich loschen?',deleteSuccess:"Profil geloscht",deleteFailed:"Loschen des Profils fehlgeschlagen",exportSuccess:"Profil exportiert",exportFailed:"Exportieren des Profils fehlgeschlagen",importSuccess:"Profil importiert",importFailed:"Importieren des Profils fehlgeschlagen",importSelectFile:"Archivdatei auswahlen",importInvalidFile:"Bitte wahlen Sie ein gultiges Archiv (.tar.gz, .tgz, .gz, .zip)",name:"Profilname",namePlaceholder:"Nur Buchstaben, Zahlen und Bindestriche",nameValidation:"Profilname darf nur Kleinbuchstaben, Zahlen, Unterstriche und Bindestriche enthalten",newName:"Neuer Name",newNamePlaceholder:"Neuen Namen eingeben",cloneFromCurrent:"Aus aktuellem Profil klonen",cloneCleanupNotice:"Beim Klonen werden exklusive Plattform-Anmeldeinformationen (Weixin / Telegram / Slack usw.) automatisch übersprungen, um Konflikte mit dem Quellprofil zu vermeiden",cloneStrippedCredentials:"{count} exklusive Anmeldeinformation(en) entfernt: {list}",cloneDisabledPlatforms:"{count} Plattform(en) deaktiviert: {list}",cloneStrippedConfigCredentials:"{count} eingebettete Anmeldeinformation(en) aus config.yaml entfernt: {list}",archivePath:"Archivpfad",archivePathPlaceholder:"Serverpfad zur Archivdatei",importName:"Profilname (optional)",importNamePlaceholder:"Leer lassen, um den Archivnamen zu verwenden",active:"Aktiv",model:"Modell",gateway:"Gateway",alias:"Alias",provider:"Anbieter",path:"Pfad",skills:"Fahigkeiten",hasEnv:"Hat .env",hasSoulMd:"Hat soul.md",noProfiles:"Keine Profile gefunden. Erstellen Sie eines, um zu beginnen.",avatar:{title:"Eigenes Avatar",customize:"Avatar anpassen",upload:"Bild hochladen",random:"Zufällig erzeugen",reset:"Standard wiederherstellen",hint:"PNG, JPEG oder WebP, maximal 1 MB",invalidType:"Bitte ein PNG-, JPEG- oder WebP-Bild wählen",tooLarge:"Das Avatar-Bild darf höchstens 1 MB groß sein",saveSuccess:"Avatar gespeichert",saveFailed:"Avatar konnte nicht gespeichert werden",resetSuccess:"Standard-Avatar wiederhergestellt",resetFailed:"Standard-Avatar konnte nicht wiederhergestellt werden"},runtime:{activeProfile:"Aktuell: {name}",bridgeWorker:"Bridge-Status",gateway:"Gateway",active:"Aktiv",activeTag:"Aktuell",idle:"Leerlauf",running:"Läuft",stopped:"Gestoppt",restartGateway:"Gateway neu starten",restartProfile:"Profil neu starten",switchProfile:"Frontend-Profil wechseln",gatewayRestarted:"Gateway neu gestartet: {name}",gatewayRestartFailed:"Gateway-Neustart fehlgeschlagen",profileRestarted:"Profil neu gestartet: {name}",profileRestartFailed:"Profil-Neustart fehlgeschlagen"}},logs:{title:"Protokolle",all:"Alle",searchPlaceholder:"Suchen...",refresh:"Aktualisieren",noEntries:"Keine Protokolleintrage"},settings:{title:"Einstellungen",saved:"Gespeichert",saveFailed:"Speichern fehlgeschlagen",tabs:{display:"Anzeige",account:"Aktuelles Konto",users:"Kontoverwaltung",agent:"Agent",memory:"Gedachtnis",compression:"Komprimierung",session:"Sitzung",privacy:"Datenschutz",apiServer:"API-Server",models:"Modelle",voice:"Sprache"},display:{streaming:"Streaming-Antworten",streamingHint:"KI-Antworten in Echtzeit anzeigen",compact:"Kompaktmodus",compactHint:"Nachrichtenabstand reduzieren",showReasoning:"Schlussfolgerung anzeigen",showReasoningHint:"Denkprozess des Modells anzeigen",showCost:"Kosten anzeigen",showCostHint:"Token-Nutzung in Antworten anzeigen",inlineDiffs:"Inline-Diffs",inlineDiffsHint:"Codeanderungen inline anzeigen",bellOnComplete:"Abschluss-Signalton",bellOnCompleteHint:"Ton abspielen, wenn die KI fertig ist",busyInputMode:"Eingabemodus bei Beschaftigung",busyInputModeHint:"Eingabe erlauben, wahrend die KI verarbeitet",theme:"Design",themeHint:"Hell, Dunkel oder Systemeinstellung verwenden",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System"},agent:{maxTurns:"Maximale Runden",maxTurnsHint:"Maximale Interaktionsrunden pro Konversation",gatewayTimeout:"Gateway-Timeout",gatewayTimeoutHint:"Anfrage-Timeout in Sekunden",restartDrainTimeout:"Neustart-Drain-Timeout",restartDrainTimeoutHint:"Drain-Timeout vor Neustart in Sekunden",toolEnforcement:"Werkzeuferzwingung",toolEnforcementHint:"Ausfuhrungsmodus fur Werkzeugaufrufe steuern",auto:"Automatisch",always:"Immer",never:"Nie"},memory:{enabled:"Gedachtnis aktivieren",enabledHint:"KI erlauben, den Konversationskontext zu merken",userProfile:"Benutzerprofil",userProfileHint:"KI erlauben, Benutzereinstellungen zu merken",charLimit:"Zeichenlimit fur Gedachtnis",charLimitHint:"Maximale Zeichen fur MEMORY.md",userCharLimit:"Zeichenlimit fur Benutzerprofil",userCharLimitHint:"Maximale Zeichen fur USER.md"},compression:{enabled:"Komprimierung aktivieren",enabledHint:"Langen Chatverlauf automatisch komprimieren, bevor der Modellkontext uberschritten wird",threshold:"Komprimierungsschwelle",thresholdHint:"Komprimierung starten, wenn geschatzte Token dieses Kontextverhaltnis uberschreiten",targetRatio:"Zielverhaltnis",targetRatioHint:"Zielgroße des Verlaufs nach der Komprimierung als Kontextverhaltnis",protectLastN:"Neueste Nachrichten schutzen",protectLastNHint:"So viele neueste Nachrichten unkomprimiert lassen",protectFirstN:"Erste Nachrichten schutzen",protectFirstNHint:"So viele erste Nachrichten unkomprimiert lassen"},session:{mode:"Zurucksetzungsmodus",modeHint:"Ausloser fur Sitzungszurucksetzung",modeBoth:"Inaktivitat + Geplant",modeIdle:"Nur Inaktivitat",modeDaily:"Nur Geplant",modeNone:"Nie (nur manuell)",idleMinutes:"Inaktivitats-Timeout",idleMinutesHint:"Wartezeit vor automatischer Zurucksetzung (Minuten)",atHour:"Geplante Zurucksetzungszeit",humanOnly:"Nur menschliche Sitzungen anzeigen",humanOnlyHint:"Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",liveMonitorHumanOnly:"Live-Monitor: nur menschliche Sitzungen anzeigen",liveMonitorHumanOnlyHint:"Im Live-Monitor Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",atHourHint:"Sitzung taglich zu dieser Stunde zurucksetzen",requireAuth:"Sitzungsautorisierung",requireAuthHint:"Erfordert Autorisierung für Sitzungsvorgänge"},privacy:{redactPii:"Personliche Daten maskieren",redactPiiHint:"Sensible Informationen automatisch erkennen und ausblenden (Passworter, Schlussel usw.)"},apiServer:{enable:"Aktivieren",enableHint:"API-Server aktivieren",host:"Host",hostHint:"Listen-Adresse",port:"Port",portHint:"Listen-Port",key:"Schlussel",keyHint:"API-Zugangsschlussel",cors:"CORS-Ursprunge",corsHint:"Erlaubte Cross-Origin-Quellen"},voice:{ttsProvider:"TTS-Anbieter",ttsProviderHint:"Waehlen Sie die Sprachsynthese-Engine fuer die Nachrichtenwiedergabe",providerWebSpeech:"WebSpeech API (Browser)",providerOpenai:"OpenAI TTS",providerCustom:"Benutzerdefinierter Endpunkt (OpenAI-kompatibel)",providerEdge:"Edge TTS (Kostenlos, kein API-Key erforderlich)",webspeechVoice:"Stimme",webspeechVoiceHint:"Waehlen Sie eine Stimme aus Ihrem Browser oder Betriebssystem",webspeechVoicePlaceholder:"Auto (Standardstimme)",openaiKey:"API-Key",openaiKeyHint:"Ihr OpenAI API-Key mit TTS-Zugriff",openaiUrl:"API-Basis-URL",openaiUrlHint:"z.B. https://api.openai.com/v1/audio/speech",openaiModel:"Modell",openaiModelHint:"tts-1 (schneller) / tts-1-hd (hoehere Qualitaet)",openaiVoice:"Stimme",openaiVoiceHint:"Stimme fuer die Synthese",customHint:"Jede OpenAI-kompatible TTS-API verwenden — funktioniert mit GPT-SoVITS, CosyVoice, usw.",customUrl:"API-URL",customUrlHint:"Basis-URL Ihres TTS-Dienstes",customUrlPlaceholder:"Die im lokalen Adapter konfigurierte Adresse, z.B. http://127.0.0.1:9880",customApiKey:"API-Key (optional)",customApiKeyHint:"Einige benutzerdefinierte Endpunkte erfordern Authentifizierung",customApiKeyPlaceholder:"Leer lassen wenn nicht benoetigt",edgeHint:"Angetrieben von Microsoft Edge TTS (node-edge-tts).",edgeUrl:"Adapter-URL",edgeUrlHint:"Adresse des Edge TTS-Adapters, z.B. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Stimme",edgeVoiceHint:"Waehlen Sie eine Stimme fuer die Sprachsynthese",edgeRate:"Geschwindigkeit",edgeRateHint:"Sprachgeschwindigkeit anpassen (0,5x ~ 2,0x)",edgePitch:"Tonhöhe",edgePitchHint:"Tonhöhe anpassen (-20 ~ +20 Hz)",testTitle:"Sprachtest",testText:"Testtext",testTextPlaceholder:"Text zum Testen eingeben...",testTextDefault:"Hallo, dies ist ein Sprachtest.",testButton:"Testen",testButtonPlaying:"Wiedergabe...",testFailed:"Test fehlgeschlagen: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — unterstützt Voreingestellte Stimmen, Stimmdesign und Stimmklonung",mimoApiKey:"API-Schluessel",mimoApiKeyHint:"Holen Sie sich Ihren Schluessel auf platform.xiaomimimo.com",mimoApiKeyPlaceholder:"MiMo API-Schluessel",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key eingeben",noProviders:"Keine Provider konfiguriert",save:"Speichern",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert"}},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...",qqSandboxHint:"Sandbox-Umgebung aktivieren (für Tests)",qqSandbox:"Sandbox-Modus",qqQrScanHint:"QR-Code oben mit QQ scannen oder Link auf dem Telefon öffnen, um die Bindung abzuschließen",qqMarkdownHint:"Markdown-formatierte Nachrichten aktivieren (einige Clients unterstützen dies möglicherweise nicht)",qqMarkdown:"Markdown-Unterstützung",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"Whitelist für Benutzer-IDs oder OpenIDs, durch Kommas getrennt",allowedUsers:"Erlaubte Benutzer",allowAllUsersHint:"Nachrichten von beliebigen Benutzern erlauben; deaktiviert lassen, um die Allowlist zu verwenden",allowAllUsers:"Alle Benutzer erlauben"},language:{label:"Sprache",zh:"中文",en:"English",de:"Deutsch"},terminal:{sessions:"Sitzungen",newTab:"Neues Terminal",closeSession:"Diese Sitzung schliessen?",sessionExited:"Beendet",processExited:"Prozess beendet mit Code {code}",noSessions:"Keine Terminal-Sitzungen",connectionFailed:"Terminaldienstverbindung fehlgeschlagen",connectionClosed:"Terminalverbindung geschlossen",connectionError:"Terminalverbindungsfehler"},usage:{title:"Nutzungsstatistiken",refresh:"Aktualisieren",totalTokens:"Gesamt-Tokens",inputTokens:"Eingabe",outputTokens:"Ausgabe",totalSessions:"Gesamt-Sitzungen",avgPerDay:"~{n}/Tag Durchschn.",estimatedCost:"Gesch. Kosten",cacheHitRate:"Cache-Trefferquote",modelBreakdown:"Modellaufschluesselung",dailyTrend:"Tagliche Nutzung",date:"Datum",tokens:"Tokens",cache:"Cache",cacheRead:"Cache gelesen",cacheWrite:"Cache geschrieben",sessions:"Sitzungen",cost:"Kosten",noData:"Keine Nutzungsdaten"},skillsUsage:{title:"Skill-Nutzung",subtitle:"Skill-Ladevorgänge und -Bearbeitungen aus 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_22_1:"Hermes-Sessionlisten-API liest jetzt die Profil-Datenbank statt des lokalen Web-UI-Session-Stores",new_0_5_23_1:"Bridge-only Chat-Slash-Befehle mit lokalisierten Befehlsvorschlägen hinzugefügt",new_0_5_23_2:"Befehlsverlauf für Session-Replay gespeichert, ohne Modellkontext, Nutzung oder Komprimierung zu verunreinigen",new_0_5_23_3:"Gateway-Profil-Umgebungsvariablen isoliert, damit Zugangsdaten nicht zwischen Profilen durchsickern",new_0_5_23_4:"Web-UI-Port bei Gateway-Zuweisung reserviert, um Startkonflikte zu vermeiden",new_0_5_23_5:"Self-Update-Neustart korrigiert, damit erfolgreiche Helper-Exits nicht als Fehler gemeldet werden",new_0_5_24_1:"Bridge-Chat an API-Server-Verarbeitung für multimodale Eingaben, System-Prompt und Workspace-Kontext angepasst",new_0_5_25_1:"Zurücksetzen und Klonen von Gruppenchat-Räumen hinzugefügt",new_0_5_25_2:"Web-UI-Statusverzeichnis für eigene Deployment-Layouts konfigurierbar gemacht",new_0_5_25_3:"MiMo als TTS-Anbieter in den Spracheinstellungen hinzugefügt",new_0_5_25_4:"Modelllisten eigener Provider werden über das Backend geladen, um Browser-CORS-Fehler zu vermeiden",new_0_5_25_5:"Tool-Freigabeablauf für Bridge-Sitzungen korrigiert",new_0_5_25_6:"Erzwungenen CLI-Plattformhinweis aus Bridge-Prompts entfernt, damit eigene Medien-/Dateianweisungen erhalten bleiben",new_0_5_25_7:"Base64-Bildinhalte werden in der Nachrichtenhistorie korrekt angezeigt",new_0_5_25_8:"Playwright-Browsertests, Chat-Streaming-Vertragsabdeckung, Provider-Modellabdeckung und Coverage-Baseline hinzugefügt",new_0_5_26_1:"Windows- und lokale Markdown-Medienpfade in Chatverlauf und gerenderten Nachrichten unterstützt",new_0_5_26_2:"Leere Assistant-Historie gefiltert und veralteter Komprimierungsstatus bei neuem Lauf gelöscht",new_0_5_26_3:"Gesperrte Schreibvorgänge für Config- und Profil-Updates hinzugefügt, um Beschädigungen durch paralleles Schreiben zu reduzieren",new_0_5_26_4:"QQBot- und DingTalk-Kanaleinstellungen hinzugefügt",new_0_5_26_5:"CLI-Porterkennung portabler gemacht und mobile Terminal-Schublade verbessert",new_0_5_26_6:"Bridge-Profilumgebungen isoliert und Hermes-Plugin-Erkennung über Python-Umgebungen hinweg korrigiert",new_0_5_26_7:"Gestoppte Gateway-Zustände mit Web-UI-Diagnosen erklärt und Log-Ladezustand stabil gehalten",new_0_5_26_8:"Session-Reset-Modi, Custom-Provider-Base-URL und dynamische Zustellziele korrigiert",new_0_5_26_9:"Lokalen Schalter für Tool-Call-Trace-Anzeige in der Chat-Eingabeleiste hinzugefügt",new_0_5_26_10:"Hermes-Agent-Paketinstallationen unterstützt, wenn kein Source-Checkout verfügbar ist",new_0_5_26_11:"xAI-Grok-OAuth-Login für SuperGrok-Abonnenten hinzugefügt und Grok-Modellpresets aktualisiert",new_0_5_26_12:"Browser-, Chat-Streaming-, Provider-, Gateway-, Config-, Plugin- und Bridge-Testabdeckung erweitert",new_0_5_27_1:"Sitzungsbezogene Modelleinstellungen für Bridge-Chats hinzugefügt, mit unabhängig gespeichertem Provider und Modell pro Sitzung",new_0_5_27_2:"Bridge-Sitzung per Rechtsklick über „Modell festlegen“ auf ein anderes Modell umstellen",new_0_5_27_3:"Läufe prüfen jetzt das Sitzungsmodell und fallen auf das aktuelle Standardmodell zurück, wenn es nicht verfügbar ist",new_0_5_27_4:"Kontextkomprimierung folgt standardmäßig dem aktuell im Profil ausgewählten Standardmodell",new_0_5_30_1:"Bridge-Chat bewahrt jetzt strukturierte Historie und behebt sporadisch ausbleibende Antworten sowie übersprungene Tool-Ausführung durch flachgedrückte Tool-Historie",new_0_5_30_2:"Gruppenchat-Mention-Routing ist zuverlässiger für mehrere Agents, entfernt die eigene @-Mention vor der Zustellung und behält Anzeigenamen nach Aktualisierung bei",new_0_5_30_3:"Modellseiten, Chat-Modellauswahl und Sitzungsmodellwahl zeigen Provider und Modelle jetzt passend zum aktiven Profil mit korrekten Standardmarkierungen",new_0_5_30_4:"Gateway-Verwaltung vereinfacht: eigenständige Gateway-Seite entfernt, jedes Profil wird vor Start auf Plattformkonfiguration geprüft, und ein leichter Gateway-Runner verwaltet Starts und Neustarts",new_0_5_30_5:"Gateway-Start unter Docker, Termux und Windows mit Runtime-Lock-Behandlung, Portkonfliktbereinigung, Hintergrundausführung und Neustartunterstützung verbessert",new_0_5_30_6:"Windows-Kompatibilität für Pfaderkennung, Dateidownloads und Job-/Update-Subprozesse gehärtet, damit keine Terminalfenster aufblitzen",new_0_5_30_7:"Config-Schreibvorgänge und Provider-Presets korrigiert: .env-Schlüssel validieren, FUN-Codex über Responses API routen und Z.AI/GLM-Modelllisten aktualisieren",new_0_5_30_8:"Frontend-Details poliert, darunter eingeklappte Seitenleiste, kurze Gruppenlabels, Seitenleisten-Trenner und Gesprächs-Outline",new_0_5_30_9:"Kontextkomprimierung folgt nun Profil-Komprimierungseinstellungen und härtet veraltete Snapshots durch Wiederverwendung alter Zusammenfassungen mit sicherem Rest statt erneuter Vollkomprimierung",new_0_5_31_1:"Bridge-Broker-Neustarts gehärtet, finale Gruppenchat-Stream-Darstellung korrigiert und {'@'}all-Routing für Gruppenchats hinzugefügt",new_0_5_31_2:"Dateimanager kann absolute Pfade kopieren; mobile Session-Schublade liegt nicht mehr hinter Chat-Inhalten",new_0_5_31_3:"Profilauswahl zeigt jetzt Avatare, eigene Avatar-Uploads, Laufzeitstatus-Dialog sowie Gateway-/Profil-Neustartaktionen",new_0_5_31_4:"Profilavatare erscheinen jetzt in Einzelchat, Gruppenchat und eingeklappter Seitenleiste, mit Web-UI-Profilmetadaten und Windows-sicheren Pfaden",new_0_5_31_5:"Docker-, Termux- und Windows-Gateway-Erkennung sowie Neustartprüfungen verbessert, indem gateway_state/gateway.pid für Managed-Gateway-Liveness genutzt wird",new_0_5_31_6:"APIKEY.FUN-Bildgenerierungs-Medienendpunkt und gebündelter apikey-image-gen-Skill für Text-zu-Bild, Bild-zu-Bild und Bildbearbeitung über den fun-codex-Provider des aktiven Profils hinzugefügt",new_0_5_33_1:"Ausführungsfehler und Socket-Fehler in Einzel- und Gruppenchats bleiben nun als rote Agent-Nachrichten in der Nachrichtenliste sichtbar",new_0_5_33_2:"Session-Suche kann auf das ausgewählte Profil begrenzt werden; ohne Auswahl werden weiterhin alle Profile durchsucht",new_0_5_33_3:"Skills-Seite zeigt chinesische/englische Empfehlungstexte, wenn kein Skill ausgewählt ist; erneuter Klick hebt die Auswahl auf",new_0_5_33_4:"Ungenutzte changelog-i18n-Einträge entfernt, um die Frontend-Größe zu reduzieren",new_0_5_33_5:"Agent-Bridge-Startfehler auf chinesischem Windows durch netstat-Ausgabecodierung behoben",new_0_5_33_6:"Nous-Portal-Modellpreset anhand des öffentlichen Catalogs und der Portal-Empfehlungen aktualisiert",new_0_5_33_7:"Profillisten und Laufzeitstatus lesen Profilnamen aus Verzeichnissen und Standardmodelle aus config, um CLI-Tabellenspaltenfehler zu vermeiden",new_0_5_34_1:"Multimodale tool-Ergebnisse werden beim Speichern von Sitzungs-/Gruppenchat-Nachrichten normalisiert, damit keine base64-Bilder in Replays gelangen",new_0_5_34_2:"Benutzerdefinierte Hermes-Modelle werden über backendverwaltete Konfiguration persistiert, mit neuen Endpunkten zum Hinzufügen und Entfernen",new_0_5_34_3:"Finale Bridge-Kontextnutzung und Tool-Statusupdates bleiben nach abgeschlossenen Läufen korrekt",new_0_5_34_4:"Kanban-Filterung, Verantwortlichenanzeige, Kartenaktionen und Aufgabendetails verbessert",new_0_5_34_5:"Komprimierungs-Nutzungszählung korrigiert, indem fixer prompt/tool-Kontext gecacht und vollständige Kontext-token gemeldet werden",new_0_5_34_6:"Gruppenchat-Agents cachen ihren eigenen fixen Kontext und zeigen Komprimierungsfortschritt erst an, wenn die Komprimierung wirklich startet",new_0_5_34_7:"Web-UI-gebündelte Skills werden in jedes Profile synchronisiert und das Ziel-Profile wird pro Injection protokolliert",new_0_5_34_8:"Wenn Kanban unter Windows fehlschlägt, aktualisieren Sie Hermes, um die neuesten Migration-Fixes für die Kanban-Datenbank zu erhalten",new_0_5_35_1:"Bridge-Sessions können nun über verschiedene Sessions hinweg parallel laufen, während Läufe derselben Session zur Wahrung der Nachrichtenreihenfolge serialisiert bleiben",new_0_5_35_2:"Neue Performance-Monitor-Seite für System-CPU/Speicher, Web UI, Bridge Broker, Workers und aktive Sessions",new_0_5_35_3:"Worker-Ressourcenmetriken zeigen CPU, Speicher, Profile, Session-Anzahl und Laufstatus pro worker",new_0_5_35_4:"Bridge-worker-Lifecycle-Cleanup verbessert, damit Broker-Shutdowns und beendete Elternprozesse worker zurückfordern und verwaiste Python-Prozesse reduzieren",new_0_5_35_5:"Monitoring-Kompatibilität mit Fallbacks für Ressourcenmessung unter macOS, Windows, Linux, Docker und Termux gehärtet",new_0_5_35_6:"Performance Monitoring blockiert nicht mehr auf worker-Anfragen während Agent-Initialisierung und reduziert request timeouts unter Windows",new_0_5_35_7:"Chat-Markdown unterstützt Inline-Vorschauen für Textinhalte, und Download-Icons laden Dateien direkt herunter statt die Vorschau zu öffnen",new_0_5_35_8:"Content-Preview-Drawer verbessert: Schließen-Aktion auf Mobilgeräten, mobile Vollbreite, 800px Desktop-Breite und konsistente Text-/Markdown-Hintergründe",new_0_6_0_1:"Account- und Profile-bezogene Verwaltung schützt Sessions, Modelle, Nutzung, Kanban, Jobs, Uploads, Medien und verwandte Hermes APIs konsistent",new_0_6_0_2:"Gebündelte Medien-Skills verwenden das generierte Server-Token nur für Medien-Endpunkte und lösen fun-codex/xAI-Zugangsdaten aus dem angeforderten Profile auf",new_0_6_0_3:"Einzelchat und Gruppenchat injizieren das aktuelle Hermes Profile in Run-Instructions, damit Skills X-Hermes-Profile senden können",new_0_6_0_4:"delegate_task-Subagent-Fortschritt wird mit Start-, Tool-, Fortschritts- und Abschlussstatus in die Chat-UI gestreamt",new_0_6_0_5:"Stoppen oder Abbrechen eines Runs bereinigt temporäre Events, damit alte abort-Zustände nicht in den nächsten Chat gelangen",new_0_6_0_6:"Dokumentation und Website-Texte für Accountverwaltung, Standard-Zugangsdaten, Account/Profile-Verwaltung, Uploads/Downloads und Medien-Skills aktualisiert",new_0_6_0_7:"CLI-Wartungsbefehle zum Löschen von Login-IP-Sperren und Zurücksetzen des Standard-Logins admin / 123456 hinzugefügt",new_0_6_0_8:"Version 0.6.0 ist die Grenze zwischen Single-User- und Multi-User-Web-UI. Bei Problemen im Multi-User-Modus bitte ein Issue erstellen und bei Bedarf auf die Single-User-Version 0.5.35 zurückgehen"},files:{title:"Dateien",tree:"Verzeichnisbaum",list:"Dateiliste",breadcrumbRoot:"Start",newFile:"Neue Datei",newFolder:"Neuer Ordner",upload:"Hochladen",refresh:"Aktualisieren",open:"Offnen",edit:"Bearbeiten",preview:"Vorschau",download:"Herunterladen",copyPath:"Pfad kopieren",rename:"Umbenennen",delete:"Loschen",name:"Name",size:"Grosse",modified:"Geandert",actions:"Aktionen",emptyDir:"Leeres Verzeichnis",loading:"Wird geladen...",confirmDelete:'Mochten Sie "{name}" wirklich loschen?',confirmDeleteDir:'Mochten Sie das Verzeichnis "{name}" und seinen gesamten Inhalt wirklich loschen?',deleteFailed:"Loschen fehlgeschlagen",deleted:"Geloscht",renameTo:"Umbenennen in",newFileName:"Dateiname",newFolderName:"Ordnername",created:"Erstellt",createFailed:"Erstellen fehlgeschlagen",renamed:"Umbenannt",renameFailed:"Umbenennen fehlgeschlagen",uploadSuccess:"{count} Datei(en) hochgeladen",uploadFailed:"Hochladen fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert",unsavedChanges:"Sie haben ungespeicherte Anderungen. Verwerfen?",pathCopied:"Pfad kopiert",fileTooLarge:"Datei zu gross (max. 10 MB)",permissionDenied:"Geschutzte Datei kann nicht geandert werden",notFound:"Datei oder Verzeichnis nicht gefunden",backendError:"Dateioperation fehlgeschlagen",dragDropHint:"Dateien hierher ziehen, um sie hochzuladen",closeEditor:"Editor schliessen",closePreview:"Schliessen",saveFile:"Speichern",fileTree:"Dateibaum"},groupChat:{title:"Gruppenchat",createRoom:"Raum erstellen",joinByCode:"Mit Code beitreten",roomName:"Raumname",roomNamePlaceholder:"Raumnamen eingeben",inviteCode:"Einladungscode",autoGenerate:"Automatisch generieren",noRooms:"Noch keine Raume",selectOrCreate:"Wahlen oder erstellen Sie einen Raum, um zu chatten",agents:"Agenten",addAgent:"Agent hinzufugen",selectProfile:"Wahlen Sie ein Profil",agentAdded:"Agent hinzugefugt",agentAlreadyInRoom:"Agent ist bereits in diesem Raum",agentAddFailedCount:"{count} Agent(en) wurden nicht hinzugefugt: {details}",noAgents:"Keine Agenten in diesem Raum",members:"Mitglieder",roomCreated:"Raum erstellt",roomDeleted:"Raum gelöscht",roomCloned:"Raum geklont",cloneRoom:"Raum klonen",copyRoomLink:"Raumlink kopieren",deleteRoomConfirm:"Diesen Raum löschen?",clearContext:"Kontext löschen",clearContextConfirm:"Diesen Raumkontext löschen? Nachrichten und Komprimierungs-Snapshots werden entfernt, Agenten und Mitglieder bleiben.",contextCleared:"Kontext gelöscht",you:"Du",joined:"Raum beigetreten",joinFailed:"Beitreten fehlgeschlagen",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden)",enterCode:"Einladungscode eingeben",yourName:"Dein Name",yourNamePlaceholder:"Gib deinen Anzeigenamen ein",yourDescription:"Beschreibung (optional)",yourDescriptionPlaceholder:"Erzahl anderen wer du bist...",agentName:"Agent-Name",agentNamePlaceholder:"Benutzerdefinierter Name (leer = Profilname)",agentDesc:"Agent-Beschreibung",agentDescPlaceholder:"Beschreiben Sie, was dieser Agent tut...",agentReplying:"antwortet...",agentCompressing:"komprimiert Kontext...",compressionSettings:"Komprimierungseinstellungen",triggerTokens:"Trigger-Token",triggerTokensDesc:"Token-Schwelle für Kontextkomprimierung",maxHistoryTokens:"Max. Verlaufs-Token",maxHistoryTokensDesc:"Maximale Token für komprimierten Kontext",tailMessageCount:"Nachrichten am Ende",tailMessageCountDesc:"Anzahl der letzten Nachrichten, die unverändert bleiben",compressionConfig:"Komprimierungskonfig",compressNow:"Jetzt komprimieren",compressingInProgress:"Komprimierung läuft, bitte warten",compressionSaved:"Konfiguration gespeichert"},download:{downloading:"Wird heruntergeladen...",downloadFailed:"Download fehlgeschlagen",fileNotFound:"Datei nicht gefunden oder geloscht",fileTooLarge:"Datei zu gross (Limit uberschritten)",backendError:"Lesen der Datei fehlgeschlagen, Remote-Umgebung moglicherweise nicht verfugbar",backendTimeout:"Zeituberschreitung beim Lesen der Datei",unsupportedBackend:"Aktuelles Terminal-Backend unterstutzt keine Datei-Downloads",invalidPath:"Ungultiger Dateipfad",contentDisplay:"Inhalt anzeigen",download:"Herunterladen",downloadFile:"Datei herunterladen"},gateways:{title:"Gateways",running:"Läuft",stopped:"Gestoppt",started:"Gestartet",startFailed:"Gateway konnte nicht gestartet werden",stopFailed:"Gateway konnte nicht gestoppt werden"},kanban:{title:"Kanban-Board",createTask:"Neue Aufgabe",noTasks:"Keine Aufgaben",allStatuses:"Alle Status",allAssignees:"Alle Verantwortlichen",columns:{triage:"Sichtung",todo:"Zu erledigen",ready:"Bereit",running:"In Arbeit",blocked:"Blockiert",done:"Erledigt",archived:"Archiviert"},card:{assigneeTooltip:"Verantwortlicher",priority:{low:"Niedrig",medium:"Mittel",high:"Hoch"},timeAgo:{justNow:"gerade eben",minutes:"vor {count} Min.",hours:"vor {count} Std.",days:"vor {count} Tg."}},board:{create:"Neues Board",archive:"Board archivieren",archiveConfirm:"Aktuelles Board archivieren?",archived:"Board archiviert",created:"Board erstellt",slugPlaceholder:"Board-Kennung, z. B. project-a",namePlaceholder:"Anzeigename (optional)",slugRequired:"Board-Kennung ist erforderlich"},form:{title:"Titel",titlePlaceholder:"Aufgabentitel",titleRequired:"Titel ist erforderlich",body:"Beschreibung",bodyPlaceholder:"Aufgabenbeschreibung (optional)",assignee:"Verantwortlicher",selectAssignee:"Verantwortlichen wählen...",priority:"Priorität",selectPriority:"Priorität wählen..."},detail:{status:"Status",priority:"Priorität",assignee:"Verantwortlicher",tenant:"Mandant",createdAt:"Erstellt",startedAt:"Gestartet",completedAt:"Abgeschlossen",comments:"Kommentare",events:"Ereignisse",runs:"Ausführungen",artifacts:"Artefakte",result:"Ergebnis",highlights:"Highlights",sources:"Datenquellen",sessions:"Zugehörige Sitzungen",sessionMessages:"Sitzungsnachrichten",noSessions:"Keine zugehörigen Sitzungen gefunden."},action:{title:"Aktionen",assign:"Zuweisen",assignTo:"Zuweisen an...",block:"Blockieren",blockReason:"Blockierungsgrund",unblock:"Blockierung aufheben",complete:"Abschließen",completeSummary:"Abschlusszusammenfassung (optional)"},message:{loadFailed:"Aufgabe konnte nicht geladen werden",taskCreated:"Aufgabe erstellt",taskAssigned:"Aufgabe zugewiesen",taskBlocked:"Aufgabe blockiert",taskUnblocked:"Blockierung aufgehoben",taskCompleted:"Aufgabe abgeschlossen"},stats:{total:"Gesamt",tasks:"Aufgaben"}}},It={login:{title:"Hermes Web UI",description:"Insira seu nome de usuario e senha para continuar.",placeholder:"Token de acesso",submit:"Entrar",tokenRequired:"Por favor, insira seu token de acesso",invalidToken:"Token invalido",connectionFailed:"Nao foi possivel conectar ao servidor",passwordLogin:"Senha",tokenLogin:"Token",usernamePlaceholder:"Nome de usuario",passwordPlaceholder:"Senha",defaultCredentialsHint:"Nome de usuario padrao: admin. Senha padrao: 123456.",credentialsRequired:"Por favor, insira nome de usuario e senha",invalidCredentials:"Nome de usuario ou senha incorretos",tooManyAttempts:"Muitas tentativas falhadas, por favor tente novamente mais tarde",sessionExpired:"Login expirado. Entre novamente.",accessDenied:"Voce nao tem permissao para acessar este recurso.",passwordMismatch:"As senhas nao conferem",passwordTooShort:"A senha deve ter pelo menos 6 caracteres",setupSuccess:"Login por senha configurado com sucesso",passwordChanged:"Senha alterada com sucesso",passwordRemoved:"Login por senha removido",setupPassword:"Configurar login por senha",changePassword:"Alterar senha",changeUsername:"Alterar nome de usuario",removePasswordLogin:"Remover",username:"Nome de usuario",currentPassword:"Senha atual",newPassword:"Nova senha",confirmPassword:"Confirmar senha",newUsername:"Novo nome de usuario",usernameChanged:"Nome de usuario alterado com sucesso",usernameTooShort:"O nome de usuario deve ter pelo menos 2 caracteres",setupDescription:"Gerencie o nome de usuario e a senha usados para entrar.",removeConfirm:"Login por senha e obrigatorio para contas de usuario.",passwordLoginNotConfigured:"Login por senha nao configurado",passwordLoginConfigured:"Conta atual: {username}",defaultCredentialTitle:"Altere a conta e senha padrao",defaultCredentialMessage:"A conta atual ainda usa o nome de usuario ou a senha padrao. Para evitar acesso nao autorizado, altere o nome de usuario e a senha da conta atual o quanto antes.",defaultCredentialAction:"Alterar agora",defaultCredentialLater:"Lembrar depois"},users:{title:"Gerenciamento de contas",description:"Crie usuarios, atribua funcoes e controle quais perfis administradores comuns podem acessar.",create:"Criar usuario",edit:"Editar usuario",username:"Nome de usuario",role:"Funcao",statusLabel:"Status",profiles:"Perfis acessiveis",profilesPlaceholder:"Selecione perfis acessiveis",allProfiles:"Todos os perfis",noProfiles:"Nenhum perfil atribuido",lastLogin:"Ultimo login",newPasswordOptional:"Nova senha (deixe em branco para manter)",loadFailed:"Falha ao carregar usuarios",deleteConfirm:"Excluir este usuario?",enable:"Ativar",disable:"Desativar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Ativo",disabled:"Desativado"}},common:{loading:"Carregando...",cancel:"Cancelar",retry:"Tentar novamente",delete:"Excluir",edit:"Editar",save:"Salvar",saved:"Salvo",update:"Atualizar",create:"Criar",saveFailed:"Falha ao salvar",deleteFailed:"Falha ao excluir",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sem dados",fetch:"Buscar",add:"Adicionar",enable:"Ativar",disable:"Desativar",configured:"Configurado",notConfigured:"Nao configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Recolher",stop:"Parar",start:"Iniciar",expired:"Expirado"},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",performance:"Desempenho",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",files:"Arquivos",groupChat:"Chat em grupo",groupConversation:"Conversa",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoramento",groupMonitoringShort:"Mon.",settings:"Configuracoes",connected:"Conectado",disconnected:"Desconectado",updateTip:'Execute "hermes-web-ui update" no terminal para atualizar',updateVersion:"Atualizar para v{version}",reloadClientVersion:"Recarregar para v{version}",updating:"Atualizando...",updateSuccess:"Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.",updateFailed:"Falha na atualizacao",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel",kanban:"Kanban",groupTools:"Ferramentas",groupPlatform:"Plataforma",gateways:"Gateways",expand:"Expandir menu",collapse:"Recolher menu"},performance:{title:"Desempenho",subtitle:"Monitore recursos do sistema, Bridge Broker, Workers e sessões ativas",refresh:"Atualizar",autoRefreshOn:"Atualização automática",autoRefreshOff:"Atualização manual",loadFailed:"Falha ao carregar métricas de desempenho",systemCpu:"CPU do sistema",systemMemory:"Memória do sistema",activeSessions:"Sessões ativas",runningSessions:"Em execução {count}",workers:"Workers",totalWorkerMemory:"Memória total de Worker",processes:"Processos",uptime:"Tempo ativo",running:"Em execução",stopped:"Parado",workerMemory:"Memória de Worker",lastUpdated:"Atualizado",profile:"Profile",memory:"Memória",sessions:"Sessões",runningActiveSessions:"Em execução / Ativas",lastUsed:"Último uso",status:"Status",noWorkers:"Nenhum Worker",sessionsByProfile:"Sessões por Profile",noActiveSessions:"Nenhuma sessão ativa"},drawer:{terminal:"Terminal",files:"Espaço de trabalho"},chat:{contextRemaining:"restante",contextClickToEdit:"Clique para editar o tamanho do contexto",contextEditTitle:"Editar tamanho do contexto",contextEditDesc:"Definir o limite de tamanho do contexto para o modelo atual (em tokens)",contextEditPlaceholder:"Digite o tamanho do contexto",contextEditHint:"Valores comuns: 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",outlineTitle:"Esboço da conversa",outlineEmpty:"Nenhum conteúdo da conversa",outlineUserQuestion:"Pergunta do usuário",inputPlaceholder:"Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)",slashCommandArgs:{message:"<mensagem>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular o uso da sessão atual",status:"Mostrar status da sessão e fila",abort:"Parar a execução ativa do Bridge",queue:"Enfileirar uma mensagem após a execução ativa",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",allProfiles:"Todos os perfis",profileMissingModelsTip:'O perfil "{profile}" não tem provider ou modelo disponível para esta sessão',sessionScopeHint:"O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.",openHistory:"Abrir histórico",hermesHistory:"Histórico Hermes",historyScopeHint:"Sessões do histórico Hermes do perfil atual, somente leitura, agrupadas por origem.",noSessions:"Sem sessoes",newChat:"Novo chat",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:"Modo de chat",liveMode:"Ao vivo",liveSessions:"Sessões ao vivo",recentBadge:"Recente",linkedSessions:"{count} vinculadas",noVisibleMessages:"Nenhuma mensagem visível para humanos.",monitorRoleUser:"Usuário",monitorRoleAssistant:"Assistente",copySessionLink:"Copiar link da sessão",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:"Tempo de execução",thinkingLabel:"Raciocínio",thinkingInProgress:"Pensando…",thinkingShow:"Mostrar raciocínio",thinkingHide:"Ocultar raciocínio",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensagem",copiedBubble:"Mensagem copiada",copyFailed:"Falha ao copiar",playSpeech:"Reproduzir voz",pauseSpeech:"Pausar",resumeSpeech:"Retomar",stopSpeech:"Parar",speechNotSupported:"Reprodução de voz não suportada neste navegador",searchEnterHint:"Enter para abrir · Esc para fechar",searchHint:"Cmd/Ctrl+K",searchScope:"Escopo da busca: apenas banco local de sessões da Web UI; sessões históricas Hermes somente leitura não são incluídas.",searchFailed:"Falha ao pesquisar sessões",searchNoSnippet:"Nenhum resumo disponível",searchNoResults:"Nenhuma sessão corresponde à busca",searchRecent:"Sessão recente",searchEmpty:"Sessões recentes",searchPlaceholder:"Pesquisar sessões...",searchSubtitle:"Pesquisar por título ou conteúdo da mensagem",searchTitle:"Pesquisar sessões",stopGateway:"Parar gateway",start:"Iniciar",workspaceSetFailed:"Falha ao definir workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Digite o caminho do projeto, ex. /home/user/project",workspace:"Área de trabalho",setWorkspaceTitle:"Definir workspace da sessão",setWorkspace:"Definir workspace",modelSetFailed:"Falha ao definir modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo da sessão",setModel:"Definir modelo",newCliChat:"Novo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproduzir voz automaticamente"},jobs:{title:"Tarefas agendadas",createJob:"Criar tarefa",editJob:"Editar tarefa",noJobs:"Nenhuma tarefa agendada ainda. Crie uma para comecar.",name:"Nome",namePlaceholder:"Nome da tarefa",schedule:"Agendamento (expressao Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Selecionar um preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"A cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos os dias as 00:00",presetEveryDay9:"Todos os dias as 09:00",presetEveryMonday:"Toda segunda as 09:00",presetEveryMonth:"Dia 1 de cada mes as 09:00",prompt:"Prompt",promptPlaceholder:"O prompt a executar",deliverTarget:"Destino de entrega",origin:"Origem",local:"Local",repeatCount:"Contagem de repeticoes (opcional)",modelPlaceholder:"Modelo padrao",repeatPlaceholder:"Deixar vazio para infinito",jobCreated:"Tarefa criada",jobUpdated:"Tarefa atualizada",nameRequired:"O nome e obrigatorio",scheduleRequired:"O agendamento e obrigatorio",loadFailed:"Falha ao carregar a tarefa",jobPaused:"Tarefa pausada",jobResumed:"Tarefa retomada",jobTriggered:"Job acionado",modelUpdated:"Modelo atualizado",jobDeleted:"Tarefa excluida",status:{running:"Em execucao",paused:"Pausada",disabled:"Desativada",scheduled:"Agendada"},info:{model:"Modelo",schedule:"Agendamento",lastRun:"Ultima execucao",nextRun:"Proxima execucao",deliver:"Entrega",repeat:"Repeticao"},action:{pause:"Pausar",pauseJob:"Pausar tarefa",resume:"Retomar",resumeJob:"Retomar tarefa",runNow:"Executar agora",triggerImmediately:"Acionar imediatamente"},runHistory:{title:"Histórico",runs:"execuções",noRuns:"Nenhum histórico encontrado."}},skills:{title:"Habilidades",searchPlaceholder:"Buscar habilidades...",noMatch:"Nenhuma habilidade corresponde a sua busca",noSkills:"Nenhuma habilidade encontrada",backTo:"Voltar para",attachedFiles:"Arquivos anexados",loadFailed:"Falha ao carregar a habilidade",fileLoadFailed:"Falha ao carregar o arquivo",modified:"Modificado pelo usuário",archived:"Arquivado",pinned:"Fixado",pin:"Fixar habilidade",unpin:"Desfixar habilidade",pinFailed:"Falha ao alterar estado de fixacao",toggleFailed:"Falha ao ativar/desativar a habilidade",source:{builtin:"Integrado",hub:"Hub",local:"Local"}},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:"Raiz do agente",python:"Python",scanCwd:"Verificar cwd",projectPlugins:"Plugins do projeto"}},memory:{title:"Memoria",refresh:"Atualizar",loadFailed:"Falha ao carregar a memoria",myNotes:"Minhas notas",noNotes:"Nenhuma nota ainda.",notesPlaceholder:"Escreva suas notas...",userProfile:"Perfil do usuario",noProfile:"Nenhum perfil ainda.",profilePlaceholder:"Escreva seu perfil...",soul:"Alma",noSoul:"Nenhuma configuracao de alma ainda.",soulPlaceholder:"Escreva a configuracao da alma..."},models:{title:"Modelos",addProvider:"Adicionar provedor",providerType:"Tipo de provedor",preset:"Predefinição",custom:"Personalizado",selectProvider:"Selecionar provedor",chooseProvider:"Escolha um provedor...",name:"Nome",autoGeneratedName:"Gerado automaticamente pela URL base",baseUrl:"URL base",region:"Região",regionIntl:"Internacional",regionCn:"China Continental",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Chave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo padrao",selectOrInput:"Selecionar ou digitar um modelo...",selectModel:"Selecionar um modelo...",providerAdded:"Provedor adicionado",providerDeleted:"Provedor excluido",deleteProvider:"Excluir provedor",deleteConfirm:'Tem certeza de que deseja excluir "{name}"?',codexLoginTitle:"Login do OpenAI Codex",codexWaiting:"Digite este código na página de autorização para fazer login:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorização",codexApproved:"Login bem-sucedido",codexExpired:"A autorização expirou. Por favor, tente novamente.",nousLoginTitle:"Login do Nous Portal",nousWaiting:"Insira este código na página de autorização:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorização",nousApproved:"Login bem-sucedido",nousDenied:"Autorização negada",nousExpired:"Autorização expirada",copilotLoginTitle:"Login do GitHub Copilot",copilotWaiting:"Abra o GitHub e insira o código do dispositivo abaixo para autorizar. A janela fechará automaticamente após a aprovação.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir a página de autorização do GitHub",copilotApproved:"Login bem-sucedido!",copilotDenied:"Autorização negada.",copilotExpired:"O link de autorização expirou. Tente novamente.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Foi detectado um token OAuth do GitHub Copilot nesta máquina. Clique em Adicionar para ativar o Copilot no 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",currentDefault:"Padrão atual",defaultShort:"Padrã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",xaiWaiting:"Conclua a autorização na página xAI aberta. A janela será fechada automaticamente após a aprovação.",xaiOpenLink:"Abrir página de autorização xAI",xaiLoginTitle:"Login OAuth xAI Grok",xaiExpired:"O link de autorização expirou. Tente novamente.",xaiCopyLink:"Copiar link de autorização",xaiApproved:"Login concluído!",visibilitySelectOne:"Mantenha pelo menos um modelo visível",visibilitySaved:"Modelos visíveis salvos",visibilitySaveFailed:"Falha ao salvar modelos visíveis",visibilityHint:"Afeta apenas o seletor de modelos e a página de modelos da Web UI. A configuração provider/model da Hermes CLI não é alterada; as chamadas ainda usam o ID original do modelo.",showAllModels:"Mostrar todos os modelos",searchPlaceholder:"Pesquisar modelos...",removeCustomModel:"Remover este modelo não listado",more:"mais",models:"Lista de modelos",manageVisibleModelsFor:"Gerenciar modelos visíveis de {name}",manageVisibleModels:"Gerenciar modelos visíveis",getApiKey:"Obter API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nome exibido de {model}",aliasTitle:"Nome exibido do modelo",aliasSaveFailed:"Falha ao salvar nome exibido",aliasPlaceholder:"Deixe vazio para usar o ID original do modelo",aliasManageFor:"Nomes exibidos de {provider}",aliasManage:"Nomes exibidos",aliasHint:"Altera apenas o nome exibido na Web UI. O Hermes ainda recebe o ID original do modelo.",aliasEdit:"Renomear",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfis",create:"Criar perfil",import:"Importar",export:"Exportar",rename:"Renomear",delete:"Excluir",switchTo:"Trocar Hermes Profile",switchConfirm:"Isto executara `hermes profile use {name}` e alterara o active profile do Hermes CLI. Continuar?",switchSuccess:'Hermes active profile alterado para "{name}"',switchFailed:"Falha ao trocar Hermes Profile. O gateway pode precisar de reinicio manual.",createSuccess:'Perfil "{name}" criado',createFailed:"Falha ao criar o perfil",renameSuccess:"Perfil renomeado",renameFailed:"Falha ao renomear o perfil",deleteConfirm:'Tem certeza de que deseja excluir o perfil "{name}"?',deleteSuccess:"Perfil excluido",deleteFailed:"Falha ao excluir o perfil",exportSuccess:"Perfil exportado",exportFailed:"Falha ao exportar o perfil",importSuccess:"Perfil importado",importFailed:"Falha ao importar o perfil",importSelectFile:"Selecionar arquivo de arquivo",importInvalidFile:"Por favor, selecione um arquivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nome do perfil",namePlaceholder:"Apenas letras, numeros e hifens",nameValidation:"O nome do perfil só pode conter letras minúsculas, números, sublinhados e hifens",newName:"Novo nome",newNamePlaceholder:"Digite um novo nome",cloneFromCurrent:"Clonar do perfil atual",cloneCleanupNotice:"Ao clonar, as credenciais exclusivas de plataforma (Weixin / Telegram / Slack, etc.) são automaticamente ignoradas para evitar conflitos com o perfil de origem",cloneStrippedCredentials:"{count} credencial(is) exclusiva(s) removida(s): {list}",cloneDisabledPlatforms:"{count} plataforma(s) desabilitada(s): {list}",cloneStrippedConfigCredentials:"{count} credencial(is) incorporada(s) removida(s) do config.yaml: {list}",archivePath:"Caminho do arquivo",archivePathPlaceholder:"Caminho do servidor para o arquivo",importName:"Nome do perfil (opcional)",importNamePlaceholder:"Deixe vazio para usar o nome do arquivo",active:"Ativo",model:"Modelo",gateway:"Gateway",alias:"Alias",provider:"Provedor",path:"Caminho",skills:"Habilidades",hasEnv:"Tem .env",hasSoulMd:"Tem soul.md",noProfiles:"Nenhum perfil encontrado. Crie um para comecar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Enviar imagem",random:"Gerar aleatório",reset:"Restaurar padrão",hint:"PNG, JPEG ou WebP, máximo 1 MB",invalidType:"Escolha uma imagem PNG, JPEG ou WebP",tooLarge:"A imagem do avatar não pode exceder 1 MB",saveSuccess:"Avatar salvo",saveFailed:"Falha ao salvar avatar",resetSuccess:"Avatar padrão restaurado",resetFailed:"Falha ao restaurar avatar padrão"},runtime:{activeProfile:"Atual: {name}",bridgeWorker:"Status do Bridge",gateway:"Gateway",active:"Ativo",activeTag:"Atual",idle:"Ocioso",running:"Em execução",stopped:"Parado",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Trocar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"Falha ao reiniciar gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"Falha ao reiniciar perfil"}},logs:{title:"Logs",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Atualizar",noEntries:"Nenhuma entrada de log"},settings:{title:"Configuracoes",saved:"Salvo",saveFailed:"Falha ao salvar",tabs:{display:"Exibicao",account:"Conta atual",users:"Gerenciamento de contas",agent:"Agente",memory:"Memoria",compression:"Compressao",session:"Sessao",privacy:"Privacidade",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respostas em streaming",streamingHint:"Mostrar respostas da IA em tempo real",compact:"Modo compacto",compactHint:"Reduzir espacamento entre mensagens",showReasoning:"Mostrar raciocinio",showReasoningHint:"Mostrar processo de pensamento do modelo",showCost:"Mostrar custo",showCostHint:"Mostrar uso de tokens nas respostas",inlineDiffs:"Diffs em linha",inlineDiffsHint:"Mostrar alteracoes de codigo em linha",bellOnComplete:"Som de conclusao",bellOnCompleteHint:"Tocar som quando a IA terminar",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada enquanto a IA processa",theme:"Tema",themeHint:"Escolha claro, escuro ou seguir a preferencia do sistema",themeLight:"Claro",themeDark:"Escuro",themeSystem:"Sistema"},agent:{maxTurns:"Maximo de turnos",maxTurnsHint:"Maximo de rodadas de interacao por conversa",gatewayTimeout:"Timeout do gateway",gatewayTimeoutHint:"Timeout da requisicao em segundos",restartDrainTimeout:"Timeout de drenagem ao reiniciar",restartDrainTimeoutHint:"Timeout de drenagem antes de reiniciar em segundos",toolEnforcement:"Obrigatoriedade de ferramentas",toolEnforcementHint:"Controlar o modo de execucao de chamadas de ferramentas",auto:"Automatico",always:"Sempre",never:"Nunca"},memory:{enabled:"Ativar memoria",enabledHint:"Permitir que a IA lembre do contexto da conversa",userProfile:"Perfil do usuario",userProfileHint:"Permitir que a IA lembre das preferencias do usuario",charLimit:"Limite de caracteres da memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres do perfil do usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Ativar compressao",enabledHint:"Comprimir automaticamente historico longo antes de exceder o contexto do modelo",threshold:"Limiar de compressao",thresholdHint:"Iniciar compressao quando tokens estimados excederem esta proporcao do contexto",targetRatio:"Proporcao alvo",targetRatioHint:"Tamanho alvo do historico apos compressao como proporcao do contexto",protectLastN:"Proteger mensagens recentes",protectLastNHint:"Manter sem compressao esta quantidade de mensagens recentes",protectFirstN:"Proteger primeiras mensagens",protectFirstNHint:"Manter sem compressao esta quantidade de mensagens iniciais"},session:{mode:"Modo de reinicializacao",modeHint:"Condicao de acionamento para reinicializacao de sessao",modeBoth:"Inatividade + Agendado",modeIdle:"Somente inatividade",modeDaily:"Somente agendado",modeNone:"Nunca (apenas manual)",idleMinutes:"Timeout de inatividade",idleMinutesHint:"Tempo de espera antes da reinicializacao automatica (minutos)",atHour:"Horario de reinicializacao agendada",humanOnly:"Mostrar apenas sessões humanas",humanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões",liveMonitorHumanOnly:"Monitor ao vivo: mostrar apenas sessões humanas",liveMonitorHumanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões no monitor ao vivo",atHourHint:"Reiniciar sessao neste horario diariamente",requireAuth:"Autorização de sessão",requireAuthHint:"Requer autorização para operações de sessão"},privacy:{redactPii:"Ocultar dados pessoais",redactPiiHint:"Detectar e ocultar automaticamente informacoes sensiveis (senhas, chaves, etc.)"},apiServer:{enable:"Ativar",enableHint:"Ativar servidor API",host:"Host",hostHint:"Endereco de escuta",port:"Porta",portHint:"Porta de escuta",key:"Chave",keyHint:"Chave de acesso API",cors:"Origens CORS",corsHint:"Fontes cross-origin permitidas"},voice:{ttsProvider:"Provedor TTS",ttsProviderHint:"Escolha o mecanismo de texto para fala para reproducao de mensagens",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compativel com OpenAI)",providerEdge:"Edge TTS (Gratuito, sem chave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Selecione uma voz do seu navegador ou SO",webspeechVoicePlaceholder:"Auto (voz padrao)",openaiKey:"Chave API",openaiKeyHint:"Sua chave API OpenAI com acesso TTS",openaiUrl:"URL base da API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mais rapido) / tts-1-hd (qualidade superior)",openaiVoice:"Voz",openaiVoiceHint:"Voz a ser usada para sintese",customHint:"Use qualquer API TTS compativel com OpenAI — funciona com GPT-SoVITS, CosyVoice, etc.",customUrl:"URL da API",customUrlHint:"URL base do seu servico TTS",customUrlPlaceholder:"Endereco configurado no adaptador local, ex. http://127.0.0.1:9880",customApiKey:"Chave API (opcional)",customApiKeyHint:"Alguns endpoints personalizados exigem autenticacao",customApiKeyPlaceholder:"Deixe em branco se nao for necessario",edgeHint:"Desenvolvido por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL do adaptador",edgeUrlHint:"Endereco do adaptador Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Selecione uma voz para sintese de fala",edgeRate:"Velocidade",edgeRateHint:"Ajustar velocidade da fala (0.5x ~ 2.0x)",edgePitch:"Tom",edgePitchHint:"Ajustar tom da fala (-20 ~ +20 Hz)",testTitle:"Teste de voz",testText:"Texto de teste",testTextPlaceholder:"Insira o texto para testar...",testTextDefault:"Ola, este e um teste de voz.",testButton:"Testar",testButtonPlaying:"Reproduzindo...",testFailed:"Teste falhou: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — vozes predefinidas, design de voz e clonagem de voz",mimoApiKey:"Chave API",mimoApiKeyHint:"Obtenha sua chave em platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Chave API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Digite a API Key",noProviders:"Nenhum provedor configurado",save:"Salvar",saveFailed:"Falha ao salvar",saved:"Salvo"}},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...",qqSandboxHint:"Ativar ambiente sandbox (para testes)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escaneie o QR code com QQ ou abra o link no celular para concluir a vinculação",qqMarkdownHint:"Ativar mensagens em formato Markdown (alguns clientes podem não suportar)",qqMarkdown:"Suporte a Markdown",qqAppSecretHint:"App Secret do bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID do bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista de permissões de IDs de usuário ou OpenID, separados por vírgula",allowedUsers:"Usuários permitidos",allowAllUsersHint:"Permite mensagens de qualquer usuário; desative para usar a lista de permissões",allowAllUsers:"Permitir todos os usuários"},language:{label:"Idioma",zh:"中文",en:"English",pt:"Portugues"},terminal:{sessions:"Sessoes",newTab:"Novo terminal",closeSession:"Fechar esta sessao?",sessionExited:"Encerrada",processExited:"Processo encerrado com codigo {code}",noSessions:"Nenhuma sessão de terminal",connectionFailed:"Falha ao conectar ao terminal",connectionError:"Erro de conexão",connectionClosed:"Conexão fechada"},usage:{title:"Estatisticas de uso",refresh:"Atualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Saida",totalSessions:"Total de sessoes",avgPerDay:"~{n}/dia em media",estimatedCost:"Custo est.",cacheHitRate:"Taxa de acerto de cache",modelBreakdown:"Detalhamento por modelo",dailyTrend:"Uso diario",date:"Data",tokens:"Tokens",cache:"Cache",cacheRead:"Leitura de cache",cacheWrite:"Escrita de cache",sessions:"Sessoes",cost:"Custo",noData:"Sem dados de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Acompanhe carregamentos e edições de habilidades nas sessões Hermes",refresh:"Atualizar",periodSelector:"Período de uso de habilidades",periodLabel:"{days} d",summary:"Resumo",totalActions:"Ações",loads:"Carga",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendência diária",periodSummary:"Últimos {days} dias",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"Nenhum dado de uso de habilidades",loadFailed:"Falha ao carregar o uso de habilidades",otherSkills:"Outras habs."},changelog:{new_0_5_22_1:"API de lista de sessões Hermes passa a ler o banco do perfil em vez do store local de sessões da Web UI",new_0_5_23_1:"Comandos slash de chat exclusivos do Bridge com sugestões localizadas",new_0_5_23_2:"Histórico de comandos persistente para replay de sessão sem poluir contexto, uso ou compressão",new_0_5_23_3:"Variáveis de ambiente do perfil gateway isoladas para evitar vazamento de credenciais entre perfis",new_0_5_23_4:"Porta da Web UI reservada durante alocação do gateway para evitar conflitos de inicialização",new_0_5_23_5:"Correção do reinício de autoatualização para não reportar saídas bem-sucedidas do helper como falha",new_0_5_24_1:"Chat Bridge alinhado ao API Server para entrada multimodal, prompt de sistema e contexto de workspace",new_0_5_25_1:"Ações de reset e clonagem de salas de chat em grupo",new_0_5_25_2:"Diretório de estado da Web UI configurável para layouts de deploy personalizados",new_0_5_25_3:"MiMo adicionado como provedor TTS nas configurações de voz",new_0_5_25_4:"Listas de modelos de provedores personalizados buscadas pelo backend para evitar falhas CORS do navegador",new_0_5_25_5:"Fluxo de aprovação de ferramentas corrigido para sessões Bridge",new_0_5_25_6:"Dica de plataforma CLI forçada removida dos prompts Bridge para preservar instruções personalizadas de mídia/arquivo",new_0_5_25_7:"Conteúdo de imagem base64 exibido corretamente no histórico de mensagens do usuário",new_0_5_25_8:"Testes Playwright de navegador, cobertura de contrato de streaming de chat, cobertura de modelos de provedor e baseline de cobertura adicionados",new_0_5_26_1:"Suporte a caminhos de mídia Markdown locais e do Windows no histórico e em mensagens renderizadas",new_0_5_26_2:"Histórico vazio do assistant filtrado e estado de compressão obsoleto limpo ao iniciar nova execução",new_0_5_26_3:"Escritas com lock para atualizações de config e perfil a fim de reduzir corrupção por concorrência",new_0_5_26_4:"Configurações de canais QQBot e DingTalk adicionadas",new_0_5_26_5:"Detecção de porta CLI portável e melhorias no tamanho da gaveta de terminal móvel",new_0_5_26_6:"Ambientes de perfil Bridge isolados e descoberta de plugins Hermes corrigida entre ambientes Python",new_0_5_26_7:"Estados de gateway parado explicados com diagnósticos Web UI e estado de carregamento de logs estável",new_0_5_26_8:"Opções de reset de sessão, base URL de provedor personalizado e destinos dinâmicos de entrega corrigidos",new_0_5_26_9:"Toggle local de visibilidade de trace de tool-call adicionado à barra de entrada do chat",new_0_5_26_10:"Instalação do pacote Hermes Agent suportada quando não há checkout de código-fonte disponível",new_0_5_26_11:"Login OAuth xAI Grok para usuários SuperGrok e presets de modelos Grok atualizados",new_0_5_26_12:"Cobertura ampliada de navegador, streaming de chat, provedor, gateway, config, plugin e Bridge",new_0_5_27_1:"Configurações de modelo por sessão para chats Bridge, com provider e model independentes salvos por sessão",new_0_5_27_2:"Clique com o botão direito em uma sessão Bridge e escolha Definir modelo para trocar o modelo daquela sessão",new_0_5_27_3:"Execuções validam o modelo da sessão e voltam ao modelo padrão atual quando o modelo salvo está indisponível",new_0_5_27_4:"Compressão de contexto segue por padrão o modelo selecionado como padrão no Profile atual",new_0_5_30_1:"Bridge chat preserva histórico estruturado, corrigindo ausência intermitente de resposta e execução de ferramentas pulada por histórico de ferramentas achatado",new_0_5_30_2:"Roteamento de menções no chat em grupo é mais confiável para múltiplos agentes, remove a própria menção @ antes da entrega e mantém nomes após atualizar",new_0_5_30_3:"Páginas de modelos, dropdowns de modelo do chat e seleção de modelo da sessão agora usam o Profile ativo com marcadores padrão precisos",new_0_5_30_4:"Gerenciamento de gateway simplificado: página Gateway independente removida, cada Profile verifica configuração de plataforma antes de iniciar e runner leve gerencia start/restart",new_0_5_30_5:"Inicialização do gateway melhorada em Docker, Termux e Windows com runtime-lock, limpeza de conflito de porta, execução em segundo plano e suporte a restart",new_0_5_30_6:"Compatibilidade Windows reforçada para detecção de caminhos, downloads e subprocessos job/update sem flashes de janelas de terminal",new_0_5_30_7:"Escritas de config e presets de provedor corrigidos: validar chaves .env, rotear FUN-Codex pela Responses API e atualizar listas Z.AI/GLM",new_0_5_30_8:"Detalhes de frontend polidos, incluindo sidebar recolhida, rótulos curtos de grupo, divisor lateral e estilo do outline da conversa",new_0_5_30_9:"Compressão de contexto segue configurações do Profile e fortalece snapshots obsoletos reutilizando resumos anteriores com cauda segura",new_0_5_31_1:"Reinícios do Bridge broker reforçados, renderização final do stream de chat em grupo corrigida e roteamento {'@'}all adicionado",new_0_5_31_2:"Gerenciador de arquivos pode copiar caminhos absolutos e a gaveta móvel de sessões não fica mais atrás do chat",new_0_5_31_3:"Seletor de Profile mostra avatares, upload de avatar personalizado, modal de status runtime e ações de restart de gateway/Profile",new_0_5_31_4:"Avatares de Profile aparecem em chat individual, chat em grupo e sidebar recolhida, com metadados Web UI e caminhos seguros para Windows",new_0_5_31_5:"Detecção e restart de gateway em Docker, Termux e Windows melhorados usando gateway_state/gateway.pid para liveness do gateway gerenciado",new_0_5_31_6:"Endpoint de mídia APIKEY.FUN para geração de imagens e skill apikey-image-gen integrado para texto-imagem, imagem-imagem e edição via provider fun-codex do Profile ativo",new_0_5_33_1:"Falhas de execução e erros Socket em chat individual e em grupo agora ficam como mensagens Agent vermelhas na lista de mensagens",new_0_5_33_2:"A busca de sessões pode ser limitada ao Profile selecionado, ou buscar todos os Profiles quando nenhum estiver selecionado",new_0_5_33_3:"A página Skills mostra documentos de recomendação em chinês/inglês quando nenhum skill está selecionado, e um segundo clique desmarca o skill",new_0_5_33_4:"Remove entradas de changelog i18n não usadas para reduzir o tamanho do frontend",new_0_5_33_5:"Corrige falha de inicialização do agent bridge no Windows chinês causada pela codificação da saída do netstat",new_0_5_33_6:"Atualiza a lista de modelos Nous Portal pelo catalog público e recomendações do Portal",new_0_5_33_7:"Listas e status runtime de Profile leem nomes dos diretórios e modelos padrão do config, evitando erros por largura de colunas da CLI",new_0_5_34_1:"Normaliza resultados de tools multimodais ao armazenar mensagens de sessão/grupo, evitando imagens base64 nos replays",new_0_5_34_2:"Persiste modelos Hermes personalizados em configuração gerenciada pelo backend e adiciona endpoints de adicionar/remover modelo",new_0_5_34_3:"Mantém uso final de contexto e status de tools do Bridge corretos após a conclusão das execuções",new_0_5_34_4:"Melhora filtros de Kanban, exibição de responsáveis, ações de cards e detalhes de tarefas",new_0_5_34_5:"Corrige contagem de uso da compressão com cache de contexto fixo de prompt/tools e totais completos de tokens",new_0_5_34_6:"Cacheia contexto fixo por agent no chat em grupo e mostra progresso apenas quando a compressão realmente inicia",new_0_5_34_7:"Sincroniza skills integradas do Web UI em todos os Profiles e registra o Profile alvo nos logs",new_0_5_34_8:"Se o Kanban falhar no Windows, atualize o Hermes para receber as correções mais recentes de migração do banco Kanban",new_0_5_35_1:"Sessões Bridge agora podem executar em paralelo entre sessions diferentes, enquanto runs da mesma session continuam serializados para preservar a ordem",new_0_5_35_2:"Adiciona a página Performance Monitor para CPU/memória do sistema, Web UI, Bridge Broker, Workers e status de sessões ativas",new_0_5_35_3:"Adiciona métricas por worker com CPU, memória, Profile, número de sessões e estado de execução",new_0_5_35_4:"Melhora a limpeza do ciclo de vida dos Bridge workers para recuperar workers no encerramento do Broker ou do processo pai e reduzir processos Python órfãos",new_0_5_35_5:"Fortalece a compatibilidade do monitoramento com fallbacks de coleta para macOS, Windows, Linux, Docker e Termux",new_0_5_35_6:"Performance Monitor não bloqueia mais em requests a workers durante a inicialização de Agents, reduzindo request timeouts no Windows",new_0_5_35_7:"Chat Markdown agora suporta preview inline de conteúdo de texto, e ícones de download baixam arquivos diretamente sem abrir o drawer",new_0_5_35_8:"Melhora o drawer de conteúdo com ação de fechar no mobile, largura total no mobile, 800px no desktop e fundos consistentes para texto/Markdown",new_0_6_0_1:"A gestão por conta e por Profile agora protege de forma consistente sessões, modelos, uso, Kanban, jobs, uploads, mídia e APIs Hermes relacionadas",new_0_6_0_2:"Skills de mídia integrados usam o token de servidor gerado apenas para endpoints de mídia e resolvem credenciais fun-codex/xAI a partir do Profile solicitado",new_0_6_0_3:"Chat individual e em grupo injetam o Hermes Profile atual nas instruções do run para que Skills enviem X-Hermes-Profile",new_0_6_0_4:"O progresso de subagents de delegate_task aparece na UI do chat com estados de início, ferramenta, progresso e conclusão",new_0_6_0_5:"Parar ou abortar um run limpa eventos temporários para que estados abort antigos não passem para o próximo chat",new_0_6_0_6:"Atualiza documentação e site para gestão de contas, credenciais padrão, gestão conta/Profile, uploads/downloads e Skills de mídia",new_0_6_0_7:"Adiciona comandos CLI de manutenção para limpar bloqueios de IP de login e redefinir o login padrão admin / 123456",new_0_6_0_8:"A versão 0.6.0 é o limite entre a Web UI de usuário único e multiusuário. Se o modo multiusuário causar problemas, abra uma issue e volte para a versão 0.5.35 de usuário único se necessário"},files:{title:"Arquivos",tree:"Arvore de diretorios",list:"Lista de arquivos",breadcrumbRoot:"Inicio",newFile:"Novo arquivo",newFolder:"Nova pasta",upload:"Enviar",refresh:"Atualizar",open:"Abrir",edit:"Editar",preview:"Visualizar",download:"Baixar",copyPath:"Copiar caminho",rename:"Renomear",delete:"Excluir",name:"Nome",size:"Tamanho",modified:"Modificado",actions:"Acoes",emptyDir:"Diretorio vazio",loading:"Carregando...",confirmDelete:'Tem certeza de que deseja excluir "{name}"?',confirmDeleteDir:'Tem certeza de que deseja excluir o diretorio "{name}" e todo o seu conteudo?',deleteFailed:"Falha ao excluir",deleted:"Excluido",renameTo:"Renomear para",newFileName:"Nome do arquivo",newFolderName:"Nome da pasta",created:"Criado",createFailed:"Falha ao criar",renamed:"Renomeado",renameFailed:"Falha ao renomear",uploadSuccess:"{count} arquivo(s) enviado(s)",uploadFailed:"Falha ao enviar",saveFailed:"Falha ao salvar",saved:"Salvo",unsavedChanges:"Voce tem alteracoes nao salvas. Descartar?",pathCopied:"Caminho copiado",fileTooLarge:"Arquivo muito grande (max 10MB)",permissionDenied:"Nao e possivel modificar arquivo protegido",notFound:"Arquivo ou diretorio nao encontrado",backendError:"Falha na operacao de arquivo",dragDropHint:"Arraste arquivos aqui para enviar",closeEditor:"Fechar editor",closePreview:"Fechar",saveFile:"Salvar",fileTree:"Árvore de arquivos"},groupChat:{title:"Chat em grupo",createRoom:"Criar sala",joinByCode:"Entrar com codigo",roomName:"Nome da sala",roomNamePlaceholder:"Digite o nome da sala",inviteCode:"Codigo de convite",autoGenerate:"Gerar automaticamente",noRooms:"Nenhuma sala ainda",selectOrCreate:"Selecione ou crie uma sala para comecar a conversar",agents:"Agentes",addAgent:"Adicionar agente",selectProfile:"Selecione um perfil",agentAdded:"Agente adicionado",agentAlreadyInRoom:"O agente ja esta nesta sala",agentAddFailedCount:"{count} agente(s) nao foram adicionados: {details}",noAgents:"Nenhum agente nesta sala",members:"Membros",roomCreated:"Sala criada",roomDeleted:"Sala excluída",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar link da sala",deleteRoomConfirm:"Excluir esta sala?",clearContext:"Limpar contexto",clearContextConfirm:"Limpar o contexto desta sala? Mensagens e snapshots de compactação serão removidos, mas agentes e membros ficam.",contextCleared:"Contexto limpo",you:"Você",joined:"Entrou na sala",joinFailed:"Falha ao entrar na sala",inputPlaceholder:"Digite uma mensagem... (Enter para enviar)",enterCode:"Digite o codigo de convite",yourName:"Seu nome",yourNamePlaceholder:"Digite seu nome de exibicao",yourDescription:"Descricao (opcional)",yourDescriptionPlaceholder:"Conte aos outros quem voce e...",agentName:"Nome do agente",agentNamePlaceholder:"Nome personalizado (vazio = nome do perfil)",agentDesc:"Descrição do agente",agentDescPlaceholder:"Descreva o que este agente faz...",agentReplying:"está respondendo...",agentCompressing:"está compactando contexto...",compressionSettings:"Configuração de compactação",triggerTokens:"Tokens de acionamento",triggerTokensDesc:"Limite de tokens para acionar a compactação",maxHistoryTokens:"Máx. tokens de histórico",maxHistoryTokensDesc:"Máximo de tokens para o contexto compactado",tailMessageCount:"Mensagens recentes",tailMessageCountDesc:"Número de mensagens recentes a manter",compressionConfig:"Config. de compactação",compressNow:"Compactar agora",compressingInProgress:"Compactação em andamento",compressionSaved:"Configuração salva"},download:{downloading:"Baixando...",downloadFailed:"Falha no download",fileNotFound:"Arquivo nao encontrado ou excluido",fileTooLarge:"Arquivo muito grande (limite excedido)",backendError:"Falha ao ler o arquivo, o ambiente remoto pode estar indisponivel",backendTimeout:"Tempo esgotado para ler o arquivo",unsupportedBackend:"O backend de terminal atual nao suporta download de arquivos",invalidPath:"Caminho de arquivo invalido",contentDisplay:"Exibicao de conteudo",download:"Baixar",downloadFile:"Baixar arquivo"},gateways:{title:"Gateways",running:"Em execução",stopped:"Parado",started:"Iniciado",startFailed:"Falha ao iniciar gateway",stopFailed:"Falha ao parar gateway"},kanban:{title:"Quadro Kanban",createTask:"Nova tarefa",noTasks:"Nenhuma tarefa",allStatuses:"Todos os status",allAssignees:"Todos os responsáveis",columns:{triage:"Triagem",todo:"A fazer",ready:"Pronto",running:"Em andamento",blocked:"Bloqueado",done:"Concluído",archived:"Arquivado"},card:{assigneeTooltip:"Responsável",priority:{low:"Baixa",medium:"Média",high:"Alta"},timeAgo:{justNow:"agora mesmo",minutes:"há {count} min",hours:"há {count} h",days:"há {count} d"}},board:{create:"Novo quadro",archive:"Arquivar quadro",archiveConfirm:"Arquivar o quadro atual?",archived:"Quadro arquivado",created:"Quadro criado",slugPlaceholder:"Identificador do quadro, ex. project-a",namePlaceholder:"Nome exibido (opcional)",slugRequired:"O identificador do quadro é obrigatório"},form:{title:"Título",titlePlaceholder:"Título da tarefa",titleRequired:"Título é obrigatório",body:"Descrição",bodyPlaceholder:"Descrição da tarefa (opcional)",assignee:"Responsável",selectAssignee:"Selecionar responsável...",priority:"Prioridade",selectPriority:"Selecionar prioridade..."},detail:{status:"Status",priority:"Prioridade",assignee:"Responsável",tenant:"Locatário",createdAt:"Criado",startedAt:"Iniciado",completedAt:"Concluído",comments:"Comentários",events:"Eventos",runs:"Execuções",artifacts:"Arquivos gerados",result:"Resultado",highlights:"Informações principais",sources:"Fontes de dados",sessions:"Sessões relacionadas",sessionMessages:"Mensagens da sessão",noSessions:"Nenhuma sessão relacionada encontrada."},action:{title:"Ações",assign:"Atribuir",assignTo:"Atribuir a...",block:"Bloquear",blockReason:"Motivo do bloqueio",unblock:"Desbloquear",complete:"Concluir",completeSummary:"Resumo de conclusão (opcional)"},message:{loadFailed:"Falha ao carregar tarefa",taskCreated:"Tarefa criada",taskAssigned:"Tarefa atribuída",taskBlocked:"Tarefa bloqueada",taskUnblocked:"Tarefa desbloqueada",taskCompleted:"Tarefa concluída"},stats:{total:"Total",tasks:"Tarefas"}}},Io=["en","zh","zh-TW","ja","ko","fr","es","de","pt"];function ia(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function Pa(o,e){const a={...o};for(const[i,r]of Object.entries(e)){const l=o[i];a[i]=ia(l)&&ia(r)?Pa(l,r):r}return a}var Mt={en:Sa,zh:St,"zh-TW":Pt,ja:Ct,ko:At,fr:Tt,es:xt,de:Ht,pt:It},Ca={};for(const[o,e]of Object.entries(Mt))Ca[o]=o==="en"?e:Pa(Sa,e);var Dt=localStorage.getItem("hermes_locale");function Rt(o){if(o&&Io.includes(o))return o;function e(a){const i=a.toLowerCase();if(i.startsWith("zh"))return i.includes("hant")||i.includes("-tw")||i.includes("-hk")||i.includes("-mo")?"zh-TW":"zh";const r=a.slice(0,2);return Io.includes(a)?a:Io.includes(r)?r:null}for(const a of navigator.languages){const i=e(a);if(i)return i}return"en"}function Aa(o){document.documentElement.lang=o}var Ta=Rt(Dt);Aa(Ta);var xa=ut({legacy:!1,locale:Ta,fallbackLocale:"en",messages:Ca});function Et(o){xa.global.locale.value=o,Aa(o)}var Lt,Ft=be((()=>{Lt="/logo.png"}));Ft();xe();var zt={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"}},Ut={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 Nt(o,e){const a=o?Ut:zt;return e?{...a,common:{...a.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:a}function qt(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function io(){const o=qt(Ee.value);Ze.value=o,Ne.value=Ue.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",Ne.value)}function Ha(){const o=se(()=>{const l=Ze.value?"dark":"light";return Ne.value?`comic-${l}`:l});function e(l){Ee.value=l}function a(l){Ue.value=l}function i(){Ee.value=Ze.value?"light":"dark"}function r(){Ue.value=Ne.value?"ink":"comic"}return{brightness:Ee,style:Ue,isDark:Ze,isComic:Ne,themeName:o,setBrightness:e,setStyle:a,toggleBrightness:i,toggleStyle:r}}var Mo,Do,Ee,Ue,Ze,Ne,Ia=be((()=>{Mo="hermes_brightness",Do="hermes_style",Ee=S(localStorage.getItem(Mo)||"system"),Ue=S(localStorage.getItem(Do)||"ink"),Ze=S(!1),Ne=S(!1),io(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Ee.value==="system"&&io()}),Re(Ee,o=>{localStorage.setItem(Mo,o),io()}),Re(Ue,o=>{localStorage.setItem(Do,o),io()})}));Ia();ve();bo();ko();Ce();var Bt={class:"model-selector"},Ot={class:"model-label"},Wt=["title"],jt={class:"model-list"},Gt=["onClick"],Kt={class:"model-group-label"},Vt={class:"model-group-count"},$t={class:"model-group-items"},Qt=["title","onClick"],Jt={class:"model-item-label"},Zt={class:"model-item-name"},Yt={key:0,class:"model-item-id"},Xt={key:0,class:"model-badge-preview"},en={key:1,class:"model-badge-disabled"},on={key:2,class:"model-badge-custom"},an=["title","onClick"],tn={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"},nn={key:0,class:"model-empty"},rn={class:"model-custom"},sn={class:"model-custom-row"},ln={class:"model-custom-hint"},dn=Pe({__name:"ModelSelector",setup(o){const{t:e}=He(),a=Ye(),i=Xe(),r=S(!1),l=S(""),d=S({}),g=S(""),T=S(""),O=se(()=>i.activeProfileName||"default"),A=se(()=>a.profileModelGroups.find(R=>R.profile===O.value)?.groups||[]),f=se(()=>(T.value=a.selectedProvider,A.value.map(R=>({label:R.label,value:R.provider})))),B=se(()=>A.value.map(R=>({...R,models:[...R.models,...(a.customModels[R.provider]||[]).filter(h=>!R.models.includes(h))]}))),M=se(()=>B.value.some(R=>R.provider===a.selectedProvider&&R.models.includes(a.selectedModel))),Y=se(()=>M.value?a.displayModelName(a.selectedModel,a.selectedProvider):"");function te(R,h){return(a.customModels[h]||[]).includes(R)}async function ue(R,h){await a.removeCustomModel(R,h)}function J(R){return typeof R=="string"?R.toLowerCase():""}const de=se(()=>{const R=J(l.value).trim();return R?B.value.map(h=>({...h,models:h.models.filter(P=>{const j=a.displayModelName(P,h.provider);return J(P).includes(R)||J(j).includes(R)})})).filter(h=>h.models.length>0||J(h.label).includes(R)):B.value});function ne(R){d.value[R]=!d.value[R]}function p(R){return!!d.value[R]}function H(R,h){A.value.find(P=>P.provider===h)?.model_meta?.[R]?.disabled||(a.switchModel(R,h),r.value=!1,l.value="")}function $(R,h){return a.displayModelName(R,h)}function Q(R,h){return a.getModelAlias(R,h)}function U(){const R=g.value.trim();!R||!T.value||A.value.find(h=>h.provider===T.value)?.model_meta?.[R]?.disabled||(a.switchModel(R,T.value),r.value=!1,l.value="",g.value="")}function ke(){d.value={},l.value="",g.value="",T.value=a.selectedProvider,r.value=!0}return(R,h)=>(I(),L("div",Bt,[n("div",Ot,b(u(e)("models.title")),1),n("button",{class:"model-trigger",onClick:ke},[n("span",{class:"model-name",title:u(a).selectedModel},b(Y.value||"—"),9,Wt),h[4]||(h[4]=n("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"},[n("polyline",{points:"6 9 12 15 18 9"})],-1))]),X(u(Be),{show:r.value,"onUpdate:show":h[3]||(h[3]=P=>r.value=P),preset:"card",title:u(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:ce(()=>[X(u(zo),{value:l.value,"onUpdate:value":h[0]||(h[0]=P=>l.value=P),placeholder:u(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),n("div",jt,[(I(!0),L(qe,null,Oe(de.value,P=>(I(),L("div",{key:P.provider,class:"model-group"},[n("div",{class:"model-group-header",onClick:j=>ne(P.provider)},[(I(),L("svg",{class:re(["model-group-arrow",{collapsed:p(P.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...h[5]||(h[5]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),n("span",Kt,b(P.label),1),n("span",Vt,b(P.models.length),1)],8,Gt),Qe(n("div",$t,[(I(!0),L(qe,null,Oe(P.models,j=>(I(),L("div",{key:j,class:re(["model-item",{active:j===u(a).selectedModel&&P.provider===u(a).selectedProvider,disabled:!!P.model_meta?.[j]?.disabled}]),title:P.model_meta?.[j]?.disabled?u(e)("models.disabledTooltip"):"",onClick:ye=>H(j,P.provider)},[n("span",Jt,[n("span",Zt,b($(j,P.provider)),1),Q(j,P.provider)?(I(),L("span",Yt,b(u(e)("models.aliasCanonical",{model:j})),1)):he("",!0)]),P.model_meta?.[j]?.preview?(I(),L("span",Xt,b(u(e)("models.previewBadge")),1)):he("",!0),P.model_meta?.[j]?.disabled?(I(),L("span",en,b(u(e)("models.disabledBadge")),1)):he("",!0),te(j,P.provider)?(I(),L("span",on,b(u(e)("models.customBadge")),1)):he("",!0),te(j,P.provider)?(I(),L("button",{key:3,class:"model-custom-remove",type:"button",title:u(e)("models.removeCustomModel"),onClick:at(ye=>ue(j,P.provider),["stop"])}," × ",8,an)):he("",!0),j===u(a).selectedModel&&P.provider===u(a).selectedProvider?(I(),L("svg",tn,[...h[6]||(h[6]=[n("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):he("",!0)],10,Qt))),128))],512),[[Je,!p(P.provider)]])]))),128)),de.value.length===0?(I(),L("div",nn,b(l.value?"No results":"No models"),1)):he("",!0),n("div",rn,[n("div",sn,[X(u(wa),{value:T.value,"onUpdate:value":h[1]||(h[1]=P=>T.value=P),options:f.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),X(u(zo),{value:g.value,"onUpdate:value":h[2]||(h[2]=P=>g.value=P),placeholder:u(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:ot(U,["enter"])},null,8,["value","placeholder"])]),n("div",ln,b(u(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});_t();Me();var cn=De(dn,[["__scopeId","data-v-72b95fdf"]]),ra,sa,la,Ma,da=be((()=>{ve(),ra=Qa(ht()),sa=["src"],la=["innerHTML"],Ma=Pe({__name:"ProfileAvatar",props:{name:{},avatar:{},size:{default:24}},setup(o){const e=o,a=se(()=>e.name||"default"),i=se(()=>(0,ra.default)(e.avatar?.seed||a.value)),r=se(()=>({width:`${e.size}px`,height:`${e.size}px`,flexBasis:`${e.size}px`}));return(l,d)=>(I(),L("span",{class:"profile-avatar-view",style:et(r.value)},[o.avatar?.type==="image"&&o.avatar.dataUrl?(I(),L("img",{key:0,class:"profile-avatar-image",src:o.avatar.dataUrl,alt:"",draggable:"false"},null,8,sa)):(I(),L("span",{key:1,class:"profile-avatar-svg",innerHTML:i.value},null,8,la))],4))}})})),un=be((()=>{})),so,mn=be((()=>{da(),da(),un(),Me(),so=De(Ma,[["__scopeId","data-v-6a9a551b"]])}));ve();xe();ko();mn();Ce();var pn={class:"profile-selector"},gn={class:"selector-label"},hn={class:"profile-name"},fn={class:"profile-modal-header"},vn={class:"profile-popover-title"},_n={class:"profile-popover-name"},wn={class:"profile-popover-subtitle"},bn={class:"profile-runtime-list"},kn={class:"profile-runtime-main"},yn={class:"profile-runtime-info"},Sn={class:"profile-runtime-name-row"},Pn={class:"profile-runtime-name"},Cn={key:0,class:"active-badge"},An={class:"runtime-status-grid"},Tn={class:"runtime-row compact"},xn={class:"runtime-label"},Hn={class:"runtime-row compact"},In={class:"runtime-label"},Mn={key:0,class:"runtime-detail"},Dn={class:"profile-runtime-actions"},Rn={key:0,class:"avatar-editor"},En={class:"avatar-editor-meta"},Ln={class:"avatar-editor-name"},Fn={class:"avatar-editor-hint"},zn={class:"avatar-editor-actions"},Un=Pe({__name:"ProfileSelector",setup(o){const{t:e}=He(),a=_o(),i=Xe(),r=se(()=>i.activeProfileName??""),l=se(()=>r.value||"default"),d=se(()=>i.profiles.find(V=>V.name===l.value)),g=S([]),T=S(!1),O=S(!1),A=S(!1),f=S(null),B=S(!1),M=S(null),Y=S({}),te=S({}),ue=S({}),J=se(()=>new Map(g.value.map(V=>[V.profile,V])));async function de(){T.value=!0;try{g.value=await wt()}catch{g.value=[]}finally{T.value=!1}}function ne(){O.value=!0,de()}function p(V){f.value=V,A.value=!0}function H(){return`profile-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}async function $(V){if(f.value){B.value=!0;try{await i.updateAvatar(f.value.name,V),a.success(e("profiles.avatar.saveSuccess")),A.value=!1}catch(me){a.error(me?.message||e("profiles.avatar.saveFailed"))}finally{B.value=!1}}}async function Q(){await $({type:"generated",seed:H()})}async function U(){if(f.value){B.value=!0;try{await i.deleteAvatar(f.value.name),a.success(e("profiles.avatar.resetSuccess")),A.value=!1}catch(V){a.error(V?.message||e("profiles.avatar.resetFailed"))}finally{B.value=!1}}}function ke(){M.value?.click()}async function R(V){const me=V.target,k=me.files?.[0];if(me.value="",!!k){if(!["image/png","image/jpeg","image/webp"].includes(k.type)){a.warning(e("profiles.avatar.invalidType"));return}if(k.size>1024*1024){a.warning(e("profiles.avatar.tooLarge"));return}await $({type:"image",dataUrl:await new Promise((pe,So)=>{const ie=new FileReader;ie.onload=()=>pe(String(ie.result||"")),ie.onerror=()=>So(ie.error||new Error("Failed to read file")),ie.readAsDataURL(k)})})}}function h(V){return e(V?"profiles.runtime.running":"profiles.runtime.stopped")}function P(V){return e(V?"profiles.runtime.active":"profiles.runtime.idle")}async function j(V){Y.value={...Y.value,[V]:!0};try{const me=await kt(V);J.value.get(V)&&(g.value=g.value.map(k=>k.profile===V?{...k,gateway:me}:k)),a.success(e("profiles.runtime.gatewayRestarted",{name:V}))}catch(me){a.error(me?.message||e("profiles.runtime.gatewayRestartFailed"))}finally{Y.value={...Y.value,[V]:!1}}}async function ye(V){te.value={...te.value,[V]:!0};try{const me=await yt(V);g.value=g.value.map(k=>k.profile===V?me:k),a.success(e("profiles.runtime.profileRestarted",{name:V}))}catch(me){a.error(me?.message||e("profiles.runtime.profileRestartFailed"))}finally{te.value={...te.value,[V]:!1}}}async function We(V){if(V!==l.value){ue.value={...ue.value,[V]:!0};try{if(!await i.switchProfile(V))throw new Error(e("profiles.switchFailed"));a.success(e("profiles.switchSuccess",{name:V})),window.location.reload()}catch(me){a.error(me?.message||e("profiles.switchFailed"))}finally{ue.value={...ue.value,[V]:!1}}}}return eo(()=>{i.profiles.length===0&&i.fetchProfiles()}),(V,me)=>(I(),L("div",pn,[n("div",gn,b(u(e)("sidebar.profiles")),1),n("div",{class:"profile-display","data-testid":"profile-selector-select",onClick:ne},[X(so,{class:"profile-avatar",name:l.value,avatar:d.value?.avatar,size:24},null,8,["name","avatar"]),n("span",hn,b(l.value),1)]),X(u(Be),{show:O.value,"onUpdate:show":me[0]||(me[0]=k=>O.value=k),preset:"card",bordered:!1,style:{width:"720px",maxWidth:"calc(100vw - 32px)"},class:"profile-manager-modal"},{header:ce(()=>[n("div",fn,[n("div",vn,[n("span",_n,b(u(e)("sidebar.profiles")),1),n("span",wn,b(u(e)("profiles.runtime.activeProfile",{name:l.value})),1)])])]),default:ce(()=>[X(u(ba),{show:T.value,size:"small"},{default:ce(()=>[n("div",bn,[(I(!0),L(qe,null,Oe(u(i).profiles,k=>(I(),L("div",{key:k.name,class:re(["profile-runtime-item",{active:k.name===l.value}])},[n("div",kn,[X(so,{class:"profile-runtime-avatar",name:k.name,avatar:k.avatar,size:34},null,8,["name","avatar"]),n("div",yn,[n("div",Sn,[n("span",Pn,b(k.name),1),k.name===l.value?(I(),L("span",Cn,b(u(e)("profiles.runtime.activeTag")),1)):he("",!0)]),n("div",An,[n("div",Tn,[n("span",xn,b(u(e)("profiles.runtime.bridgeWorker")),1),n("span",{class:re(["runtime-value",{running:J.value.get(k.name)?.bridge.running}])},[me[2]||(me[2]=n("span",{class:"runtime-dot"},null,-1)),we(" "+b(P(J.value.get(k.name)?.bridge.running)),1)],2)]),n("div",Hn,[n("span",In,b(u(e)("profiles.runtime.gateway")),1),n("span",{class:re(["runtime-value",{running:J.value.get(k.name)?.gateway.running}])},[me[3]||(me[3]=n("span",{class:"runtime-dot"},null,-1)),we(" "+b(h(J.value.get(k.name)?.gateway.running)),1)],2)])]),!J.value.get(k.name)?.gateway.running&&(J.value.get(k.name)?.gateway.diagnostics?.reason||J.value.get(k.name)?.gateway.error)?(I(),L("div",Mn,b(J.value.get(k.name)?.gateway.diagnostics?.reason||J.value.get(k.name)?.gateway.error),1)):he("",!0)])]),n("div",Dn,[X(u(Se),{size:"small",type:"primary",onClick:pe=>p(k)},{default:ce(()=>[we(b(u(e)("profiles.avatar.customize")),1)]),_:1},8,["onClick"]),X(u(Se),{size:"small",type:"primary",loading:Y.value[k.name],onClick:pe=>j(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.restartGateway")),1)]),_:1},8,["loading","onClick"]),X(u(Se),{size:"small",type:"primary",loading:te.value[k.name],onClick:pe=>ye(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.restartProfile")),1)]),_:1},8,["loading","onClick"]),X(u(Se),{size:"small",type:"primary",disabled:k.name===l.value,loading:ue.value[k.name],onClick:pe=>We(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.switchProfile")),1)]),_:1},8,["disabled","loading","onClick"])])],2))),128))])]),_:1},8,["show"])]),_:1},8,["show"]),X(u(Be),{show:A.value,"onUpdate:show":me[1]||(me[1]=k=>A.value=k),preset:"card",title:u(e)("profiles.avatar.title"),bordered:!1,style:{width:"420px",maxWidth:"calc(100vw - 32px)"}},{default:ce(()=>[f.value?(I(),L("div",Rn,[X(so,{name:f.value.name,avatar:f.value.avatar,size:72},null,8,["name","avatar"]),n("div",En,[n("div",Ln,b(f.value.name),1),n("div",Fn,b(u(e)("profiles.avatar.hint")),1)]),n("input",{ref_key:"fileInputRef",ref:M,class:"avatar-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:R},null,544),n("div",zn,[X(u(Se),{type:"primary",loading:B.value,onClick:ke},{default:ce(()=>[we(b(u(e)("profiles.avatar.upload")),1)]),_:1},8,["loading"]),X(u(Se),{type:"primary",loading:B.value,onClick:Q},{default:ce(()=>[we(b(u(e)("profiles.avatar.random")),1)]),_:1},8,["loading"]),X(u(Se),{loading:B.value,onClick:U},{default:ce(()=>[we(b(u(e)("profiles.avatar.reset")),1)]),_:1},8,["loading"])])])):he("",!0)]),_:1},8,["show","title"])]))}});Me();var Nn=De(Un,[["__scopeId","data-v-6d14c2f6"]]);ve();Ce();xe();var qn=Pe({__name:"LanguageSwitch",setup(o){const{locale:e}=He(),a=[{label:"简体中文",value:"zh"},{label:"繁體中文",value:"zh-TW"},{label:"English",value:"en"},{label:"日本語",value:"ja"},{label:"한국어",value:"ko"},{label:"Français",value:"fr"},{label:"Español",value:"es"},{label:"Deutsch",value:"de"},{label:"Português",value:"pt"}];function i(r){Et(r),localStorage.setItem("hermes_locale",r)}return(r,l)=>(I(),Le(u(wa),{value:u(e),options:a,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":i},null,8,["value"]))}}),Bn=qn;ve();var On={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},Wn=["title"],jn={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Gn={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Kn=["title"],Vn={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},$n={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Qn=Pe({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:a,toggleBrightness:i,toggleStyle:r}=Ha();return(l,d)=>(I(),L("div",On,[n("button",{class:"theme-switch",title:u(a)?"Ink style":"Comic style",onClick:d[0]||(d[0]=(...g)=>u(r)&&u(r)(...g))},[u(a)?(I(),L("svg",jn,[...d[2]||(d[2]=[n("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(I(),L("svg",Gn,[...d[3]||(d[3]=[n("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,Wn),n("button",{class:"theme-switch",title:u(e)?"Light mode":"Dark mode",onClick:d[1]||(d[1]=(...g)=>u(i)&&u(i)(...g))},[u(e)?(I(),L("svg",Vn,[...d[4]||(d[4]=[ze('<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(),L("svg",$n,[...d[5]||(d[5]=[n("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,Kn)]))}});Me();var Jn=De(Qn,[["__scopeId","data-v-4c30f4bd"]]);ve();var Ro=S(!1);function $o(){function o(){Ro.value=!0}function e(){Ro.value=!1}return{sessionSearchOpen:Ro,openSessionSearch:o,closeSessionSearch:e}}var Zn=[{version:"0.6.0",date:"2026-05-24",changes:["changelog.new_0_6_0_1","changelog.new_0_6_0_2","changelog.new_0_6_0_3","changelog.new_0_6_0_4","changelog.new_0_6_0_5","changelog.new_0_6_0_6","changelog.new_0_6_0_7","changelog.new_0_6_0_8"]},{version:"0.5.35",date:"2026-05-23",changes:["changelog.new_0_5_35_1","changelog.new_0_5_35_2","changelog.new_0_5_35_3","changelog.new_0_5_35_4","changelog.new_0_5_35_5","changelog.new_0_5_35_6","changelog.new_0_5_35_7","changelog.new_0_5_35_8"]},{version:"0.5.34",date:"2026-05-22",changes:["changelog.new_0_5_34_1","changelog.new_0_5_34_2","changelog.new_0_5_34_3","changelog.new_0_5_34_4","changelog.new_0_5_34_5","changelog.new_0_5_34_6","changelog.new_0_5_34_7","changelog.new_0_5_34_8"]},{version:"0.5.33",date:"2026-05-21",changes:["changelog.new_0_5_33_1","changelog.new_0_5_33_2","changelog.new_0_5_33_3","changelog.new_0_5_33_4","changelog.new_0_5_33_5","changelog.new_0_5_33_6","changelog.new_0_5_33_7"]},{version:"0.5.32",date:"2026-05-20",changes:["changelog.new_0_5_31_1","changelog.new_0_5_31_2","changelog.new_0_5_31_3","changelog.new_0_5_31_4","changelog.new_0_5_31_5","changelog.new_0_5_31_6"]},{version:"0.5.30",date:"2026-05-19",changes:["changelog.new_0_5_30_1","changelog.new_0_5_30_2","changelog.new_0_5_30_3","changelog.new_0_5_30_4","changelog.new_0_5_30_5","changelog.new_0_5_30_6","changelog.new_0_5_30_7","changelog.new_0_5_30_8","changelog.new_0_5_30_9"]},{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"]}];ve();Ce();xe();bo();var Yn=["title"],Xn={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ei={key:0,points:"9 18 15 12 9 6"},oi={key:1,points:"15 18 9 12 15 6"},ai={class:"sidebar-nav"},ti={class:"nav-group"},ni={class:"nav-group-items"},ii={class:"nav-item fun-link",href:"https://apikey.fun/register?aff=LIBAPI",target:"_blank",rel:"noopener noreferrer"},ri={class:"nav-group"},si={class:"nav-group-items"},li={class:"nav-group"},di={class:"nav-group-items"},ci={class:"nav-group"},ui={class:"nav-group-items"},mi={class:"sidebar-footer"},pi={class:"status-row"},gi={class:"status-text"},hi={class:"version-info"},fi={class:"changelog-list"},vi={class:"changelog-version-header"},_i={class:"changelog-version-tag"},wi={class:"changelog-date"},bi={class:"changelog-changes"},ki="/logo.png",yi=Pe({__name:"AppSidebar",setup(o){const{t:e}=He(),a=_o(),i=Ko(),r=oo(),l=Ye(),{openSessionSearch:d}=$o(),g=se(()=>i.name==="hermes.session"?"hermes.chat":i.name==="hermes.historySession"?"hermes.history":i.name==="hermes.groupChatRoom"?"hermes.groupChat":i.name),T=se(()=>gt()),O=Ya({});function A(ne){return e(`sidebar.group${ne}${l.sidebarCollapsed?"Short":""}`)}function f(ne){O[ne]=!O[ne]}function B(ne){return!!O[ne]}function M(ne){r.push({name:ne})}async function Y(){await l.doUpdate()?a.success(e("sidebar.updateSuccess"),{duration:5e3}):a.error(e("sidebar.updateFailed"))}function te(){l.reloadClient()}function ue(){localStorage.clear(),r.replace({name:"login"})}const J=S(!1);function de(){J.value=!0}return(ne,p)=>(I(),L("aside",{class:re(["sidebar",{open:u(l).sidebarOpen,collapsed:u(l).sidebarCollapsed}])},[n("div",{class:"sidebar-logo",onClick:p[0]||(p[0]=H=>u(r).push("/hermes/chat"))},[n("img",{src:ki,alt:"Hermes",class:"logo-img"}),p[24]||(p[24]=n("span",{class:"logo-text"},"Hermes",-1))]),n("button",{class:"collapse-btn",onClick:p[1]||(p[1]=H=>u(l).toggleSidebarCollapsed()),title:u(l).sidebarCollapsed?u(e)("sidebar.expand"):u(e)("sidebar.collapse")},[(I(),L("svg",Xn,[u(l).sidebarCollapsed?(I(),L("polyline",ei)):(I(),L("polyline",oi))]))],8,Yn),n("nav",ai,[n("div",ti,[n("div",{class:"nav-group-label",onClick:p[2]||(p[2]=H=>f("conversation"))},[n("span",null,b(A("Conversation")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[25]||(p[25]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",ni,[n("button",{class:re(["nav-item",{active:g.value==="hermes.chat"}]),onClick:p[3]||(p[3]=H=>M("hermes.chat"))},[p[26]||(p[26]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("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)),n("span",null,b(u(e)("sidebar.chat")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.history"}]),onClick:p[4]||(p[4]=H=>M("hermes.history"))},[p[27]||(p[27]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"12",cy:"12",r:"10"}),n("polyline",{points:"12 6 12 12 16 14"})],-1)),n("span",null,b(u(e)("sidebar.history")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.groupChat"}]),onClick:p[5]||(p[5]=H=>M("hermes.groupChat"))},[p[29]||(p[29]=ze('<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-437079c4><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" data-v-437079c4></path><circle cx="9" cy="7" r="4" data-v-437079c4></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" data-v-437079c4></path><path d="M16 3.13a4 4 0 0 1 0 7.75" data-v-437079c4></path></svg>',1)),n("span",null,[we(b(u(e)("sidebar.groupChat")),1),p[28]||(p[28]=n("span",{class:"beta-tag"},"(beta)",-1))])],2),n("button",{class:"nav-item",onClick:p[6]||(p[6]=(...H)=>u(d)&&u(d)(...H))},[p[30]||(p[30]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"11",cy:"11",r:"7"}),n("path",{d:"m20 20-3.5-3.5"})],-1)),n("span",null,b(u(e)("sidebar.search")),1)]),n("a",ii,[p[31]||(p[31]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),n("polyline",{points:"15 3 21 3 21 9"}),n("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)),n("span",null,b(u(e)("sidebar.apiRelay")),1)])],512),[[Je,!B("conversation")]])]),n("div",ri,[n("div",{class:"nav-group-label",onClick:p[7]||(p[7]=H=>f("agent"))},[n("span",null,b(A("Agent")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[32]||(p[32]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",si,[n("button",{class:re(["nav-item",{active:g.value==="hermes.jobs"}]),onClick:p[8]||(p[8]=H=>M("hermes.jobs"))},[p[33]||(p[33]=ze('<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-437079c4><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-437079c4></rect><line x1="16" y1="2" x2="16" y2="6" data-v-437079c4></line><line x1="8" y1="2" x2="8" y2="6" data-v-437079c4></line><line x1="3" y1="10" x2="21" y2="10" data-v-437079c4></line></svg>',1)),n("span",null,b(u(e)("sidebar.jobs")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.kanban"}]),onClick:p[9]||(p[9]=H=>M("hermes.kanban"))},[p[34]||(p[34]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),n("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),n("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),n("span",null,b(u(e)("sidebar.kanban")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.channels"}]),onClick:p[10]||(p[10]=H=>M("hermes.channels"))},[p[35]||(p[35]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),n("span",null,b(u(e)("sidebar.channels")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.skills"}]),onClick:p[11]||(p[11]=H=>M("hermes.skills"))},[p[36]||(p[36]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),n("polyline",{points:"2 17 12 22 22 17"}),n("polyline",{points:"2 12 12 17 22 12"})],-1)),n("span",null,b(u(e)("sidebar.skills")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.plugins"}]),onClick:p[12]||(p[12]=H=>M("hermes.plugins"))},[p[37]||(p[37]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("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"}),n("path",{d:"M5 19l1-1"})],-1)),n("span",null,b(u(e)("sidebar.plugins")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.memory"}]),onClick:p[13]||(p[13]=H=>M("hermes.memory"))},[p[38]||(p[38]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M9 18h6"}),n("path",{d:"M10 22h4"}),n("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),n("span",null,b(u(e)("sidebar.memory")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.models"}]),onClick:p[14]||(p[14]=H=>M("hermes.models"))},[p[39]||(p[39]=ze('<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-437079c4><circle cx="12" cy="12" r="3" data-v-437079c4></circle><path d="M12 1v4" data-v-437079c4></path><path d="M12 19v4" data-v-437079c4></path><path d="M1 12h4" data-v-437079c4></path><path d="M19 12h4" data-v-437079c4></path><path d="M4.22 4.22l2.83 2.83" data-v-437079c4></path><path d="M16.95 16.95l2.83 2.83" data-v-437079c4></path><path d="M4.22 19.78l2.83-2.83" data-v-437079c4></path><path d="M16.95 7.05l2.83-2.83" data-v-437079c4></path></svg>',1)),n("span",null,b(u(e)("sidebar.models")),1)],2)],512),[[Je,!B("agent")]])]),n("div",li,[n("div",{class:"nav-group-label",onClick:p[15]||(p[15]=H=>f("monitoring"))},[n("span",null,b(A("Monitoring")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[40]||(p[40]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",di,[n("button",{class:re(["nav-item",{active:g.value==="hermes.logs"}]),onClick:p[16]||(p[16]=H=>M("hermes.logs"))},[p[41]||(p[41]=ze('<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-437079c4><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-437079c4></path><polyline points="14 2 14 8 20 8" data-v-437079c4></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-437079c4></line><line x1="16" y1="17" x2="8" y2="17" data-v-437079c4></line><polyline points="10 9 9 9 8 9" data-v-437079c4></polyline></svg>',1)),n("span",null,b(u(e)("sidebar.logs")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.usage"}]),onClick:p[17]||(p[17]=H=>M("hermes.usage"))},[p[42]||(p[42]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),n("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),n("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),n("span",null,b(u(e)("sidebar.usage")),1)],2),T.value?(I(),L("button",{key:0,class:re(["nav-item",{active:g.value==="hermes.performance"}]),onClick:p[18]||(p[18]=H=>M("hermes.performance"))},[p[43]||(p[43]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),n("span",null,b(u(e)("sidebar.performance")),1)],2)):he("",!0),n("button",{class:re(["nav-item",{active:g.value==="hermes.skillsUsage"}]),onClick:p[19]||(p[19]=H=>M("hermes.skillsUsage"))},[p[44]||(p[44]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M21.21 15.89A10 10 0 1 1 8.11 2.79"}),n("path",{d:"M22 12A10 10 0 0 0 12 2v10z"})],-1)),n("span",null,b(u(e)("sidebar.skillsUsage")),1)],2)],512),[[Je,!B("monitoring")]])]),n("div",ci,[n("div",{class:"nav-group-label",onClick:p[20]||(p[20]=H=>f("system"))},[n("span",null,b(A("System")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[45]||(p[45]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",ui,[T.value?(I(),L("button",{key:0,class:re(["nav-item",{active:g.value==="hermes.profiles"}]),onClick:p[21]||(p[21]=H=>M("hermes.profiles"))},[p[46]||(p[46]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),n("circle",{cx:"12",cy:"7",r:"4"})],-1)),n("span",null,b(u(e)("sidebar.profiles")),1)],2)):he("",!0),n("button",{class:re(["nav-item",{active:g.value==="hermes.settings"}]),onClick:p[22]||(p[22]=H=>M("hermes.settings"))},[p[47]||(p[47]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"12",cy:"12",r:"3"}),n("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)),n("span",null,b(u(e)("sidebar.settings")),1)],2)],512),[[Je,!B("system")]])])]),X(Nn),X(cn),n("div",mi,[n("button",{class:"nav-item logout-item",onClick:ue},[p[48]||(p[48]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),n("polyline",{points:"16 17 21 12 16 7"}),n("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),n("span",null,b(u(e)("sidebar.logout")),1)]),n("div",pi,[n("div",{class:re(["status-indicator",{connected:u(l).connected,disconnected:!u(l).connected}])},[p[49]||(p[49]=n("span",{class:"status-dot"},null,-1)),n("span",gi,b(u(l).connected?u(e)("sidebar.connected"):u(e)("sidebar.disconnected")),1)],2),X(Bn)]),n("div",hi,[p[50]||(p[50]=ze('<div class="version-links" data-v-437079c4><a class="github-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener noreferrer" title="GitHub" data-v-437079c4><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" data-v-437079c4><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-437079c4></path></svg></a><a class="website-link" href="https://ekkolearnai.com/" target="_blank" rel="noopener noreferrer" title="Website" data-v-437079c4><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-437079c4><circle cx="12" cy="12" r="10" data-v-437079c4></circle><line x1="2" y1="12" x2="22" y2="12" data-v-437079c4></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-437079c4></path></svg></a></div>',1)),n("span",{class:"version-text",onClick:de},"Web UI v"+b(u(l).serverVersion||"0.1.0"),1),X(Jn)]),u(l).clientOutdated?(I(),Le(u(Se),{key:0,type:"warning",size:"tiny",block:"",class:"update-btn",onClick:te},{default:ce(()=>[we(b(u(e)("sidebar.reloadClientVersion",{version:u(l).serverVersion})),1)]),_:1})):he("",!0),u(l).updateAvailable?(I(),Le(u(Se),{key:1,type:"primary",size:"tiny",block:"",class:"update-btn",loading:u(l).updating,onClick:Y},{default:ce(()=>[we(b(u(l).updating?u(e)("sidebar.updating"):u(e)("sidebar.updateVersion",{version:u(l).latestVersion})),1)]),_:1},8,["loading"])):he("",!0)]),X(u(Be),{show:J.value,"onUpdate:show":p[23]||(p[23]=H=>J.value=H),preset:"dialog",title:u(e)("sidebar.changelog"),style:{width:"520px"}},{default:ce(()=>[n("div",fi,[(I(!0),L(qe,null,Oe(u(Zn),H=>(I(),L("div",{key:H.version,class:"changelog-version-block"},[n("div",vi,[n("span",_i,"v"+b(H.version),1),n("span",wi,b(H.date),1)]),n("ul",bi,[(I(!0),L(qe,null,Oe(H.changes,($,Q)=>(I(),L("li",{key:Q},b(u(e)($)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});Me();var Si=De(yi,[["__scopeId","data-v-437079c4"]]);function Pi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onMessageDelta&&a.onMessageDelta(o)}function Ci(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onReasoningDelta&&a.onReasoningDelta(o)}function Ai(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onThinkingDelta&&a.onThinkingDelta(o)}function Ti(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onReasoningAvailable&&a.onReasoningAvailable(o)}function xi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onToolStarted&&a.onToolStarted(o)}function Hi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onToolCompleted&&a.onToolCompleted(o)}function ro(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onSubagentEvent&&a.onSubagentEvent(o)}function Ii(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunStarted&&a.onRunStarted(o)}function Mi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunCompleted&&a.onRunCompleted(o),!(o.queue_remaining>0)&&ae.delete(e)}function Di(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunFailed&&a.onRunFailed(o),!(o.queue_remaining>0)&&ae.delete(e)}function Ri(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunQueued&&a.onRunQueued(o)}function Ei(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onCompressionStarted&&a.onCompressionStarted(o)}function Li(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onCompressionCompleted&&a.onCompressionCompleted(o)}function Fi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onAbortStarted&&a.onAbortStarted(o)}function zi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onAbortCompleted&&a.onAbortCompleted(o),!(o.queue_length>0)&&ae.delete(e)}function Ui(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onUsageUpdated&&a.onUsageUpdated(o)}function Ni(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onSessionCommand&&a.onSessionCommand(o)}function qi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onApprovalRequested&&a.onApprovalRequested(o)}function Bi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onApprovalResolved&&a.onApprovalResolved(o)}function Oi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onPeerUserMessage&&a.onPeerUserMessage(o);for(const i of po)i(o)}function Wi(o,e){return ae.set(o,e),()=>{ae.delete(o)}}function ji(o){ae.delete(o)}function Gi(o){return po.add(o),()=>{po.delete(o)}}function Ki(o,e,a){Qo().emit("approval.respond",{session_id:o,approval_id:e,choice:a})}function ca(){return oe}function Qo(o){const e=o?.trim()||null;if(oe?.connected&&(!e||co===e))return oe;oe&&(oe.removeAllListeners(),oe.disconnect(),lo=!1,co=null);const a=Vo(),i=wo();let r=e||"default";try{if(!e){const{useProfilesStore:l}=(ko(),Ja(bt));r=l().activeProfileName||"default"}}catch{r=e||localStorage.getItem("hermes_active_profile_name")||"default"}return co=r,oe=vt(`${a}/chat-run`,{auth:{token:i},query:{profile:r},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),lo||(oe.on("message.delta",Pi),oe.on("reasoning.delta",Ci),oe.on("thinking.delta",Ai),oe.on("reasoning.available",Ti),oe.on("tool.started",xi),oe.on("tool.completed",Hi),oe.on("subagent.start",ro),oe.on("subagent.tool",ro),oe.on("subagent.progress",ro),oe.on("subagent.complete",ro),oe.on("run.started",Ii),oe.on("run.failed",Di),oe.on("run.completed",Mi),oe.on("run.queued",Ri),oe.on("approval.requested",qi),oe.on("approval.resolved",Bi),oe.on("run.peer_user_message",Oi),oe.on("compression.started",Ei),oe.on("compression.completed",Li),oe.on("abort.started",Fi),oe.on("abort.completed",zi),oe.on("usage.updated",Ui),oe.on("session.command",Ni),lo=!0),oe}function ua(o,e,a){const i=o;if(typeof i.off=="function"){i.off(e,a);return}i.removeListener?.(e,a)}function ma(o,e,a){const i=Qo(a);return i.once("resumed",e),i.emit("resume",{session_id:o,...a?{profile:a}:{}}),i}function Vi(o,e,a,i,r){const l=o.session_id;if(!l)throw new Error("session_id is required for startRunViaSocket");let d=!1;const g=Qo(o.profile),T=f=>{d||(d=!0,ae.delete(l),i(f))};g.once("connect_error",T);const O=f=>{d||f==="io client disconnect"||T(new Error(`Socket disconnected: ${f}`))};g.once("disconnect",O);const A=()=>{ua(g,"connect_error",T),ua(g,"disconnect",O)};return ae.has(l)?(g.emit("run",o),{abort:()=>{d||g.emit("abort",{session_id:l})}}):(ae.set(l,{onMessageDelta:f=>{d||e(f)},onReasoningDelta:f=>{d||e(f)},onThinkingDelta:f=>{d||e(f)},onReasoningAvailable:f=>{d||e(f)},onToolStarted:f=>{d||e(f)},onToolCompleted:f=>{d||e(f)},onSubagentEvent:f=>{d||e(f)},onRunStarted:f=>{d||(e(f),r?.(f.run_id||""))},onRunCompleted:f=>{d||(e(f),!(f.queue_remaining>0)&&(d=!0,A(),a()))},onRunFailed:f=>{d||(e(f),!(f.queue_remaining>0)&&(d=!0,A(),a()))},onCompressionStarted:f=>{d||e(f)},onCompressionCompleted:f=>{d||e(f)},onAbortStarted:f=>{d||e(f)},onAbortCompleted:f=>{d||(e(f),!(f.queue_length>0)&&(d=!0,A(),a()))},onUsageUpdated:f=>{d||e(f)},onSessionCommand:f=>{d||(e(f),f.terminal!==!1&&(d=!0,A(),ae.delete(l),a()))},onRunQueued:f=>{d||e(f)},onApprovalRequested:f=>{d||e(f)},onApprovalResolved:f=>{d||e(f)}}),g.emit("run",o),{abort:()=>{d||g.emit("abort",{session_id:l})}})}var oe,lo,co,ae,po,$i=be((()=>{ft(),Ie(),oe=null,lo=!1,co=null,ae=new Map,po=new Set}));async function Uo(o,e,a){const i=new URLSearchParams;o&&i.set("source",o),e&&i.set("limit",String(e)),a&&i.set("profile",a);const r=i.toString();return(await le(`/api/hermes/sessions${r?`?${r}`:""}`)).sessions}async function ns(o,e,a){const i=new URLSearchParams;o&&i.set("source",o),e&&i.set("limit",String(e)),a&&i.set("profile",a);const r=i.toString();return(await le(`/api/hermes/sessions/hermes${r?`?${r}`:""}`)).sessions}async function pa(o,e,a,i){const r=new URLSearchParams;return r.set("q",o),e&&r.set("source",e),a&&r.set("limit",String(a)),i&&r.set("profile",i),(await le(`/api/hermes/search/sessions?${r.toString()}`)).results}async function Qi(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return(await le(`/api/hermes/sessions/${o}${i?`?${i}`:""}`)).session}catch{return null}}async function is(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return(await le(`/api/hermes/sessions/hermes/${o}${i?`?${i}`:""}`)).session}catch{return null}}async function Ji(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return await le(`/api/hermes/sessions/${o}${i?`?${i}`:""}`,{method:"DELETE"}),!0}catch{return!1}}async function rs(o){try{return await le("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:o})})}catch(e){throw e}}async function ss(o,e){try{return await le(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function ls(o,e){try{return await le(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Zi(o,e,a){try{return await le(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:a})}),!0}catch{return!1}}async function ds(o,e="full",a="json"){const i=Vo(),r=wo(),l=`${i}/api/hermes/sessions/${o}/export?mode=${e}&ext=${a}&token=${encodeURIComponent(r)}`,d=await fetch(l);if(!d.ok)throw new Error("Export failed");const g=await d.blob(),T=d.headers.get("Content-Disposition")||"";let O=`session_${o}.${a}`;const A=T.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);A&&(O=decodeURIComponent(A[1].replace(/"/g,"")));const f=document.createElement("a");f.href=URL.createObjectURL(g),f.download=O,f.click(),URL.revokeObjectURL(f.href)}async function cs(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,a=new URLSearchParams;return a.set("days",String(e)),le(`/api/hermes/usage/stats?${a}`)}async function us(o,e,a){const i=new URLSearchParams;o&&i.set("profile",o),e&&i.set("provider",e),a&&i.set("model",a);const r=i.toString();return(await le(`/api/hermes/sessions/context-length${r?`?${r}`:""}`)).context_length}var Da=be((()=>{Ie()}));function Jo(o,e){const a=Vo();if(o.startsWith("/api/hermes/download?"))try{const d=new URL(o,"http://localhost").searchParams.get("path");d&&(o=d)}catch{}const i=new URLSearchParams({path:decodeURIComponent(o)});if(e){const d=decodeURIComponent(e);i.set("name",d)}const r=ya();r&&i.set("profile",r);const l=wo();return l&&i.set("token",l),`${a}/api/hermes/download?${i.toString()}`}async function ms(o,e){const a=Jo(o,e),i=await fetch(a);if(!i.ok){const g=await i.json().catch(()=>({error:`HTTP ${i.status}`}));throw new Error(g.error||`Download failed: ${i.status}`)}const r=await i.blob(),l=URL.createObjectURL(r),d=document.createElement("a");d.href=l,d.download=e||o.split("/").pop()||"download",document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(l)}async function ps(o,e){const a=Jo(o,e),i=await fetch(a);if(!i.ok){const r=await i.json().catch(()=>({error:`HTTP ${i.status}`}));throw new Error(r.error||`Preview failed: ${i.status}`)}return i.text()}var Yi=be((()=>{Ie()}));async function Xi(o){return le(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function er(o,e,a){await le("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e,...a})})}async function gs(o,e){await le("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function hs(){return le("/api/hermes/weixin/qrcode")}async function fs(o){return le(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function vs(o){await le("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var or=be((()=>{Ie()})),No,ar=be((()=>{ve(),or(),No=ka("settings",()=>{const o=S(!1),e=S(!1),a=S({}),i=S({}),r=S({}),l=S({}),d=S({}),g=S({}),T=S({}),O=S({}),A=S({}),f=S({}),B=S({}),M=S({}),Y=S({}),te=S({}),ue=S({}),J=S({}),de=S({}),ne=S({});async function p(){o.value=!0;try{const Q=await Xi();a.value=Q.display||{},i.value=Q.agent||{},r.value=Q.memory||{},l.value=Q.compression||{},d.value=Q.session_reset||{},g.value=Q.privacy||{},T.value=Q.approvals||{},O.value=Q.telegram||{},A.value=Q.discord||{},f.value=Q.slack||{},B.value=Q.whatsapp||{},M.value=Q.matrix||{},Y.value=Q.wecom||{},te.value=Q.feishu||{},ue.value=Q.dingtalk||{},J.value=Q.qqbot||{},de.value=Q.weixin||{},ne.value=Q.platforms||{}}catch(Q){console.error("Failed to fetch settings:",Q)}finally{o.value=!1}}function H(Q,U){switch(Q){case"display":a.value={...a.value,...U};break;case"agent":i.value={...i.value,...U};break;case"memory":r.value={...r.value,...U};break;case"compression":l.value={...l.value,...U};break;case"session_reset":d.value={...d.value,...U};break;case"privacy":g.value={...g.value,...U};break;case"approvals":T.value={...T.value,...U};break;case"telegram":O.value={...O.value,...U};break;case"discord":A.value={...A.value,...U};break;case"slack":f.value={...f.value,...U};break;case"whatsapp":B.value={...B.value,...U};break;case"matrix":M.value={...M.value,...U};break;case"wecom":Y.value={...Y.value,...U};break;case"feishu":te.value={...te.value,...U};break;case"dingtalk":ue.value={...ue.value,...U};break;case"qqbot":J.value={...J.value,...U};break;case"weixin":de.value={...de.value,...U};break;case"platforms":for(const[ke,R]of Object.entries(U))ne.value={...ne.value,[ke]:{...ne.value[ke]||{},...R}};break}}async function $(Q,U,ke){e.value=!0;try{switch(await er(Q,U,ke),Q){case"display":a.value={...a.value,...U};break;case"agent":i.value={...i.value,...U};break;case"memory":r.value={...r.value,...U};break;case"compression":l.value={...l.value,...U};break;case"session_reset":d.value={...d.value,...U};break;case"privacy":g.value={...g.value,...U};break;case"approvals":T.value={...T.value,...U};break;case"telegram":O.value={...O.value,...U};break;case"discord":A.value={...A.value,...U};break;case"slack":f.value={...f.value,...U};break;case"whatsapp":B.value={...B.value,...U};break;case"matrix":M.value={...M.value,...U};break;case"wechat":case"wecom":Y.value={...Y.value,...U};break;case"feishu":te.value={...te.value,...U};break;case"dingtalk":ue.value={...ue.value,...U};break;case"qqbot":J.value={...J.value,...U};break;case"weixin":de.value={...de.value,...U};break;case"platforms":for(const[R,h]of Object.entries(U))ne.value={...ne.value,[R]:{...ne.value[R]||{},...h}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:a,agent:i,memory:r,compression:l,sessionReset:d,privacy:g,approvals:T,telegram:O,discord:A,slack:f,whatsapp:B,matrix:M,wecom:Y,feishu:te,dingtalk:ue,qqbot:J,weixin:de,platforms:ne,fetchSettings:p,saveSection:$,updateLocal:H}})}));function Ra(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(uo||(uo=new o),uo):null}function tr(){const o=Ra();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function nr(){const o=Ra();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,a=.16,i=o.createOscillator(),r=o.createGain();return i.type="sine",i.frequency.setValueAtTime(880,e),i.frequency.exponentialRampToValueAtTime(660,e+a),r.gain.setValueAtTime(1e-4,e),r.gain.exponentialRampToValueAtTime(.18,e+.015),r.gain.exponentialRampToValueAtTime(1e-4,e+a),i.connect(r),r.connect(o.destination),i.start(e),i.stop(e+a),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var uo,ir=be((()=>{uo=null}));function qo(o){const e=[];let a=o.replace(Ea,i=>(e.push(i),`${go}${e.length-1}${ho}`));return a=a.replace(La,i=>(e.push(i),`${go}${e.length-1}${ho}`)),{masked:a,blocks:e}}function Eo(o,e){if(e.length===0)return o;const a=new RegExp(`${go}(\\d+)${ho}`,"g");let i=o;for(let r=0;r<e.length;r+=1){const l=i.replace(a,(d,g)=>e[Number(g)]??"");if(l===i)break;i=l}return i}function _s(o,e){const{masked:a,blocks:i}=qo(o),r=[];let l=null,d="",g=0;Bo.lastIndex=0;let T;for(;(T=Bo.exec(a))!==null;)d+=a.slice(g,T.index),r.push(T[2]),g=T.index+T[0].length;const O=a.slice(g),A=O.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return A?(d+=O.slice(0,A.index),e.streaming?l=A[2]:d+=O.slice(A.index)):d+=O,{segments:r.map(f=>Eo(f,i)),pending:l===null?null:Eo(l,i),body:Eo(d,i),hasThinking:r.length>0||l!==null}}function ws(o){const e=a=>[...a].length;return o.segments.reduce((a,i)=>a+e(i),0)+e(o.pending||"")}function rr(o,e){const a=qo(o).masked,i=qo(e).masked;return{startedAtBoundary:!Oo.test(a)&&Oo.test(i),endedAtBoundary:!Wo.test(a)&&Wo.test(i)}}var Bo,go,ho,Ea,La,Oo,Wo,sr=be((()=>{Bo=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,go="\0THKCODE",ho="\0",Ea=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,La=/`[^`\n]*`/g,Oo=/<(think|thinking|reasoning)>/i,Wo=/<\/(think|thinking|reasoning)>/i}));function fe(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Lo(o){if(typeof o!="string"||!o.trim())return!1;try{const e=JSON.parse(o);if(e&&typeof e=="object"){const a=e;if(a.success===!1||a.error!=null&&String(a.error).trim()!=="")return!0}}catch{return!1}return!1}async function lr(o){if(o.length===0)return[];const e=new FormData;for(const d of o)d.file&&e.append("file",d.file,d.name);const a=localStorage.getItem("hermes_api_key")||"",i=ya(),r={};a&&(r.Authorization=`Bearer ${a}`),i&&(r["X-Hermes-Profile"]=i);const l=await fetch("/upload",{method:"POST",body:e,headers:r});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return(await l.json()).files}async function dr(o,e,a){const i=[];if(o.trim()&&i.push({type:"text",text:o.trim()}),e&&e.length>0&&a)for(let r=0;r<a.length;r++){const l=a[r],d=e[r];d?.type.startsWith("image/")?i.push({type:"image",name:l.name,path:l.path,media_type:d.type}):i.push({type:"file",name:l.name,path:l.path,media_type:d?.type})}return i}function Fo(o){const e=o.filter(l=>l.role==="assistant"?(l.tool_calls?.length||0)>0||l.content&&l.content.trim()!=="":!0),a=new Map,i=new Map;for(const l of e)if(l.role==="assistant"&&l.tool_calls)for(const d of l.tool_calls)d.id&&(d.function?.name&&a.set(d.id,d.function.name),d.function?.arguments&&i.set(d.id,d.function.arguments));const r=[];for(const l of e){if(l.role==="assistant"&&l.tool_calls?.length&&!l.content?.trim()){for(const d of l.tool_calls)r.push({id:String(l.id)+"_"+d.id,role:"tool",content:"",timestamp:Math.round(l.timestamp*1e3),toolName:d.function?.name||void 0,toolCallId:d.id,toolArgs:d.function?.arguments||void 0,toolStatus:"done"});continue}if(l.role==="tool"){const d=l.tool_call_id||"",g=l.tool_name||a.get(d)||void 0,T=i.get(d)||void 0;let O="";if(l.content)try{const f=JSON.parse(l.content);O=f.url||f.title||f.preview||f.summary||""}catch{O=l.content.slice(0,80)}const A=r.findIndex(f=>f.role==="tool"&&f.toolName===g&&!f.toolResult&&f.id.includes("_"+d));A!==-1&&r.splice(A,1),r.push({id:String(l.id),role:"tool",content:"",timestamp:Math.round(l.timestamp*1e3),toolName:g,toolCallId:d||void 0,toolArgs:T,toolPreview:typeof O=="string"&&O.slice(0,100)||void 0,toolResult:l.content||void 0,toolStatus:"done"});continue}r.push({id:String(l.id),role:l.role,content:l.content||"",timestamp:Math.round(l.timestamp*1e3),reasoning:l.reasoning?l.reasoning:void 0,systemType:l.role==="command"?"command":void 0})}return r}function cr(o){return{id:o.id,profile:o.profile||"default",title:o.title||"",source:o.source||void 0,messages:[],createdAt:Math.round(o.started_at*1e3),updatedAt:Math.round((o.last_active||o.ended_at||o.started_at)*1e3),model:o.model,provider:o.provider||o.billing_provider||"",messageCount:o.message_count,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 Fa(){try{return Xe().activeProfileName||"default"}catch{return"default"}}function mo(){return za+Fa()}function ga(){return Fa()==="default"?fo:null}function ur(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function mr(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let a=0;a<localStorage.length;a++){const i=localStorage.key(a);i&&(i===mo()||i===fo||o.some(r=>i.startsWith(r))&&e.push(i))}e.forEach(a=>jo(a)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function pr(o,e){try{localStorage.setItem(o,e);return}catch(a){if(!ur(a))return}mr();try{localStorage.setItem(o,e)}catch{}}function ha(o){try{return localStorage.getItem(o)}catch{return null}}function jo(o){try{localStorage.removeItem(o)}catch{}}var za,fo,Zo,Ua=be((()=>{$i(),Da(),Ie(),Yi(),Go(),ve(),bo(),ko(),ar(),ir(),sr(),za="hermes_active_session_",fo="hermes_active_session",Zo=ka("chat",()=>{const o=S([]),e=S(null),a=S(null),i=S(new Map),r=S(new Set),l=S(null),d=S(new Map),g=S(new Map),T=S(new Map),O=se(()=>{const t=e.value;return t&&T.value.get(t)||null}),A=S(!1);function f(t){A.value=t}const B=se(()=>{const t=e.value;return t==null?!1:i.value.has(t)||r.value.has(t)}),M=S(!1),Y=S(!1),te=S(!1),ue=se(()=>B.value),J=S(null);function de(t){J.value=t}const ne=S(null),p=se(()=>ne.value?.aborting===!0);function H(t){ne.value=t}const $=S(null),Q=se(()=>$.value?.messages||[]);function U(t){return i.value.has(t)||r.value.has(t)}function ke(){e.value=null,$.value=null,a.value=null,H(null),de(null),jo(mo())}async function R(t,s){M.value=!0;try{const c=(await Uo(void 0,void 0,t||void 0)).map(cr),v=new Map(o.value.map(K=>[K.id,K.messages]));for(const K of c){const w=v.get(K.id);w&&w.length&&(K.messages=w)}o.value=c;const y=e.value,C=ga(),G=ha(mo())||(C?ha(fo):null),Z=s&&o.value.some(K=>K.id===s)?s:y&&o.value.some(K=>K.id===y)?y:G&&o.value.some(K=>K.id===G)?G:o.value[0]?.id;Z?await ye(Z):ke()}catch(c){console.error("Failed to load sessions:",c)}finally{M.value=!1,Y.value=!0}}async function h(){const t=e.value;if(!t)return!1;try{const s=await Qi(t,$.value?.profile);if(!s)return!1;const c=o.value.find(v=>v.id===t);return c?(c.messages=Fo(s.messages||[]),s.title&&(c.title=s.title),!0):!1}catch(s){return console.error("Failed to refresh active session:",s),!1}}function P(t={}){const s={id:fe(),profile:t.profile||Xe().activeProfileName||"default",title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now(),model:t.model||void 0,provider:t.provider||""};return o.value.unshift(s),s}function j(){const t=new Date,s={id:`${[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0"),"_",String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(s),s}async function ye(t,s){na(t),e.value=t,a.value=s??null,pr(mo(),t);const c=ga();if(c&&jo(c),$.value=o.value.find(v=>v.id===t)||null,!!$.value){te.value=!0;try{await new Promise((v,y)=>{const C=setTimeout(()=>y(new Error("resume timeout")),15e3);ma(t,G=>{if(clearTimeout(C),G.session_id!==t||e.value!==t){v();return}const Z=o.value.find(K=>K.id===t);if(!Z){v();return}if(G.isWorking?r.value.add(t):r.value.delete(t),G.queueLength&&G.queueLength>0?d.value.set(t,G.queueLength):d.value.delete(t),Array.isArray(G.queueMessages)?Ao(t,ea(G.queueMessages)):G.queueLength||Ao(t,[]),G.isAborting?H({aborting:!0,synced:null}):G.isWorking||H(null),G.inputTokens!=null&&(Z.inputTokens=G.inputTokens),G.outputTokens!=null&&(Z.outputTokens=G.outputTokens),G.contextTokens!=null&&(Z.contextTokens=G.contextTokens),G.messages?.length&&(Z.messages=Fo(G.messages)),!Z.title){const K=Z.messages.find(w=>w.role==="user");K&&(Z.title=K.content.slice(0,40)+(K.content.length>40?"...":""))}if($.value=Z,G.events?.length)for(const K of G.events){const w=K.data;if(w.event==="compression.started")de({compressing:!0,messageCount:w.message_count||0,beforeTokens:w.token_count||0,afterTokens:0,compressed:null});else if(w.event==="compression.completed"){const m=w.contextTokens||w.afterTokens||0;de({compressing:!1,messageCount:w.totalMessages||0,beforeTokens:w.beforeTokens||0,afterTokens:m,compressed:w.compressed??!1,error:w.error}),w.contextTokens!=null&&(Z.contextTokens=w.contextTokens)}else if(w.event==="abort.started")H({aborting:!0,synced:null});else if(w.event==="abort.completed")H({aborting:!1,synced:w.synced??!1});else if(w.event==="approval.requested")To({...w,session_id:t});else if(w.event==="approval.resolved")xo({...w,session_id:t});else if(w.event==="run.failed")to(t,w.error),r.value.delete(t),d.value.delete(t);else if(w.event==="tool.started"){const m=k(t),z=w.tool_call_id,E=z?m.find(x=>x.role==="tool"&&x.toolCallId===z):null;E?ie(t,E.id,{toolName:w.tool||w.name,toolArgs:typeof w.arguments=="string"?w.arguments:E.toolArgs,toolPreview:w.preview||E.toolPreview,toolStatus:E.toolStatus||"running"}):pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:w.tool||w.name,toolCallId:z,toolPreview:w.preview,toolArgs:typeof w.arguments=="string"?w.arguments:void 0,toolStatus:"running"})}else if(w.event==="tool.completed"){const m=k(t),z=w.tool_call_id,E=z?m.filter(x=>x.role==="tool"&&x.toolCallId===z):m.filter(x=>x.role==="tool"&&x.toolStatus==="running");if(E.length>0){const x=typeof w.output=="string"?w.output:void 0;ie(t,E[E.length-1].id,{toolStatus:w.error===!0||Lo(x)?"error":"done",toolDuration:w.duration,toolResult:x})}}else String(w.event||"").startsWith("subagent.")&&Po(t,w)}v()},$.value?.profile)})}catch(v){console.error("Failed to load session messages via resume:",v)}finally{te.value=!1}e.value===t&&je(t)}}function We(t={}){const s=Ye(),c=P({profile:t.profile,model:t.model||s.selectedModel||void 0,provider:t.provider||s.selectedProvider||""});return ye(c.id),c}async function V(t,s,c){const v=c||$.value?.id;if(!v||!await Zi(v,t,s||""))return!1;const y=o.value.find(C=>C.id===v);return y&&(y.model=t,y.provider=s||""),$.value?.id===v&&($.value.model=t,$.value.provider=s||""),!0}async function me(t){await Ji(t,o.value.find(s=>s.id===t)?.profile),o.value=o.value.filter(s=>s.id!==t),e.value===t&&(o.value.length>0?await ye(o.value[0].id):ye(P().id))}function k(t){return o.value.find(s=>s.id===t)?.messages||[]}function pe(t,s){const c=o.value.find(v=>v.id===t);c&&c.messages.push(s)}function So(t){const s=o.value.findIndex(c=>c.id===t.id);s!==-1?o.value[s]=t:o.value.push(t)}function ie(t,s,c){const v=o.value.find(C=>C.id===t);if(!v)return;const y=v.messages.findIndex(C=>C.id===s);y!==-1&&(v.messages[y]={...v.messages[y],...c})}function Po(t,s){const c=String(s.event||"");if(!c.startsWith("subagent."))return;const v=String(s.subagent_id||`${s.task_index??0}`),y=`subagent:${s.run_id||"run"}:${v}`,C=Number(s.task_index??0),G=Number(s.task_count??1),Z=`${C+1}/${Math.max(1,G||1)}`,K=String(s.tool||s.name||""),w=Number(s.tool_count||0),m=String(s.goal||"").trim(),z=String(s.text||s.preview||"").trim(),E=String(s.summary||"").trim(),x=Number(s.duration_seconds??s.duration);let F=z||E||m;c==="subagent.start"?F=`subagent ${Z} started${m?`: ${m}`:""}`:c==="subagent.tool"?F=`${`subagent ${Z}${w?` turn ${w}`:""}`}${K?`: ${K}`:""}${z?` - ${z}`:""}`:c==="subagent.progress"?F=`subagent ${Z}: ${z||"working"}`:c==="subagent.complete"&&(F=`subagent ${Z} ${String(s.status||"completed")}${E?`: ${E}`:""}`);const ee=k(t).find(no=>no.role==="tool"&&no.toolCallId===y),ge=c==="subagent.complete"?s.status&&String(s.status)!=="completed"?"error":"done":"running",Te={toolName:"delegate_task",toolCallId:y,toolPreview:F.slice(0,220),toolStatus:ge,toolDuration:Number.isFinite(x)?x:void 0,toolResult:c==="subagent.complete"?JSON.stringify({status:s.status||"completed",summary:E||z,api_calls:s.api_calls,input_tokens:s.input_tokens,output_tokens:s.output_tokens},null,2):void 0};if(ee){ie(t,ee.id,Te);return}pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),...Te})}function to(t,s){const c=s?`Error: ${s}`:"Run failed",v=k(t),y=v[v.length-1];if(y?.isStreaming){ie(t,y.id,{role:"assistant",content:c,isStreaming:!1,systemType:"error"});return}y?.role==="assistant"&&y.systemType==="error"&&y.content===c||pe(t,{id:fe(),role:"assistant",content:c,timestamp:Date.now(),systemType:"error"})}function Xo(t){const s=t.session_id;if(!s)return;const c=o.value.find(C=>C.id===s),v=t.action;if(v==="clear"){if(c&&(c.messages=[]),g.value.delete(s),d.value.delete(s),t.clearHistory){const C=String(t.message||"");C&&pe(s,{id:fe(),role:"command",content:C,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}return}v==="title"&&c&&typeof t.title=="string"&&(c.title=t.title,c.updatedAt=Date.now()),v==="usage"&&c&&(c.inputTokens=t.inputTokens,c.outputTokens=t.outputTokens,t.contextTokens!=null&&(c.contextTokens=t.contextTokens)),v==="destroy"&&(i.value.delete(s),r.value.delete(s),d.value.delete(s),g.value.delete(s),H(null),k(s).forEach(C=>{C.isStreaming&&ie(s,C.id,{isStreaming:!1}),C.role==="tool"&&C.toolStatus==="running"&&(C.toolStatus="error")}));const y=String(t.message||"");y&&pe(s,{id:fe(),role:"command",content:y,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}function Co(t,s){const c=g.value.get(t)||[];if(c.some(y=>y.id===s.id))return;const v=new Map(g.value);v.set(t,[...c,{...s,queued:!0}]),g.value=v}function Na(t,s){const c=g.value.get(t);if(!c?.length)return;const v=c.filter(C=>C.id!==s),y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y,d.value.set(t,v.length),ca()?.emit("cancel_queued_run",{session_id:t,queue_id:s})}function ea(t){return Array.isArray(t)?t.flatMap(s=>{const c=s,v=typeof c?.content=="string"?c.content:"",y=c?.id!=null?String(c.id):"";return!y||!v.trim()?[]:[{id:y,role:"user",content:v,timestamp:typeof c?.timestamp=="number"&&Number.isFinite(c.timestamp)?Math.round(c.timestamp*1e3):Date.now(),queued:!0}]}):[]}function Ao(t,s){const c=new Map((g.value.get(t)||[]).map(C=>[C.id,C])),v=s.map(C=>({...c.get(C.id)||{},...C,attachments:c.get(C.id)?.attachments||C.attachments,queued:!0})),y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y}function oa(t,s){const c=Number(s.queue_length||0);if(c>0?d.value.set(t,c):d.value.delete(t),Array.isArray(s.queued_messages)&&!s.dequeued_queue_id){Ao(t,ea(s.queued_messages));return}const v=s.message,y=typeof v?.content=="string"?v.content:"",C=v?.id!=null?String(v.id):"";if(!C||!y.trim()||(g.value.get(t)||[]).some(m=>m.id===C))return;const G=typeof v?.timestamp=="number"&&Number.isFinite(v.timestamp)?Math.round(v.timestamp*1e3):Date.now(),Z=k(t),K=Z.findIndex(m=>m.id===C&&m.role==="user"),w=K>=0?Z[K]:null;K>=0&&Z.splice(K,1),Co(t,{...w||{},id:C,role:"user",content:y,timestamp:w?.timestamp||G,attachments:w?.attachments,queued:!0})}function To(t){const s=t.session_id,c=t.approval_id;if(!s||!c)return;const v=(Array.isArray(t.choices)?t.choices:["once","session","deny"]).filter(y=>y==="once"||y==="session"||y==="always"||y==="deny");T.value.set(s,{sessionId:s,approvalId:c,command:String(t.command||""),description:String(t.description||""),choices:v.length?v:["once","session","deny"],allowPermanent:!!t.allow_permanent,requestedAt:Date.now()}),T.value=new Map(T.value)}function xo(t){const s=t.session_id;if(!s)return;const c=T.value.get(s);if(!c)return;const v=t.approval_id;v&&c.approvalId!==v||(T.value.delete(s),T.value=new Map(T.value))}function qa(t){const s=O.value;s&&(Ki(s.sessionId,s.approvalId,t),T.value.delete(s.sessionId),T.value=new Map(T.value))}function aa(t){const s=g.value.get(t);if(!s?.length)return;const[c,...v]=s,y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y,pe(t,{...c,queued:!1}),Fe(t)}function Fe(t){const s=o.value.find(c=>c.id===t);if(s){if(!s.title){const c=s.messages.find(v=>v.role==="user");if(c){const v=c.attachments?.length?c.attachments.map(y=>y.name).join(", "):c.content;s.title=v.slice(0,40)+(v.length>40?"...":"")}}s.updatedAt=Date.now()}}function Ba(){No().display.bell_on_complete&&tr()}function ta(){No().display.bell_on_complete&&nr()}async function Oa(t,s){if(!t.trim()&&!(s&&s.length>0))return;Ba(),$.value||ye(P().id);const c=e.value,v=$.value?$.value.messageCount==null||$.value.messageCount===0:!1,y=t.trim().startsWith("/"),C=y&&/^\/compress(?:\s|$)/i.test(t.trim()),G=U(c)&&!y,Z={id:fe(),role:y?"command":"user",content:t.trim(),timestamp:Date.now(),attachments:s&&s.length>0?s:void 0,queued:G,systemType:y?"command":void 0};G||(pe(c,Z),Fe(c));try{let K;if(s&&s.length>0){const _=await lr(s),W=new Map(_.map(D=>[D.name,Jo(D.path,D.name)]));if(G&&Z.attachments)Z.attachments=Z.attachments.map(D=>{const N=W.get(D.name);return N?{...D,url:N}:D});else{const D=k(c).findLast(N=>N.id===Z.id);D?.attachments&&(D.attachments=D.attachments.map(N=>{const q=W.get(N.name);return q?{...N,url:q}:N}))}K=await dr(t,s,_)}else K=t.trim();const w=Ye();await w.waitForModelsForRun();const m=$.value?.model||w.selectedModel,z=$.value?.provider||w.selectedProvider,E={input:K,session_id:c,profile:$.value?.profile||Xe().activeProfileName||void 0,model:v&&m||void 0,provider:v&&z||void 0,model_groups:w.modelGroups.map(_=>({provider:_.provider,models:_.models})),queue_id:Z.id,source:"cli"};v&&$.value&&($.value.messageCount=Math.max($.value.messageCount||0,1)),G&&Co(c,Z);const x=()=>{i.value.delete(c),r.value.delete(c)};let F=!1,ee=!1,ge=null;const Te=()=>{aa(c)},no=()=>{k(c).forEach(_=>{_.role==="assistant"&&_.isStreaming&&ie(c,_.id,{isStreaming:!1})}),ge=null},Va=Vi(E,_=>{switch(_.event){case"run.started":H(null),de(null),F=!1,ee=!1,no(),Te(),_.queue_length>0?d.value.set(c,_.queue_length):d.value.delete(c);break;case"run.queued":oa(c,_);break;case"session.command":Xo(_);break;case"compression.started":de({compressing:!0,messageCount:_.message_count||0,beforeTokens:_.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const W=_.contextTokens||_.afterTokens||0;if(de({compressing:!1,messageCount:_.totalMessages||0,beforeTokens:_.beforeTokens||0,afterTokens:W,compressed:_.compressed??!1,error:_.error}),_.contextTokens!=null){const D=o.value.find(N=>N.id===c);D&&(D.contextTokens=_.contextTokens)}setTimeout(()=>{J.value&&!J.value.compressing&&de(null)},5e3);break}case"abort.started":H({aborting:!0,synced:null});break;case"abort.completed":{if(H({aborting:!1,synced:_.synced??!1}),_.queue_length>0){d.value.set(c,_.queue_length),H(null);break}const W=k(c),D=W[W.length-1];D?.isStreaming&&ie(c,D.id,{isStreaming:!1}),W.forEach((N,q)=>{N.role==="tool"&&N.toolStatus==="running"&&(W[q]={...N,toolStatus:"done"})}),x(),H(null);break}case"reasoning.delta":case"thinking.delta":{const W=_.text||_.delta||"";if(!W)break;F=!0;const D=k(c),N=ge?D.find(q=>q.id===ge):null;if(N?.role==="assistant"&&N.isStreaming)N.reasoning=(N.reasoning||"")+W,Ke(N.id);else{const q=fe();pe(c,{id:q,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:W}),ge=q,Ke(q)}break}case"reasoning.available":{const W=k(c),D=W[W.length-1];D?.role==="assistant"&&D.isStreaming&&Ve(D.id);break}case"message.delta":{_.delta&&(F=!0);const W=k(c),D=ge?W.find(N=>N.id===ge):null;if(D?.role==="assistant"&&D.isStreaming){const N=D.content,q=N+(_.delta||"");Ge(D.id,N,q),D.reasoning&&Ve(D.id),D.content=q}else{const N=fe(),q=_.delta||"";Ge(N,"",q),pe(c,{id:N,role:"assistant",content:q,timestamp:Date.now(),isStreaming:!0}),ge=N}break}case"tool.started":{ee=!0;const W=k(c),D=_.tool_call_id,N=ge?W.find(_e=>_e.id===ge):W[W.length-1];N?.isStreaming&&ie(c,N.id,{isStreaming:!1}),ge=null;const q=D?W.find(_e=>_e.role==="tool"&&_e.toolCallId===D):null;if(q){ie(c,q.id,{toolName:_.tool||_.name,toolArgs:typeof _.arguments=="string"?_.arguments:q.toolArgs,toolPreview:_.preview||q.toolPreview,toolStatus:q.toolStatus||"running"});break}pe(c,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:_.tool||_.name,toolCallId:D,toolPreview:_.preview,toolArgs:typeof _.arguments=="string"?_.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{ee=!0;const W=k(c),D=_.tool_call_id,N=D?W.filter(q=>q.role==="tool"&&q.toolCallId===D):W.filter(q=>q.role==="tool"&&q.toolStatus==="running");if(N.length>0){const q=N[N.length-1],_e=typeof _.output=="string"?_.output:void 0,$e=_.error===!0||Lo(_e),$a=_.duration;ie(c,q.id,{toolStatus:$e?"error":"done",toolDuration:$a,toolResult:_e})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":ee=!0,Po(c,_);break;case"approval.requested":To(_);break;case"approval.resolved":xo(_);break;case"run.completed":{const W=k(c),D=ge?W.find(q=>q.id===ge):W[W.length-1];if(D?.isStreaming&&ie(c,D.id,{isStreaming:!1}),_.inputTokens!=null){const q=o.value.find(_e=>_e.id===c);q&&(q.inputTokens=_.inputTokens,q.outputTokens=_.outputTokens,_.contextTokens!=null&&(q.contextTokens=_.contextTokens))}let N="";if(_.parsed_content!==void 0){const q=k(c),_e=ge?q.find($e=>$e.id===ge):[...q].reverse().find($e=>$e.role==="assistant");_e&&(ie(c,_e.id,{content:_.parsed_content||""}),_.parsed_reasoning&&ie(c,_e.id,{reasoning:_.parsed_reasoning}),N=(_.parsed_content||"").trim())}else{const q=typeof _.output=="string"?_.output:"";N=q.trim(),!F&&N!==""&&(pe(c,{id:fe(),role:"assistant",content:q,timestamp:Date.now()}),F=!0)}if(!F&&!ee&&N===""?pe(c,{id:fe(),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()}):ta(),A.value){const q=[...k(c)].reverse().find(_e=>_e.role==="assistant");q?.content&&setTimeout(()=>{Ho(q.id,q.content)},300)}_.queue_remaining>0?d.value.set(c,_.queue_remaining):x(),ge=null,Fe(c);break}case"run.failed":{if(_.inputTokens!=null){const D=o.value.find(N=>N.id===c);D&&(D.inputTokens=_.inputTokens,D.outputTokens=_.outputTokens,_.contextTokens!=null&&(D.contextTokens=_.contextTokens))}to(c,_.error);const W=k(c);W.forEach((D,N)=>{D.role==="tool"&&D.toolStatus==="running"&&(W[N]={...D,toolStatus:"error"})}),_.queue_remaining>0?d.value.set(c,_.queue_remaining):x();break}case"usage.updated":{const W=o.value.find(D=>D.id===c);W&&(W.inputTokens=_.inputTokens,W.outputTokens=_.outputTokens,_.contextTokens!=null&&(W.contextTokens=_.contextTokens));break}}},()=>{const _=k(c),W=_[_.length-1];W?.isStreaming&&ie(c,W.id,{isStreaming:!1}),x(),Fe(c)},_=>{console.warn("Socket.IO run stream error:",_.message),to(c,_.message);const W=k(c);W.forEach((D,N)=>{D.role==="tool"&&D.toolStatus==="running"&&(W[N]={...D,toolStatus:"error"})}),x()},void 0);(!y||C)&&i.value.set(c,Va)}catch(K){pe(c,{id:fe(),role:"system",content:`Error: ${K.message}`,timestamp:Date.now()})}}function je(t,s=!1){if(i.value.has(t)||!s&&!r.value.has(t))return;let c=!1,v=!1,y=!1,C=null;const G=()=>{c||(c=!0,i.value.delete(t),r.value.delete(t),ji(t))},Z=()=>{aa(t)},K=()=>{k(t).forEach(m=>{m.role==="assistant"&&m.isStreaming&&ie(t,m.id,{isStreaming:!1})}),C=null};function w(m){if(!c&&!(m.session_id&&m.session_id!==t))switch(m.event){case"run.queued":oa(t,m);break;case"session.command":Xo(m);break;case"run.started":H(null),de(null),v=!1,y=!1,K(),Z(),m.queue_length>0?d.value.set(t,m.queue_length):d.value.delete(t);break;case"compression.started":de({compressing:!0,messageCount:m.message_count||0,beforeTokens:m.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const z=m.contextTokens||m.afterTokens||0;if(de({compressing:!1,messageCount:m.totalMessages||0,beforeTokens:m.beforeTokens||0,afterTokens:z,compressed:m.compressed??!1,error:m.error}),m.contextTokens!=null){const E=o.value.find(x=>x.id===t);E&&(E.contextTokens=m.contextTokens)}setTimeout(()=>{J.value&&!J.value.compressing&&de(null)},5e3);break}case"abort.started":H({aborting:!0,synced:null});break;case"abort.completed":{if(H({aborting:!1,synced:m.synced??!1}),m.queue_length>0){d.value.set(t,m.queue_length),H(null);break}const z=k(t),E=z[z.length-1];E?.isStreaming&&ie(t,E.id,{isStreaming:!1}),z.forEach((x,F)=>{x.role==="tool"&&x.toolStatus==="running"&&(z[F]={...x,toolStatus:"done"})}),G(),H(null);break}case"reasoning.delta":case"thinking.delta":{const z=m.text||m.delta||"";if(!z)break;v=!0;const E=k(t),x=C?E.find(F=>F.id===C):null;if(x?.role==="assistant"&&x.isStreaming)x.reasoning=(x.reasoning||"")+z,Ke(x.id);else{const F=fe();pe(t,{id:F,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:z}),C=F,Ke(F)}break}case"reasoning.available":{const z=k(t),E=z[z.length-1];E?.role==="assistant"&&E.isStreaming&&Ve(E.id);break}case"message.delta":{m.delta&&(v=!0);const z=k(t),E=C?z.find(x=>x.id===C):null;if(E?.role==="assistant"&&E.isStreaming){const x=E.content,F=x+(m.delta||"");Ge(E.id,x,F),E.reasoning&&Ve(E.id),E.content=F}else{const x=fe(),F=m.delta||"";Ge(x,"",F),pe(t,{id:x,role:"assistant",content:F,timestamp:Date.now(),isStreaming:!0}),C=x}break}case"tool.started":{y=!0;const z=k(t),E=m.tool_call_id,x=C?z.find(ee=>ee.id===C):z[z.length-1];x?.isStreaming&&ie(t,x.id,{isStreaming:!1}),C=null;const F=E?z.find(ee=>ee.role==="tool"&&ee.toolCallId===E):null;if(F){ie(t,F.id,{toolName:m.tool||m.name,toolArgs:typeof m.arguments=="string"?m.arguments:F.toolArgs,toolPreview:m.preview||F.toolPreview,toolStatus:F.toolStatus||"running"});break}pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:m.tool||m.name,toolCallId:E,toolPreview:m.preview,toolArgs:typeof m.arguments=="string"?m.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{y=!0;const z=k(t),E=m.tool_call_id,x=E?z.filter(F=>F.role==="tool"&&F.toolCallId===E):z.filter(F=>F.role==="tool"&&F.toolStatus==="running");if(x.length>0){const F=typeof m.output=="string"?m.output:void 0,ee=m.error===!0||Lo(F);ie(t,x[x.length-1].id,{toolStatus:ee?"error":"done",toolDuration:m.duration,toolResult:F})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":y=!0,Po(t,m);break;case"approval.requested":To(m);break;case"approval.resolved":xo(m);break;case"run.completed":{const z=m.queue_remaining>0;z?d.value.set(t,m.queue_remaining):d.value.delete(t);const E=k(t),x=C?E.find(ee=>ee.id===C):E[E.length-1];if(x?.isStreaming&&ie(t,x.id,{isStreaming:!1}),m.inputTokens!=null){const ee=o.value.find(ge=>ge.id===t);ee&&(ee.inputTokens=m.inputTokens,ee.outputTokens=m.outputTokens,m.contextTokens!=null&&(ee.contextTokens=m.contextTokens))}let F="";if(m.parsed_content!==void 0){const ee=k(t),ge=C?ee.find(Te=>Te.id===C):[...ee].reverse().find(Te=>Te.role==="assistant");ge&&(ie(t,ge.id,{content:m.parsed_content||""}),m.parsed_reasoning&&ie(t,ge.id,{reasoning:m.parsed_reasoning}),F=(m.parsed_content||"").trim())}else{const ee=typeof m.output=="string"?m.output:"";F=ee.trim(),!v&&F!==""&&pe(t,{id:fe(),role:"assistant",content:ee,timestamp:Date.now()})}if(!v&&!y&&F===""?pe(t,{id:fe(),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()}):ta(),A.value){const ee=[...k(t)].reverse().find(ge=>ge.role==="assistant");ee?.content&&setTimeout(()=>{Ho(ee.id,ee.content)},300)}z||G(),C=null,Fe(t);break}case"run.failed":{if(m.inputTokens!=null){const x=o.value.find(F=>F.id===t);x&&(x.inputTokens=m.inputTokens,x.outputTokens=m.outputTokens,m.contextTokens!=null&&(x.contextTokens=m.contextTokens))}const z=m.queue_remaining>0;z?d.value.set(t,m.queue_remaining):d.value.delete(t),to(t,m.error);const E=k(t);E.forEach((x,F)=>{x.role==="tool"&&x.toolStatus==="running"&&(E[F]={...x,toolStatus:"error"})}),z||G();break}case"usage.updated":{const z=o.value.find(E=>E.id===t);z&&(z.inputTokens=m.inputTokens,z.outputTokens=m.outputTokens,m.contextTokens!=null&&(z.contextTokens=m.contextTokens));break}}}Wi(t,{onMessageDelta:m=>w(m),onReasoningDelta:m=>w(m),onThinkingDelta:m=>w(m),onReasoningAvailable:m=>w(m),onToolStarted:m=>w(m),onToolCompleted:m=>w(m),onSubagentEvent:m=>w(m),onRunStarted:m=>w(m),onRunCompleted:m=>w(m),onRunFailed:m=>w(m),onCompressionStarted:m=>w(m),onCompressionCompleted:m=>w(m),onAbortStarted:m=>w(m),onAbortCompleted:m=>w(m),onUsageUpdated:m=>w(m),onSessionCommand:m=>w(m),onRunQueued:m=>w(m)}),i.value.set(t,{abort:()=>{ca()?.emit("abort",{session_id:t})}})}function Wa(t){const s=t.session_id;if(!s||e.value!==s||!$.value)return;const c=t.message,v=typeof c?.content=="string"?c.content:"";if(!v.trim())return;const y=c?.id!=null?String(c.id):"",C=k(s);if(y&&C.some(K=>K.id===y)){r.value.add(s),je(s,!0);return}if(y&&(g.value.get(s)||[]).some(K=>K.id===y)){r.value.add(s),je(s,!0);return}const G=typeof c?.timestamp=="number"&&Number.isFinite(c.timestamp)?Math.round(c.timestamp*1e3):Date.now(),Z={id:y||fe(),role:"user",content:v,timestamp:G,queued:!!c?.queued};c?.queued?Co(s,Z):(pe(s,Z),Fe(s)),r.value.add(s),je(s,!0)}Gi(Wa);function ja(){const t=e.value;if(!t||p.value)return;const s=i.value.get(t);if(s){H({aborting:!0,synced:null}),s.abort();const c=k(t),v=c[c.length-1];v?.isStreaming&&ie(t,v.id,{isStreaming:!1}),window.setTimeout(()=>{e.value===t&&ne.value?.aborting&&(i.value.delete(t),r.value.delete(t),H(null))},2e4)}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&e.value&&!B.value){const t=e.value;t&&!i.value.has(t)&&ma(t,s=>{s.isWorking?r.value.add(t):r.value.delete(t),s.isAborting?H({aborting:!0,synced:null}):s.isWorking||H(null),s.messages?.length&&$.value&&($.value.messages=Fo(s.messages)),je(t)},$.value?.profile)}});const Ae=new Map;function Ga(t){return Ae.get(t)}function Ge(t,s,c){const{startedAtBoundary:v,endedAtBoundary:y}=rr(s,c);if(!v&&!y)return;const C=Ae.get(t)||{};v&&C.startedAt===void 0&&(C.startedAt=Date.now()),y&&C.endedAt===void 0&&(C.endedAt=Date.now()),Ae.set(t,C)}function Ke(t){const s=Ae.get(t)||{};s.startedAt===void 0&&(s.startedAt=Date.now(),Ae.set(t,s))}function Ve(t){const s=Ae.get(t);!s||s.startedAt===void 0||s.endedAt===void 0&&(s.endedAt=Date.now(),Ae.set(t,s))}function Ka(t){if(!t)return;const s=t.toLowerCase();for(const c of o.value)(c.provider||"").toLowerCase()===s&&(c.model=void 0,c.provider="")}function na(t){Ae.clear()}function Ho(t,s){const c=new CustomEvent("auto-play-speech",{detail:{messageId:t,content:s}});window.dispatchEvent(c)}return{sessions:o,activeSessionId:e,activeSession:$,focusMessageId:a,messages:Q,isStreaming:B,isRunActive:ue,isSessionLive:U,sessionProfileFilter:l,compressionState:J,abortState:ne,isAborting:p,queueLengths:d,queuedUserMessages:g,pendingApprovals:T,activePendingApproval:O,removeQueuedMessage:Na,isLoadingSessions:M,sessionsLoaded:Y,isLoadingMessages:te,newChat:We,newCliSession:j,switchSession:ye,switchSessionModel:V,addOrUpdateSession:So,clearProviderFromSessions:Ka,deleteSession:me,sendMessage:Oa,stopStreaming:ja,respondApproval:qa,loadSessions:R,refreshActiveSession:h,getThinkingObservation:Ga,noteThinkingDelta:Ge,noteReasoningStart:Ke,noteReasoningEnd:Ve,clearThinkingObservationFor:na,setAutoPlaySpeech:f,playMessageSpeech:Ho}})}));ve();ao();Ua();function gr(){const o=oo(),e=Zo(),{sessionSearchOpen:a,openSessionSearch:i,closeSessionSearch:r}=$o();function l(d){const g=d.ctrlKey||d.metaKey;if(g&&d.key==="n"){d.preventDefault(),e.newChat();return}if(g&&d.key==="j"){d.preventDefault(),o.push({name:"hermes.jobs"});return}if(g&&d.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;d.preventDefault(),i();return}if(d.key==="Escape"){if(a.value){d.preventDefault(),r();return}const T=document.querySelector(".n-modal-mask");T&&T.querySelector(".n-base-close")?.click()}}eo(()=>{window.addEventListener("keydown",l)}),vo(()=>{window.removeEventListener("keydown",l)})}ve();ao();xe();Ce();Da();Ua();var hr={class:"session-search-modal"},fr={class:"search-header"},vr={class:"search-title"},_r={class:"search-hint"},wr={class:"search-scope"},br={class:"search-body"},kr={key:0,class:"search-empty"},yr={key:1,class:"result-list"},Sr=["onClick","onMouseenter"],Pr={class:"result-main"},Cr={class:"result-title-row"},Ar={class:"result-title"},Tr={class:"result-source"},xr={class:"result-snippet"},Hr={class:"result-meta"},Ir={class:"result-time"},Mr={key:0,class:"result-match"},Dr={class:"search-footer"},Rr=Pe({__name:"SessionSearchModal",setup(o){const{t:e}=He(),a=_o(),i=oo(),r=Zo(),{sessionSearchOpen:l}=$o(),d=S(""),g=S(!1),T=S([]),O=S([]),A=S(0),f=S(null),B=se(()=>r.sessionProfileFilter||void 0);let M=null,Y=0;const te=se(()=>d.value.trim().length>0),ue=se(()=>te.value?O.value:T.value.map(h=>({...h,matched_message_id:null,snippet:h.preview||"",rank:0})));function J(h){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[h]||h}function de(h){return h?new Date(h*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function ne(h){const P=h.title?.trim();return P||(h.preview?.trim()?h.preview.trim():h.id)}async function p(){const h=++Y;g.value=!0;try{const P=B.value?await Uo(void 0,8,B.value):await Uo(void 0,8);if(h!==Y)return;T.value=P,O.value=[],A.value=0}catch(P){if(h!==Y)return;a.error(P instanceof Error?P.message:e("chat.searchFailed"))}finally{h===Y&&(g.value=!1)}}async function H(h){const P=++Y;g.value=!0;try{const j=h.trim()?B.value?await pa(h.trim(),void 0,10,B.value):await pa(h.trim(),void 0,10):[];if(P!==Y)return;O.value=j,A.value=0}catch(j){if(P!==Y)return;a.error(j instanceof Error?j.message:e("chat.searchFailed"))}finally{P===Y&&(g.value=!1)}}async function $(){r.sessions.length===0&&await r.loadSessions(r.sessionProfileFilter)}async function Q(h){const P=h.matched_message_id!=null?String(h.matched_message_id):null;l.value=!1,await $(),!r.sessions.some(j=>j.id===h.id)&&typeof r.addOrUpdateSession=="function"&&r.addOrUpdateSession({id:h.id,profile:h.profile||"default",title:h.title||"",source:h.source,messages:[],createdAt:Math.round(h.started_at*1e3),updatedAt:Math.round((h.last_active||h.ended_at||h.started_at)*1e3),model:h.model,provider:h.provider||h.billing_provider||"",messageCount:h.message_count,endedAt:h.ended_at!=null?Math.round(h.ended_at*1e3):null,lastActiveAt:h.last_active!=null?Math.round(h.last_active*1e3):void 0,workspace:h.workspace||null}),await r.switchSession(h.id,P),i.currentRoute.value.name!=="hermes.chat"&&await i.push({name:"hermes.chat"})}function U(){l.value=!1}function ke(h){const P=ue.value;P.length!==0&&(A.value=(A.value+h+P.length)%P.length)}async function R(h){if(l.value){if(h.key==="ArrowDown"){h.preventDefault(),ke(1);return}if(h.key==="ArrowUp"){h.preventDefault(),ke(-1);return}if(h.key==="Enter"){h.preventDefault();const P=ue.value[A.value];P&&await Q(P);return}h.key==="Escape"&&(h.preventDefault(),U())}}return Re(()=>l.value,async h=>{if(!h){d.value="",O.value=[],T.value=[],A.value=0;return}d.value="",O.value=[],A.value=0,await p(),await it(),f.value?.focus?.()}),Re(d,h=>{M&&(clearTimeout(M),M=null),M=setTimeout(()=>{l.value&&H(h)},160)}),Re(ue,()=>{A.value>=ue.value.length&&(A.value=0)}),eo(()=>{window.addEventListener("keydown",R)}),vo(()=>{window.removeEventListener("keydown",R),M&&clearTimeout(M)}),(h,P)=>(I(),Le(u(Be),{show:u(l),"onUpdate:show":P[1]||(P[1]=j=>Za(l)?l.value=j:null),preset:"card",title:u(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:ce(()=>[n("div",hr,[n("div",fr,[n("div",vr,b(u(e)("chat.searchSubtitle")),1),n("div",_r,b(u(e)("chat.searchHint")),1)]),n("div",wr,b(u(e)("chat.searchScope")),1),X(u(zo),{ref_key:"inputRef",ref:f,value:d.value,"onUpdate:value":P[0]||(P[0]=j=>d.value=j),placeholder:u(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),n("div",br,[X(u(ba),{show:g.value},{default:ce(()=>[ue.value.length===0?(I(),L("div",kr,b(te.value?u(e)("chat.searchNoResults"):u(e)("chat.searchEmpty")),1)):(I(),L("div",yr,[(I(!0),L(qe,null,Oe(ue.value,(j,ye)=>(I(),L("button",{key:j.id,class:re(["result-item",{active:ye===A.value}]),onClick:We=>Q(j),onMouseenter:We=>A.value=ye},[n("div",Pr,[n("div",Cr,[n("span",Ar,b(ne(j)),1),n("span",Tr,b(J(j.source)),1)]),n("div",xr,b(te.value?j.snippet||u(e)("chat.searchNoSnippet"):j.preview||u(e)("chat.searchRecent")),1)]),n("div",Hr,[n("span",Ir,b(de(j.last_active||j.started_at)),1),te.value&&j.matched_message_id!=null?(I(),L("span",Mr," #"+b(j.matched_message_id),1)):he("",!0)])],42,Sr))),128))]))]),_:1},8,["show"])]),n("div",Dr,[n("span",null,b(u(e)("chat.searchEnterHint")),1),X(u(Se),{quaternary:"",size:"small",onClick:U},{default:ce(()=>[we(b(u(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});Me();var Er=De(Rr,[["__scopeId","data-v-971921f4"]]);ve();Ce();xe();var Lr={style:{display:"none"},"aria-hidden":"true"},Fr=Pe({__name:"AuthEventListener",setup(o){const e=_o(),{t:a}=He();let i=0;function r(l){const d=l.detail||{},g=Date.now();if(!(g-i<1200)){if(i=g,d.kind==="forbidden"){e.error(a("login.accessDenied"));return}e.error(a("login.sessionExpired"))}}return eo(()=>{window.addEventListener("hermes-auth-notice",r)}),vo(()=>{window.removeEventListener("hermes-auth-notice",r)}),(l,d)=>(I(),L("span",Lr))}}),zr=Fr;async function bs(){const o=await fetch("/api/auth/status");if(!o.ok)throw new Error("Failed to fetch auth status");return o.json()}async function ks(o,e){const a=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:o,password:e})});if(!a.ok){const i=await a.json().catch(()=>({})),r=new Error(i.error||"Login failed");throw r.status=a.status,r}return(await a.json()).token}async function Ur(){return(await le("/api/auth/me")).user}async function ys(o,e){return le("/api/auth/change-password",{method:"POST",body:JSON.stringify({currentPassword:o,newPassword:e})})}async function Ss(o,e){return le("/api/auth/change-username",{method:"POST",body:JSON.stringify({currentPassword:o,newUsername:e})})}async function Yo(){return le("/api/auth/users")}async function Ps(o){const e=await le("/api/auth/users",{method:"POST",body:JSON.stringify(o)});return{...await Yo(),users:e.users}}async function Cs(o,e){const a=await le(`/api/auth/users/${o}`,{method:"PUT",body:JSON.stringify(e)});return{...await Yo(),users:a.users}}async function As(o){const e=await le(`/api/auth/users/${o}`,{method:"DELETE"});return{...await Yo(),users:e.users}}async function Ts(){return(await le("/api/auth/locked-ips")).locks}async function xs(o){return le(`/api/auth/locked-ips?ip=${encodeURIComponent(o)}`,{method:"DELETE"})}async function Hs(){return(await le("/api/auth/locked-ips",{method:"DELETE"})).count}var Nr=be((()=>{Ie()}));ve();ao();Ce();xe();Nr();Ie();var qr={class:"credential-warning-text"},Br=Pe({__name:"DefaultCredentialPrompt",setup(o){const{t:e}=He(),a=Ko(),i=oo(),r=S(!1),l=S(!1),d=S(""),g=S(null);function T(B){return`hermes_default_credentials_prompt_dismissed_${B}`}async function O(){if(a.name==="login"){r.value=!1;return}const B=wo();if(!(!B||B===d.value)){d.value=B,l.value=!0;try{const M=await Ur();g.value=M.id;const Y=sessionStorage.getItem(T(M.id))==="1";r.value=!!M.requiresCredentialChange&&!Y}catch{r.value=!1}finally{l.value=!1}}}function A(){g.value!=null&&sessionStorage.setItem(T(g.value),"1"),r.value=!1}function f(){r.value=!1,i.push({name:"hermes.settings",query:{tab:"account"}})}return Re(()=>a.fullPath,()=>{O()},{immediate:!0}),(B,M)=>(I(),Le(u(Be),{show:r.value,"onUpdate:show":M[0]||(M[0]=Y=>r.value=Y),preset:"dialog",title:u(e)("login.defaultCredentialTitle"),"mask-closable":!1},{action:ce(()=>[X(u(Se),{disabled:l.value,onClick:A},{default:ce(()=>[we(b(u(e)("login.defaultCredentialLater")),1)]),_:1},8,["disabled"]),X(u(Se),{type:"primary",loading:l.value,onClick:f},{default:ce(()=>[we(b(u(e)("login.defaultCredentialAction")),1)]),_:1},8,["loading"])]),default:ce(()=>[n("p",qr,b(u(e)("login.defaultCredentialMessage")),1)]),_:1},8,["show","title"]))}});Me();var Or=De(Br,[["__scopeId","data-v-1b403be2"]]);ve();ao();xe();Ce();Ia();bo();var Wr={key:0,class:"node-warning-bar"},jr={class:"app-main"},Gr=Pe({__name:"App",setup(o){const{isDark:e,isComic:a}=Ha(),{t:i}=He(),r=Ye(),l=Ko(),d=oo(),g=S(!1),T=se(()=>Nt(e.value,a.value)),O=se(()=>e.value?rt:null),A=se(()=>l.name==="login"),f=se(()=>{const B=r.nodeVersion,M=parseInt(B.split(".")[0],10);return!isNaN(M)&&M<23});return Re(()=>l.path,()=>{r.closeSidebar()}),d.isReady().then(()=>{g.value=!0}),eo(()=>{A.value||(r.loadModels(),r.startHealthPolling())}),vo(()=>{r.stopHealthPolling()}),gr(),(B,M)=>{const Y=Xa("router-view");return I(),Le(u(nt),{theme:O.value,"theme-overrides":T.value},{default:ce(()=>[X(u(tt),null,{default:ce(()=>[X(zr),X(u(dt),null,{default:ce(()=>[X(u(lt),null,{default:ce(()=>[f.value&&g.value?(I(),L("div",Wr,b(u(i)("sidebar.nodeVersionWarning",{version:u(r).nodeVersion})),1)):he("",!0),g.value?(I(),L("div",{key:1,class:re(["app-layout",{"no-sidebar":A.value}])},[A.value?he("",!0):(I(),L("button",{key:0,class:"hamburger-btn",onClick:M[0]||(M[0]=(...te)=>u(r).toggleSidebar&&u(r).toggleSidebar(...te))},[...M[2]||(M[2]=[n("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!A.value&&u(r).sidebarOpen?(I(),L("div",{key:1,class:"mobile-backdrop",onClick:M[1]||(M[1]=(...te)=>u(r).closeSidebar&&u(r).closeSidebar(...te))})):he("",!0),A.value?he("",!0):(I(),Le(Si,{key:2})),n("main",jr,[X(Y)])],2)):he("",!0),X(Er),X(Or)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});Me();var Kr=De(Gr,[["__scopeId","data-v-6415d8d3"]]);ve();Go();var fa=localStorage.getItem("hermes_brightness")||"system",Vr=localStorage.getItem("hermes_style")||"ink",$r=window.matchMedia("(prefers-color-scheme: dark)").matches,Qr=fa==="dark"||fa==="system"&&$r,Jr=Vr==="comic";Qr&&document.documentElement.classList.add("dark");Jr&&document.documentElement.classList.add("comic");var Zr=new URLSearchParams(window.location.search),va=window.location.hash.split("?")[1],_a=Zr.get("token")||(va?new URLSearchParams(va).get("token"):null);_a&&(window.__LOGIN_TOKEN__=_a);var yo=st(Kr);yo.use(ct());yo.use(xa);yo.use(mt);yo.mount("#app");export{rs as A,so as B,fs as C,ps as D,ms as E,ns as F,Lt as G,Ia as H,cs as I,Da as L,ds as M,us as N,Jo as O,is as P,ss as R,or as S,vs as T,Ha as U,mn as V,Ft as W,sr as _,bs as a,No as b,Yo as c,Hs as d,xs as f,ws as g,Zo as h,As as i,Ji as j,Yi as k,Nr as l,Ua as m,Ss as n,Ur as o,Cs as p,Ps as r,Ts as s,ys as t,ks as u,_s as v,gs as w,hs as x,ar as y,ls as z};
|
|
1
|
+
import{a as Qa,i as Ja,n as be}from"./rolldown-runtime-BKwlnUi0.js";import{A as wa,At as Za,Bt as re,Ct as Re,Et as Qe,Ht as b,I as Se,Nt as Ya,Pt as S,Q as qe,S as Be,St as Xa,Tt as ce,Vt as et,W as ve,X as ot,Y as Je,Z as at,_t as vo,at as L,b as tt,bt as Oe,ct as X,gt as eo,it as he,j as nt,l as ba,lt as Pe,mt as it,n as rt,nt as n,ot as ze,q as st,rt as Le,st as we,t as xe,tt as se,v as lt,vt as I,x as dt,y as _o,z as zo,zt as u}from"./ui-vendor-BMwF7QXa.js";import{c as oo,d as Go,l as ct,n as Ce,o as ao,r as He,s as Ko,t as ut,u as ka}from"./vue-vendor-kBYBtqCg.js";import{a as ya,d as le,i as mt,l as Ie,n as Me,o as wo,r as pt,s as Vo,t as De,u as gt}from"./_plugin-vue_export-helper-CHoatqkO.js";import{A as ht,O as ft,k as vt}from"./vendor-CGQjY-CL.js";import{a as _t,c as bo,i as wt,l as Ye,n as bt,o as kt,r as Xe,s as yt,t as ko}from"./profiles-CyjgPK1f.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))i(r);new MutationObserver(r=>{for(const l of r)if(l.type==="childList")for(const d of l.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&i(d)}).observe(document,{childList:!0,subtree:!0});function a(r){const l={};return r.integrity&&(l.integrity=r.integrity),r.referrerPolicy&&(l.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?l.credentials="include":r.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function i(r){if(r.ep)return;r.ep=!0;const l=a(r);fetch(r.href,l)}})();ve();Go();ao();Ie();pt();Ce();var Sa={login:{title:"Hermes Web UI",description:"Enter your username and password to continue.",placeholder:"Access token",submit:"Login",tokenRequired:"Please enter your access token",invalidToken:"Invalid token",connectionFailed:"Cannot connect to server",passwordLogin:"Password",tokenLogin:"Token",usernamePlaceholder:"Username",passwordPlaceholder:"Password",defaultCredentialsHint:"Default username: admin. Default password: 123456.",credentialsRequired:"Please enter username and password",invalidCredentials:"Invalid username or password",tooManyAttempts:"Too many failed attempts, please try again later",sessionExpired:"Login expired. Please sign in again.",accessDenied:"You do not have permission to access this resource.",passwordMismatch:"Passwords do not match",passwordTooShort:"Password must be at least 6 characters",setupSuccess:"Password login configured successfully",passwordChanged:"Password changed successfully",passwordRemoved:"Password login removed",setupPassword:"Set Up Password Login",changePassword:"Change Password",changeUsername:"Change Username",removePasswordLogin:"Remove",username:"Username",currentPassword:"Current Password",newPassword:"New Password",confirmPassword:"Confirm Password",newUsername:"New Username",usernameChanged:"Username changed successfully",usernameTooShort:"Username must be at least 2 characters",setupDescription:"Manage the username and password used to sign in.",removeConfirm:"Password login is required for user accounts.",passwordLoginNotConfigured:"Password login is not configured",passwordLoginConfigured:"Current account: {username}",defaultCredentialTitle:"Change the default account credentials",defaultCredentialMessage:"This account is still using the default username or password. To prevent unauthorized access, update the username and password as soon as possible.",defaultCredentialAction:"Update now",defaultCredentialLater:"Remind me later"},users:{title:"Account Management",description:"Create users, assign roles, and control which profiles regular admins can access.",create:"Create User",edit:"Edit User",username:"Username",role:"Role",statusLabel:"Status",profiles:"Accessible Profiles",profilesPlaceholder:"Select accessible profiles",allProfiles:"All profiles",noProfiles:"No profiles assigned",lastLogin:"Last Login",newPasswordOptional:"New Password (leave blank to keep)",loadFailed:"Failed to load users",deleteConfirm:"Delete this user?",enable:"Enable",disable:"Disable",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Active",disabled:"Disabled"}},common:{loading:"Loading...",cancel:"Cancel",delete:"Delete",edit:"Edit",save:"Save",retry:"Retry",saved:"Saved",update:"Update",create:"Create",saveFailed:"Save failed",deleteFailed:"Delete failed",ok:"OK",copied:"Copied",copy:"Copy",noData:"No data",expired:"Expired",fetch:"Fetch",add:"Add",enable:"Enable",disable:"Disable",configured:"Configured",notConfigured:"Not configured",confirm:"Confirm",expand:"Expand",collapse:"Collapse",start:"Start",stop:"Stop"},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",performance:"Performance",skillsUsage:"Skills Usage",channels:"Channels",gateways:"Gateways",terminal:"Terminal",groupChat:"Group Chat",files:"Files",groupConversation:"Conversation",groupConversationShort:"Conv",groupPlatform:"Platform",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Monitoring",groupMonitoringShort:"Mon",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"},performance:{title:"Performance",subtitle:"Inspect system resources, bridge broker, workers, and active sessions",refresh:"Refresh",autoRefreshOn:"Auto refresh",autoRefreshOff:"Manual refresh",loadFailed:"Failed to load performance metrics",systemCpu:"System CPU",systemMemory:"System Memory",activeSessions:"Active Sessions",runningSessions:"Running {count}",workers:"Workers",totalWorkerMemory:"Worker memory",processes:"Processes",uptime:"Uptime",running:"Running",stopped:"Stopped",workerMemory:"Worker Memory",lastUpdated:"Updated",profile:"Profile",memory:"Memory",sessions:"Sessions",runningActiveSessions:"Running / Active",lastUsed:"Last Used",status:"Status",noWorkers:"No workers",sessionsByProfile:"Sessions by Profile",noActiveSessions:"No active sessions"},drawer:{terminal:"Terminal",files:"Workspace"},chat:{contextRemaining:"remaining",contextClickToEdit:"Click to edit context length",contextEditTitle:"Edit Context Length",contextEditDesc:"Set context length limit for current model (in tokens)",contextEditPlaceholder:"Enter context length",contextEditHint:"Common values: 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",outlineTitle:"Conversation Outline",outlineEmpty:"No conversation content",outlineUserQuestion:"User question",inputPlaceholder:"Type a message... (Enter to send, Shift+Enter for new line)",slashCommandArgs:{message:"<message>",title:"<title>",text:"<text>"},slashCommands:{usage:"Calculate current session usage",status:"Show session status and queue",abort:"Stop the active bridge run",queue:"Queue a message behind the active run",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",allProfiles:"All profiles",profileMissingModelsTip:'Profile "{profile}" has no available provider or model for this session',sessionScopeHint:"Chat shows Web UI/API Server sessions only. CLI, Telegram, Discord, Cron, and other channel sessions are read-only in History.",openHistory:"Open History",hermesHistory:"Hermes History",historyScopeHint:"Read-only Hermes history sessions for the current profile, grouped by source.",noSessions:"No sessions",searchTitle:"Search Sessions",searchSubtitle:"Search by title or message content",searchScope:"Search scope: Web UI local session database only. Read-only Hermes history sessions are not included.",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"Search sessions...",searchEmpty:"Recent sessions",searchRecent:"Recent session",searchNoResults:"No sessions match your search",searchNoSnippet:"No snippet available",searchEnterHint:"Enter to open · Esc to close",searchFailed:"Failed to search sessions",newChat:"New Chat",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",copySessionLink:"Copy Session Link",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",xaiCopyLink:"Copy authorization link",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",currentDefault:"Current default",defaultShort:"Default",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 Hermes Profile",switchConfirm:"This will run `hermes profile use {name}` and change the active Hermes CLI profile. Continue?",switchSuccess:'Hermes active profile switched to "{name}"',switchFailed:"Failed to switch Hermes profile. Gateway may need manual restart.",createSuccess:'Profile "{name}" created',createFailed:"Failed to create profile",renameSuccess:"Profile renamed",renameFailed:"Failed to rename profile",deleteConfirm:'Are you sure you want to delete profile "{name}"?',deleteSuccess:"Profile deleted",deleteFailed:"Failed to delete profile",exportSuccess:"Profile exported",exportFailed:"Failed to export profile",importSuccess:"Profile imported",importFailed:"Failed to import profile",importSelectFile:"Select archive file",importInvalidFile:"Please select a valid archive (.tar.gz, .tgz, .gz, .zip)",name:"Profile Name",namePlaceholder:"Lowercase letters, numbers, hyphens only",nameValidation:"Profile name can only contain lowercase letters, numbers, underscores, and hyphens",newName:"New Name",newNamePlaceholder:"Lowercase letters, numbers, hyphens",cloneFromCurrent:"Clone from current profile",cloneCleanupNotice:"Cloning automatically skips exclusive platform credentials (Weixin / Telegram / Slack, etc.) to avoid conflicts with the source profile",cloneStrippedCredentials:"Stripped {count} exclusive credential(s): {list}",cloneDisabledPlatforms:"Disabled {count} platform(s): {list}",cloneStrippedConfigCredentials:"Stripped {count} embedded credential(s) from config.yaml: {list}",archivePath:"Archive Path",archivePathPlaceholder:"Server path to archive file",importName:"Profile Name (optional)",importNamePlaceholder:"Leave empty to use archive name",active:"Active",model:"Model",gateway:"Gateway",alias:"Alias",provider:"Provider",path:"Path",skills:"Skills",hasEnv:"Has .env",hasSoulMd:"Has soul.md",noProfiles:"No profiles found. Create one to get started.",avatar:{title:"Custom Avatar",customize:"Avatar",upload:"Upload Image",random:"Randomize",reset:"Use Default",hint:"PNG, JPEG, or WebP. Max 1MB.",invalidType:"Please choose a PNG, JPEG, or WebP image",tooLarge:"Avatar image must be 1MB or smaller",saveSuccess:"Avatar saved",saveFailed:"Failed to save avatar",resetSuccess:"Default avatar restored",resetFailed:"Failed to restore default avatar"},runtime:{activeProfile:"Active: {name}",bridgeWorker:"Bridge worker",gateway:"Gateway",active:"Active",activeTag:"Active",idle:"Idle",running:"Running",stopped:"Stopped",restartGateway:"Restart Gateway",restartProfile:"Restart Profile",switchProfile:"Switch Frontend Profile",gatewayRestarted:"Gateway restarted: {name}",gatewayRestartFailed:"Failed to restart gateway",profileRestarted:"Profile restarted: {name}",profileRestartFailed:"Failed to restart profile"}},logs:{title:"Logs",all:"All",searchPlaceholder:"Search...",refresh:"Refresh",noEntries:"No log entries"},settings:{title:"Settings",saved:"Saved",saveFailed:"Save failed",tabs:{display:"Display",account:"Current Account",users:"Account Management",agent:"Agent",memory:"Memory",compression:"Compression",session:"Session",privacy:"Privacy",apiServer:"API Server",models:"Models",voice:"Voice"},models:{apiKey:"API Key",apiKeyPlaceholder:"Enter API key",save:"Save",saved:"Saved",saveFailed:"Save failed",noProviders:"No providers configured"},display:{streaming:"Stream Responses",streamingHint:"Show AI replies in real-time",compact:"Compact Mode",compactHint:"Reduce message spacing",showReasoning:"Show Reasoning",showReasoningHint:"Show model thinking process",showCost:"Show Cost",showCostHint:"Show token usage in replies",inlineDiffs:"Inline Diffs",inlineDiffsHint:"Show code changes inline",bellOnComplete:"Completion Sound",bellOnCompleteHint:"Play sound when AI finishes",busyInputMode:"Busy Input Mode",busyInputModeHint:"Allow input while AI is processing",theme:"Theme",themeHint:"Choose light, dark, or follow system preference",themeLight:"Light",themeDark:"Dark",themeSystem:"System"},agent:{maxTurns:"Max Turns",maxTurnsHint:"Maximum interaction rounds per conversation",gatewayTimeout:"Gateway Timeout",gatewayTimeoutHint:"Request timeout in seconds",restartDrainTimeout:"Restart Drain Timeout",restartDrainTimeoutHint:"Drain timeout before restart in seconds",toolEnforcement:"Tool Enforcement",toolEnforcementHint:"Control tool call execution mode",auto:"Auto",always:"Always",never:"Never"},memory:{enabled:"Enable Memory",enabledHint:"Allow AI to remember conversation context",userProfile:"User Profile",userProfileHint:"Allow AI to remember user preferences",charLimit:"Memory Char Limit",charLimitHint:"Max characters for MEMORY.md",userCharLimit:"User Profile Char Limit",userCharLimitHint:"Max characters for USER.md"},compression:{enabled:"Enable Compression",enabledHint:"Automatically compress long chat history before it exceeds the model context",threshold:"Compression Threshold",thresholdHint:"Start compression when estimated tokens exceed this context ratio",targetRatio:"Target Ratio",targetRatioHint:"Target history size after compression as a context ratio",protectLastN:"Protect Recent Messages",protectLastNHint:"Keep this many latest messages uncompressed",protectFirstN:"Protect First Messages",protectFirstNHint:"Keep this many earliest messages uncompressed"},session:{mode:"Reset Mode",modeHint:"Trigger condition for session reset",modeBoth:"Idle + Scheduled",modeIdle:"Idle Only",modeDaily:"Scheduled Only",modeNone:"Never (Manual Only)",idleMinutes:"Idle Timeout",idleMinutesHint:"Wait time before auto-reset (minutes)",atHour:"Scheduled Reset Time",humanOnly:"Show human sessions only",humanOnlyHint:"Hide sub-agent/session monitor noise by default",liveMonitorHumanOnly:"Live monitor: show human sessions only",liveMonitorHumanOnlyHint:"Hide sub-agent/session monitor noise in the Live monitor by default",atHourHint:"Reset session at this hour daily",requireAuth:"Session Authorization",requireAuthHint:"Require authorization for session operations"},privacy:{redactPii:"Redact PII",redactPiiHint:"Auto-detect and hide sensitive info (passwords, keys, etc.)"},apiServer:{enable:"Enable",enableHint:"Enable API server",host:"Host",hostHint:"Listen address",port:"Port",portHint:"Listen port",key:"Key",keyHint:"API access key",cors:"CORS Origins",corsHint:"Allowed cross-origin sources"},lockedIps:{title:"Locked IPs",count:"{count} locked",empty:"No locked IPs",unlock:"Unlock",unlockAll:"Unlock All",unlockAllConfirm:"Unlock all locked IPs?",unlocked:"IP unlocked",allUnlocked:"{count} IPs unlocked"},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",agentAddFailedCount:"{count} agent(s) were not added: {details}",noAgents:"No agents in this room",members:"members",roomCreated:"Room created",roomDeleted:"Room deleted",roomCloned:"Room cloned",cloneRoom:"Clone room",copyRoomLink:"Copy Room Link",deleteRoomConfirm:"Delete this room?",clearContext:"Clear context",clearContextConfirm:"Clear this room context? Messages and compression snapshots will be removed, but agents and members stay.",contextCleared:"Context cleared",you:"You",joined:"Joined room",joinFailed:"Failed to join room",inputPlaceholder:"Type a message... (Enter to send)",enterCode:"Enter invite code",yourName:"Your Name",yourNamePlaceholder:"Enter your display name",yourDescription:"Description (optional)",yourDescriptionPlaceholder:"Tell others who you are...",agentName:"Agent Name",agentNamePlaceholder:"Custom name (leave empty to use profile name)",agentDesc:"Agent Description",agentDescPlaceholder:"Describe what this agent does...",agentReplying:"is replying...",agentCompressing:"is compressing context...",compressionSettings:"Compression Settings",triggerTokens:"Trigger Tokens",triggerTokensDesc:"Token threshold to trigger context compression",maxHistoryTokens:"Max History Tokens",maxHistoryTokensDesc:"Maximum tokens for compressed context sent to LLM",tailMessageCount:"Tail Message Count",tailMessageCountDesc:"Number of recent messages to keep verbatim after compression",compressionConfig:"Compression Config",compressionSaved:"Compression config saved",compressNow:"Compress Now",compressingInProgress:"Compression in progress, please wait"},usage:{title:"Usage Statistics",refresh:"Refresh",totalTokens:"Total Tokens",inputTokens:"Input",outputTokens:"Output",totalSessions:"Total Sessions",avgPerDay:"~{n}/day avg",estimatedCost:"Est. Cost",cacheHitRate:"Cache Hit Rate",modelBreakdown:"Model Breakdown",dailyTrend:"Daily Usage",date:"Date",tokens:"Tokens",cache:"Cache",cacheRead:"Cache Read",cacheWrite:"Cache Write",sessions:"Sessions",cost:"Cost",noData:"No usage data"},skillsUsage:{title:"Skills Usage",subtitle:"Track skill loads and edits from Hermes sessions",refresh:"Refresh",periodSelector:"Skill usage period",periodLabel:"{days}d",summary:"Summary",totalActions:"Actions",loads:"Loads",edits:"Edits",distinctSkills:"Skills",topSkills:"Top Skills",dailyTrend:"Daily Trend",periodSummary:"Last {days} days",skill:"Skill",share:"Share",lastUsed:"Last Used",noData:"No skill usage data",loadFailed:"Failed to load skill usage",otherSkills:"Other skills"},files:{title:"Files",fileTree:"File Tree",tree:"Directory Tree",list:"File List",breadcrumbRoot:"Home",newFile:"New File",newFolder:"New Folder",upload:"Upload",refresh:"Refresh",open:"Open",edit:"Edit",preview:"Preview",download:"Download",copyPath:"Copy Path",rename:"Rename",delete:"Delete",name:"Name",size:"Size",modified:"Modified",actions:"Actions",emptyDir:"Empty directory",loading:"Loading...",confirmDelete:'Are you sure you want to delete "{name}"?',confirmDeleteDir:'Are you sure you want to delete directory "{name}" and all its contents?',deleteFailed:"Delete failed",deleted:"Deleted",renameTo:"Rename to",newFileName:"File name",newFolderName:"Folder name",created:"Created",createFailed:"Create failed",renamed:"Renamed",renameFailed:"Rename failed",uploadSuccess:"Uploaded {count} file(s)",uploadFailed:"Upload failed",saveFailed:"Save failed",saved:"Saved",unsavedChanges:"You have unsaved changes. Discard?",pathCopied:"Path copied",fileTooLarge:"File too large (max 10MB)",permissionDenied:"Cannot modify protected file",notFound:"File or directory not found",backendError:"File operation failed",dragDropHint:"Drag files here to upload",closeEditor:"Close Editor",closePreview:"Close",saveFile:"Save"},download:{downloading:"Downloading...",downloadFailed:"Download failed",fileNotFound:"File not found or deleted",fileTooLarge:"File too large (exceeds limit)",backendError:"File read failed, remote environment may be unavailable",backendTimeout:"File read timed out",unsupportedBackend:"Current terminal backend does not support file download",invalidPath:"Invalid file path",contentDisplay:"Content display",download:"Download",downloadFile:"Download file"},changelog:{new_0_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_30_1:"Bridge chat now preserves structured history, fixing intermittent no-response and skipped tool execution caused by text-flattened tool history",new_0_5_30_2:"Group chat mention routing is more reliable for multiple agents, removes each agent’s own @ mention before delivery, and keeps user display names bound after refresh",new_0_5_30_3:"Model pages, chat model dropdowns, and session model selection now scope providers and models to the active Profile with accurate default markers",new_0_5_30_4:"Gateway management is simplified: the standalone Gateway page is removed, each Profile is checked for platform configuration before starting the needed gateway, and a lightweight gateway runner handles starts and restarts",new_0_5_30_5:"Improve Gateway startup across Docker, Termux, and Windows with runtime-lock handling, port-conflict cleanup, background execution, and restart support",new_0_5_30_6:"Harden Windows compatibility for path detection, file downloads, and job/update subprocesses so they no longer flash terminal windows",new_0_5_30_7:"Fix config writes and provider presets: validate .env keys, route FUN-Codex through the Responses API, and refresh Z.AI/GLM model lists",new_0_5_30_8:"Polish frontend details including collapsed sidebar layout, short group labels, sidebar divider, and conversation outline styling",new_0_5_30_9:"Context compression now follows Profile compression settings and hardens stale snapshots by reusing previous summaries with a safe tail instead of recompressing full history",new_0_5_31_1:"Harden Bridge broker restarts, fix final group-chat stream rendering, and add {'@'}all routing for group chat",new_0_5_31_2:"File manager can copy absolute paths, and the mobile session drawer overlay no longer falls behind chat content",new_0_5_31_3:"Profile selector now shows avatars, custom avatar uploads, runtime status modal, and gateway/profile restart actions",new_0_5_31_4:"Profile avatars now appear in single chat, group chat, and collapsed sidebar, with Web UI profile metadata storage and Windows-safe paths",new_0_5_31_5:"Improve Docker, Termux, and Windows gateway detection and restart checks by using gateway_state/gateway.pid for managed gateway liveness",new_0_5_31_6:"Add APIKEY.FUN image-generation media endpoint and bundled apikey-image-gen skill for text-to-image, image-to-image, and image editing via the active Profile fun-codex provider",new_0_5_33_1:"Single chat and group chat now keep run failures and socket errors as red Agent messages in the message list instead of flashing them briefly",new_0_5_33_2:"Session search can now scope results to the selected Profile, while still searching all Profiles when no Profile is selected",new_0_5_33_3:"Skills page now shows Chinese and English recommendation documents when no skill is selected, and clicking the selected skill again clears the selection",new_0_5_33_4:"Remove unused changelog localization entries to reduce frontend i18n size",new_0_5_33_5:"Fix agent bridge startup failures on Chinese Windows systems caused by netstat output encoding",new_0_5_33_6:"Refresh the Nous Portal preset model list from the public catalog and Portal recommendations",new_0_5_33_7:"Profile lists and runtime status now read Profile names from disk and default models from config, avoiding CLI table column-width parsing errors",new_0_5_34_1:"Normalize multimodal tool results while storing session and group-chat messages, avoiding base64 image payloads in replays",new_0_5_34_2:"Persist custom Hermes models through backend-managed configuration and expose add/remove model endpoints",new_0_5_34_3:"Keep Bridge final context usage and tool status updates accurate after runs complete",new_0_5_34_4:"Improve Kanban board filtering, assignee display, card actions, and task detail handling",new_0_5_34_5:"Fix compression usage accounting by caching fixed prompt/tool context and reporting full-context token totals",new_0_5_34_6:"Cache fixed context per group-chat agent and only show compression progress when compression actually starts",new_0_5_34_7:"Sync Web UI bundled skills into every Profile and log the target Profile for each injection",new_0_5_34_8:"If Kanban fails on Windows, upgrade Hermes to pick up the latest kanban database migration fixes",new_0_5_35_1:"Bridge sessions can now run concurrently across different sessions while same-session runs stay serialized to preserve message order",new_0_5_35_2:"Add the Performance Monitor page for system CPU/memory, Web UI, Bridge Broker, Workers, and active session status",new_0_5_35_3:"Add per-worker resource metrics showing CPU, memory, Profile, session count, and running state",new_0_5_35_4:"Improve Bridge worker lifecycle cleanup so broker shutdowns and parent-process exits reclaim workers and reduce orphan Python processes",new_0_5_35_5:"Harden monitoring compatibility with resource collection fallbacks for macOS, Windows, Linux, Docker, and Termux",new_0_5_35_6:"Performance monitoring no longer blocks on worker requests while agents are initializing, reducing request timeouts on Windows",new_0_5_35_7:"Chat Markdown now supports inline text-content previews, and download icons download files directly instead of opening the preview drawer",new_0_5_35_8:"Polish the content preview drawer with a mobile close action, full-width mobile layout, 800px desktop width, and consistent text/Markdown backgrounds",new_0_6_0_1:"Account- and Profile-scoped management now consistently protects sessions, models, usage, Kanban, jobs, uploads, media, and related Hermes APIs",new_0_6_0_2:"Bundled media skills use the generated server token only for media endpoints and resolve fun-codex/xAI credentials from the requested Profile",new_0_6_0_3:"Single chat and group chat now inject the current Hermes Profile into run instructions so skills can send X-Hermes-Profile",new_0_6_0_4:"delegate_task subagent progress now streams into the chat UI with start, tool, progress, and completion updates",new_0_6_0_5:"Stopping or aborting a run clears transient events so stale abort state does not leak into the next chat",new_0_6_0_6:"Update docs and website copy for account management, default credentials, account/Profile management, uploads/downloads, and bundled media skills",new_0_6_0_7:"Add CLI maintenance commands for clearing login IP locks and resetting the default admin / 123456 login",new_0_6_0_8:"Version 0.6.0 is the boundary between single-user and multi-user Web UI. If multi-user mode causes issues, please file an issue and roll back to the 0.5.35 single-user release if needed"}},St={login:{title:"Hermes Web UI",description:"输入用户名和密码以继续。",placeholder:"访问令牌",submit:"登录",tokenRequired:"请输入访问令牌",invalidToken:"令牌无效",connectionFailed:"无法连接到服务器",passwordLogin:"密码登录",tokenLogin:"令牌登录",usernamePlaceholder:"用户名",passwordPlaceholder:"密码",defaultCredentialsHint:"默认登录名:admin,默认密码:123456",credentialsRequired:"请输入用户名和密码",invalidCredentials:"用户名或密码错误",tooManyAttempts:"登录失败次数过多,请稍后重试",sessionExpired:"登录已过期,请重新登录",accessDenied:"你没有权限访问该资源",passwordMismatch:"两次密码不一致",passwordTooShort:"密码长度至少 6 个字符",setupSuccess:"密码登录配置成功",passwordChanged:"密码修改成功",passwordRemoved:"密码登录已移除",setupPassword:"设置密码登录",changePassword:"修改密码",changeUsername:"修改用户名",removePasswordLogin:"移除",username:"用户名",currentPassword:"当前密码",newPassword:"新密码",confirmPassword:"确认密码",newUsername:"新用户名",usernameChanged:"用户名修改成功",usernameTooShort:"用户名至少 2 个字符",setupDescription:"管理用于登录的用户名和密码。",removeConfirm:"用户账号必须保留密码登录。",passwordLoginNotConfigured:"密码登录未配置",passwordLoginConfigured:"当前账户:{username}",defaultCredentialTitle:"请修改默认账户和密码",defaultCredentialMessage:"当前登录账户仍在使用默认用户名或默认密码。为了避免未授权访问,请尽快进入当前账户修改用户名和密码。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍后提醒"},users:{title:"账户管理",description:"创建用户、分配角色,并控制普通管理员可访问的配置。",create:"创建用户",edit:"编辑用户",username:"用户名",role:"角色",statusLabel:"状态",profiles:"可访问配置",profilesPlaceholder:"选择可访问的配置",allProfiles:"全部配置",noProfiles:"未关联配置",lastLogin:"最后登录",newPasswordOptional:"新密码(留空不修改)",loadFailed:"用户列表加载失败",deleteConfirm:"确认删除该用户?",enable:"启用",disable:"禁用",roles:{superAdmin:"超级管理员",admin:"普通管理员"},status:{active:"启用",disabled:"禁用"}},common:{loading:"加载中...",cancel:"取消",delete:"删除",retry:"重试",edit:"编辑",save:"保存",saved:"已保存",saveFailed:"保存失败",deleteFailed:"删除失败",ok:"确定",copied:"已复制",copy:"复制",update:"更新",create:"创建",noData:"暂无数据",expired:"已过期",fetch:"获取",add:"添加",enable:"启用",disable:"禁用",configured:"已配置",notConfigured:"未配置",confirm:"确定",expand:"展开",collapse:"收起",start:"启动",stop:"停止"},sidebar:{chat:"对话",search:"搜索",apiRelay:"中转站",history:"历史",jobs:"任务",kanban:"看板",models:"模型",profiles:"用户",plugins:"插件",skills:"技能",memory:"记忆",logs:"日志",usage:"用量",performance:"性能监控",skillsUsage:"技能用量",channels:"频道",gateways:"网关",terminal:"终端",groupChat:"群聊",files:"文件",groupConversation:"对话",groupConversationShort:"对话",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系统",groupSystemShort:"系统",groupMonitoring:"监控",groupMonitoringShort:"监控",groupTools:"工具",settings:"设置",connected:"已连接",disconnected:"未连接",collapse:"收起菜单",expand:"展开菜单",updateTip:'在终端运行 "hermes-web-ui update" 即可更新',updateVersion:"升级版本 v{version}",reloadClientVersion:"刷新到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,请稍后刷新页面,如长时间未启动,请手动启动",updateFailed:"更新失败",logout:"退出登录",nodeVersionWarning:"检测到 Node.js v{version},请升级到23以上版本。",changelog:"更新日志",noChangelog:"暂无更新日志"},performance:{title:"性能监控",subtitle:"查看系统资源、Bridge Broker、Workers 和活跃会话",refresh:"刷新",autoRefreshOn:"自动刷新",autoRefreshOff:"手动刷新",loadFailed:"性能数据加载失败",systemCpu:"系统 CPU",systemMemory:"系统内存",activeSessions:"活跃会话",runningSessions:"运行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 总内存",processes:"进程",uptime:"运行",running:"运行中",stopped:"已停止",workerMemory:"Worker 内存",lastUpdated:"更新时间",profile:"Profile",memory:"内存",sessions:"会话",runningActiveSessions:"运行中 / 活跃",lastUsed:"最后使用",status:"状态",noWorkers:"暂无 Worker",sessionsByProfile:"按 Profile 统计会话",noActiveSessions:"暂无活跃会话"},drawer:{terminal:"终端",files:"工作区"},chat:{contextRemaining:"剩余",contextClickToEdit:"点击编辑上下文长度",contextEditTitle:"编辑上下文长度",contextEditDesc:"设置当前模型的上下文长度限制(token 数量)",contextEditPlaceholder:"请输入上下文长度",contextEditHint:"常见值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"取消",contextEditInvalid:"请输入有效的上下文长度",contextEditSuccess:"上下文长度已更新",contextEditFailed:"更新失败",emptyState:"开始与 Hermes Agent 对话",cliEmptyState:"开始 CLI 对话",outlineTitle:"会话大纲",outlineEmpty:"暂无会话内容",outlineUserQuestion:"用户问题",inputPlaceholder:"输入消息... (Enter 发送,Shift+Enter 换行)",slashCommandArgs:{message:"<消息>",title:"<标题>",text:"<文本>"},slashCommands:{usage:"计算当前会话用量",status:"查看会话状态和队列",abort:"停止当前 Bridge 运行",queue:"把消息加入当前运行后的队列",clear:"清空当前显示内容",clearHistory:"删除当前会话已入库的消息历史",title:"重命名当前会话",compress:"空闲时触发上下文压缩",steer:"向当前 Bridge 运行发送引导文本",destroy:"释放当前会话的 Bridge Agent"},attachFiles:"添加附件",autoPlaySpeech:"自动播放语音",showToolCalls:"显示工具调用",hideToolCalls:"隐藏工具调用",messageQueue:"消息队列",removeQueuedMessage:"移除队列消息",stop:"停止",start:"启动",stopGateway:"停止网关",send:"发送",contextUsed:"上下文已用:",sessions:"会话",webUiSessions:"会话",allProfiles:"全部配置",profileMissingModelsTip:"该会话所属配置「{profile}」没有可用的 provider 或模型",sessionScopeHint:"这里只显示当前会话;CLI、Telegram、Discord、Cron 等通道会话在历史中只读查看。",openHistory:"打开历史",hermesHistory:"Hermes 历史",historyScopeHint:"这里按来源只读查看当前 profile 的 Hermes 历史会话。",noSessions:"暂无会话",searchTitle:"搜索会话",searchSubtitle:"按标题或消息内容搜索",searchScope:"搜索范围:仅 Web UI 本地会话库;不包含只读 Hermes 历史会话。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜索会话...",searchEmpty:"最近会话",searchRecent:"最近会话",searchNoResults:"没有匹配的会话",searchNoSnippet:"没有可显示的摘要",searchEnterHint:"Enter 打开 · Esc 关闭",searchFailed:"搜索会话失败",newChat:"新建对话",approvalKicker:"终端授权",approvalTitle:"运行前请确认命令",approvalAllowOnce:"仅本次允许",approvalAllowSession:"本会话允许",approvalAlways:"始终允许",approvalDeny:"拒绝",newCliChat:"新建 CLI",deleteSession:"确定删除此会话?",sessionDeleted:"会话已删除",toggleBatchMode:"批量选择",selectAll:"全选",confirmBatchDelete:"确定删除选中的 {count} 个会话?",batchDeleteSuccess:"已删除 {count} 个会话",batchDeletePartial:"{failed} 个会话删除失败",batchDeleteFailed:"批量删除失败",rename:"重命名",pin:"置顶",unpin:"取消置顶",pinned:"已置顶",chatMode:"聊天",liveMode:"实时",liveSessions:"实时会话",recentBadge:"最近",linkedSessions:"关联 {count} 个会话",noVisibleMessages:"没有人类可见消息。",monitorRoleUser:"用户",monitorRoleAssistant:"助手",copySessionLink:"复制会话链接",copySessionId:"复制会话 ID",export:"导出",exportFull:"全量导出 (JSON)",exportCompressed:"压缩导出 (TXT)",exportCompressing:"正在压缩上下文,请稍候...",exportSuccess:"会话已导出",exportFailed:"导出失败",renamed:"已重命名",renameFailed:"重命名失败",renameSession:"重命名会话",sessionNotFound:"会话未找到",enterNewTitle:"输入新标题",workspace:"工作区",setWorkspace:"设置工作区",setWorkspaceTitle:"设置会话工作区",workspacePlaceholder:"输入项目路径,例如 /home/user/project",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 授权页",xaiCopyLink:"复制授权链接",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:"取消全选",currentDefault:"当前默认",defaultShort:"默认",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:"切换 Hermes Profile",switchConfirm:"将执行 `hermes profile use {name}` 并切换 Hermes CLI 的 active profile,是否继续?",switchSuccess:'Hermes active profile 已切换为 "{name}"',switchFailed:"切换 Hermes Profile 失败,网关可能需要手动重启",createSuccess:'配置 "{name}" 已创建',createFailed:"创建配置失败",renameSuccess:"配置已重命名",renameFailed:"重命名配置失败",deleteConfirm:'确定删除配置 "{name}" 吗?',deleteSuccess:"配置已删除",deleteFailed:"删除配置失败",exportSuccess:"配置已导出",exportFailed:"导出配置失败",importSuccess:"配置已导入",importFailed:"导入配置失败",importSelectFile:"选择归档文件",importInvalidFile:"请选择有效的归档文件 (.tar.gz, .tgz, .gz, .zip)",name:"配置名称",namePlaceholder:"仅限小写字母、数字、连字符",nameValidation:"配置名称只能包含小写字母、数字、下划线和连字符",newName:"新名称",newNamePlaceholder:"小写字母、数字、连字符",cloneFromCurrent:"从当前配置克隆",cloneCleanupNotice:"克隆时会自动跳过独占型平台凭据(Weixin / Telegram / Slack 等),避免与源配置冲突",cloneStrippedCredentials:"已清理 {count} 项独占凭据:{list}",cloneDisabledPlatforms:"已禁用 {count} 个平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 项内嵌凭据:{list}",archivePath:"归档路径",archivePathPlaceholder:"归档文件的服务器路径",importName:"配置名称(可选)",importNamePlaceholder:"留空则使用归档名称",active:"活跃",model:"模型",gateway:"网关",alias:"别名",provider:"Provider",path:"路径",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"暂无配置,创建一个开始吧。",avatar:{title:"自定义头像",customize:"头像",upload:"上传图片",random:"随机生成",reset:"恢复默认",hint:"支持 PNG、JPEG、WebP,最大 1MB",invalidType:"请选择 PNG、JPEG 或 WebP 图片",tooLarge:"头像图片不能超过 1MB",saveSuccess:"头像已保存",saveFailed:"保存头像失败",resetSuccess:"已恢复默认头像",resetFailed:"恢复默认头像失败"},runtime:{activeProfile:"当前:{name}",bridgeWorker:"桥接状态",gateway:"网关",active:"活跃",activeTag:"当前",idle:"空闲",running:"运行中",stopped:"已停止",restartGateway:"重启网关",restartProfile:"重启配置",switchProfile:"切换前端配置",gatewayRestarted:"网关已重启:{name}",gatewayRestartFailed:"重启网关失败",profileRestarted:"配置已重启:{name}",profileRestartFailed:"重启配置失败"}},logs:{title:"日志",all:"全部",searchPlaceholder:"搜索...",refresh:"刷新",noEntries:"暂无日志"},settings:{title:"设置",saved:"已保存",saveFailed:"保存失败",tabs:{display:"显示",account:"当前账户",users:"账户管理",agent:"代理",memory:"记忆",compression:"上下文压缩",session:"会话",privacy:"隐私",apiServer:"API 服务器",models:"模型",voice:"语音"},models:{apiKey:"API Key",apiKeyPlaceholder:"输入 API Key",save:"保存",saved:"已保存",saveFailed:"保存失败",noProviders:"暂无已配置的模型"},display:{streaming:"流式响应",streamingHint:"实时显示 AI 回复",compact:"紧凑模式",compactHint:"减少消息间距",showReasoning:"显示推理过程",showReasoningHint:"展示模型思考过程",showCost:"显示费用",showCostHint:"在回复中显示 token 使用量",inlineDiffs:"内联差异",inlineDiffsHint:"代码变更以内联方式显示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回复完成时播放提示音",busyInputMode:"忙碌输入模式",busyInputModeHint:"AI 处理中仍可输入",theme:"主题",themeHint:"选择浅色、暗色或跟随系统",themeLight:"浅色",themeDark:"暗色",themeSystem:"跟随系统"},agent:{maxTurns:"最大轮次",maxTurnsHint:"单次对话最大交互轮数",gatewayTimeout:"网关超时",gatewayTimeoutHint:"单次请求超时时间(秒)",restartDrainTimeout:"重启排空超时",restartDrainTimeoutHint:"重启前排空请求的超时时间(秒)",toolEnforcement:"工具执行策略",toolEnforcementHint:"控制工具调用的执行模式",auto:"自动",always:"始终",never:"从不"},memory:{enabled:"启用记忆",enabledHint:"允许 AI 记住对话上下文",userProfile:"用户画像",userProfileHint:"允许 AI 记住用户偏好信息",charLimit:"记忆字符上限",charLimitHint:"MEMORY.md 最大字符数",userCharLimit:"用户画像字符上限",userCharLimitHint:"USER.md 最大字符数"},compression:{enabled:"启用压缩",enabledHint:"长对话接近模型上下文上限前自动压缩历史",threshold:"压缩阈值",thresholdHint:"预计 token 超过上下文比例时开始压缩",targetRatio:"目标比例",targetRatioHint:"压缩后历史保留到上下文的目标比例",protectLastN:"保护最近消息",protectLastNHint:"最近多少条消息不参与压缩",protectFirstN:"保护开头消息",protectFirstNHint:"最早多少条消息不参与压缩"},session:{mode:"重置模式",modeHint:"会话重置的触发条件",modeBoth:"空闲 + 定时",modeIdle:"仅空闲",modeDaily:"仅定时",modeNone:"永不(仅手动)",idleMinutes:"空闲超时",idleMinutesHint:"无操作后自动重置的等待时间(分钟)",atHour:"定时重置时间",humanOnly:"仅显示人类会话",humanOnlyHint:"默认隐藏子代理和会话监看噪音",liveMonitorHumanOnly:"实时监看:仅显示人类会话",liveMonitorHumanOnlyHint:"在实时监看中默认隐藏子代理和会话监看噪音",atHourHint:"每天在指定小时重置会话",requireAuth:"会话授权",requireAuthHint:"修改会话操作是否授权"},privacy:{redactPii:"脱敏 PII",redactPiiHint:"自动检测并隐藏敏感信息(密码、密钥等)"},apiServer:{enable:"启用",enableHint:"启用 API 服务器",host:"主机",hostHint:"监听地址",port:"端口",portHint:"监听端口",key:"密钥",keyHint:"API 访问密钥",cors:"CORS 来源",corsHint:"允许的跨域来源"},lockedIps:{title:"锁定 IP 管理",count:"{count} 个 IP 被锁定",empty:"暂无锁定 IP",unlock:"解锁",unlockAll:"全部解锁",unlockAllConfirm:"确认解锁所有锁定的 IP?",unlocked:"IP 已解锁",allUnlocked:"已解锁 {count} 个 IP"},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:"该智能体已在房间中",agentAddFailedCount:"{count} 个智能体未添加:{details}",noAgents:"当前房间暂无智能体",members:"成员",roomCreated:"房间已创建",roomDeleted:"房间已删除",roomCloned:"房间已克隆",cloneRoom:"克隆房间",copyRoomLink:"复制房间链接",deleteRoomConfirm:"确定删除这个房间吗?",clearContext:"清理上下文",clearContextConfirm:"确定清理当前房间上下文吗?消息和压缩快照会被删除,智能体和成员会保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房间",joinFailed:"加入房间失败",inputPlaceholder:"输入消息... (Enter 发送)",enterCode:"输入邀请码",yourName:"你的名称",yourNamePlaceholder:"输入你的群聊昵称",yourDescription:"自我描述(选填)",yourDescriptionPlaceholder:"介绍一下你自己...",agentName:"Agent 名称",agentNamePlaceholder:"自定义名称(留空则使用 profile 名称)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述这个 agent 的作用...",agentReplying:"正在回复...",agentCompressing:"正在压缩上下文...",compressionSettings:"压缩设置",triggerTokens:"触发压缩 Token 数",triggerTokensDesc:"消息 token 数超过此值时触发上下文压缩",maxHistoryTokens:"最大历史 Token 数",maxHistoryTokensDesc:"压缩后发送给 LLM 的最大 token 数",tailMessageCount:"保留最近消息数",tailMessageCountDesc:"压缩后保留最近的原始消息条数",compressionConfig:"压缩配置",compressionSaved:"压缩配置已保存",compressNow:"立即压缩",compressingInProgress:"正在压缩中,请稍后"},usage:{title:"用量统计",refresh:"刷新",totalTokens:"总 Token 数",inputTokens:"输入",outputTokens:"输出",totalSessions:"总会话数",avgPerDay:"日均 ~{n}",estimatedCost:"预估费用",cacheHitRate:"缓存命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"缓存",cacheRead:"缓存读取",cacheWrite:"缓存写入",sessions:"会话",cost:"费用",noData:"暂无用量数据"},skillsUsage:{title:"技能用量",subtitle:"跟踪 Hermes 会话中的技能加载和编辑",refresh:"刷新",periodSelector:"技能用量周期",periodLabel:"{days}天",summary:"概览",totalActions:"操作",loads:"加载",edits:"编辑",distinctSkills:"技能数",topSkills:"热门",dailyTrend:"趋势",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暂无技能用量数据",loadFailed:"技能用量加载失败",otherSkills:"其他技能"},files:{title:"文件",fileTree:"文件树",tree:"目录树",list:"文件列表",breadcrumbRoot:"根目录",newFile:"新建文件",newFolder:"新建文件夹",upload:"上传",refresh:"刷新",open:"打开",edit:"编辑",preview:"预览",download:"下载",copyPath:"复制路径",rename:"重命名",delete:"删除",name:"名称",size:"大小",modified:"修改时间",actions:"操作",emptyDir:"空目录",loading:"加载中...",confirmDelete:"确定要删除「{name}」吗?",confirmDeleteDir:"确定要删除目录「{name}」及其所有内容吗?",deleteFailed:"删除失败",deleted:"已删除",renameTo:"重命名为",newFileName:"文件名",newFolderName:"文件夹名",created:"已创建",createFailed:"创建失败",renamed:"已重命名",renameFailed:"重命名失败",uploadSuccess:"已上传 {count} 个文件",uploadFailed:"上传失败",saveFailed:"保存失败",saved:"已保存",unsavedChanges:"有未保存的更改,是否丢弃?",pathCopied:"路径已复制",fileTooLarge:"文件过大(最大 10MB)",permissionDenied:"无法修改受保护的文件",notFound:"文件或目录不存在",backendError:"文件操作失败",dragDropHint:"拖拽文件到此处上传",closeEditor:"关闭编辑器",closePreview:"关闭",saveFile:"保存"},download:{downloading:"正在下载...",downloadFailed:"下载失败",fileNotFound:"文件不存在或已被删除",fileTooLarge:"文件过大(超过限制)",backendError:"文件读取失败,远程环境可能不可用",backendTimeout:"文件读取超时",unsupportedBackend:"当前 terminal backend 暂不支持文件下载",invalidPath:"无效的文件路径",contentDisplay:"内容展示",download:"下载",downloadFile:"下载文件"},changelog:{new_0_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_30_1:"Bridge 聊天改为保留结构化历史,修复工具调用历史转文本后导致模型偶发不返回、工具不执行的问题",new_0_5_30_2:"群聊 @ 多 Agent 路由更可靠,发送给每个 Agent 时会移除自己的 @,并改善刷新后的用户昵称绑定",new_0_5_30_3:"模型页、聊天模型下拉和会话模型选择改为按当前 Profile 展示,默认模型标记更准确",new_0_5_30_4:"精简 Gateway 管理:移除独立网关页面,按各 Profile 的平台配置检查并拉起需要运行的 gateway,并改用轻量 gateway runner 管理启动和重启",new_0_5_30_5:"增强 Docker、Termux 和 Windows 的 Gateway 启动流程,处理运行锁、端口冲突、后台执行和重启场景",new_0_5_30_6:"优化 Windows 兼容性:路径识别、文件下载、任务/更新子进程不再弹出额外终端窗口",new_0_5_30_7:"修复配置写入和 Provider 预设:加强 .env 校验,FUN-Codex 改走 Responses API,并更新 Z.AI/GLM 模型列表",new_0_5_30_8:"前端体验细节优化:折叠侧边栏布局、分组短标题、侧边栏分隔线和对话大纲样式更稳定",new_0_5_30_9:"上下文压缩现在跟随 Profile 压缩配置,并在旧快照失效时复用旧摘要和安全尾部,避免重新压缩完整历史",new_0_5_31_1:"增强 Bridge Broker 重启稳定性,修复群聊最终流式渲染,并新增群聊 {'@'}all 路由",new_0_5_31_2:"文件管理支持复制绝对路径,并修复移动端会话抽屉层级遮挡问题",new_0_5_31_3:"Profile 选择器新增头像展示、自定义头像、运行状态弹窗,以及网关/Profile 重启操作",new_0_5_31_4:"Profile 头像会同步用于单聊、群聊和折叠侧边栏,头像元数据保存到 Web UI 目录并兼容 Windows 路径",new_0_5_31_5:"改进 Docker、Termux、Windows 的 gateway 检测和重启逻辑,优先使用 gateway_state/gateway.pid 判断 managed gateway 是否存活",new_0_5_31_6:"新增 APIKEY.FUN 生图媒体接口和内置 apikey-image-gen skill,支持文生图、图生图和图片编辑,并从 active Profile 的 fun-codex 配置读取凭据",new_0_5_33_1:"单聊和群聊的运行失败、Socket 错误会作为红色 Agent 消息保留在消息列表中,不再一闪而过",new_0_5_33_2:"会话搜索支持按当前选中的 Profile 限定范围,未选择 Profile 时仍可搜索全部 Profile",new_0_5_33_3:"Skills 页面新增中英文推荐清单,未选中 Skill 时展示推荐内容,并支持再次点击已选 Skill 取消选中",new_0_5_33_4:"清理未使用的 changelog 国际化内容,减少前端 i18n 体积",new_0_5_33_5:"修复 Windows 中文系统下 agent bridge 解析 netstat 输出编码失败导致启动异常的问题",new_0_5_33_6:"更新 Nous Portal 预设模型列表,对齐公开 catalog 和 Portal 推荐模型",new_0_5_33_7:"Profile 列表和运行状态改为从目录读取 Profile 名称、从 config 读取默认模型,避免 CLI 表格列宽导致 name/model/gateway 解析错位",new_0_5_34_1:"存储会话和群聊消息时会规范化多模态工具结果,避免 base64 图片污染回放内容",new_0_5_34_2:"自定义 Hermes 模型改为由后端配置持久化,并新增添加/移除模型接口",new_0_5_34_3:"修复 Bridge 运行结束后的最终上下文用量和工具状态更新",new_0_5_34_4:"优化看板过滤、负责人展示、卡片操作和任务详情处理",new_0_5_34_5:"修复压缩用量统计:缓存固定 prompt/tool 上下文,并展示完整上下文 token 总量",new_0_5_34_6:"群聊 Agent 缓存各自固定上下文,仅在真正开始压缩时显示压缩进度",new_0_5_34_7:"Web UI 内置 Skills 会同步注入到所有 Profile,并在日志中标明目标 Profile",new_0_5_34_8:"如果 Windows 下看板功能异常,请升级 Hermes 以获取最新的看板数据库迁移修复",new_0_5_35_1:"Bridge 会话支持不同 session 并发运行,同一 session 仍保持串行,避免消息顺序错乱",new_0_5_35_2:"新增“性能监控”页面,可查看系统 CPU/内存、Web UI、Bridge Broker、Workers 和活跃会话状态",new_0_5_35_3:"新增 Worker 级资源统计,展示每个 worker 的 CPU、内存、Profile、会话数和运行状态",new_0_5_35_4:"优化 Bridge worker 生命周期清理,Broker 关闭或父进程退出时会回收 worker,减少残留 Python 进程",new_0_5_35_5:"监控接口增强跨平台兼容,支持 macOS、Windows、Linux、Docker 和 Termux 的资源采集降级",new_0_5_35_6:"性能监控不再因为 Agent 初始化中的 worker 请求而阻塞,降低 Windows 上 request timed out 的概率",new_0_5_35_7:"聊天 Markdown 新增文本内容内联预览,下载图标会直接下载文件,避免被预览弹窗拦截",new_0_5_35_8:"优化内容展示抽屉:移动端全宽并提供关闭入口,桌面端加宽到 800px,文本与 Markdown 背景保持一致",new_0_6_0_1:"分账户、分 Profile 管理现在统一覆盖会话、模型、用量、看板、任务、上传、媒体以及相关 Hermes API",new_0_6_0_2:"内置媒体 Skills 仅在媒体接口使用生成的服务端 token,并按请求的 Profile 读取 fun-codex/xAI 凭据",new_0_6_0_3:"单聊和群聊都会向运行提示词注入当前 Hermes Profile,方便 Skills 请求时带上 X-Hermes-Profile",new_0_6_0_4:"delegate_task 的 subagent 进度会实时展示到聊天界面,包含开始、工具调用、进度和完成状态",new_0_6_0_5:"停止或中断运行时会清理临时事件,避免旧的 abort 状态带入下一次聊天",new_0_6_0_6:"同步更新文档和官网文案,覆盖账户管理、默认凭据、分账户分 Profile 管理、上传下载和内置媒体 Skills",new_0_6_0_7:"新增 CLI 维护命令,用于清理登录 IP 锁和重置默认 admin / 123456 登录账户",new_0_6_0_8:"0.6.0 是 Web UI 从单用户走向多用户的分界版本;如果多用户模式遇到问题,请提交 issue,必要时可回退到 0.5.35 单用户版本"}},Pt={login:{title:"Hermes Web UI",description:"輸入使用者名稱和密碼以繼續。",placeholder:"存取權杖",submit:"登入",tokenRequired:"請輸入存取權杖",invalidToken:"權杖無效",connectionFailed:"無法連線至伺服器",passwordLogin:"密碼登入",tokenLogin:"權杖登入",usernamePlaceholder:"使用者名稱",passwordPlaceholder:"密碼",defaultCredentialsHint:"預設登入名:admin,預設密碼:123456",credentialsRequired:"請輸入使用者名稱和密碼",invalidCredentials:"使用者名稱或密碼錯誤",tooManyAttempts:"登入失敗次數過多,請稍後再試",sessionExpired:"登入已過期,請重新登入",accessDenied:"你沒有權限存取此資源",passwordMismatch:"兩次密碼不一致",passwordTooShort:"密碼長度至少 6 個字元",setupSuccess:"密碼登入設定成功",passwordChanged:"密碼修改成功",passwordRemoved:"密碼登入已移除",setupPassword:"設定密碼登入",changePassword:"修改密碼",changeUsername:"修改使用者名稱",removePasswordLogin:"移除",username:"使用者名稱",currentPassword:"目前密碼",newPassword:"新密碼",confirmPassword:"確認密碼",newUsername:"新使用者名稱",usernameChanged:"使用者名稱修改成功",usernameTooShort:"使用者名稱至少 2 個字元",setupDescription:"管理用於登入的使用者名稱和密碼。",removeConfirm:"使用者帳號必須保留密碼登入。",passwordLoginNotConfigured:"密碼登入未設定",passwordLoginConfigured:"目前帳號:{username}",defaultCredentialTitle:"請修改預設帳號和密碼",defaultCredentialMessage:"目前登入帳號仍在使用預設使用者名稱或預設密碼。為避免未授權存取,請盡快進入目前帳號修改使用者名稱和密碼。",defaultCredentialAction:"去修改",defaultCredentialLater:"稍後提醒"},users:{title:"帳號管理",description:"建立使用者、分配角色,並控制一般管理員可存取的設定檔。",create:"建立使用者",edit:"編輯使用者",username:"使用者名稱",role:"角色",statusLabel:"狀態",profiles:"可存取設定檔",profilesPlaceholder:"選擇可存取的設定檔",allProfiles:"全部設定檔",noProfiles:"未關聯設定檔",lastLogin:"最後登入",newPasswordOptional:"新密碼(留空不修改)",loadFailed:"使用者列表載入失敗",deleteConfirm:"確認刪除此使用者?",enable:"啟用",disable:"停用",roles:{superAdmin:"超級管理員",admin:"一般管理員"},status:{active:"啟用",disabled:"停用"}},common:{loading:"載入中...",cancel:"取消",delete:"刪除",retry:"重試",edit:"編輯",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",deleteFailed:"刪除失敗",ok:"確定",copied:"已複製",copy:"複製",update:"更新",create:"建立",noData:"目前無資料",expired:"已過期",fetch:"取得",add:"新增",enable:"啟用",disable:"停用",configured:"已設定",notConfigured:"未設定",confirm:"確定",expand:"展開",collapse:"收起",start:"啟動",stop:"停止"},sidebar:{chat:"對話",search:"搜尋",apiRelay:"中轉站",history:"歷史",jobs:"任務",kanban:"看板",models:"模型",profiles:"使用者",plugins:"插件",skills:"技能",memory:"記憶",logs:"日誌",usage:"用量",performance:"效能監控",skillsUsage:"技能用量",channels:"頻道",gateways:"閘道",terminal:"終端機",groupChat:"群聊",files:"檔案",groupConversation:"對話",groupConversationShort:"對話",groupPlatform:"平台",groupAgent:"代理",groupAgentShort:"代理",groupSystem:"系統",groupSystemShort:"系統",groupMonitoring:"監控",groupMonitoringShort:"監控",groupTools:"工具",settings:"設定",connected:"已連線",disconnected:"未連線",collapse:"收起選單",expand:"展開選單",updateTip:'在終端機執行 "hermes-web-ui update" 即可更新',updateVersion:"升級版本 v{version}",reloadClientVersion:"重新整理到 v{version}",updating:"正在更新...",updateSuccess:"更新成功,請稍後重新整理頁面,如長時間未啟動,請手動啟動",updateFailed:"更新失敗",logout:"登出",nodeVersionWarning:"偵測到 Node.js v{version},請升級至 23 以上版本。",changelog:"更新日誌",noChangelog:"目前無更新日誌"},performance:{title:"效能監控",subtitle:"查看系統資源、Bridge Broker、Workers 和活躍會話",refresh:"重新整理",autoRefreshOn:"自動重新整理",autoRefreshOff:"手動重新整理",loadFailed:"效能資料載入失敗",systemCpu:"系統 CPU",systemMemory:"系統記憶體",activeSessions:"活躍會話",runningSessions:"執行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 總記憶體",processes:"程序",uptime:"執行",running:"執行中",stopped:"已停止",workerMemory:"Worker 記憶體",lastUpdated:"更新時間",profile:"Profile",memory:"記憶體",sessions:"會話",runningActiveSessions:"執行中 / 活躍",lastUsed:"最後使用",status:"狀態",noWorkers:"暫無 Worker",sessionsByProfile:"按 Profile 統計會話",noActiveSessions:"暫無活躍會話"},drawer:{terminal:"終端機",files:"工作區"},chat:{contextRemaining:"剩餘",contextClickToEdit:"點擊編輯上下文長度",contextEditTitle:"編輯上下文長度",contextEditDesc:"設定目前模型的上下文長度限制(token 數量)",contextEditPlaceholder:"請輸入上下文長度",contextEditHint:"常見值:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"儲存",contextEditCancel:"取消",contextEditInvalid:"請輸入有效的上下文長度",contextEditSuccess:"上下文長度已更新",contextEditFailed:"更新失敗",emptyState:"開始與 Hermes Agent 對話",outlineTitle:"會話大綱",outlineEmpty:"暫無會話內容",outlineUserQuestion:"使用者問題",inputPlaceholder:"輸入訊息... (Enter 發送,Shift+Enter 換行)",slashCommandArgs:{message:"<訊息>",title:"<標題>",text:"<文字>"},slashCommands:{usage:"計算目前會話用量",status:"查看會話狀態和佇列",abort:"停止目前 Bridge 執行",queue:"將訊息加入目前執行後的佇列",clear:"清空目前顯示內容",clearHistory:"刪除目前會話已儲存的訊息歷史",title:"重新命名目前會話",compress:"空閒時觸發上下文壓縮",steer:"向目前 Bridge 執行傳送引導文字",destroy:"釋放目前會話的 Bridge Agent"},attachFiles:"新增附件",autoPlaySpeech:"自動播放語音",showToolCalls:"顯示工具呼叫",hideToolCalls:"隱藏工具呼叫",messageQueue:"訊息佇列",removeQueuedMessage:"移除佇列訊息",stop:"停止",start:"啟動",stopGateway:"停止閘道",send:"發送",contextUsed:"上下文已用:",sessions:"工作階段",webUiSessions:"工作階段",allProfiles:"全部設定",profileMissingModelsTip:"此工作階段所屬設定「{profile}」沒有可用的 provider 或模型",sessionScopeHint:"這裡只顯示目前工作階段;CLI、Telegram、Discord、Cron 等頻道工作階段在歷史中以唯讀方式查看。",openHistory:"開啟歷史",hermesHistory:"Hermes 歷史",historyScopeHint:"這裡按來源以唯讀方式查看目前 profile 的 Hermes 歷史工作階段。",noSessions:"目前無工作階段",searchTitle:"搜尋工作階段",searchSubtitle:"依標題或訊息內容搜尋",searchScope:"搜尋範圍:僅 Web UI 本地工作階段資料庫;不包含唯讀 Hermes 歷史工作階段。",searchHint:"Cmd/Ctrl+K",searchPlaceholder:"搜尋工作階段...",searchEmpty:"最近工作階段",searchRecent:"最近工作階段",searchNoResults:"沒有符合的工作階段",searchNoSnippet:"沒有可顯示的摘要",searchEnterHint:"Enter 開啟 · Esc 關閉",searchFailed:"搜尋工作階段失敗",newChat:"新增對話",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:"助手",copySessionLink:"複製工作階段連結",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:"此瀏覽器不支援語音播放",modelSetFailed:"設定模型失敗",modelSet:"模型已設定",setModelTitle:"設定工作階段模型",setModel:"設定模型",newCliChat:"新增 CLI",cliEmptyState:"開始 CLI 對話"},kanban:{title:"看板",createTask:"新增任務",noTasks:"目前無任務",allStatuses:"所有狀態",allAssignees:"所有負責人",board:{create:"新增看板",archive:"封存看板",slugPlaceholder:"看板識別碼,例如 project-a",namePlaceholder:"顯示名稱(選填)",slugRequired:"看板識別碼不能為空",created:"看板已建立",archived:"看板已封存",archiveConfirm:"確定封存目前看板?"},columns:{triage:"待分類",todo:"待辦",ready:"就緒",running:"進行中",blocked:"阻塞",done:"已完成",archived:"已封存"},form:{title:"標題",titlePlaceholder:"任務標題",titleRequired:"標題不能為空",body:"描述",bodyPlaceholder:"任務描述(選填)",assignee:"負責人",selectAssignee:"選擇負責人...",priority:"優先級",selectPriority:"選擇優先級..."},card:{assigneeTooltip:"負責人",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"剛剛",minutes:"{count} 分鐘前",hours:"{count} 小時前",days:"{count} 天前"}},detail:{status:"狀態",assignee:"負責人",priority:"優先級",tenant:"租戶",createdAt:"建立時間",startedAt:"開始時間",completedAt:"完成時間",comments:"評論",events:"事件",runs:"執行記錄",result:"完成結果",sessions:"關聯工作階段",sessionMessages:"工作階段記錄",noSessions:"找不到關聯工作階段。",artifacts:"產出檔案",sources:"資料來源",highlights:"關鍵資訊"},action:{title:"操作",complete:"完成",completeSummary:"完成摘要(選填)",block:"阻塞",blockReason:"阻塞原因",unblock:"解除阻塞",assign:"指派",assignTo:"指派給..."},message:{taskCreated:"任務已建立",taskCompleted:"任務已完成",taskBlocked:"任務已阻塞",taskUnblocked:"任務已解除阻塞",taskAssigned:"任務已指派",loadFailed:"載入任務失敗"},stats:{total:"總計",tasks:"任務數"}},jobs:{title:"排程任務",createJob:"建立任務",editJob:"編輯任務",noJobs:"目前無排程任務,建立一個開始吧。",name:"名稱",namePlaceholder:"任務名稱",schedule:"排程運算式 (Cron)",schedulePlaceholder:"例如 0 9 * * *",quickPresets:"快速預設",selectPreset:"選擇預設...",presetEveryMinute:"每分鐘",presetEvery5Min:"每 5 分鐘",presetEveryHour:"每小時",presetEveryDay:"每天 00:00",presetEveryDay9:"每天 09:00",presetEveryMonday:"每週一 09:00",presetEveryMonth:"每月 1 日 09:00",prompt:"提示詞",promptPlaceholder:"要執行的內容",deliverTarget:"投遞目標",origin:"來源",local:"本地",repeatCount:"重複次數(選填)",modelPlaceholder:"預設模型",repeatPlaceholder:"留空表示無限重複",jobCreated:"任務已建立",jobUpdated:"任務已更新",nameRequired:"名稱為必填項",scheduleRequired:"排程運算式為必填項",loadFailed:"載入任務失敗",jobPaused:"任務已暫停",jobResumed:"任務已恢復",jobTriggered:"任務已觸發",modelUpdated:"模型已更新",jobDeleted:"任務已刪除",status:{running:"執行中",paused:"已暫停",disabled:"已停用",scheduled:"已排程"},info:{model:"模型",schedule:"排程",lastRun:"上次執行",nextRun:"下次執行",deliver:"投遞",repeat:"重複"},action:{pause:"暫停",pauseJob:"暫停任務",resume:"恢復",resumeJob:"恢復任務",runNow:"立即執行",triggerImmediately:"立即觸發"},runHistory:{title:"執行歷史",runs:"次執行",noRuns:"目前無執行歷史。"}},skills:{title:"技能",searchPlaceholder:"搜尋技能...",noMatch:"沒有符合的技能",noSkills:"目前無技能",backTo:"返回",attachedFiles:"附件檔案",loadFailed:"載入技能失敗",fileLoadFailed:"載入檔案失敗",modified:"使用者已修改",archived:"已封存",pinned:"已釘選",pin:"釘選技能",unpin:"取消釘選",pinFailed:"變更釘選狀態失敗",toggleFailed:"切換技能狀態失敗",source:{builtin:"內建",hub:"Hub 安裝",local:"本地安裝"}},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:"取消全選",currentDefault:"目前預設",defaultShort:"預設",aliasEdit:"重新命名",aliasTitle:"模型顯示名",aliasTitleFor:"{model} 的顯示名",aliasPlaceholder:"留空則使用原始模型 ID",aliasHint:"僅修改 Web UI 顯示名,傳送給 Hermes 的仍是原始模型 ID。",aliasCanonical:"原始 ID:{model}",aliasUseOriginal:"恢復原始 ID",aliasManage:"顯示名",aliasManageFor:"{provider} 的顯示名",aliasSaveFailed:"儲存顯示名失敗",visibilitySelectOne:"至少保留一個可見模型",xaiWaiting:"請在開啟的 xAI 頁面完成授權。授權完成後視窗會自動關閉。",xaiOpenLink:"開啟 xAI 授權頁",xaiLoginTitle:"xAI Grok OAuth 登入",xaiExpired:"授權連結已過期,請重試。",xaiCopyLink:"複製授權連結",xaiApproved:"登入成功!"},profiles:{title:"設定檔",create:"建立設定檔",import:"匯入",export:"匯出",rename:"重新命名",delete:"刪除",switchTo:"切換 Hermes Profile",switchConfirm:"將執行 `hermes profile use {name}` 並切換 Hermes CLI 的 active profile,是否繼續?",switchSuccess:"Hermes active profile 已切換為「{name}」",switchFailed:"切換 Hermes Profile 失敗,閘道可能需要手動重新啟動",createSuccess:"設定檔「{name}」已建立",createFailed:"建立設定檔失敗",renameSuccess:"設定檔已重新命名",renameFailed:"重新命名設定檔失敗",deleteConfirm:"確定刪除設定檔「{name}」嗎?",deleteSuccess:"設定檔已刪除",deleteFailed:"刪除設定檔失敗",exportSuccess:"設定檔已匯出",exportFailed:"匯出設定檔失敗",importSuccess:"設定檔已匯入",importFailed:"匯入設定檔失敗",importSelectFile:"選擇封存檔案",importInvalidFile:"請選擇有效的封存檔案 (.tar.gz, .tgz, .gz, .zip)",name:"設定檔名稱",namePlaceholder:"僅限小寫字母、數字、連字號",nameValidation:"設定檔名稱只能包含小寫字母、數字、底線和連字號",newName:"新名稱",newNamePlaceholder:"小寫字母、數字、連字號",cloneFromCurrent:"從目前設定檔複製",cloneCleanupNotice:"複製時會自動略過獨占型平台憑證(Weixin / Telegram / Slack 等),避免與來源設定檔衝突",cloneStrippedCredentials:"已清理 {count} 項獨占憑證:{list}",cloneDisabledPlatforms:"已停用 {count} 個平台:{list}",cloneStrippedConfigCredentials:"已清理 config.yaml 中 {count} 項嵌入憑證:{list}",archivePath:"封存路徑",archivePathPlaceholder:"封存檔案的伺服器路徑",importName:"設定檔名稱(選填)",importNamePlaceholder:"留空則使用封存名稱",active:"使用中",model:"模型",gateway:"閘道",alias:"別名",provider:"Provider",path:"路徑",skills:"技能",hasEnv:"有 .env",hasSoulMd:"有 soul.md",noProfiles:"目前無設定檔,建立一個開始吧。",avatar:{title:"自訂頭像",customize:"頭像",upload:"上傳圖片",random:"隨機產生",reset:"恢復預設",hint:"支援 PNG、JPEG、WebP,最大 1MB",invalidType:"請選擇 PNG、JPEG 或 WebP 圖片",tooLarge:"頭像圖片不能超過 1MB",saveSuccess:"頭像已儲存",saveFailed:"儲存頭像失敗",resetSuccess:"已恢復預設頭像",resetFailed:"恢復預設頭像失敗"},runtime:{activeProfile:"目前:{name}",bridgeWorker:"橋接狀態",gateway:"閘道",active:"使用中",activeTag:"目前",idle:"閒置",running:"執行中",stopped:"已停止",restartGateway:"重啟閘道",restartProfile:"重啟設定檔",switchProfile:"切換前端設定檔",gatewayRestarted:"閘道已重啟:{name}",gatewayRestartFailed:"重啟閘道失敗",profileRestarted:"設定檔已重啟:{name}",profileRestartFailed:"重啟設定檔失敗"}},logs:{title:"日誌",all:"全部",searchPlaceholder:"搜尋...",refresh:"重新整理",noEntries:"目前無日誌"},settings:{title:"設定",saved:"已儲存",saveFailed:"儲存失敗",tabs:{display:"顯示",account:"目前帳號",users:"帳號管理",agent:"代理",memory:"記憶",compression:"上下文壓縮",session:"工作階段",privacy:"隱私",apiServer:"API 伺服器",models:"模型",voice:"語音"},models:{apiKey:"API Key",apiKeyPlaceholder:"輸入 API Key",save:"儲存",saved:"已儲存",saveFailed:"儲存失敗",noProviders:"目前無已設定的模型"},display:{streaming:"串流回應",streamingHint:"即時顯示 AI 回覆",compact:"緊湊模式",compactHint:"減少訊息間距",showReasoning:"顯示推理過程",showReasoningHint:"展示模型思考過程",showCost:"顯示費用",showCostHint:"在回覆中顯示 token 使用量",inlineDiffs:"內嵌差異",inlineDiffsHint:"程式碼變更以內嵌方式顯示",bellOnComplete:"完成提示音",bellOnCompleteHint:"AI 回覆完成時播放提示音",busyInputMode:"忙碌輸入模式",busyInputModeHint:"AI 處理中仍可輸入",theme:"主題",themeHint:"選擇淺色、暗色或跟隨系統",themeLight:"淺色",themeDark:"暗色",themeSystem:"跟隨系統"},agent:{maxTurns:"最大輪次",maxTurnsHint:"單次對話最大互動輪數",gatewayTimeout:"閘道逾時",gatewayTimeoutHint:"單次請求逾時時間(秒)",restartDrainTimeout:"重啟排空逾時",restartDrainTimeoutHint:"重啟前排空請求的逾時時間(秒)",toolEnforcement:"工具執行策略",toolEnforcementHint:"控制工具呼叫的執行模式",auto:"自動",always:"始終",never:"從不"},memory:{enabled:"啟用記憶",enabledHint:"允許 AI 記住對話上下文",userProfile:"使用者畫像",userProfileHint:"允許 AI 記住使用者偏好資訊",charLimit:"記憶字元上限",charLimitHint:"MEMORY.md 最大字元數",userCharLimit:"使用者畫像字元上限",userCharLimitHint:"USER.md 最大字元數"},compression:{enabled:"啟用壓縮",enabledHint:"長對話接近模型上下文上限前自動壓縮歷史",threshold:"壓縮閾值",thresholdHint:"預估 token 超過上下文比例時開始壓縮",targetRatio:"目標比例",targetRatioHint:"壓縮後歷史保留到上下文的目標比例",protectLastN:"保護最近訊息",protectLastNHint:"最近多少則訊息不參與壓縮",protectFirstN:"保護開頭訊息",protectFirstNHint:"最早多少則訊息不參與壓縮"},session:{mode:"重設模式",modeHint:"工作階段重設的觸發條件",modeBoth:"閒置 + 定時",modeIdle:"僅閒置",modeDaily:"僅定時",modeNone:"永不(僅手動)",idleMinutes:"閒置逾時",idleMinutesHint:"無操作後自動重設的等待時間(分鐘)",atHour:"定時重設時間",humanOnly:"僅顯示人類工作階段",humanOnlyHint:"預設隱藏子代理和工作階段監看雜訊",liveMonitorHumanOnly:"即時監看:僅顯示人類工作階段",liveMonitorHumanOnlyHint:"在即時監看中預設隱藏子代理和工作階段監看雜訊",atHourHint:"每天在指定小時重設工作階段",requireAuth:"工作階段授權",requireAuthHint:"修改工作階段操作是否授權"},privacy:{redactPii:"遮蔽 PII",redactPiiHint:"自動偵測並隱藏敏感資訊(密碼、金鑰等)"},apiServer:{enable:"啟用",enableHint:"啟用 API 伺服器",host:"主機",hostHint:"監聽位址",port:"連接埠",portHint:"監聽連接埠",key:"金鑰",keyHint:"API 存取金鑰",cors:"CORS 來源",corsHint:"允許的跨域來源"},lockedIps:{title:"鎖定 IP 管理",count:"{count} 個 IP 被鎖定",empty:"目前無鎖定 IP",unlock:"解鎖",unlockAll:"全部解鎖",unlockAllConfirm:"確認解鎖所有鎖定的 IP?",unlocked:"IP 已解鎖",allUnlocked:"已解鎖 {count} 個 IP"},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:"該智慧代理已在房間中",agentAddFailedCount:"{count} 個智慧代理未新增:{details}",noAgents:"目前房間無智慧代理",members:"成員",roomCreated:"房間已建立",roomDeleted:"房間已刪除",roomCloned:"房間已複製",cloneRoom:"複製房間",copyRoomLink:"複製房間連結",deleteRoomConfirm:"確定刪除這個房間嗎?",clearContext:"清理上下文",clearContextConfirm:"確定清理目前房間上下文嗎?訊息和壓縮快照會被刪除,智慧代理和成員會保留。",contextCleared:"上下文已清理",you:"你",joined:"已加入房間",joinFailed:"加入房間失敗",inputPlaceholder:"輸入訊息... (Enter 發送)",enterCode:"輸入邀請碼",yourName:"你的名稱",yourNamePlaceholder:"輸入你的群聊暱稱",yourDescription:"自我介紹(選填)",yourDescriptionPlaceholder:"介紹一下你自己...",agentName:"Agent 名稱",agentNamePlaceholder:"自訂名稱(留空則使用 profile 名稱)",agentDesc:"Agent 描述",agentDescPlaceholder:"描述這個 agent 的作用...",agentReplying:"正在回覆...",agentCompressing:"正在壓縮上下文...",compressionSettings:"壓縮設定",triggerTokens:"觸發壓縮 Token 數",triggerTokensDesc:"訊息 token 數超過此值時觸發上下文壓縮",maxHistoryTokens:"最大歷史 Token 數",maxHistoryTokensDesc:"壓縮後傳送給 LLM 的最大 token 數",tailMessageCount:"保留最近訊息數",tailMessageCountDesc:"壓縮後保留最近的原始訊息條數",compressionConfig:"壓縮設定",compressionSaved:"壓縮設定已儲存",compressNow:"立即壓縮",compressingInProgress:"正在壓縮中,請稍後"},usage:{title:"用量統計",refresh:"重新整理",totalTokens:"總 Token 數",inputTokens:"輸入",outputTokens:"輸出",totalSessions:"總工作階段數",avgPerDay:"日均 ~{n}",estimatedCost:"預估費用",cacheHitRate:"快取命中率",modelBreakdown:"模型分布",dailyTrend:"每日用量",date:"日期",tokens:"Token",cache:"快取",cacheRead:"快取讀取",cacheWrite:"快取寫入",sessions:"工作階段",cost:"費用",noData:"目前無用量資料"},skillsUsage:{title:"技能用量",subtitle:"追蹤 Hermes 工作階段中的技能載入與編輯",refresh:"重新整理",periodSelector:"技能用量期間",periodLabel:"{days}天",summary:"總覽",totalActions:"操作",loads:"載入",edits:"編輯",distinctSkills:"技能數",topSkills:"熱門",dailyTrend:"趨勢",periodSummary:"最近 {days} 天",skill:"技能",share:"占比",lastUsed:"最近",noData:"暫無技能用量資料",loadFailed:"技能用量載入失敗",otherSkills:"其他技能"},files:{title:"檔案",fileTree:"檔案樹",tree:"目錄樹",list:"檔案清單",breadcrumbRoot:"根目錄",newFile:"新增檔案",newFolder:"新增資料夾",upload:"上傳",refresh:"重新整理",open:"開啟",edit:"編輯",preview:"預覽",download:"下載",copyPath:"複製路徑",rename:"重新命名",delete:"刪除",name:"名稱",size:"大小",modified:"修改時間",actions:"操作",emptyDir:"空目錄",loading:"載入中...",confirmDelete:"確定要刪除「{name}」嗎?",confirmDeleteDir:"確定要刪除目錄「{name}」及其所有內容嗎?",deleteFailed:"刪除失敗",deleted:"已刪除",renameTo:"重新命名為",newFileName:"檔案名稱",newFolderName:"資料夾名稱",created:"已建立",createFailed:"建立失敗",renamed:"已重新命名",renameFailed:"重新命名失敗",uploadSuccess:"已上傳 {count} 個檔案",uploadFailed:"上傳失敗",saveFailed:"儲存失敗",saved:"已儲存",unsavedChanges:"有未儲存的變更,是否捨棄?",pathCopied:"路徑已複製",fileTooLarge:"檔案過大(最大 10MB)",permissionDenied:"無法修改受保護的檔案",notFound:"檔案或目錄不存在",backendError:"檔案操作失敗",dragDropHint:"拖曳檔案至此處上傳",closeEditor:"關閉編輯器",closePreview:"關閉",saveFile:"儲存"},download:{downloading:"正在下載...",downloadFailed:"下載失敗",fileNotFound:"檔案不存在或已被刪除",fileTooLarge:"檔案過大(超過限制)",backendError:"檔案讀取失敗,遠端環境可能不可用",backendTimeout:"檔案讀取逾時",unsupportedBackend:"目前 terminal backend 暫不支援檔案下載",invalidPath:"無效的檔案路徑",contentDisplay:"內容展示",download:"下載",downloadFile:"下載檔案"},changelog:{new_0_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_30_1:"Bridge 聊天改為保留結構化歷史,修復工具調用歷史轉文本後導致模型偶發不返回、工具不執行的問題",new_0_5_30_2:"群聊 @ 多 Agent 路由更可靠,發送給每個 Agent 時會移除自己的 @,並改善刷新後的使用者暱稱綁定",new_0_5_30_3:"模型頁、聊天模型下拉和工作階段模型選擇改為按目前 Profile 展示,預設模型標記更準確",new_0_5_30_4:"精簡 Gateway 管理:移除獨立網關頁面,按各 Profile 的平台配置檢查並拉起需要運行的 gateway,並改用輕量 gateway runner 管理啟動和重啟",new_0_5_30_5:"增強 Docker、Termux 和 Windows 的 Gateway 啟動流程,處理運行鎖、端口衝突、後台執行和重啟場景",new_0_5_30_6:"優化 Windows 相容性:路徑識別、檔案下載、任務/更新子程序不再彈出額外終端視窗",new_0_5_30_7:"修復配置寫入和 Provider 預設:加強 .env 校驗,FUN-Codex 改走 Responses API,並更新 Z.AI/GLM 模型列表",new_0_5_30_8:"前端體驗細節優化:折疊側邊欄布局、分組短標題、側邊欄分隔線和對話大綱樣式更穩定",new_0_5_30_9:"上下文壓縮現在跟隨 Profile 壓縮配置,並在舊快照失效時複用舊摘要和安全尾部,避免重新壓縮完整歷史",new_0_5_31_1:"增強 Bridge Broker 重啟穩定性,修復群聊最終串流渲染,並新增群聊 {'@'}all 路由",new_0_5_31_2:"檔案管理支援複製絕對路徑,並修復行動端工作階段抽屜層級遮擋問題",new_0_5_31_3:"Profile 選擇器新增頭像展示、自訂頭像、執行狀態彈窗,以及網關/Profile 重啟操作",new_0_5_31_4:"Profile 頭像會同步用於單聊、群聊和折疊側邊欄,頭像中繼資料保存到 Web UI 目錄並相容 Windows 路徑",new_0_5_31_5:"改進 Docker、Termux、Windows 的 gateway 偵測和重啟邏輯,優先使用 gateway_state/gateway.pid 判斷 managed gateway 是否存活",new_0_5_31_6:"新增 APIKEY.FUN 生圖媒體接口和內建 apikey-image-gen skill,支援文生圖、圖生圖和圖片編輯,並從 active Profile 的 fun-codex 配置讀取憑據",new_0_5_33_1:"單聊和群聊的執行失敗、Socket 錯誤會作為紅色 Agent 訊息保留在訊息列表中,不再一閃而過",new_0_5_33_2:"會話搜尋支援按目前選中的 Profile 限定範圍,未選擇 Profile 時仍可搜尋全部 Profile",new_0_5_33_3:"Skills 頁面新增中英文推薦清單,未選中 Skill 時展示推薦內容,並支援再次點擊已選 Skill 取消選中",new_0_5_33_4:"清理未使用的 changelog 國際化內容,減少前端 i18n 體積",new_0_5_33_5:"修復 Windows 中文系統下 agent bridge 解析 netstat 輸出編碼失敗導致啟動異常的問題",new_0_5_33_6:"更新 Nous Portal 預設模型列表,對齊公開 catalog 和 Portal 推薦模型",new_0_5_33_7:"Profile 列表和執行狀態改為從目錄讀取 Profile 名稱、從 config 讀取預設模型,避免 CLI 表格欄寬導致 name/model/gateway 解析錯位",new_0_5_34_1:"儲存工作階段和群聊訊息時會規範化多模態工具結果,避免 base64 圖片污染回放內容",new_0_5_34_2:"自訂 Hermes 模型改由後端設定持久化,並新增新增/移除模型介面",new_0_5_34_3:"修復 Bridge 執行結束後的最終上下文用量和工具狀態更新",new_0_5_34_4:"最佳化看板篩選、負責人展示、卡片操作和任務詳情處理",new_0_5_34_5:"修復壓縮用量統計:快取固定 prompt/tool 上下文,並顯示完整上下文 token 總量",new_0_5_34_6:"群聊 Agent 快取各自固定上下文,僅在真正開始壓縮時顯示壓縮進度",new_0_5_34_7:"Web UI 內建 Skills 會同步注入到所有 Profile,並在日誌中標明目標 Profile",new_0_5_34_8:"如果 Windows 下看板功能異常,請升級 Hermes 以取得最新的看板資料庫遷移修復",new_0_5_35_1:"Bridge 工作階段支援不同 session 並發執行,同一 session 仍保持串行以避免訊息順序錯亂",new_0_5_35_2:"新增「效能監控」頁面,可查看系統 CPU/記憶體、Web UI、Bridge Broker、Workers 和活躍工作階段狀態",new_0_5_35_3:"新增 Worker 級資源統計,展示每個 worker 的 CPU、記憶體、Profile、工作階段數和執行狀態",new_0_5_35_4:"最佳化 Bridge worker 生命週期清理,Broker 關閉或父行程退出時會回收 worker,減少殘留 Python 行程",new_0_5_35_5:"監控介面增強跨平台相容,支援 macOS、Windows、Linux、Docker 和 Termux 的資源採集降級",new_0_5_35_6:"效能監控不再因 Agent 初始化中的 worker 請求而阻塞,降低 Windows 上 request timed out 的機率",new_0_5_35_7:"聊天 Markdown 新增文字內容內嵌預覽,下載圖示會直接下載檔案,避免被預覽抽屜攔截",new_0_5_35_8:"最佳化內容展示抽屜:行動端全寬並提供關閉入口,桌面端加寬到 800px,文字與 Markdown 背景保持一致",new_0_6_0_1:"分帳戶、分 Profile 管理現在一致保護工作階段、模型、用量、看板、任務、上傳、媒體與相關 Hermes API",new_0_6_0_2:"內建媒體 Skills 只會在媒體端點使用產生的伺服器 token,並依請求的 Profile 讀取 fun-codex/xAI 憑證",new_0_6_0_3:"單聊與群聊都會把目前 Hermes Profile 注入執行提示,方便 Skills 請求時帶上 X-Hermes-Profile",new_0_6_0_4:"delegate_task 的 subagent 進度會即時顯示在聊天介面,包含開始、工具、進度與完成狀態",new_0_6_0_5:"停止或中止執行時會清理暫時事件,避免舊的 abort 狀態帶入下一次聊天",new_0_6_0_6:"同步更新文件與官網文案,涵蓋帳戶管理、預設憑證、分帳戶分 Profile 管理、上傳下載與內建媒體 Skills",new_0_6_0_7:"新增 CLI 維護命令,用於清理登入 IP 鎖與重設預設 admin / 123456 登入帳戶",new_0_6_0_8:"0.6.0 是 Web UI 從單使用者走向多使用者的分界版本;如果多使用者模式遇到問題,請提交 issue,必要時可回退到 0.5.35 單使用者版本"}},Ct={login:{title:"Hermes Web UI",description:"ユーザー名とパスワードを入力して続行してください。",placeholder:"アクセストークン",submit:"ログイン",tokenRequired:"アクセストークンを入力してください",invalidToken:"無効なトークンです",connectionFailed:"サーバーに接続できません",passwordLogin:"パスワード",tokenLogin:"トークン",usernamePlaceholder:"ユーザー名",passwordPlaceholder:"パスワード",defaultCredentialsHint:"既定のユーザー名:admin、既定のパスワード:123456",credentialsRequired:"ユーザー名とパスワードを入力してください",invalidCredentials:"ユーザー名またはパスワードが正しくありません",tooManyAttempts:"ログイン試行回数が多すぎます。しばらくしてからお試しください",sessionExpired:"ログインの有効期限が切れました。再度ログインしてください。",accessDenied:"このリソースにアクセスする権限がありません。",passwordMismatch:"パスワードが一致しません",passwordTooShort:"パスワードは6文字以上必要です",setupSuccess:"パスワードログインが設定されました",passwordChanged:"パスワードが変更されました",passwordRemoved:"パスワードログインが削除されました",setupPassword:"パスワードログインを設定",changePassword:"パスワードを変更",changeUsername:"ユーザー名を変更",removePasswordLogin:"削除",username:"ユーザー名",currentPassword:"現在のパスワード",newPassword:"新しいパスワード",confirmPassword:"パスワード確認",newUsername:"新しいユーザー名",usernameChanged:"ユーザー名が変更されました",usernameTooShort:"ユーザー名は2文字以上必要です",setupDescription:"ログインに使用するユーザー名とパスワードを管理します。",removeConfirm:"ユーザーアカウントにはパスワードログインが必要です。",passwordLoginNotConfigured:"パスワードログイン未設定",passwordLoginConfigured:"現在のアカウント:{username}",defaultCredentialTitle:"既定のアカウント情報を変更してください",defaultCredentialMessage:"現在のログインアカウントは、既定のユーザー名または既定のパスワードをまだ使用しています。不正アクセスを防ぐため、できるだけ早く現在のアカウントでユーザー名とパスワードを変更してください。",defaultCredentialAction:"変更する",defaultCredentialLater:"後で通知"},users:{title:"アカウント管理",description:"ユーザーを作成し、ロールを割り当て、通常管理者がアクセスできるプロファイルを制御します。",create:"ユーザー作成",edit:"ユーザー編集",username:"ユーザー名",role:"ロール",statusLabel:"ステータス",profiles:"アクセス可能なプロファイル",profilesPlaceholder:"アクセス可能なプロファイルを選択",allProfiles:"すべてのプロファイル",noProfiles:"プロファイル未割り当て",lastLogin:"最終ログイン",newPasswordOptional:"新しいパスワード(空欄なら変更なし)",loadFailed:"ユーザー一覧の読み込みに失敗しました",deleteConfirm:"このユーザーを削除しますか?",enable:"有効化",disable:"無効化",roles:{superAdmin:"スーパー管理者",admin:"管理者"},status:{active:"有効",disabled:"無効"}},common:{loading:"読み込み中...",cancel:"キャンセル",retry:"再試行",delete:"削除",edit:"編集",save:"保存",saved:"保存しました",update:"更新",create:"作成",saveFailed:"保存に失敗しました",deleteFailed:"削除に失敗しました",ok:"OK",copied:"コピーしました",copy:"コピー",noData:"データがありません",fetch:"取得",add:"追加",enable:"有効化",disable:"無効化",configured:"設定済み",notConfigured:"未設定",confirm:"確認",expand:"展開",collapse:"折りたたむ",stop:"停止",start:"開始",expired:"期限切れ"},sidebar:{chat:"チャット",search:"検索",apiRelay:"APIリレー",history:"履歴",jobs:"ジョブ",models:"モデル",profiles:"プロファイル",plugins:"プラグイン",skills:"スキル",memory:"メモリ",logs:"ログ",usage:"使用量",performance:"パフォーマンス",skillsUsage:"スキル使用状況",channels:"チャンネル",terminal:"ターミナル",files:"ファイル",groupChat:"グループチャット",groupConversation:"会話",groupConversationShort:"会話",groupAgent:"エージェント",groupAgentShort:"エージェント",groupSystem:"システム",groupSystemShort:"シス",groupMonitoring:"監視",groupMonitoringShort:"監視",settings:"設定",connected:"接続済み",disconnected:"未接続",updateTip:'ターミナルで "hermes-web-ui update" を実行して更新してください',updateVersion:"v{version} にアップグレード",reloadClientVersion:"v{version} に再読み込み",updating:"更新中...",updateSuccess:"更新が完了しました。しばらくしてからページを再読み込みしてください。長時間起動しない場合は手動で起動してください。",updateFailed:"更新に失敗しました",logout:"ログアウト",nodeVersionWarning:"Node.js v{version} が検出されました。バージョン23以降にアップグレードしてください。",changelog:"更新履歴",noChangelog:"更新履歴はありません",kanban:"カンバン",groupTools:"ツール",groupPlatform:"プラットフォーム",gateways:"ゲートウェイ",expand:"メニューを展開",collapse:"メニューを折りたたむ"},performance:{title:"パフォーマンス",subtitle:"システムリソース、Bridge Broker、Workers、アクティブセッションを確認",refresh:"更新",autoRefreshOn:"自動更新",autoRefreshOff:"手動更新",loadFailed:"パフォーマンスデータの読み込みに失敗しました",systemCpu:"システム CPU",systemMemory:"システムメモリ",activeSessions:"アクティブセッション",runningSessions:"実行中 {count}",workers:"Workers",totalWorkerMemory:"Worker 合計メモリ",processes:"プロセス",uptime:"稼働時間",running:"実行中",stopped:"停止",workerMemory:"Worker メモリ",lastUpdated:"更新時刻",profile:"Profile",memory:"メモリ",sessions:"セッション",runningActiveSessions:"実行中 / アクティブ",lastUsed:"最終使用",status:"状態",noWorkers:"Worker はありません",sessionsByProfile:"Profile 別セッション",noActiveSessions:"アクティブセッションはありません"},drawer:{terminal:"ターミナル",files:"ワークスペース"},chat:{contextRemaining:"残り",contextClickToEdit:"クリックしてコンテキスト長を編集",contextEditTitle:"コンテキスト長を編集",contextEditDesc:"現在のモデルのコンテキスト長制限を設定(トークン数)",contextEditPlaceholder:"コンテキスト長を入力",contextEditHint:"一般的な値:200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"保存",contextEditCancel:"キャンセル",contextEditInvalid:"有効なコンテキスト長を入力してください",contextEditSuccess:"コンテキスト長を更新しました",contextEditFailed:"更新に失敗しました",emptyState:"Hermes Agent と会話を開始しましょう",outlineTitle:"会話アウトライン",outlineEmpty:"会話内容はありません",outlineUserQuestion:"ユーザーの質問",inputPlaceholder:"メッセージを入力... (Enter で送信、Shift+Enter で改行)",slashCommandArgs:{message:"<メッセージ>",title:"<タイトル>",text:"<テキスト>"},slashCommands:{usage:"現在のセッション使用量を計算",status:"セッション状態とキューを表示",abort:"実行中の Bridge を停止",queue:"実行中の処理の後ろにメッセージをキュー追加",clear:"現在の表示をクリア",clearHistory:"このセッションの保存済みメッセージ履歴を削除",title:"このセッション名を変更",compress:"アイドル時にコンテキスト圧縮を実行",steer:"実行中の Bridge に誘導テキストを送信",destroy:"このセッションの Bridge Agent を解放"},attachFiles:"ファイルを添付",showToolCalls:"ツール呼び出しを表示",hideToolCalls:"ツール呼び出しを非表示",messageQueue:"メッセージキュー",removeQueuedMessage:"キューのメッセージを削除",stop:"停止",send:"送信",contextUsed:"コンテキスト使用量:",sessions:"セッション",webUiSessions:"セッション",allProfiles:"すべてのプロファイル",profileMissingModelsTip:"このセッションのプロファイル「{profile}」には利用可能なプロバイダーまたはモデルがありません",sessionScopeHint:"チャットには Web UI/API Server セッションのみ表示されます。CLI、Telegram、Discord、Cron などのチャンネルセッションは履歴で読み取り専用として表示されます。",openHistory:"履歴を開く",hermesHistory:"Hermes 履歴",historyScopeHint:"現在の profile の Hermes 履歴セッションをソース別に読み取り専用で表示します。",noSessions:"セッションがありません",newChat:"新しいチャット",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:"アシスタント",copySessionLink:"セッションリンクをコピー",copySessionId:"セッション ID をコピー",export:"エクスポート",exportFull:"フルエクスポート (JSON)",exportCompressed:"圧縮エクスポート (TXT)",exportCompressing:"コンテキストを圧縮中、お待ちください...",exportSuccess:"セッションをエクスポートしました",exportFailed:"エクスポートに失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",renameSession:"セッション名の変更",sessionNotFound:"セッションが見つかりません",enterNewTitle:"新しいタイトルを入力",other:"その他",runFailed:"実行に失敗しました",error:"エラー",tool:"ツール",arguments:"引数",result:"結果",truncated:"... (省略)",executionDuration:"実行時間",thinkingLabel:"思考過程",thinkingInProgress:"思考中…",thinkingShow:"思考過程を表示",thinkingHide:"思考過程を隠す",thinkingDuration:"観測 {duration}",thinkingChars:"{count} 文字",copyBubble:"メッセージをコピー",copiedBubble:"コピーしました",copyFailed:"コピーに失敗しました",playSpeech:"音声を読み上げ",pauseSpeech:"一時停止",resumeSpeech:"再開",stopSpeech:"停止",speechNotSupported:"このブラウザは音声読み上げをサポートしていません",searchEnterHint:"Enter で開く · Esc で閉じる",searchHint:"Cmd/Ctrl+K",searchScope:"検索範囲: Web UI のローカルセッション DB のみ。読み取り専用の Hermes 履歴セッションは含まれません。",searchFailed:"セッション検索に失敗しました",searchNoSnippet:"表示できる要約がありません",searchNoResults:"一致するセッションがありません",searchRecent:"最近のセッション",searchEmpty:"最近のセッション",searchPlaceholder:"セッションを検索...",searchSubtitle:"タイトルまたはメッセージ内容で検索",searchTitle:"セッション検索",stopGateway:"Gateway を停止",start:"開始",workspaceSetFailed:"Workspace の設定に失敗しました",workspaceSet:"Workspace を設定しました",workspacePlaceholder:"プロジェクトパスを入力 例: /home/user/project",workspace:"ワークスペース",setWorkspaceTitle:"セッション Workspace を設定",setWorkspace:"Workspace を設定",modelSetFailed:"モデルの設定に失敗しました",modelSet:"モデルを設定しました",setModelTitle:"セッションモデルを設定",setModel:"モデルを設定",newCliChat:"新規 CLI",cliEmptyState:"CLI チャットを開始",autoPlaySpeech:"音声を自動再生"},jobs:{title:"スケジュールジョブ",createJob:"ジョブを作成",editJob:"ジョブを編集",noJobs:"スケジュールジョブがありません。作成して始めましょう。",name:"名前",namePlaceholder:"ジョブ名",schedule:"スケジュール (Cron 式)",schedulePlaceholder:"例: 0 9 * * *",quickPresets:"クイックプリセット",selectPreset:"プリセットを選択...",presetEveryMinute:"毎分",presetEvery5Min:"5分ごと",presetEveryHour:"毎時",presetEveryDay:"毎日 00:00",presetEveryDay9:"毎日 09:00",presetEveryMonday:"毎週月曜 09:00",presetEveryMonth:"毎月1日 09:00",prompt:"プロンプト",promptPlaceholder:"実行するプロンプト",deliverTarget:"配信先",origin:"配信元",local:"ローカル",repeatCount:"繰り返し回数(任意)",modelPlaceholder:"デフォルトモデル",repeatPlaceholder:"空白の場合は無制限",jobCreated:"ジョブを作成しました",jobUpdated:"ジョブを更新しました",nameRequired:"名前は必須です",scheduleRequired:"スケジュールは必須です",loadFailed:"ジョブの読み込みに失敗しました",jobPaused:"ジョブを一時停止しました",jobResumed:"ジョブを再開しました",jobTriggered:"ジョブをトリガーしました",modelUpdated:"モデルを更新しました",jobDeleted:"ジョブを削除しました",status:{running:"実行中",paused:"一時停止",disabled:"無効",scheduled:"スケジュール済み"},info:{model:"モデル",schedule:"スケジュール",lastRun:"前回実行",nextRun:"次回実行",deliver:"配信",repeat:"繰り返し"},action:{pause:"一時停止",pauseJob:"ジョブを一時停止",resume:"再開",resumeJob:"ジョブを再開",runNow:"今すぐ実行",triggerImmediately:"すぐにトリガー"},runHistory:{title:"実行履歴",runs:"件",noRuns:"実行履歴がありません。"}},skills:{title:"スキル",searchPlaceholder:"スキルを検索...",noMatch:"検索に一致するスキルがありません",noSkills:"スキルがありません",backTo:"戻る",attachedFiles:"添付ファイル",loadFailed:"スキルの読み込みに失敗しました",fileLoadFailed:"ファイルの読み込みに失敗しました",modified:"ユーザー変更あり",archived:"アーカイブ済み",pinned:"ピン留め",pin:"スキルをピン留め",unpin:"ピン留めを解除",pinFailed:"ピン留め状態の変更に失敗しました",toggleFailed:"スキルの切り替えに失敗しました",source:{builtin:"組み込み",hub:"Hub",local:"ローカル"}},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:"プロバイダー管理"},status:{enabled:"有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},statusLabel:{enabled:"設定で有効","auto-active":"自動有効",inactive:"非アクティブ",disabled:"無効","provider-managed":"プロバイダー管理"},configStatuses:{enabled:"有効",disabled:"無効","not-enabled":"未有効",auto:"自動","provider-managed":"プロバイダー管理"},table:{plugin:"プラグイン",status:"ステータス",source:"ソース",kind:"種類",capabilities:"機能",path:"パス / entrypoint",cli:"CLI"},capabilities:{tools:"{count} tools",hooks:"{count} hooks",env:"{count} env"},metadata:{agentRoot:"エージェントルート",python:"Python",scanCwd:"cwd をスキャン",projectPlugins:"プロジェクトプラグイン"}},memory:{title:"メモリ",refresh:"更新",loadFailed:"メモリの読み込みに失敗しました",myNotes:"メモ",noNotes:"メモはまだありません。",notesPlaceholder:"メモを入力...",userProfile:"ユーザープロファイル",noProfile:"プロファイルはまだありません。",profilePlaceholder:"プロファイルを入力...",soul:"ソウル",noSoul:"ソウル設定はまだありません。",soulPlaceholder:"ソウル設定を入力..."},models:{title:"モデル",addProvider:"プロバイダーを追加",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:"選択をクリア",currentDefault:"現在のデフォルト",defaultShort:"デフォルト",builtIn:"組み込み",customType:"カスタム",provider:"プロバイダー",contextLength:"コンテキスト長",contextLengthPlaceholder:"例: 200000(任意)",local:"ローカル ({host})",selectProviderRequired:"プロバイダーを選択してください",baseUrlRequired:"ベース URL は必須です",apiKeyRequired:"API キーは必須です",modelRequired:"デフォルトモデルは必須です",enterBaseUrl:"ベース URL を先に入力してください",unexpectedFormat:"予期しないレスポンス形式です",foundModels:"{count} 個のモデルが見つかりました",fetchFailed:"モデルの取得に失敗しました",xaiWaiting:"開いた xAI ページで認可を完了してください。承認後、このウィンドウは自動で閉じます。",xaiOpenLink:"xAI 認可ページを開く",xaiLoginTitle:"xAI Grok OAuth ログイン",xaiExpired:"認可リンクの期限が切れました。再試行してください。",xaiCopyLink:"認可リンクをコピー",xaiApproved:"ログイン成功!",visibilitySelectOne:"少なくとも 1 つの表示モデルを残してください",visibilitySaved:"表示モデルを保存しました",visibilitySaveFailed:"表示モデルの保存に失敗しました",visibilityHint:"Web UI のモデル選択とモデルページの表示だけに影響します。Hermes CLI の provider/model 設定は変更されず、実際の呼び出しは元のモデル ID を使います。",showAllModels:"すべてのモデルを表示",searchPlaceholder:"モデルを検索...",removeCustomModel:"この一覧外モデルを削除",more:"件追加",models:"モデル一覧",manageVisibleModelsFor:"{name} の表示モデルを管理",manageVisibleModels:"表示モデルを管理",getApiKey:"API Key を取得",count:"個のモデル",aliasUseOriginal:"元の ID に戻す",aliasTitleFor:"{model} の表示名",aliasTitle:"モデル表示名",aliasSaveFailed:"表示名の保存に失敗しました",aliasPlaceholder:"空欄の場合は元のモデル ID を使用",aliasManageFor:"{provider} の表示名",aliasManage:"表示名",aliasHint:"Web UI の表示名だけを変更します。Hermes には元のモデル ID が送信されます。",aliasEdit:"名前変更",aliasCanonical:"元の ID: {model}"},profiles:{title:"プロファイル",create:"プロファイルを作成",import:"インポート",export:"エクスポート",rename:"名前変更",delete:"削除",switchTo:"Hermes Profile を切り替え",switchConfirm:"`hermes profile use {name}` を実行し、Hermes CLI の active profile を切り替えます。続行しますか?",switchSuccess:"Hermes active profile を「{name}」に切り替えました",switchFailed:"Hermes Profile の切り替えに失敗しました。ゲートウェイの手動再起動が必要な場合があります。",createSuccess:"プロファイル「{name}」を作成しました",createFailed:"プロファイルの作成に失敗しました",renameSuccess:"プロファイル名を変更しました",renameFailed:"プロファイル名の変更に失敗しました",deleteConfirm:"プロファイル「{name}」を削除しますか?",deleteSuccess:"プロファイルを削除しました",deleteFailed:"プロファイルの削除に失敗しました",exportSuccess:"プロファイルをエクスポートしました",exportFailed:"プロファイルのエクスポートに失敗しました",importSuccess:"プロファイルをインポートしました",importFailed:"プロファイルのインポートに失敗しました",importSelectFile:"アーカイブファイルを選択",importInvalidFile:"有効なアーカイブファイルを選択してください (.tar.gz, .tgz, .gz, .zip)",name:"プロファイル名",namePlaceholder:"英数字、ハイフンのみ",nameValidation:"プロファイル名には小文字、数字、アンダースコア、ハイフンのみ使用できます",newName:"新しい名前",newNamePlaceholder:"新しい名前を入力",cloneFromCurrent:"現在のプロファイルから複製",cloneCleanupNotice:"複製時、独占型プラットフォーム認証情報(Weixin / Telegram / Slack など)は自動的にスキップされ、ソースプロファイルとの競合を回避します",cloneStrippedCredentials:"{count} 件の独占認証情報を削除しました:{list}",cloneDisabledPlatforms:"{count} 個のプラットフォームを無効化しました:{list}",cloneStrippedConfigCredentials:"config.yaml から {count} 件の埋め込み認証情報を削除しました:{list}",archivePath:"アーカイブパス",archivePathPlaceholder:"アーカイブファイルのサーバーパス",importName:"プロファイル名(任意)",importNamePlaceholder:"空白の場合はアーカイブ名を使用",active:"アクティブ",model:"モデル",gateway:"ゲートウェイ",alias:"エイリアス",provider:"プロバイダー",path:"パス",skills:"スキル",hasEnv:".env あり",hasSoulMd:"soul.md あり",noProfiles:"プロファイルがありません。作成して始めましょう。",avatar:{title:"カスタムアバター",customize:"アバター",upload:"画像をアップロード",random:"ランダム生成",reset:"デフォルトに戻す",hint:"PNG、JPEG、WebP 対応、最大 1MB",invalidType:"PNG、JPEG、WebP 画像を選択してください",tooLarge:"アバター画像は 1MB 以下にしてください",saveSuccess:"アバターを保存しました",saveFailed:"アバターの保存に失敗しました",resetSuccess:"デフォルトアバターに戻しました",resetFailed:"デフォルトアバターへの復元に失敗しました"},runtime:{activeProfile:"現在: {name}",bridgeWorker:"Bridge 状態",gateway:"ゲートウェイ",active:"アクティブ",activeTag:"現在",idle:"待機中",running:"実行中",stopped:"停止中",restartGateway:"Gateway を再起動",restartProfile:"プロファイルを再起動",switchProfile:"フロントエンドプロファイルを切り替え",gatewayRestarted:"Gateway を再起動しました: {name}",gatewayRestartFailed:"Gateway の再起動に失敗しました",profileRestarted:"プロファイルを再起動しました: {name}",profileRestartFailed:"プロファイルの再起動に失敗しました"}},logs:{title:"ログ",all:"すべて",searchPlaceholder:"検索...",refresh:"更新",noEntries:"ログエントリがありません"},settings:{title:"設定",saved:"保存しました",saveFailed:"保存に失敗しました",tabs:{display:"表示",account:"現在のアカウント",users:"アカウント管理",agent:"エージェント",memory:"メモリ",compression:"圧縮",session:"セッション",privacy:"プライバシー",apiServer:"API サーバー",models:"モデル",voice:"音声"},display:{streaming:"ストリームレスポンス",streamingHint:"AI の返信をリアルタイムで表示",compact:"コンパクトモード",compactHint:"メッセージの間隔を狭める",showReasoning:"推論過程を表示",showReasoningHint:"モデルの思考プロセスを表示",showCost:"コストを表示",showCostHint:"返信にトークン使用量を表示",inlineDiffs:"インライン差分",inlineDiffsHint:"コード変更をインラインで表示",bellOnComplete:"完了通知音",bellOnCompleteHint:"AI の応答完了時に通知音を再生",busyInputMode:"処理中入力モード",busyInputModeHint:"AI 処理中でも入力を許可",theme:"テーマ",themeHint:"ライト、ダーク、またはシステム設定に従う",themeLight:"ライト",themeDark:"ダーク",themeSystem:"システム"},agent:{maxTurns:"最大ターン数",maxTurnsHint:"1回の会話の最大インタラクション回数",gatewayTimeout:"ゲートウェイタイムアウト",gatewayTimeoutHint:"リクエストタイムアウト(秒)",restartDrainTimeout:"再起動ドレインタイムアウト",restartDrainTimeoutHint:"再起動前のドレインタイムアウト(秒)",toolEnforcement:"ツール実行ポリシー",toolEnforcementHint:"ツール呼び出しの実行モードを制御",auto:"自動",always:"常に",never:"しない"},memory:{enabled:"メモリを有効化",enabledHint:"AI に会話コンテキストを記憶させる",userProfile:"ユーザープロファイル",userProfileHint:"AI にユーザーの設定を記憶させる",charLimit:"メモリ文字数上限",charLimitHint:"MEMORY.md の最大文字数",userCharLimit:"ユーザープロファイル文字数上限",userCharLimitHint:"USER.md の最大文字数"},compression:{enabled:"圧縮を有効化",enabledHint:"長いチャット履歴がモデルコンテキストを超える前に自動圧縮",threshold:"圧縮しきい値",thresholdHint:"推定トークンがこのコンテキスト比率を超えたら圧縮を開始",targetRatio:"目標比率",targetRatioHint:"圧縮後の履歴サイズをコンテキスト比率で指定",protectLastN:"直近メッセージを保護",protectLastNHint:"この数の最新メッセージは圧縮しない",protectFirstN:"先頭メッセージを保護",protectFirstNHint:"この数の最初のメッセージは圧縮しない"},session:{mode:"リセットモード",modeHint:"セッションリセットのトリガー条件",modeBoth:"アイドル + スケジュール",modeIdle:"アイドルのみ",modeDaily:"スケジュールのみ",modeNone:"無し(手動のみ)",idleMinutes:"アイドルタイムアウト",idleMinutesHint:"自動リセットまでの待機時間(分)",atHour:"スケジュールリセット時刻",humanOnly:"人間のセッションのみ表示",humanOnlyHint:"サブエージェントやセッション監視ノイズを既定で隠します",liveMonitorHumanOnly:"ライブモニター: 人間のセッションのみ表示",liveMonitorHumanOnlyHint:"ライブモニターでサブエージェントやセッション監視ノイズを既定で隠します",atHourHint:"毎日指定時刻にセッションをリセット",requireAuth:"セッション認証",requireAuthHint:"セッション操作に認証を必要とする"},privacy:{redactPii:"個人情報のマスキング",redactPiiHint:"機密情報を自動検出して隠す(パスワード、キーなど)"},apiServer:{enable:"有効化",enableHint:"API サーバーを有効にする",host:"ホスト",hostHint:"リッスンアドレス",port:"ポート",portHint:"リッスンポート",key:"キー",keyHint:"API アクセスキー",cors:"CORS 許可元",corsHint:"許可するクロスオリジン"},voice:{ttsProvider:"TTS プロバイダー",ttsProviderHint:"メッセージ読み上げに使用する音声合成エンジンを選択",providerWebSpeech:"WebSpeech API(ブラウザ)",providerOpenai:"OpenAI TTS",providerCustom:"カスタムエンドポイント(OpenAI 互換)",providerEdge:"Edge TTS(無料、API Key 不要)",webspeechVoice:"音声",webspeechVoiceHint:"ブラウザまたは OS から音声を選択",webspeechVoicePlaceholder:"自動(デフォルト音声)",openaiKey:"API キー",openaiKeyHint:"TTS アクセス権のある OpenAI API キー",openaiUrl:"API ベース URL",openaiUrlHint:"例: https://api.openai.com/v1/audio/speech",openaiModel:"モデル",openaiModelHint:"tts-1(高速)/ tts-1-hd(高音質)",openaiVoice:"音声",openaiVoiceHint:"合成に使用する音色",customHint:"OpenAI 互換の TTS API を使用可能 — GPT-SoVITS、CosyVoice などに対応",customUrl:"API URL",customUrlHint:"TTS サービスのベース URL",customUrlPlaceholder:"ローカルアダプターで設定したアドレス(例:http://127.0.0.1:9880)",customApiKey:"API キー(オプション)",customApiKeyHint:"一部のカスタムエンドポイントは認証が必要",customApiKeyPlaceholder:"不要な場合は空欄",edgeHint:"Microsoft Edge TTS を搭載(node-edge-tts)。",edgeUrl:"アダプター URL",edgeUrlHint:"Edge TTS アダプターのアドレス(例:http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"音声",edgeVoiceHint:"音声合成に使用する音色を選択",edgeRate:"速度",edgeRateHint:"音声の速度を調整(0.5~2.0倍)",edgePitch:"ピッチ",edgePitchHint:"音声のピッチを調整(-20~+20 Hz)",testTitle:"音声テスト",testText:"テストテキスト",testTextPlaceholder:"テストするテキストを入力...",testTextDefault:"こんにちは、これは音声テストです。",testButton:"テスト",testButtonPlaying:"再生中...",testFailed:"テスト失敗:{error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — プリセット音声、音声デザイン、音声クローンの3つのモードをサポート",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com で取得",mimoApiKeyPlaceholder:"MiMo API Key",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をロック解除しました"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key を入力",noProviders:"設定済みプロバイダーがありません",save:"保存",saveFailed:"保存に失敗しました",saved:"保存しました"}},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:"スキャン済み、スマートフォンで確認してください...",qqSandboxHint:"サンドボックス環境を有効化(テスト用)",qqSandbox:"サンドボックスモード",qqQrScanHint:"QQ で上の QR コードをスキャンするか、スマホでリンクを開いて連携を完了します",qqMarkdownHint:"Markdown 形式メッセージを有効化(一部クライアントでは未対応の場合があります)",qqMarkdown:"Markdown サポート",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"ユーザー ID または OpenID の許可リスト。カンマ区切り",allowedUsers:"許可ユーザー",allowAllUsersHint:"任意のユーザーからのメッセージを許可します。オフの場合は許可リストを使用します",allowAllUsers:"すべてのユーザーを許可"},language:{label:"言語",zh:"中文",en:"English",ja:"日本語"},terminal:{sessions:"セッション",newTab:"新しいターミナル",closeSession:"このセッションを閉じますか?",sessionExited:"終了しました",processExited:"プロセスが終了しました(コード {code})",noSessions:"ターミナルセッションがありません",connectionFailed:"ターミナルに接続できませんでした",connectionError:"接続エラー",connectionClosed:"接続が閉じられました"},usage:{title:"使用統計",refresh:"更新",totalTokens:"総トークン数",inputTokens:"入力",outputTokens:"出力",totalSessions:"総セッション数",avgPerDay:"1日平均 ~{n}",estimatedCost:"推定コスト",cacheHitRate:"キャッシュヒット率",modelBreakdown:"モデル別内訳",dailyTrend:"日別使用量",date:"日付",tokens:"トークン",cache:"キャッシュ",cacheRead:"キャッシュ読み取り",cacheWrite:"キャッシュ書き込み",sessions:"セッション",cost:"コスト",noData:"使用データがありません"},skillsUsage:{title:"スキル使用状況",subtitle:"Hermes セッションでのスキル読み込みと編集を追跡します",refresh:"更新",periodSelector:"スキル使用期間",periodLabel:"{days}日",summary:"概要",totalActions:"操作数",loads:"読み込み",edits:"編集",distinctSkills:"スキル数",topSkills:"上位",dailyTrend:"日別",periodSummary:"過去 {days} 日",skill:"スキル",share:"割合",lastUsed:"最終",noData:"スキル使用データはありません",loadFailed:"スキル使用状況の読み込みに失敗しました",otherSkills:"その他"},changelog:{new_0_5_22_1:"Hermes セッション一覧 API が Web UI ローカルストアではなく Profile データベースを読むよう修正",new_0_5_23_1:"Bridge 専用チャットスラッシュコマンドとローカライズ済み候補を追加",new_0_5_23_2:"モデルコンテキスト、使用量、圧縮を汚さずセッション再生用のコマンド履歴を永続化",new_0_5_23_3:"認証情報が Profile 間で漏れないよう gateway Profile 環境変数を分離",new_0_5_23_4:"起動競合を避けるため gateway 割り当て時に Web UI ポートを予約",new_0_5_23_5:"self-update restart で成功した helper 終了を失敗として報告しないよう修正",new_0_5_24_1:"Bridge チャットを API Server のマルチモーダル入力、システムプロンプト、workspace コンテキスト処理に合わせる",new_0_5_25_1:"グループチャットルームのリセットと複製アクションを追加",new_0_5_25_2:"カスタムデプロイ構成向けに Web UI 状態ディレクトリを設定可能に変更",new_0_5_25_3:"音声設定に MiMo TTS プロバイダーを追加",new_0_5_25_4:"ブラウザ CORS エラーを避けるためカスタムプロバイダーのモデル一覧をバックエンド経由で取得",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 ブラウザテスト、チャットストリーミング契約カバレッジ、プロバイダーモデルカバレッジ、カバレッジ基準を追加",new_0_5_26_1:"チャット履歴とレンダリング済みメッセージで Windows およびローカル Markdown メディアパスをサポート",new_0_5_26_2:"空の assistant 履歴をフィルタし、新しい実行開始時に古い圧縮状態をクリア",new_0_5_26_3:"同時書き込みによる破損を減らすため config と Profile 更新にファイルロック書き込みを追加",new_0_5_26_4:"QQBot と DingTalk チャンネル設定を追加",new_0_5_26_5:"CLI ポート検出をポータブル化し、モバイル端末ドロワーのサイズを改善",new_0_5_26_6:"Bridge Profile 環境を分離し、Python 環境をまたぐ Hermes plugin 検出を修正",new_0_5_26_7:"停止中 gateway 状態に Web UI 診断説明を追加し、ログ読み込み状態を安定化",new_0_5_26_8:"セッションリセットモード、カスタムプロバイダー Base URL、動的配信先を修正",new_0_5_26_9:"チャット入力バーにローカル保存の tool-call trace 表示切替を追加",new_0_5_26_10:"ソース checkout がない場合の Hermes Agent パッケージインストールをサポート",new_0_5_26_11:"SuperGrok サブスクユーザー向け xAI Grok OAuth ログインを追加し Grok モデルプリセットを更新",new_0_5_26_12:"ブラウザ、チャットストリーミング、プロバイダー、gateway、config、plugin、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_30_1:"Bridge チャットが構造化履歴を保持し、tool 履歴のテキスト化による応答なしや tool 実行スキップを修正",new_0_5_30_2:"複数 Agent のグループチャット mention ルーティングを改善し、配信前に各 Agent 自身の @ mention を削除し、更新後も表示名を保持",new_0_5_30_3:"モデルページ、チャットモデルドロップダウン、セッションモデル選択を active Profile にスコープし、デフォルト表示を正確化",new_0_5_30_4:"Gateway 管理を簡素化:独立 Gateway ページを削除し、各 Profile の平台設定を確認して必要な gateway を起動、軽量 runner で起動/再起動を管理",new_0_5_30_5:"Docker、Termux、Windows での gateway 起動を改善し、runtime lock、ポート競合、バックグラウンド実行、再起動をサポート",new_0_5_30_6:"Windows 互換性を強化し、パス検出、ファイルダウンロード、job/update サブプロセスで端末ウィンドウが点滅しないよう修正",new_0_5_30_7:"config 書き込みと provider preset を修正:.env キー検証、FUN-Codex の Responses API 経由、Z.AI/GLM モデル一覧更新",new_0_5_30_8:"折りたたみサイドバー、短いグループラベル、サイドバー区切り、会話アウトラインなど frontend の細部を調整",new_0_5_30_9:"コンテキスト圧縮は Profile 圧縮設定に従い、古いスナップショットでは全文再圧縮せず以前の要約と安全な末尾を再利用",new_0_5_31_1:"Bridge broker の再起動を強化し、グループチャット最終ストリーム表示を修正し、{'@'}all ルーティングを追加",new_0_5_31_2:"ファイルマネージャーで絶対パスをコピー可能にし、モバイルセッションドロワーがチャット内容の背面に回らないよう修正",new_0_5_31_3:"Profile セレクターにアバター、カスタムアバターアップロード、実行状態モーダル、gateway/Profile 再起動操作を追加",new_0_5_31_4:"Profile アバターを単聊、グループチャット、折りたたみサイドバーに反映し、Web UI メタデータ保存と Windows 安全パスに対応",new_0_5_31_5:"Docker、Termux、Windows の gateway 検出と再起動確認を改善し、managed gateway の生存判定に gateway_state/gateway.pid を使用",new_0_5_31_6:"APIKEY.FUN 生画像メディア endpoint と内蔵 apikey-image-gen skill を追加し、active Profile の fun-codex provider で文生図、図生図、画像編集に対応",new_0_5_33_1:"単聊とグループチャットの実行失敗や Socket エラーを赤い Agent メッセージとしてメッセージ一覧に保持し、一瞬で消えないよう修正",new_0_5_33_2:"セッション検索を選択中 Profile に絞り込めるようにし、Profile 未選択時は全 Profile を検索",new_0_5_33_3:"Skills ページに日本語以外では英語へフォールバックする中英推薦ドキュメントを追加し、選択済み Skill の再クリックで選択解除可能に",new_0_5_33_4:"未使用の changelog ローカライズ項目を削除し、frontend i18n サイズを削減",new_0_5_33_5:"中国語 Windows 環境で netstat 出力のエンコード解析に失敗し agent bridge が起動しない問題を修正",new_0_5_33_6:"Nous Portal の preset モデル一覧を公開 catalog と Portal 推奨モデルに合わせて更新",new_0_5_33_7:"Profile 一覧と実行状態は Profile 名をディレクトリから、既定モデルを config から読むようにし、CLI 表の列幅による解析ずれを回避",new_0_5_34_1:"セッション/グループチャット保存時にマルチモーダル tool 結果を正規化し、base64 画像がリプレイに混ざらないよう修正",new_0_5_34_2:"カスタム Hermes モデルを backend 管理設定に永続化し、モデル追加/削除 endpoint を追加",new_0_5_34_3:"Bridge 実行完了後の最終コンテキスト使用量と tool 状態更新を正確化",new_0_5_34_4:"Kanban のボード絞り込み、担当者表示、カード操作、タスク詳細処理を改善",new_0_5_34_5:"固定 prompt/tool コンテキストをキャッシュし、完全コンテキスト token 合計を表示するよう圧縮使用量を修正",new_0_5_34_6:"グループチャット Agent ごとに固定コンテキストをキャッシュし、実際に圧縮が始まった時だけ進捗を表示",new_0_5_34_7:"Web UI 内蔵 Skills をすべての Profile に同期注入し、ログに対象 Profile を記録",new_0_5_34_8:"Windows で Kanban 機能が異常な場合は、最新の Kanban データベース移行修正を取得するため Hermes をアップグレードしてください",new_0_5_35_1:"Bridge セッションは異なる session 間で並行実行でき、同一 session の実行はメッセージ順序を守るため直列化されます",new_0_5_35_2:"Performance Monitor ページを追加し、システム CPU/メモリ、Web UI、Bridge Broker、Workers、アクティブセッション状態を確認できます",new_0_5_35_3:"Worker ごとの CPU、メモリ、Profile、セッション数、実行状態を表示するリソース統計を追加",new_0_5_35_4:"Bridge worker のライフサイクル cleanup を改善し、Broker 終了時や親プロセス終了時に worker を回収して残留 Python プロセスを減らします",new_0_5_35_5:"macOS、Windows、Linux、Docker、Termux 向けの fallback を追加し、監視リソース収集のクロスプラットフォーム互換性を強化",new_0_5_35_6:"Agent 初期化中の worker request で Performance Monitor がブロックされにくくなり、Windows の request timed out を軽減",new_0_5_35_7:"Chat Markdown にテキスト内容のインラインプレビューを追加し、download アイコンはプレビュー drawer を開かず直接ダウンロードします",new_0_5_35_8:"内容表示 drawer を改善し、モバイルの閉じる操作と全幅表示、デスクトップ 800px 幅、テキスト/Markdown 背景の統一に対応",new_0_6_0_1:"アカウント別・Profile 別の管理により、セッション、モデル、使用量、Kanban、ジョブ、アップロード、メディア、関連 Hermes API を一貫して保護します",new_0_6_0_2:"内蔵メディア Skills は生成されたサーバートークンをメディア endpoint のみに使用し、要求された Profile から fun-codex/xAI 認証情報を解決します",new_0_6_0_3:"単一チャットとグループチャットは現在の Hermes Profile を run instructions に注入し、Skills が X-Hermes-Profile を送れるようにします",new_0_6_0_4:"delegate_task の subagent 進行状況をチャット UI に stream 表示し、開始、tool、進行、完了を確認できます",new_0_6_0_5:"停止または中断時に一時イベントをクリアし、古い abort 状態が次のチャットに漏れないようにしました",new_0_6_0_6:"アカウント管理、既定の認証情報、アカウント/Profile 管理、アップロード/ダウンロード、内蔵メディア Skills のドキュメントとサイト文言を更新",new_0_6_0_7:"ログイン IP ロックのクリアと既定の admin / 123456 ログインをリセットする CLI メンテナンスコマンドを追加",new_0_6_0_8:"0.6.0 は Web UI の単一ユーザー版とマルチユーザー版の境界です。マルチユーザー機能に問題がある場合は issue を送信し、必要に応じて 0.5.35 の単一ユーザー版へ戻してください"},files:{title:"ファイル",tree:"ディレクトリツリー",list:"ファイル一覧",breadcrumbRoot:"ホーム",newFile:"新規ファイル",newFolder:"新規フォルダ",upload:"アップロード",refresh:"更新",open:"開く",edit:"編集",preview:"プレビュー",download:"ダウンロード",copyPath:"パスをコピー",rename:"名前の変更",delete:"削除",name:"名前",size:"サイズ",modified:"更新日時",actions:"操作",emptyDir:"空のディレクトリ",loading:"読み込み中...",confirmDelete:"「{name}」を削除してもよろしいですか?",confirmDeleteDir:"ディレクトリ「{name}」とそのすべての内容を削除してもよろしいですか?",deleteFailed:"削除に失敗しました",deleted:"削除しました",renameTo:"名前を変更",newFileName:"ファイル名",newFolderName:"フォルダ名",created:"作成しました",createFailed:"作成に失敗しました",renamed:"名前を変更しました",renameFailed:"名前の変更に失敗しました",uploadSuccess:"{count} 個のファイルをアップロードしました",uploadFailed:"アップロードに失敗しました",saveFailed:"保存に失敗しました",saved:"保存しました",unsavedChanges:"未保存の変更があります。破棄しますか?",pathCopied:"パスをコピーしました",fileTooLarge:"ファイルが大きすぎます(最大10MB)",permissionDenied:"保護されたファイルは変更できません",notFound:"ファイルまたはディレクトリが見つかりません",backendError:"ファイル操作に失敗しました",dragDropHint:"ここにファイルをドラッグしてアップロード",closeEditor:"エディタを閉じる",closePreview:"閉じる",saveFile:"保存",fileTree:"ファイルツリー"},groupChat:{title:"グループチャット",createRoom:"ルームを作成",joinByCode:"コードで参加",roomName:"ルーム名",roomNamePlaceholder:"ルーム名を入力",inviteCode:"招待コード",autoGenerate:"自動生成",noRooms:"ルームがありません",selectOrCreate:"ルームを選択または作成してチャットを開始",agents:"エージェント",addAgent:"エージェントを追加",selectProfile:"プロファイルを選択",agentAdded:"エージェントが追加されました",agentAlreadyInRoom:"このエージェントは既にルームにいます",agentAddFailedCount:"{count} 件のエージェントを追加できませんでした: {details}",noAgents:"このルームにエージェントはいません",members:"メンバー",roomCreated:"ルームが作成されました",roomDeleted:"ルームを削除しました",roomCloned:"ルームを複製しました",cloneRoom:"ルームを複製",copyRoomLink:"ルームリンクをコピー",deleteRoomConfirm:"このルームを削除しますか?",clearContext:"コンテキストを削除",clearContextConfirm:"このルームのコンテキストを削除しますか?メッセージと圧縮スナップショットは削除されますが、エージェントとメンバーは残ります。",contextCleared:"コンテキストを削除しました",you:"あなた",joined:"ルームに参加しました",joinFailed:"ルームへの参加に失敗しました",inputPlaceholder:"メッセージを入力... (Enterで送信)",enterCode:"招待コードを入力",yourName:"あなたの名前",yourNamePlaceholder:"表示名を入力",yourDescription:"自己紹介(任意)",yourDescriptionPlaceholder:"自分について教えてください...",agentName:"エージェント名",agentNamePlaceholder:"カスタム名(空欄ならプロファイル名)",agentDesc:"エージェントの説明",agentDescPlaceholder:"このエージェントの役割を説明...",agentReplying:"が返信中...",agentCompressing:"がコンテキストを圧縮中...",compressionSettings:"圧縮設定",triggerTokens:"圧縮トリガートークン数",triggerTokensDesc:"このトークン数を超えるとコンテキスト圧縮がトリガーされます",maxHistoryTokens:"最大履歴トークン数",maxHistoryTokensDesc:"圧縮後のLLM送信最大トークン数",tailMessageCount:"末尾メッセージ数",tailMessageCountDesc:"圧縮後にそのまま保持する最近のメッセージ数",compressionConfig:"圧縮設定",compressNow:"今すぐ圧縮",compressingInProgress:"圧縮中です、お待ちください",compressionSaved:"圧縮設定を保存しました"},download:{downloading:"ダウンロード中...",downloadFailed:"ダウンロードに失敗しました",fileNotFound:"ファイルが見つからないか削除されています",fileTooLarge:"ファイルが大きすぎます(制限超過)",backendError:"ファイルの読み取りに失敗しました。リモート環境が利用できない可能性があります",backendTimeout:"ファイルの読み取りがタイムアウトしました",unsupportedBackend:"現在のターミナルバックエンドはファイルのダウンロードに対応していません",invalidPath:"無効なファイルパス",contentDisplay:"内容表示",download:"ダウンロード",downloadFile:"ファイルをダウンロード"},gateways:{title:"ゲートウェイ",running:"実行中",stopped:"停止中",started:"開始しました",startFailed:"Gateway の起動に失敗しました",stopFailed:"Gateway の停止に失敗しました"},kanban:{title:"Kanban ボード",createTask:"新規タスク",noTasks:"タスクはありません",allStatuses:"すべての状態",allAssignees:"すべての担当者",columns:{triage:"振り分け待ち",todo:"未着手",ready:"準備完了",running:"進行中",blocked:"ブロック中",done:"完了",archived:"アーカイブ済み"},card:{assigneeTooltip:"担当者",priority:{low:"低",medium:"中",high:"高"},timeAgo:{justNow:"たった今",minutes:"{count}分前",hours:"{count}時間前",days:"{count}日前"}},board:{create:"新規ボード",archive:"ボードをアーカイブ",archiveConfirm:"現在のボードをアーカイブしますか?",archived:"ボードをアーカイブしました",created:"ボードを作成しました",slugPlaceholder:"ボード識別子 例: project-a",namePlaceholder:"表示名(任意)",slugRequired:"ボード識別子は必須です"},form:{title:"タイトル",titlePlaceholder:"タスクタイトル",titleRequired:"タイトルは必須です",body:"説明",bodyPlaceholder:"タスク説明(任意)",assignee:"担当者",selectAssignee:"担当者を選択...",priority:"優先度",selectPriority:"優先度を選択..."},detail:{status:"状態",priority:"優先度",assignee:"担当者",tenant:"テナント",createdAt:"作成時刻",startedAt:"開始時刻",completedAt:"完了時刻",comments:"コメント",events:"イベント",runs:"実行履歴",artifacts:"成果物",result:"完了結果",highlights:"重要情報",sources:"データソース",sessions:"関連セッション",sessionMessages:"セッション記録",noSessions:"関連セッションが見つかりません。"},action:{title:"操作",assign:"割り当て",assignTo:"割り当て先...",block:"ブロック",blockReason:"ブロック理由",unblock:"ブロック解除",complete:"完了",completeSummary:"完了サマリー(任意)"},message:{loadFailed:"タスクの読み込みに失敗しました",taskCreated:"タスクを作成しました",taskAssigned:"タスクを割り当てました",taskBlocked:"タスクをブロックしました",taskUnblocked:"タスクのブロックを解除しました",taskCompleted:"タスクを完了しました"},stats:{total:"合計",tasks:"タスク数"}}},At={login:{title:"Hermes Web UI",description:"계속하려면 사용자 이름과 비밀번호를 입력하세요.",placeholder:"액세스 토큰",submit:"로그인",tokenRequired:"액세스 토큰을 입력해 주세요",invalidToken:"유효하지 않은 토큰입니다",connectionFailed:"서버에 연결할 수 없습니다",passwordLogin:"비밀번호",tokenLogin:"토큰",usernamePlaceholder:"사용자 이름",passwordPlaceholder:"비밀번호",defaultCredentialsHint:"기본 로그인 이름: admin, 기본 비밀번호: 123456",credentialsRequired:"사용자 이름과 비밀번호를 입력해 주세요",invalidCredentials:"사용자 이름 또는 비밀번호가 올바르지 않습니다",tooManyAttempts:"로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요",sessionExpired:"로그인이 만료되었습니다. 다시 로그인해 주세요.",accessDenied:"이 리소스에 접근할 권한이 없습니다.",passwordMismatch:"비밀번호가 일치하지 않습니다",passwordTooShort:"비밀번호는 6자 이상이어야 합니다",setupSuccess:"비밀번호 로그인이 설정되었습니다",passwordChanged:"비밀번호가 변경되었습니다",passwordRemoved:"비밀번호 로그인이 제거되었습니다",setupPassword:"비밀번호 로그인 설정",changePassword:"비밀번호 변경",changeUsername:"사용자 이름 변경",removePasswordLogin:"제거",username:"사용자 이름",currentPassword:"현재 비밀번호",newPassword:"새 비밀번호",confirmPassword:"비밀번호 확인",newUsername:"새 사용자 이름",usernameChanged:"사용자 이름이 변경되었습니다",usernameTooShort:"사용자 이름은 2자 이상이어야 합니다",setupDescription:"로그인에 사용할 사용자 이름과 비밀번호를 관리합니다.",removeConfirm:"사용자 계정에는 비밀번호 로그인이 필요합니다.",passwordLoginNotConfigured:"비밀번호 로그인 미설정",passwordLoginConfigured:"현재 계정: {username}",defaultCredentialTitle:"기본 계정과 비밀번호를 변경하세요",defaultCredentialMessage:"현재 로그인 계정이 아직 기본 사용자 이름 또는 기본 비밀번호를 사용하고 있습니다. 무단 접근을 방지하려면 현재 계정에서 사용자 이름과 비밀번호를 가능한 한 빨리 변경하세요.",defaultCredentialAction:"변경하기",defaultCredentialLater:"나중에 알림"},users:{title:"계정 관리",description:"사용자를 만들고 역할을 할당하며 일반 관리자가 접근할 수 있는 프로필을 제어합니다.",create:"사용자 만들기",edit:"사용자 편집",username:"사용자 이름",role:"역할",statusLabel:"상태",profiles:"접근 가능한 프로필",profilesPlaceholder:"접근 가능한 프로필 선택",allProfiles:"모든 프로필",noProfiles:"할당된 프로필 없음",lastLogin:"마지막 로그인",newPasswordOptional:"새 비밀번호 (비워두면 유지)",loadFailed:"사용자 목록을 불러오지 못했습니다",deleteConfirm:"이 사용자를 삭제하시겠습니까?",enable:"활성화",disable:"비활성화",roles:{superAdmin:"슈퍼 관리자",admin:"관리자"},status:{active:"활성",disabled:"비활성"}},common:{loading:"로딩 중...",cancel:"취소",retry:"재시도",delete:"삭제",edit:"편집",save:"저장",saved:"저장됨",update:"업데이트",create:"생성",saveFailed:"저장 실패",deleteFailed:"삭제 실패",ok:"확인",copied:"복사됨",copy:"복사",noData:"데이터 없음",fetch:"가져오기",add:"추가",enable:"활성화",disable:"비활성화",configured:"구성됨",notConfigured:"미구성",confirm:"확인",expand:"펼치기",collapse:"접기",stop:"중지",start:"시작",expired:"만료됨"},sidebar:{chat:"채팅",search:"검색",apiRelay:"API 릴레이",history:"기록",jobs:"예약 작업",models:"모델",profiles:"프로필",plugins:"플러그인",skills:"스킬",memory:"메모리",logs:"로그",usage:"사용량",performance:"성능 모니터링",skillsUsage:"스킬 사용량",channels:"채널",terminal:"터미널",files:"파일",groupChat:"그룹 채팅",groupConversation:"대화",groupConversationShort:"대화",groupAgent:"에이전트",groupAgentShort:"에전",groupSystem:"시스템",groupSystemShort:"시스템",groupMonitoring:"모니터링",groupMonitoringShort:"모니터",settings:"설정",connected:"연결됨",disconnected:"연결 끊김",updateTip:'터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요',updateVersion:"v{version}(으)로 업그레이드",reloadClientVersion:"v{version}(으)로 새로고침",updating:"업데이트 중...",updateSuccess:"업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.",updateFailed:"업데이트 실패",logout:"로그아웃",nodeVersionWarning:"Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.",changelog:"변경 이력",noChangelog:"변경 이력이 없습니다",kanban:"칸반",groupTools:"도구",groupPlatform:"플랫폼",gateways:"게이트웨이",expand:"메뉴 펼치기",collapse:"메뉴 접기"},performance:{title:"성능 모니터링",subtitle:"시스템 리소스, Bridge Broker, Workers, 활성 세션 확인",refresh:"새로고침",autoRefreshOn:"자동 새로고침",autoRefreshOff:"수동 새로고침",loadFailed:"성능 데이터를 불러오지 못했습니다",systemCpu:"시스템 CPU",systemMemory:"시스템 메모리",activeSessions:"활성 세션",runningSessions:"실행 중 {count}",workers:"Workers",totalWorkerMemory:"Worker 총 메모리",processes:"프로세스",uptime:"실행 시간",running:"실행 중",stopped:"중지됨",workerMemory:"Worker 메모리",lastUpdated:"업데이트 시간",profile:"Profile",memory:"메모리",sessions:"세션",runningActiveSessions:"실행 중 / 활성",lastUsed:"마지막 사용",status:"상태",noWorkers:"Worker 없음",sessionsByProfile:"Profile별 세션",noActiveSessions:"활성 세션 없음"},drawer:{terminal:"터미널",files:"작업 공간"},chat:{contextRemaining:"남음",contextClickToEdit:"클릭하여 컨텍스트 길이 편집",contextEditTitle:"컨텍스트 길이 편집",contextEditDesc:"현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)",contextEditPlaceholder:"컨텍스트 길이 입력",contextEditHint:"일반적인 값: 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)",contextEditSave:"저장",contextEditCancel:"취소",contextEditInvalid:"유효한 컨텍스트 길이를 입력하세요",contextEditSuccess:"컨텍스트 길이가 업데이트되었습니다",contextEditFailed:"업데이트 실패",emptyState:"Hermes Agent와 대화를 시작하세요",outlineTitle:"대화 개요",outlineEmpty:"대화 내용이 없습니다",outlineUserQuestion:"사용자 질문",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)",slashCommandArgs:{message:"<메시지>",title:"<제목>",text:"<텍스트>"},slashCommands:{usage:"현재 세션 사용량 계산",status:"세션 상태와 대기열 표시",abort:"활성 Bridge 실행 중지",queue:"활성 실행 뒤에 메시지 대기열 추가",clear:"현재 표시 내용 지우기",clearHistory:"이 세션의 저장된 메시지 기록 삭제",title:"이 세션 이름 변경",compress:"유휴 상태에서 컨텍스트 압축 실행",steer:"활성 Bridge 실행에 지시 텍스트 보내기",destroy:"이 세션의 Bridge Agent 해제"},attachFiles:"파일 첨부",showToolCalls:"도구 호출 표시",hideToolCalls:"도구 호출 숨기기",messageQueue:"메시지 대기열",removeQueuedMessage:"대기열 메시지 제거",stop:"중지",send:"전송",contextUsed:"사용된 컨텍스트:",sessions:"세션",webUiSessions:"세션",allProfiles:"모든 프로필",profileMissingModelsTip:'이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다',sessionScopeHint:"채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.",openHistory:"기록 열기",hermesHistory:"Hermes 기록",historyScopeHint:"현재 profile의 Hermes 기록 세션을 소스별로 읽기 전용으로 봅니다.",noSessions:"세션 없음",newChat:"새 채팅",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:"어시스턴트",copySessionLink:"세션 링크 복사",copySessionId:"세션 ID 복사",export:"내보내기",exportFull:"전체 내보내기 (JSON)",exportCompressed:"압축 내보내기 (TXT)",exportCompressing:"컨텍스트 압축 중, 잠시 기다려주세요...",exportSuccess:"세션을 내보냈습니다",exportFailed:"내보내기 실패",renamed:"이름이 변경되었습니다",renameFailed:"이름 변경 실패",renameSession:"세션 이름 변경",sessionNotFound:"세션을 찾을 수 없습니다",enterNewTitle:"새 제목을 입력하세요",other:"기타",runFailed:"실행 실패",error:"오류",tool:"도구",arguments:"인수",result:"결과",truncated:"... (잘림)",executionDuration:"실행 시간",thinkingLabel:"사고 과정",thinkingInProgress:"사고 중…",thinkingShow:"사고 과정 펼치기",thinkingHide:"사고 과정 접기",thinkingDuration:"관측 {duration}",thinkingChars:"{count}자",copyBubble:"메시지 복사",copiedBubble:"복사됨",copyFailed:"복사 실패",playSpeech:"음성 재생",pauseSpeech:"일시정지",resumeSpeech:"재개",stopSpeech:"중지",speechNotSupported:"이 브라우저는 음성 재생을 지원하지 않습니다",searchEnterHint:"Enter로 열기 · Esc로 닫기",searchHint:"Cmd/Ctrl+K",searchScope:"검색 범위: Web UI 로컬 세션 DB만 포함하며 읽기 전용 Hermes 기록 세션은 포함하지 않습니다.",searchFailed:"세션 검색 실패",searchNoSnippet:"표시할 요약이 없습니다",searchNoResults:"일치하는 세션이 없습니다",searchRecent:"최근 세션",searchEmpty:"최근 세션",searchPlaceholder:"세션 검색...",searchSubtitle:"제목 또는 메시지 내용으로 검색",searchTitle:"세션 검색",stopGateway:"Gateway 중지",start:"시작",workspaceSetFailed:"Workspace 설정 실패",workspaceSet:"Workspace가 설정되었습니다",workspacePlaceholder:"프로젝트 경로 입력, 예: /home/user/project",workspace:"작업 공간",setWorkspaceTitle:"세션 Workspace 설정",setWorkspace:"Workspace 설정",modelSetFailed:"모델 설정 실패",modelSet:"모델이 설정되었습니다",setModelTitle:"세션 모델 설정",setModel:"모델 설정",newCliChat:"새 CLI",cliEmptyState:"CLI 채팅 시작",autoPlaySpeech:"음성 자동 재생"},jobs:{title:"예약 작업",createJob:"작업 생성",editJob:"작업 편집",noJobs:"예약된 작업이 없습니다. 새로 만들어 시작하세요.",name:"이름",namePlaceholder:"작업 이름",schedule:"스케줄 (Cron 표현식)",schedulePlaceholder:"예: 0 9 * * *",quickPresets:"빠른 프리셋",selectPreset:"프리셋 선택...",presetEveryMinute:"매 분",presetEvery5Min:"매 5분",presetEveryHour:"매 시간",presetEveryDay:"매일 00:00",presetEveryDay9:"매일 09:00",presetEveryMonday:"매주 월요일 09:00",presetEveryMonth:"매월 1일 09:00",prompt:"프롬프트",promptPlaceholder:"실행할 프롬프트",deliverTarget:"전송 대상",origin:"출처",local:"로컬",repeatCount:"반복 횟수 (선택)",modelPlaceholder:"기본 모델",repeatPlaceholder:"비워두면 무한 반복",jobCreated:"작업이 생성되었습니다",jobUpdated:"작업이 업데이트되었습니다",nameRequired:"이름을 입력해 주세요",scheduleRequired:"스케줄을 입력해 주세요",loadFailed:"작업을 불러오지 못했습니다",jobPaused:"작업이 일시 정지되었습니다",jobResumed:"작업이 재개되었습니다",jobTriggered:"작업이 실행되었습니다",modelUpdated:"모델이 업데이트되었습니다",jobDeleted:"작업이 삭제되었습니다",status:{running:"실행 중",paused:"일시 정지",disabled:"비활성화",scheduled:"예약됨"},info:{model:"모델",schedule:"일정",lastRun:"마지막 실행",nextRun:"다음 실행",deliver:"전송",repeat:"반복"},action:{pause:"일시 정지",pauseJob:"작업 일시 정지",resume:"재개",resumeJob:"작업 재개",runNow:"즉시 실행",triggerImmediately:"즉시 실행"},runHistory:{title:"실행 기록",runs:"회 실행",noRuns:"실행 기록이 없습니다."}},skills:{title:"스킬",searchPlaceholder:"스킬 검색...",noMatch:"검색과 일치하는 스킬이 없습니다",noSkills:"스킬을 찾을 수 없습니다",backTo:"돌아가기",attachedFiles:"첨부 파일",loadFailed:"스킬을 불러오지 못했습니다",fileLoadFailed:"파일을 불러오지 못했습니다",modified:"사용자 수정됨",archived:"보관됨",pinned:"고정됨",pin:"스킬 고정",unpin:"고정 해제",pinFailed:"고정 상태 변경 실패",toggleFailed:"스킬 상태를 전환하지 못했습니다",source:{builtin:"내장",hub:"Hub",local:"로컬"}},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:"에이전트 루트",python:"Python",scanCwd:"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:"선택 지우기",currentDefault:"현재 기본값",defaultShort:"기본값",builtIn:"내장",customType:"사용자 지정",provider:"공급자",contextLength:"컨텍스트 길이",contextLengthPlaceholder:"예: 200000 (선택사항)",local:"로컬 ({host})",selectProviderRequired:"Provider를 선택해 주세요",baseUrlRequired:"Base URL을 입력해 주세요",apiKeyRequired:"API Key를 입력해 주세요",modelRequired:"기본 모델을 선택해 주세요",enterBaseUrl:"먼저 Base URL을 입력해 주세요",unexpectedFormat:"예상치 못한 응답 형식입니다",foundModels:"{count}개의 모델을 찾았습니다",fetchFailed:"모델을 가져오지 못했습니다",xaiWaiting:"열린 xAI 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.",xaiOpenLink:"xAI 인증 페이지 열기",xaiLoginTitle:"xAI Grok OAuth 로그인",xaiExpired:"인증 링크가 만료되었습니다. 다시 시도하세요.",xaiCopyLink:"인증 링크 복사",xaiApproved:"로그인 성공!",visibilitySelectOne:"최소 하나의 표시 모델을 유지하세요",visibilitySaved:"표시 모델이 저장되었습니다",visibilitySaveFailed:"표시 모델 저장 실패",visibilityHint:"Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.",showAllModels:"모든 모델 표시",searchPlaceholder:"모델 검색...",removeCustomModel:"목록에 없는 이 모델 제거",more:"개 더",models:"모델 목록",manageVisibleModelsFor:"{name} 표시 모델 관리",manageVisibleModels:"표시 모델 관리",getApiKey:"API Key 가져오기",count:"개 모델",aliasUseOriginal:"원본 ID로 복원",aliasTitleFor:"{model}의 표시 이름",aliasTitle:"모델 표시 이름",aliasSaveFailed:"표시 이름 저장 실패",aliasPlaceholder:"비워두면 원본 모델 ID 사용",aliasManageFor:"{provider}의 표시 이름",aliasManage:"표시 이름",aliasHint:"Web UI 표시 이름만 변경합니다. Hermes에는 여전히 원본 모델 ID가 전달됩니다.",aliasEdit:"이름 변경",aliasCanonical:"원본 ID: {model}"},profiles:{title:"프로필",create:"프로필 생성",import:"가져오기",export:"내보내기",rename:"이름 변경",delete:"삭제",switchTo:"Hermes Profile 전환",switchConfirm:"`hermes profile use {name}`를 실행하고 Hermes CLI active profile을 변경합니다. 계속하시겠습니까?",switchSuccess:'Hermes active profile이 "{name}"(으)로 전환되었습니다',switchFailed:"Hermes Profile 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.",createSuccess:'프로필 "{name}"이(가) 생성되었습니다',createFailed:"프로필 생성 실패",renameSuccess:"프로필 이름이 변경되었습니다",renameFailed:"프로필 이름 변경 실패",deleteConfirm:'프로필 "{name}"을(를) 삭제하시겠습니까?',deleteSuccess:"프로필이 삭제되었습니다",deleteFailed:"프로필 삭제 실패",exportSuccess:"프로필이 내보내기되었습니다",exportFailed:"프로필 내보내기 실패",importSuccess:"프로필이 가져오기되었습니다",importFailed:"프로필 가져오기 실패",importSelectFile:"아카이브 파일 선택",importInvalidFile:"유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)",name:"프로필 이름",namePlaceholder:"영문, 숫자, 하이픈만 사용 가능",nameValidation:"프로필 이름에는 소문자, 숫자, 밑줄, 하이픈만 사용할 수 있습니다",newName:"새 이름",newNamePlaceholder:"새 이름을 입력하세요",cloneFromCurrent:"현재 프로필에서 복제",cloneCleanupNotice:"복제 시 독점형 플랫폼 자격 증명(Weixin / Telegram / Slack 등)은 자동으로 건너뛰어 원본 프로필과의 충돌을 방지합니다",cloneStrippedCredentials:"독점 자격 증명 {count}개 제거됨: {list}",cloneDisabledPlatforms:"플랫폼 {count}개 비활성화됨: {list}",cloneStrippedConfigCredentials:"config.yaml에서 임베디드 자격 증명 {count}개 제거됨: {list}",archivePath:"아카이브 경로",archivePathPlaceholder:"아카이브 파일의 서버 경로",importName:"프로필 이름 (선택)",importNamePlaceholder:"비워두면 아카이브 이름을 사용합니다",active:"활성",model:"모델",gateway:"게이트웨이",alias:"별칭",provider:"공급자",path:"경로",skills:"스킬",hasEnv:".env 있음",hasSoulMd:"soul.md 있음",noProfiles:"프로필이 없습니다. 새로 만들어 시작하세요.",avatar:{title:"사용자 지정 아바타",customize:"아바타",upload:"이미지 업로드",random:"무작위 생성",reset:"기본값 복원",hint:"PNG, JPEG, WebP 지원, 최대 1MB",invalidType:"PNG, JPEG 또는 WebP 이미지를 선택하세요",tooLarge:"아바타 이미지는 1MB를 초과할 수 없습니다",saveSuccess:"아바타가 저장되었습니다",saveFailed:"아바타 저장 실패",resetSuccess:"기본 아바타로 복원되었습니다",resetFailed:"기본 아바타 복원 실패"},runtime:{activeProfile:"현재: {name}",bridgeWorker:"Bridge 상태",gateway:"게이트웨이",active:"활성",activeTag:"현재",idle:"대기 중",running:"실행 중",stopped:"중지됨",restartGateway:"Gateway 재시작",restartProfile:"프로필 재시작",switchProfile:"프론트엔드 프로필 전환",gatewayRestarted:"Gateway가 재시작되었습니다: {name}",gatewayRestartFailed:"Gateway 재시작 실패",profileRestarted:"프로필이 재시작되었습니다: {name}",profileRestartFailed:"프로필 재시작 실패"}},logs:{title:"로그",all:"전체",searchPlaceholder:"검색...",refresh:"새로고침",noEntries:"로그 항목 없음"},settings:{title:"설정",saved:"저장됨",saveFailed:"저장 실패",tabs:{display:"표시",account:"현재 계정",users:"계정 관리",agent:"에이전트",memory:"메모리",compression:"압축",session:"세션",privacy:"개인정보",apiServer:"API 서버",models:"모델",voice:"음성"},display:{streaming:"스트리밍 응답",streamingHint:"AI 응답을 실시간으로 표시",compact:"컴팩트 모드",compactHint:"메시지 간격 줄이기",showReasoning:"추론 과정 표시",showReasoningHint:"모델의 생각 과정 표시",showCost:"비용 표시",showCostHint:"응답에 토큰 사용량 표시",inlineDiffs:"인라인 변경사항",inlineDiffsHint:"코드 변경사항을 인라인으로 표시",bellOnComplete:"완료 알림음",bellOnCompleteHint:"AI 응답 완료 시 알림음 재생",busyInputMode:"바쁨 입력 모드",busyInputModeHint:"AI 처리 중에도 입력 허용",theme:"테마",themeHint:"라이트, 다크 또는 시스템 설정 따르기",themeLight:"라이트",themeDark:"다크",themeSystem:"시스템"},agent:{maxTurns:"최대 턴 수",maxTurnsHint:"대화당 최대 상호작용 라운드 수",gatewayTimeout:"게이트웨이 시간초과",gatewayTimeoutHint:"요청 시간초과 (초)",restartDrainTimeout:"재시작 드레인 시간초과",restartDrainTimeoutHint:"재시작 전 드레인 시간초과 (초)",toolEnforcement:"도구 실행 정책",toolEnforcementHint:"도구 호출 실행 모드 제어",auto:"자동",always:"항상",never:"사용 안 함"},memory:{enabled:"메모리 활성화",enabledHint:"AI가 대화 컨텍스트를 기억하도록 허용",userProfile:"사용자 프로필",userProfileHint:"AI가 사용자 선호를 기억하도록 허용",charLimit:"메모리 문자 제한",charLimitHint:"MEMORY.md 최대 문자 수",userCharLimit:"사용자 프로필 문자 제한",userCharLimitHint:"USER.md 최대 문자 수"},compression:{enabled:"압축 활성화",enabledHint:"긴 채팅 기록이 모델 컨텍스트를 넘기 전에 자동 압축",threshold:"압축 임계값",thresholdHint:"추정 토큰이 이 컨텍스트 비율을 넘으면 압축 시작",targetRatio:"목표 비율",targetRatioHint:"압축 후 기록 크기를 컨텍스트 비율로 지정",protectLastN:"최근 메시지 보호",protectLastNHint:"이 수만큼 최신 메시지는 압축하지 않음",protectFirstN:"처음 메시지 보호",protectFirstNHint:"이 수만큼 처음 메시지는 압축하지 않음"},session:{mode:"초기화 모드",modeHint:"세션 초기화 트리거 조건",modeBoth:"유휴 + 예약",modeIdle:"유휴만",modeDaily:"예약만",modeNone:"안함 (수동만)",idleMinutes:"유휴 시간초과",idleMinutesHint:"자동 초기화 대기 시간 (분)",atHour:"예약 초기화 시간",humanOnly:"사람 세션만 표시",humanOnlyHint:"하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",liveMonitorHumanOnly:"라이브 모니터: 사람 세션만 표시",liveMonitorHumanOnlyHint:"라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다",atHourHint:"매일 지정한 시간에 세션 초기화",requireAuth:"세션 인증",requireAuthHint:"세션 작업에 인증 필요"},privacy:{redactPii:"개인정보 마스킹",redactPiiHint:"민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)"},apiServer:{enable:"활성화",enableHint:"API 서버 활성화",host:"호스트",hostHint:"수신 주소",port:"포트",portHint:"수신 포트",key:"키",keyHint:"API 접근 키",cors:"CORS 출처",corsHint:"허용된 교차 출처"},voice:{ttsProvider:"TTS 제공자",ttsProviderHint:"메시지 재생에 사용할 텍스트 음성 변환 엔진 선택",providerWebSpeech:"WebSpeech API (브라우저)",providerOpenai:"OpenAI TTS",providerCustom:"사용자 정의 엔드포인트 (OpenAI 호환)",providerEdge:"Edge TTS (무료, API Key 불필요)",webspeechVoice:"음성",webspeechVoiceHint:"브라우저 또는 OS에서 음성 선택",webspeechVoicePlaceholder:"자동 (기본 음성)",openaiKey:"API 키",openaiKeyHint:"TTS 접근 권한이 있는 OpenAI API 키",openaiUrl:"API 기본 URL",openaiUrlHint:"예: https://api.openai.com/v1/audio/speech",openaiModel:"모델",openaiModelHint:"tts-1 (빠름) / tts-1-hd (고음질)",openaiVoice:"음색",openaiVoiceHint:"합성에 사용할 음색",customHint:"모든 OpenAI 호환 TTS API 사용 가능 — GPT-SoVITS, CosyVoice 등 지원",customUrl:"API URL",customUrlHint:"TTS 서비스의 기본 URL",customUrlPlaceholder:"로컬 어댑터에 설정된 주소 (예: http://127.0.0.1:9880)",customApiKey:"API 키 (선택사항)",customApiKeyHint:"일부 사용자 정의 엔드포인트는 인증 필요",customApiKeyPlaceholder:"필요하지 않으면 비워둠",edgeHint:"Microsoft Edge TTS 기반 (node-edge-tts).",edgeUrl:"어댑터 URL",edgeUrlHint:"Edge TTS 어댑터 주소 (예: http://127.0.0.1:9882)",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"음색",edgeVoiceHint:"음성 합성에 사용할 음색 선택",edgeRate:"속도",edgeRateHint:"음성 속도 조절 (0.5~2.0배)",edgePitch:"음높이",edgePitchHint:"음성 음높이 조절 (-20~+20 Hz)",testTitle:"음성 테스트",testText:"테스트 텍스트",testTextPlaceholder:"테스트할 텍스트 입력...",testTextDefault:"안녕하세요, 음성 테스트입니다.",testButton:"테스트",testButtonPlaying:"재생 중...",testFailed:"테스트 실패: {error}",providerMimo:"MiMo TTS",mimoHint:"샤오미 MiMo TTS — 프리셋 음성, 음성 디자인, 음성 클론 세 가지 모드 지원",mimoApiKey:"API Key",mimoApiKeyHint:"platform.xiaomimimo.com에서 발급",mimoApiKeyPlaceholder:"MiMo API Key",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 잠금 해제됨"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key 입력",noProviders:"구성된 공급자가 없습니다",save:"저장",saveFailed:"저장 실패",saved:"저장됨"}},platform:{requireMention:"{'@'}멘션 필요",requireMentionGroup:"그룹에서 {'@'}멘션 시에만 응답",requireMentionChannel:"채널에서 {'@'}멘션 시에만 응답",requireMentionRoom:"방에서 {'@'}멘션 시에만 응답",reactions:"반응",reactionsHint:"메시지에 이모지 반응",freeResponseChats:"자유 응답 채팅",freeResponseChatsHint:"{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)",freeResponseChannels:"자유 응답 채널",freeResponseChannelsHint:"{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)",freeResponseRooms:"자유 응답 방",freeResponseRoomsHint:"{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)",mentionPatterns:"사용자 지정 멘션 패턴",mentionPatternsHint:"추가 트리거 패턴",autoThread:"자동 스레드",autoThreadHint:"{'@'}멘션 후 자동으로 스레드 생성",autoThreadHintRoom:"방에서 자동으로 스레드 생성",dmMentionThreads:"DM 멘션 스레드",dmMentionThreadsHint:"DM에서 멘션 시 스레드로 응답",allowBots:"봇 메시지 허용",allowBotsHint:"다른 봇의 메시지에 응답",allowedChannels:"허용된 채널",allowedChannelsHint:"채널 ID 허용 목록 (쉼표로 구분)",ignoredChannels:"무시할 채널",ignoredChannelsHint:"봇이 응답하지 않는 채널 ID (쉼표로 구분)",noThreadChannels:"스레드 없는 채널",noThreadChannelsHint:"스레드 없이 응답할 채널 ID (쉼표로 구분)",exclusiveTokenWarning:"이 플랫폼은 독점 토큰 잠금을 사용합니다. 각 프로필은 다른 프로필과 충돌하지 않도록 서로 다른 ID 토큰을 사용해야 합니다.",botToken:"Bot Token",botTokenHint:"개발자 포털에서 발급받은 Bot Token",accessToken:"Access Token",accessTokenHint:"Matrix 액세스 토큰",homeserver:"Homeserver URL",homeserverHint:"Matrix 홈서버 URL",appId:"App ID",appIdHint:"Feishu App ID",appSecret:"App Secret",appSecretHint:"Feishu App Secret",clientId:"Client ID",clientIdHint:"DingTalk Client ID",clientSecret:"Client Secret",clientSecretHint:"DingTalk Client Secret",botId:"Bot ID",botIdHint:"WeCom Bot ID",wecomSecretHint:"WeCom Bot Secret",waEnabled:"WhatsApp 활성화",waEnabledHint:"QR 코드 페어링으로 WhatsApp 활성화",weixinToken:"Weixin Token",weixinTokenHint:"weixin CLI QR 로그인에서 가져오기 (hermes weixin)",accountId:"Account ID",accountIdHint:"Weixin Account ID",qrLogin:"QR 로그인",qrRelogin:"다시 로그인",qrFetching:"QR 코드를 가져오는 중...",qrScanHint:"WeChat으로 QR 코드를 스캔하여 로그인",qrScanedHint:"스캔됨, 휴대폰에서 확인해 주세요...",qqSandboxHint:"샌드박스 환경 활성화(테스트용)",qqSandbox:"샌드박스 모드",qqQrScanHint:"QQ로 위 QR 코드를 스캔하거나 휴대폰에서 링크를 열어 바인딩을 완료하세요",qqMarkdownHint:"Markdown 형식 메시지 활성화(일부 클라이언트는 지원하지 않을 수 있음)",qqMarkdown:"Markdown 지원",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"사용자 ID 또는 OpenID 허용 목록, 쉼표로 구분",allowedUsers:"허용 사용자",allowAllUsersHint:"모든 사용자의 메시지를 허용합니다. 끄면 허용 목록을 사용합니다",allowAllUsers:"모든 사용자 허용"},language:{label:"언어",zh:"中文",en:"English",ko:"한국어"},terminal:{sessions:"세션",newTab:"새 터미널",closeSession:"이 세션을 닫으시겠습니까?",sessionExited:"종료됨",processExited:"프로세스가 종료되었습니다 (코드 {code})",noSessions:"터미널 세션이 없습니다",connectionFailed:"터미널에 연결하지 못했습니다",connectionError:"연결 오류",connectionClosed:"연결이 닫혔습니다"},usage:{title:"사용량 통계",refresh:"새로고침",totalTokens:"총 토큰 수",inputTokens:"입력",outputTokens:"출력",totalSessions:"총 세션 수",avgPerDay:"일평균 ~{n}",estimatedCost:"예상 비용",cacheHitRate:"캐시 적중률",modelBreakdown:"모델별 분포",dailyTrend:"일별 사용량",date:"날짜",tokens:"토큰",cache:"캐시",cacheRead:"캐시 읽기",cacheWrite:"캐시 쓰기",sessions:"세션",cost:"비용",noData:"사용량 데이터 없음"},skillsUsage:{title:"스킬 사용량",subtitle:"Hermes 세션의 스킬 로드와 편집을 추적합니다",refresh:"새로고침",periodSelector:"스킬 사용량 기간",periodLabel:"{days}일",summary:"요약",totalActions:"작업 수",loads:"로드",edits:"편집",distinctSkills:"스킬 수",topSkills:"상위",dailyTrend:"일별",periodSummary:"최근 {days}일",skill:"스킬",share:"비중",lastUsed:"마지막",noData:"스킬 사용량 데이터가 없습니다",loadFailed:"스킬 사용량을 불러오지 못했습니다",otherSkills:"기타"},changelog:{new_0_5_22_1:"Hermes 세션 목록 API가 Web UI 로컬 세션 저장소 대신 Profile 데이터베이스를 읽도록 수정",new_0_5_23_1:"Bridge 전용 채팅 슬래시 명령과 지역화된 명령 제안 추가",new_0_5_23_2:"모델 컨텍스트, 사용량, 압축을 오염시키지 않고 세션 재생용 명령 기록 저장",new_0_5_23_3:"자격 증명이 Profile 간에 새지 않도록 gateway Profile 환경 변수 격리",new_0_5_23_4:"시작 충돌 방지를 위해 gateway 할당 중 Web UI 포트 예약",new_0_5_23_5:"self-update 재시작에서 성공한 helper 종료를 실패로 보고하지 않도록 수정",new_0_5_24_1:"Bridge 채팅을 API Server의 멀티모달 입력, 시스템 프롬프트, workspace 컨텍스트 처리와 정렬",new_0_5_25_1:"그룹 채팅 룸 재설정 및 복제 액션 추가",new_0_5_25_2:"사용자 지정 배포 레이아웃을 위해 Web UI 상태 디렉터리 설정 가능",new_0_5_25_3:"음성 설정에 MiMo TTS 공급자 추가",new_0_5_25_4:"브라우저 CORS 실패 방지를 위해 사용자 지정 공급자 모델 목록을 백엔드에서 가져오도록 변경",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 브라우저 테스트, 채팅 스트리밍 계약 커버리지, 공급자 모델 커버리지 및 커버리지 기준선 추가",new_0_5_26_1:"채팅 기록과 렌더링된 메시지에서 Windows 및 로컬 Markdown 미디어 경로 지원",new_0_5_26_2:"빈 assistant 기록을 필터링하고 새 실행 시작 시 오래된 압축 상태 정리",new_0_5_26_3:"동시 쓰기 손상을 줄이기 위해 config 및 Profile 업데이트에 잠금 쓰기 추가",new_0_5_26_4:"QQBot 및 DingTalk 채널 설정 추가",new_0_5_26_5:"CLI 포트 감지를 이식 가능하게 만들고 모바일 터미널 드로어 크기 개선",new_0_5_26_6:"Bridge Profile 환경 격리 및 Python 환경 간 Hermes plugin 발견 수정",new_0_5_26_7:"중지된 gateway 상태를 Web UI 진단으로 설명하고 로그 로딩 상태 안정화",new_0_5_26_8:"세션 재설정 모드 옵션, 사용자 지정 공급자 base URL 처리, 동적 전달 대상 수정",new_0_5_26_9:"채팅 입력 바에 로컬 도구 호출 추적 표시 토글 추가",new_0_5_26_10:"소스 checkout이 없을 때 Hermes Agent 패키지 설치 지원",new_0_5_26_11:"SuperGrok 구독자를 위한 xAI Grok OAuth 로그인 추가 및 Grok 모델 프리셋 업데이트",new_0_5_26_12:"브라우저, 채팅 스트리밍, 공급자, gateway, config, plugin, Bridge 테스트 커버리지 확장",new_0_5_27_1:"Bridge 채팅에 세션별 모델 설정 추가, 각 세션에서 provider와 model 독립 저장",new_0_5_27_2:"Bridge 세션을 우클릭하고 모델 설정을 선택해 해당 세션의 모델 전환",new_0_5_27_3:"실행 시 세션 모델을 검증하고 저장된 모델을 사용할 수 없으면 현재 기본 모델로 fallback",new_0_5_27_4:"컨텍스트 압축은 기본적으로 현재 Profile의 기본 선택 모델을 따름",new_0_5_30_1:"Bridge 채팅이 구조화된 기록을 보존하여 평탄화된 도구 기록으로 인한 간헐적 무응답과 도구 실행 누락 수정",new_0_5_30_2:"여러 agent의 그룹 채팅 mention 라우팅을 개선하고 전달 전 각 agent 자신의 @ mention 제거 및 새로고침 후 표시 이름 유지",new_0_5_30_3:"모델 페이지, 채팅 모델 드롭다운, 세션 모델 선택을 active Profile 범위로 제한하고 기본 표시 정확도 개선",new_0_5_30_4:"Gateway 관리 단순화: 독립 Gateway 페이지 제거, 각 Profile 플랫폼 설정 확인 후 필요한 gateway 시작, 경량 runner로 시작/재시작 관리",new_0_5_30_5:"Docker, Termux, Windows의 gateway 시작 개선: runtime lock 처리, 포트 충돌 정리, 백그라운드 실행, 재시작 지원",new_0_5_30_6:"Windows 호환성 강화: 경로 감지, 파일 다운로드, job/update 하위 프로세스에서 터미널 창이 깜박이지 않음",new_0_5_30_7:"config 쓰기와 provider preset 수정: .env 키 검증, FUN-Codex를 Responses API로 라우팅, Z.AI/GLM 모델 목록 갱신",new_0_5_30_8:"접힌 사이드바 레이아웃, 짧은 그룹 라벨, 사이드바 구분선, 대화 outline 스타일 등 프론트엔드 세부 개선",new_0_5_30_9:"컨텍스트 압축이 Profile 압축 설정을 따르고, 오래된 snapshot은 전체 재압축 대신 이전 요약과 안전한 tail 재사용",new_0_5_31_1:"Bridge broker 재시작 안정화, 그룹 채팅 최종 스트림 렌더링 수정, 그룹 채팅 {'@'}all 라우팅 추가",new_0_5_31_2:"파일 관리자가 절대 경로를 복사할 수 있고 모바일 세션 드로어가 채팅 콘텐츠 뒤로 가지 않음",new_0_5_31_3:"Profile 선택기에 아바타, 사용자 지정 아바타 업로드, 런타임 상태 모달, gateway/Profile 재시작 액션 추가",new_0_5_31_4:"Profile 아바타가 단일 채팅, 그룹 채팅, 접힌 사이드바에 표시되며 Web UI 메타데이터 저장과 Windows 안전 경로 지원",new_0_5_31_5:"Docker, Termux, Windows gateway 감지 및 재시작 확인을 개선하고 managed gateway liveness 판단에 gateway_state/gateway.pid 사용",new_0_5_31_6:"APIKEY.FUN 이미지 생성 미디어 endpoint와 내장 apikey-image-gen skill 추가, active Profile의 fun-codex provider로 텍스트-이미지, 이미지-이미지, 이미지 편집 지원",new_0_5_33_1:"단일 채팅과 그룹 채팅의 실행 실패 및 Socket 오류를 빨간 Agent 메시지로 메시지 목록에 유지하여 잠깐 나타났다 사라지지 않도록 수정",new_0_5_33_2:"세션 검색을 선택된 Profile로 제한할 수 있으며, Profile을 선택하지 않으면 모든 Profile을 검색",new_0_5_33_3:"Skills 페이지에 중국어/영어 추천 문서를 추가하고, 선택된 Skill을 다시 클릭하면 선택을 해제하도록 지원",new_0_5_33_4:"사용하지 않는 changelog 로컬라이즈 항목을 제거해 frontend i18n 크기 축소",new_0_5_33_5:"중국어 Windows 시스템에서 netstat 출력 인코딩 파싱 실패로 agent bridge 시작이 실패하는 문제 수정",new_0_5_33_6:"Nous Portal preset 모델 목록을 공개 catalog와 Portal 추천 모델에 맞춰 갱신",new_0_5_33_7:"Profile 목록과 런타임 상태가 Profile 이름은 디렉터리에서, 기본 모델은 config에서 읽어 CLI 표 열 너비로 인한 파싱 오류를 방지",new_0_5_34_1:"세션/그룹 채팅 저장 시 멀티모달 tool 결과를 정규화해 base64 이미지가 리플레이에 섞이지 않도록 수정",new_0_5_34_2:"사용자 지정 Hermes 모델을 backend 관리 설정에 저장하고 모델 추가/삭제 endpoint 추가",new_0_5_34_3:"Bridge 실행 완료 후 최종 컨텍스트 사용량과 tool 상태 업데이트 정확도 개선",new_0_5_34_4:"Kanban 보드 필터링, 담당자 표시, 카드 작업, 작업 상세 처리 개선",new_0_5_34_5:"고정 prompt/tool 컨텍스트를 캐시하고 전체 컨텍스트 token 합계를 표시하도록 압축 사용량 수정",new_0_5_34_6:"그룹 채팅 Agent별 고정 컨텍스트를 캐시하고 실제 압축이 시작될 때만 진행 상태 표시",new_0_5_34_7:"Web UI 내장 Skills를 모든 Profile에 동기화 주입하고 로그에 대상 Profile 기록",new_0_5_34_8:"Windows에서 Kanban 기능이 비정상이라면 최신 Kanban 데이터베이스 마이그레이션 수정이 포함된 Hermes로 업그레이드하세요",new_0_5_35_1:"Bridge 세션은 서로 다른 session 간 동시 실행을 지원하며, 같은 session 실행은 메시지 순서를 보존하도록 직렬화됩니다",new_0_5_35_2:"Performance Monitor 페이지를 추가해 시스템 CPU/메모리, Web UI, Bridge Broker, Workers, 활성 세션 상태를 확인할 수 있습니다",new_0_5_35_3:"Worker별 CPU, 메모리, Profile, 세션 수, 실행 상태를 보여주는 리소스 지표 추가",new_0_5_35_4:"Bridge worker 수명 주기 정리를 개선해 Broker 종료나 부모 프로세스 종료 시 worker를 회수하고 남는 Python 프로세스를 줄입니다",new_0_5_35_5:"macOS, Windows, Linux, Docker, Termux용 fallback으로 모니터링 리소스 수집의 크로스 플랫폼 호환성 강화",new_0_5_35_6:"Agent 초기화 중 worker request로 Performance Monitor가 막히지 않도록 개선해 Windows의 request timed out 가능성을 낮춤",new_0_5_35_7:"Chat Markdown에 텍스트 콘텐츠 인라인 미리보기를 추가하고, 다운로드 아이콘은 preview drawer 대신 파일을 직접 다운로드합니다",new_0_5_35_8:"콘텐츠 preview drawer 개선: 모바일 닫기 동작, 모바일 전체 너비, 데스크톱 800px 너비, 텍스트/Markdown 배경 통일",new_0_6_0_1:"계정별 및 Profile별 관리가 세션, 모델, 사용량, Kanban, 작업, 업로드, 미디어, 관련 Hermes API를 일관되게 보호합니다",new_0_6_0_2:"내장 미디어 Skills는 생성된 서버 토큰을 미디어 엔드포인트에만 사용하고 요청한 Profile에서 fun-codex/xAI 자격 증명을 확인합니다",new_0_6_0_3:"단일 채팅과 그룹 채팅이 현재 Hermes Profile을 run instructions에 주입해 Skills가 X-Hermes-Profile을 보낼 수 있습니다",new_0_6_0_4:"delegate_task subagent 진행 상황이 시작, 도구, 진행, 완료 상태로 채팅 UI에 스트리밍됩니다",new_0_6_0_5:"실행 중지 또는 중단 시 임시 이벤트를 정리해 이전 abort 상태가 다음 채팅으로 넘어가지 않게 했습니다",new_0_6_0_6:"계정 관리, 기본 자격 증명, 계정/Profile 관리, 업로드/다운로드, 내장 미디어 Skills 문서와 웹사이트 문구를 업데이트했습니다",new_0_6_0_7:"로그인 IP 잠금을 지우고 기본 admin / 123456 로그인을 재설정하는 CLI 유지보수 명령을 추가했습니다",new_0_6_0_8:"0.6.0은 Web UI의 단일 사용자 버전과 다중 사용자 버전의 경계입니다. 다중 사용자 모드에 문제가 있으면 issue를 제출하고, 필요하면 0.5.35 단일 사용자 버전으로 되돌리세요"},files:{title:"파일",tree:"디렉터리 트리",list:"파일 목록",breadcrumbRoot:"홈",newFile:"새 파일",newFolder:"새 폴더",upload:"업로드",refresh:"새로고침",open:"열기",edit:"편집",preview:"미리보기",download:"다운로드",copyPath:"경로 복사",rename:"이름 변경",delete:"삭제",name:"이름",size:"크기",modified:"수정일",actions:"작업",emptyDir:"빈 디렉터리",loading:"불러오는 중...",confirmDelete:'"{name}"을(를) 삭제하시겠습니까?',confirmDeleteDir:'디렉터리 "{name}"과 그 내부 항목을 모두 삭제하시겠습니까?',deleteFailed:"삭제 실패",deleted:"삭제됨",renameTo:"새 이름",newFileName:"파일 이름",newFolderName:"폴더 이름",created:"생성됨",createFailed:"생성 실패",renamed:"이름이 변경됨",renameFailed:"이름 변경 실패",uploadSuccess:"{count}개 파일이 업로드되었습니다",uploadFailed:"업로드 실패",saveFailed:"저장 실패",saved:"저장됨",unsavedChanges:"저장하지 않은 변경 사항이 있습니다. 취소하시겠습니까?",pathCopied:"경로가 복사되었습니다",fileTooLarge:"파일이 너무 큽니다 (최대 10MB)",permissionDenied:"보호된 파일은 수정할 수 없습니다",notFound:"파일 또는 디렉터리를 찾을 수 없습니다",backendError:"파일 작업 실패",dragDropHint:"여기로 파일을 드래그하여 업로드",closeEditor:"편집기 닫기",closePreview:"닫기",saveFile:"저장",fileTree:"파일 트리"},groupChat:{title:"그룹 채팅",createRoom:"방 만들기",joinByCode:"코드로 참여",roomName:"방 이름",roomNamePlaceholder:"방 이름을 입력하세요",inviteCode:"초대 코드",autoGenerate:"자동 생성",noRooms:"아직 방이 없습니다",selectOrCreate:"방을 선택하거나 만들어 채팅을 시작하세요",agents:"에이전트",addAgent:"에이전트 추가",selectProfile:"프로필 선택",agentAdded:"에이전트가 추가되었습니다",agentAlreadyInRoom:"해당 에이전트가 이미 방에 있습니다",agentAddFailedCount:"{count}개의 에이전트를 추가하지 못했습니다: {details}",noAgents:"이 방에 에이전트가 없습니다",members:"멤버",roomCreated:"방이 생성되었습니다",roomDeleted:"방이 삭제되었습니다",roomCloned:"방이 복제되었습니다",cloneRoom:"방 복제",copyRoomLink:"방 링크 복사",deleteRoomConfirm:"이 방을 삭제하시겠습니까?",clearContext:"컨텍스트 지우기",clearContextConfirm:"이 방의 컨텍스트를 지우시겠습니까? 메시지와 압축 스냅샷은 삭제되고 에이전트와 멤버는 유지됩니다.",contextCleared:"컨텍스트가 지워졌습니다",you:"나",joined:"방에 참여했습니다",joinFailed:"방 참여에 실패했습니다",inputPlaceholder:"메시지를 입력하세요... (Enter로 전송)",enterCode:"초대 코드를 입력하세요",yourName:"이름",yourNamePlaceholder:"표시 이름을 입력하세요",yourDescription:"설명 (선택)",yourDescriptionPlaceholder:"자신을 소개해 주세요...",agentName:"에이전트 이름",agentNamePlaceholder:"사용자 지정 이름 (빈칸=프로필 이름)",agentDesc:"에이전트 설명",agentDescPlaceholder:"이 에이전트가 하는 일을 설명...",agentReplying:"이(가) 응답 중...",agentCompressing:"이(가) 컨텍스트 압축 중...",compressionSettings:"압축 설정",triggerTokens:"압축 트리거 토큰",triggerTokensDesc:"이 토큰 수를 초과하면 컨텍스트 압축이 시작됩니다",maxHistoryTokens:"최대 기록 토큰",maxHistoryTokensDesc:"압축된 컨텍스트의 최대 토큰 수",tailMessageCount:"최근 메시지 수",tailMessageCountDesc:"압축 후 그대로 유지할 최근 메시지 수",compressionConfig:"압축 설정",compressNow:"지금 압축",compressingInProgress:"압축 진행 중",compressionSaved:"압축 설정이 저장되었습니다"},download:{downloading:"다운로드 중...",downloadFailed:"다운로드 실패",fileNotFound:"파일을 찾을 수 없거나 삭제되었습니다",fileTooLarge:"파일이 너무 큽니다 (제한 초과)",backendError:"파일 읽기에 실패했습니다. 원격 환경이 사용 불가능할 수 있습니다",backendTimeout:"파일 읽기 시간 초과",unsupportedBackend:"현재 터미널 백엔드는 파일 다운로드를 지원하지 않습니다",invalidPath:"잘못된 파일 경로",contentDisplay:"내용 표시",download:"다운로드",downloadFile:"파일 다운로드"},gateways:{title:"게이트웨이",running:"실행 중",stopped:"중지됨",started:"시작됨",startFailed:"Gateway 시작 실패",stopFailed:"Gateway 중지 실패"},kanban:{title:"Kanban 보드",createTask:"새 작업",noTasks:"작업 없음",allStatuses:"모든 상태",allAssignees:"모든 담당자",columns:{triage:"분류 대기",todo:"할 일",ready:"준비됨",running:"진행 중",blocked:"차단됨",done:"완료됨",archived:"보관됨"},card:{assigneeTooltip:"담당자",priority:{low:"낮음",medium:"보통",high:"높음"},timeAgo:{justNow:"방금",minutes:"{count}분 전",hours:"{count}시간 전",days:"{count}일 전"}},board:{create:"새 보드",archive:"보드 보관",archiveConfirm:"현재 보드를 보관하시겠습니까?",archived:"보드가 보관되었습니다",created:"보드가 생성되었습니다",slugPlaceholder:"보드 식별자, 예: project-a",namePlaceholder:"표시 이름 (선택)",slugRequired:"보드 식별자는 필수입니다"},form:{title:"제목",titlePlaceholder:"작업 제목",titleRequired:"제목은 필수입니다",body:"설명",bodyPlaceholder:"작업 설명 (선택)",assignee:"담당자",selectAssignee:"담당자 선택...",priority:"우선순위",selectPriority:"우선순위 선택..."},detail:{status:"상태",priority:"우선순위",assignee:"담당자",tenant:"테넌트",createdAt:"생성 시간",startedAt:"시작 시간",completedAt:"완료 시간",comments:"댓글",events:"이벤트",runs:"실행 기록",artifacts:"산출 파일",result:"완료 결과",highlights:"핵심 정보",sources:"데이터 소스",sessions:"관련 세션",sessionMessages:"세션 기록",noSessions:"관련 세션을 찾을 수 없습니다."},action:{title:"작업",assign:"할당",assignTo:"할당 대상...",block:"차단",blockReason:"차단 이유",unblock:"차단 해제",complete:"완료",completeSummary:"완료 요약 (선택)"},message:{loadFailed:"작업 로드 실패",taskCreated:"작업이 생성되었습니다",taskAssigned:"작업이 할당되었습니다",taskBlocked:"작업이 차단되었습니다",taskUnblocked:"작업 차단이 해제되었습니다",taskCompleted:"작업이 완료되었습니다"},stats:{total:"합계",tasks:"작업 수"}}},Tt={login:{title:"Hermes Web UI",description:"Entrez votre nom d'utilisateur et votre mot de passe pour continuer.",placeholder:"Jeton d'acces",submit:"Connexion",tokenRequired:"Veuillez entrer votre jeton d'acces",invalidToken:"Jeton invalide",connectionFailed:"Impossible de se connecter au serveur",passwordLogin:"Mot de passe",tokenLogin:"Jeton",usernamePlaceholder:"Nom d'utilisateur",passwordPlaceholder:"Mot de passe",defaultCredentialsHint:"Nom d utilisateur par defaut : admin. Mot de passe par defaut : 123456.",credentialsRequired:"Veuillez entrer le nom d'utilisateur et le mot de passe",invalidCredentials:"Nom d'utilisateur ou mot de passe incorrect",tooManyAttempts:"Trop de tentatives echouees, veuillez reessayer plus tard",sessionExpired:"La session a expire. Veuillez vous reconnecter.",accessDenied:"Vous n'avez pas l'autorisation d'acceder a cette ressource.",passwordMismatch:"Les mots de passe ne correspondent pas",passwordTooShort:"Le mot de passe doit contenir au moins 6 caracteres",setupSuccess:"Login par mot de passe configure avec succes",passwordChanged:"Mot de passe change avec succes",passwordRemoved:"Login par mot de passe supprime",setupPassword:"Configurer le login par mot de passe",changePassword:"Changer le mot de passe",changeUsername:"Changer le nom d'utilisateur",removePasswordLogin:"Supprimer",username:"Nom d'utilisateur",currentPassword:"Mot de passe actuel",newPassword:"Nouveau mot de passe",confirmPassword:"Confirmer le mot de passe",newUsername:"Nouveau nom d'utilisateur",usernameChanged:"Nom d'utilisateur change avec succes",usernameTooShort:"Le nom d'utilisateur doit contenir au moins 2 caracteres",setupDescription:"Gerez le nom d'utilisateur et le mot de passe utilises pour vous connecter.",removeConfirm:"Le login par mot de passe est requis pour les comptes utilisateur.",passwordLoginNotConfigured:"Login par mot de passe non configure",passwordLoginConfigured:"Compte actuel : {username}",defaultCredentialTitle:"Modifiez le compte et le mot de passe par defaut",defaultCredentialMessage:"Le compte connecte utilise encore le nom d utilisateur ou le mot de passe par defaut. Pour eviter tout acces non autorise, modifiez rapidement le nom d utilisateur et le mot de passe du compte actuel.",defaultCredentialAction:"Modifier maintenant",defaultCredentialLater:"Me le rappeler plus tard"},users:{title:"Gestion des comptes",description:"Creez des utilisateurs, attribuez des roles et controlez les profils accessibles aux administrateurs standard.",create:"Creer un utilisateur",edit:"Modifier l utilisateur",username:"Nom d utilisateur",role:"Role",statusLabel:"Statut",profiles:"Profils accessibles",profilesPlaceholder:"Selectionner les profils accessibles",allProfiles:"Tous les profils",noProfiles:"Aucun profil assigne",lastLogin:"Derniere connexion",newPasswordOptional:"Nouveau mot de passe (laisser vide pour conserver)",loadFailed:"Echec du chargement des utilisateurs",deleteConfirm:"Supprimer cet utilisateur ?",enable:"Activer",disable:"Desactiver",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Actif",disabled:"Desactive"}},common:{loading:"Chargement...",cancel:"Annuler",retry:"Réessayer",delete:"Supprimer",edit:"Modifier",save:"Enregistrer",saved:"Enregistre",update:"Mettre a jour",create:"Creer",saveFailed:"Echec de l'enregistrement",deleteFailed:"Echec de la suppression",ok:"OK",copied:"Copie",copy:"Copier",noData:"Aucune donnee",fetch:"Recuperer",add:"Ajouter",enable:"Activer",disable:"Desactiver",configured:"Configure",notConfigured:"Non configure",confirm:"Confirmer",expand:"Developper",collapse:"Reduire",stop:"Arrêter",start:"Démarrer",expired:"Expiré"},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",performance:"Performance",skillsUsage:"Utilisation des compétences",channels:"Canaux",terminal:"Terminal",files:"Fichiers",groupChat:"Chat de groupe",groupConversation:"Conversation",groupConversationShort:"Conv.",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"Systeme",groupSystemShort:"Sys",groupMonitoring:"Suivi",groupMonitoringShort:"Suivi",settings:"Parametres",connected:"Connecte",disconnected:"Deconnecte",updateTip:'Executez "hermes-web-ui update" dans le terminal pour mettre a jour',updateVersion:"Mettre a jour vers v{version}",reloadClientVersion:"Recharger pour v{version}",updating:"Mise a jour...",updateSuccess:"Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.",updateFailed:"Echec de la mise a jour",logout:"Deconnexion",nodeVersionWarning:"Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.",changelog:"Journal des modifications",noChangelog:"Aucun journal disponible",kanban:"Kanban",groupTools:"Outils",groupPlatform:"Plateforme",gateways:"Passerelles",expand:"Déplier le menu",collapse:"Replier le menu"},performance:{title:"Performance",subtitle:"Surveiller les ressources système, Bridge Broker, Workers et sessions actives",refresh:"Actualiser",autoRefreshOn:"Actualisation auto",autoRefreshOff:"Actualisation manuelle",loadFailed:"Échec du chargement des métriques de performance",systemCpu:"CPU système",systemMemory:"Mémoire système",activeSessions:"Sessions actives",runningSessions:"En cours {count}",workers:"Workers",totalWorkerMemory:"Mémoire totale Worker",processes:"Processus",uptime:"Disponibilité",running:"En cours",stopped:"Arrêté",workerMemory:"Mémoire Worker",lastUpdated:"Mis à jour",profile:"Profile",memory:"Mémoire",sessions:"Sessions",runningActiveSessions:"En cours / Actives",lastUsed:"Dernière utilisation",status:"Statut",noWorkers:"Aucun Worker",sessionsByProfile:"Sessions par Profile",noActiveSessions:"Aucune session active"},drawer:{terminal:"Terminal",files:"Espace de travail"},chat:{contextRemaining:"restant",contextClickToEdit:"Cliquez pour modifier la longueur du contexte",contextEditTitle:"Modifier la longueur du contexte",contextEditDesc:"Définir la limite de longueur du contexte pour le modèle actuel (en tokens)",contextEditPlaceholder:"Entrez la longueur du contexte",contextEditHint:"Valeurs courantes : 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",outlineTitle:"Plan de la conversation",outlineEmpty:"Aucun contenu de conversation",outlineUserQuestion:"Question utilisateur",inputPlaceholder:"Tapez un message... (Entree pour envoyer, Shift+Entree pour un saut de ligne)",slashCommandArgs:{message:"<message>",title:"<titre>",text:"<texte>"},slashCommands:{usage:"Calculer l’utilisation de la session actuelle",status:"Afficher l’état de la session et la file",abort:"Arrêter l’exécution Bridge active",queue:"Mettre un message en file après l’exécution active",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",allProfiles:"Tous les profils",profileMissingModelsTip:'Le profil "{profile}" n’a aucun fournisseur ni modèle disponible pour cette session',sessionScopeHint:"Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.",openHistory:"Ouvrir l’historique",hermesHistory:"Historique Hermes",historyScopeHint:"Sessions d’historique Hermes du profil actuel en lecture seule, regroupées par source.",noSessions:"Aucune session",newChat:"Nouvelle discussion",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:"Mode chat",liveMode:"Direct",liveSessions:"Sessions en direct",recentBadge:"Récent",linkedSessions:"{count} sessions liées",noVisibleMessages:"Aucun message visible par l’humain.",monitorRoleUser:"Utilisateur",monitorRoleAssistant:"Assistant",copySessionLink:"Copier le lien de session",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:"Temps d’exécution",thinkingLabel:"Raisonnement",thinkingInProgress:"En réflexion…",thinkingShow:"Afficher le raisonnement",thinkingHide:"Masquer le raisonnement",thinkingDuration:"Observé {duration}",thinkingChars:"{count} caractères",copyBubble:"Copier le message",copiedBubble:"Message copié",copyFailed:"Échec de la copie",playSpeech:"Lire à voix haute",pauseSpeech:"Pause",resumeSpeech:"Reprendre",stopSpeech:"Arrêter",speechNotSupported:"Reproduction vocale non prise en charge dans ce navigateur",searchEnterHint:"Entrée pour ouvrir · Échap pour fermer",searchHint:"Cmd/Ctrl+K",searchScope:"Portée de recherche : base locale des sessions Web UI uniquement ; les sessions d’historique Hermes en lecture seule ne sont pas incluses.",searchFailed:"Échec de la recherche de sessions",searchNoSnippet:"Aucun extrait disponible",searchNoResults:"Aucune session correspondante",searchRecent:"Session récente",searchEmpty:"Sessions récentes",searchPlaceholder:"Rechercher des sessions...",searchSubtitle:"Rechercher par titre ou contenu des messages",searchTitle:"Rechercher des sessions",stopGateway:"Arrêter le gateway",start:"Démarrer",workspaceSetFailed:"Échec de la définition du workspace",workspaceSet:"Workspace défini",workspacePlaceholder:"Saisissez le chemin du projet, ex. /home/user/project",workspace:"Espace de travail",setWorkspaceTitle:"Définir le workspace de session",setWorkspace:"Définir le workspace",modelSetFailed:"Échec de la définition du modèle",modelSet:"Modèle défini",setModelTitle:"Définir le modèle de session",setModel:"Définir le modèle",newCliChat:"Nouveau CLI",cliEmptyState:"Démarrer un chat CLI",autoPlaySpeech:"Lire la voix automatiquement"},jobs:{title:"Taches planifiees",createJob:"Creer une tache",editJob:"Modifier la tache",noJobs:"Aucune tache planifiee. Creez-en une pour commencer.",name:"Nom",namePlaceholder:"Nom de la tache",schedule:"Planification (expression Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapides",selectPreset:"Selectionner un preset...",presetEveryMinute:"Chaque minute",presetEvery5Min:"Toutes les 5 minutes",presetEveryHour:"Chaque heure",presetEveryDay:"Tous les jours a 00:00",presetEveryDay9:"Tous les jours a 09:00",presetEveryMonday:"Chaque lundi a 09:00",presetEveryMonth:"Le 1er de chaque mois a 09:00",prompt:"Invite",promptPlaceholder:"L'invite a executer",deliverTarget:"Cible de livraison",origin:"Origine",local:"Local",repeatCount:"Nombre de repetitions (facultatif)",modelPlaceholder:"Modele par defaut",repeatPlaceholder:"Laisser vide pour infini",jobCreated:"Tache creee",jobUpdated:"Tache mise a jour",nameRequired:"Le nom est requis",scheduleRequired:"La planification est requise",loadFailed:"Echec du chargement de la tache",jobPaused:"Tache en pause",jobResumed:"Tache reprise",jobTriggered:"Job declenche",modelUpdated:"Modele mis a jour",jobDeleted:"Tache supprimee",status:{running:"En cours",paused:"En pause",disabled:"Desactivee",scheduled:"Planifiee"},info:{model:"Modele",schedule:"Planification",lastRun:"Derniere execution",nextRun:"Prochaine execution",deliver:"Livraison",repeat:"Repetition"},action:{pause:"Pause",pauseJob:"Mettre en pause",resume:"Reprendre",resumeJob:"Reprendre la tache",runNow:"Executer maintenant",triggerImmediately:"Déclencher immédiatement"},runHistory:{title:"Historique",runs:"exécutions",noRuns:"Aucun historique trouvé."}},skills:{title:"Competences",searchPlaceholder:"Rechercher des competences...",noMatch:"Aucune competence ne correspond a votre recherche",noSkills:"Aucune competence trouvee",backTo:"Retour a",attachedFiles:"Fichiers joints",loadFailed:"Echec du chargement de la competence",fileLoadFailed:"Echec du chargement du fichier",modified:"Modifié par l'utilisateur",archived:"Archivé",pinned:"Épinglé",pin:"Épingler la compétence",unpin:"Désépingler la compétence",pinFailed:"Impossible de changer le statut d'épinglage",toggleFailed:"Echec de l'activation/desactivation de la competence",source:{builtin:"Intégré",hub:"Hub",local:"Local"}},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:"Racine de l’agent",python:"Python",scanCwd:"Analyser cwd",projectPlugins:"Plugins du projet"}},memory:{title:"Memoire",refresh:"Actualiser",loadFailed:"Echec du chargement de la memoire",myNotes:"Mes notes",noNotes:"Aucune note pour l'instant.",notesPlaceholder:"Ecrivez vos notes...",userProfile:"Profil utilisateur",noProfile:"Aucun profil pour l'instant.",profilePlaceholder:"Ecrivez votre profil...",soul:"Ame",noSoul:"Aucune configuration d'ame pour l'instant.",soulPlaceholder:"Ecrivez la configuration de l'ame..."},models:{title:"Modeles",addProvider:"Ajouter un fournisseur",providerType:"Type de fournisseur",preset:"Préréglage",custom:"Personnalise",selectProvider:"Selectionner un fournisseur",chooseProvider:"Choisir un fournisseur...",name:"Nom",autoGeneratedName:"Genere automatiquement a partir de l'URL de base",baseUrl:"URL de base",region:"Région",regionIntl:"International",regionCn:"Chine continentale",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Cle API",apiKeyPlaceholder:"sk-...",defaultModel:"Modele par defaut",selectOrInput:"Sélectionner ou saisir un modèle...",selectModel:"Selectionner un modele...",providerAdded:"Fournisseur ajoute",providerDeleted:"Fournisseur supprime",deleteProvider:"Supprimer le fournisseur",deleteConfirm:'Etes-vous sur de vouloir supprimer "{name}" ?',codexLoginTitle:"Connexion OpenAI Codex",codexWaiting:"Entrez ce code sur la page d'autorisation pour vous connecter :",codexCopyCode:"Code copié",codexOpenLink:"Ouvrir la page d'autorisation",codexApproved:"Connexion réussie",codexExpired:"L'autorisation a expiré. Veuillez réessayer.",nousLoginTitle:"Connexion Nous Portal",nousWaiting:"Entrez ce code sur la page d'autorisation:",nousCopyCode:"Code copié",nousOpenLink:"Ouvrir la page d'autorisation",nousApproved:"Connexion réussie",nousDenied:"Autorisation refusée",nousExpired:"Autorisation expirée",copilotLoginTitle:"Connexion GitHub Copilot",copilotWaiting:"Ouvrez GitHub et saisissez le code ci-dessous pour autoriser. La fenêtre se fermera automatiquement après approbation.",copilotCopyCode:"Code copié",copilotOpenLink:"Ouvrir la page d'autorisation GitHub",copilotApproved:"Connexion réussie !",copilotDenied:"Autorisation refusée.",copilotExpired:"Le lien d'autorisation a expiré. Veuillez réessayer.",copilotAddDetectedTitle:"GitHub Copilot détecté",copilotAddDetected:"Un token OAuth GitHub Copilot a été détecté sur cette machine. Cliquez sur Ajouter pour activer Copilot dans 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",currentDefault:"Par défaut actuel",defaultShort:"Défaut",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",xaiWaiting:"Terminez l’autorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.",xaiOpenLink:"Ouvrir la page d’autorisation xAI",xaiLoginTitle:"Connexion OAuth xAI Grok",xaiExpired:"Le lien d’autorisation a expiré. Veuillez réessayer.",xaiCopyLink:"Copier le lien d’autorisation",xaiApproved:"Connexion réussie !",visibilitySelectOne:"Conserver au moins un modèle visible",visibilitySaved:"Modèles visibles enregistrés",visibilitySaveFailed:"Échec de l’enregistrement des modèles visibles",visibilityHint:"Affecte uniquement le sélecteur de modèles et la page Modèles de la Web UI. La configuration provider/model de Hermes CLI n’est pas modifiée ; les appels utilisent toujours l’ID de modèle d’origine.",showAllModels:"Afficher tous les modèles",searchPlaceholder:"Rechercher des modèles...",removeCustomModel:"Retirer ce modèle non listé",more:"de plus",models:"Liste des modèles",manageVisibleModelsFor:"Gérer les modèles visibles de {name}",manageVisibleModels:"Gérer les modèles visibles",getApiKey:"Obtenir une API Key",count:"modèles",aliasUseOriginal:"Restaurer l’ID d’origine",aliasTitleFor:"Nom affiché pour {model}",aliasTitle:"Nom affiché du modèle",aliasSaveFailed:"Échec de l’enregistrement du nom affiché",aliasPlaceholder:"Laisser vide pour utiliser l’ID de modèle d’origine",aliasManageFor:"Noms affichés pour {provider}",aliasManage:"Noms affichés",aliasHint:"Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours l’ID de modèle d’origine.",aliasEdit:"Renommer",aliasCanonical:"ID d’origine : {model}"},profiles:{title:"Profils",create:"Creer un profil",import:"Importer",export:"Exporter",rename:"Renommer",delete:"Supprimer",switchTo:"Changer Hermes Profile",switchConfirm:"Cette action execute `hermes profile use {name}` et change le active profile Hermes CLI. Continuer ?",switchSuccess:'Hermes active profile change vers "{name}"',switchFailed:"Echec du changement Hermes Profile. La passerelle peut necessiter un redemarrage manuel.",createSuccess:'Profil "{name}" cree',createFailed:"Echec de la creation du profil",renameSuccess:"Profil renomme",renameFailed:"Echec du renommage du profil",deleteConfirm:'Etes-vous sur de vouloir supprimer le profil "{name}" ?',deleteSuccess:"Profil supprime",deleteFailed:"Echec de la suppression du profil",exportSuccess:"Profil exporte",exportFailed:"Echec de l'exportation du profil",importSuccess:"Profil importe",importFailed:"Echec de l'importation du profil",importSelectFile:"Selectionner un fichier d'archive",importInvalidFile:"Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)",name:"Nom du profil",namePlaceholder:"Lettres, chiffres et tirets uniquement",nameValidation:"Le nom du profil ne peut contenir que des lettres minuscules, des chiffres, des tirets bas et des tirets",newName:"Nouveau nom",newNamePlaceholder:"Entrez un nouveau nom",cloneFromCurrent:"Cloner depuis le profil actuel",cloneCleanupNotice:"Lors du clonage, les identifiants de plateformes exclusives (Weixin / Telegram / Slack, etc.) sont automatiquement ignorés pour éviter les conflits avec le profil source",cloneStrippedCredentials:"{count} identifiant(s) exclusif(s) supprimé(s) : {list}",cloneDisabledPlatforms:"{count} plateforme(s) désactivée(s) : {list}",cloneStrippedConfigCredentials:"{count} identifiant(s) intégré(s) supprimé(s) de config.yaml : {list}",archivePath:"Chemin de l'archive",archivePathPlaceholder:"Chemin serveur du fichier d'archive",importName:"Nom du profil (facultatif)",importNamePlaceholder:"Laisser vide pour utiliser le nom de l'archive",active:"Actif",model:"Modele",gateway:"Passerelle",alias:"Alias",provider:"Fournisseur",path:"Chemin",skills:"Competences",hasEnv:"A un .env",hasSoulMd:"A un soul.md",noProfiles:"Aucun profil trouve. Creez-en un pour commencer.",avatar:{title:"Avatar personnalisé",customize:"Personnaliser l’avatar",upload:"Importer une image",random:"Générer au hasard",reset:"Restaurer par défaut",hint:"PNG, JPEG ou WebP, 1 Mo maximum",invalidType:"Veuillez choisir une image PNG, JPEG ou WebP",tooLarge:"L’image d’avatar ne doit pas dépasser 1 Mo",saveSuccess:"Avatar enregistré",saveFailed:"Échec de l’enregistrement de l’avatar",resetSuccess:"Avatar par défaut restauré",resetFailed:"Échec de la restauration de l’avatar par défaut"},runtime:{activeProfile:"Actuel : {name}",bridgeWorker:"État du Bridge",gateway:"Passerelle",active:"Actif",activeTag:"Actuel",idle:"Inactif",running:"En cours",stopped:"Arrêté",restartGateway:"Redémarrer le gateway",restartProfile:"Redémarrer le profil",switchProfile:"Changer le profil frontend",gatewayRestarted:"Gateway redémarré : {name}",gatewayRestartFailed:"Échec du redémarrage du gateway",profileRestarted:"Profil redémarré : {name}",profileRestartFailed:"Échec du redémarrage du profil"}},logs:{title:"Journaux",all:"Tout",searchPlaceholder:"Rechercher...",refresh:"Actualiser",noEntries:"Aucune entree de journal"},settings:{title:"Parametres",saved:"Enregistre",saveFailed:"Echec de l'enregistrement",tabs:{display:"Affichage",account:"Compte actuel",users:"Gestion des comptes",agent:"Agent",memory:"Memoire",compression:"Compression",session:"Session",privacy:"Confidentialite",apiServer:"Serveur API",models:"Modèles",voice:"Voix"},display:{streaming:"Reponses en continu",streamingHint:"Afficher les reponses de l'IA en temps reel",compact:"Mode compact",compactHint:"Reduire l'espacement des messages",showReasoning:"Afficher le raisonnement",showReasoningHint:"Afficher le processus de reflexion du modele",showCost:"Afficher le cout",showCostHint:"Afficher l'utilisation des jetons dans les reponses",inlineDiffs:"Diffs en ligne",inlineDiffsHint:"Afficher les changements de code en ligne",bellOnComplete:"Son de fin",bellOnCompleteHint:"Jouer un son lorsque l'IA a termine",busyInputMode:"Mode saisie active",busyInputModeHint:"Permettre la saisie pendant le traitement de l'IA",theme:"Thème",themeHint:"Choisir clair, sombre ou suivre les preferences du systeme",themeLight:"Clair",themeDark:"Sombre",themeSystem:"Systeme"},agent:{maxTurns:"Tours maximum",maxTurnsHint:"Nombre maximum de tours d'interaction par conversation",gatewayTimeout:"Delai d'attente de la passerelle",gatewayTimeoutHint:"Delai d'attente de la requete en secondes",restartDrainTimeout:"Delai de vidange au redemarrage",restartDrainTimeoutHint:"Delai de vidange avant redemarrage en secondes",toolEnforcement:"Application des outils",toolEnforcementHint:"Controler le mode d'execution des appels d'outils",auto:"Automatique",always:"Toujours",never:"Jamais"},memory:{enabled:"Activer la memoire",enabledHint:"Permettre a l'IA de memoriser le contexte de conversation",userProfile:"Profil utilisateur",userProfileHint:"Permettre a l'IA de memoriser les preferences utilisateur",charLimit:"Limite de caracteres de la memoire",charLimitHint:"Nombre maximum de caracteres pour MEMORY.md",userCharLimit:"Limite de caracteres du profil utilisateur",userCharLimitHint:"Nombre maximum de caracteres pour USER.md"},compression:{enabled:"Activer la compression",enabledHint:"Compresser automatiquement un long historique avant de depasser le contexte du modele",threshold:"Seuil de compression",thresholdHint:"Demarrer la compression quand les jetons estimes depassent ce ratio de contexte",targetRatio:"Ratio cible",targetRatioHint:"Taille cible de l'historique apres compression comme ratio du contexte",protectLastN:"Proteger les messages recents",protectLastNHint:"Garder autant de messages recents non compresses",protectFirstN:"Proteger les premiers messages",protectFirstNHint:"Garder autant de premiers messages non compresses"},session:{mode:"Mode de reinitialisation",modeHint:"Condition de declenchement de la reinitialisation de session",modeBoth:"Inactivite + Planifie",modeIdle:"Inactivite uniquement",modeDaily:"Planifie uniquement",modeNone:"Jamais (manuel uniquement)",idleMinutes:"Delai d'inactivite",idleMinutesHint:"Temps d'attente avant reinitialisation automatique (minutes)",atHour:"Heure de reinitialisation planifiee",humanOnly:"Afficher uniquement les sessions humaines",humanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session",liveMonitorHumanOnly:"Moniteur live : n’afficher que les sessions humaines",liveMonitorHumanOnlyHint:"Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live",atHourHint:"Reinitialiser la session a cette heure chaque jour",requireAuth:"Autorisation de session",requireAuthHint:"Requiere l'autorisation pour les operations de session"},privacy:{redactPii:"Masquer les DPI",redactPiiHint:"Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)"},apiServer:{enable:"Activer",enableHint:"Activer le serveur API",host:"Hote",hostHint:"Adresse d'ecoute",port:"Port",portHint:"Port d'ecoute",key:"Cle",keyHint:"Cle d'acces API",cors:"Origines CORS",corsHint:"Sources cross-origin autorisees"},voice:{ttsProvider:"Fournisseur TTS",ttsProviderHint:"Choisir le moteur de synthese vocale pour la lecture des messages",providerWebSpeech:"WebSpeech API (Navigateur)",providerOpenai:"OpenAI TTS",providerCustom:"Point d'acces personnalise (compatible OpenAI)",providerEdge:"Edge TTS (Gratuit, sans cle API)",webspeechVoice:"Voix",webspeechVoiceHint:"Choisir une voix depuis le navigateur ou l'OS",webspeechVoicePlaceholder:"Auto (voix par defaut)",openaiKey:"Cle API",openaiKeyHint:"Votre cle API OpenAI avec acces TTS",openaiUrl:"URL de base API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modele",openaiModelHint:"tts-1 (rapide) / tts-1-hd (haute qualite)",openaiVoice:"Voix",openaiVoiceHint:"Voix a utiliser pour la synthese",customHint:"Utilisez toute API TTS compatible OpenAI — fonctionne avec GPT-SoVITS, CosyVoice, etc.",customUrl:"URL API",customUrlHint:"URL de base de votre service TTS",customUrlPlaceholder:"Adresse configuree dans l'adaptateur local, ex. http://127.0.0.1:9880",customApiKey:"Cle API (optionnelle)",customApiKeyHint:"Certains points d'acces personnalises necessitent une authentification",customApiKeyPlaceholder:"Laisser vide si inutile",edgeHint:"Propulse par Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL de l'adaptateur",edgeUrlHint:"Adresse de l'adaptateur Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voix",edgeVoiceHint:"Choisir une voix pour la synthese vocale",edgeRate:"Vitesse",edgeRateHint:"Ajuster la vitesse de la voix (0.5x ~ 2.0x)",edgePitch:"Hauteur",edgePitchHint:"Ajuster la hauteur de la voix (-20 ~ +20 Hz)",testTitle:"Test vocal",testText:"Texte de test",testTextPlaceholder:"Entrez le texte a tester...",testTextDefault:"Bonjour, ceci est un test vocal.",testButton:"Tester",testButtonPlaying:"Lecture...",testFailed:"Echec du test : {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voices predefinies, conception vocale et clonage vocal",mimoApiKey:"Cle API",mimoApiKeyHint:"Obtenez votre cle sur platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Cle API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Saisir l’API Key",noProviders:"Aucun fournisseur configuré",save:"Enregistrer",saveFailed:"Échec de l’enregistrement",saved:"Enregistré"}},platform:{requireMention:"Exiger une mention {'@'}",requireMentionGroup:"Exiger une mention {'@'} dans les groupes pour repondre",requireMentionChannel:"Exiger une mention {'@'} dans les canaux pour repondre",requireMentionRoom:"Exiger une mention {'@'} dans les salles pour repondre",reactions:"Réactions",reactionsHint:"Reagir aux messages avec des emoji",freeResponseChats:"Discussions en reponse libre",freeResponseChatsHint:"ID de discussions repondant sans mention {'@'} (separes par des virgules)",freeResponseChannels:"Canaux en reponse libre",freeResponseChannelsHint:"ID de canaux repondant sans mention {'@'} (separes par des virgules)",freeResponseRooms:"Salles en reponse libre",freeResponseRoomsHint:"ID de salles repondant sans mention {'@'} (separes par des virgules)",mentionPatterns:"Motifs de mention personnalises",mentionPatternsHint:"Motifs de declenchement supplementaires",autoThread:"Fil automatique",autoThreadHint:"Creer automatiquement des fils de reponse apres une mention {'@'}",autoThreadHintRoom:"Creer automatiquement des fils de reponse dans les salles",dmMentionThreads:"Fils de mention en MP",dmMentionThreadsHint:"Utiliser des fils de reponse pour les mentions en MP",allowBots:"Autoriser les messages de bots",allowBotsHint:"Repondre aux messages d'autres bots",allowedChannels:"Canaux autorises",allowedChannelsHint:"Liste blanche des ID de canaux (separes par des virgules)",ignoredChannels:"Canaux ignores",ignoredChannelsHint:"Canaux ou le bot ne repond jamais (separes par des virgules)",noThreadChannels:"Canaux sans fil",noThreadChannelsHint:"Canaux ou le bot repond sans fil (separes par des virgules)",exclusiveTokenWarning:"Cette plateforme utilise un verrou de jeton exclusif. Chaque profil doit utiliser un jeton d'identite different pour eviter les conflits avec les autres profils.",botToken:"Jeton de bot",botTokenHint:"Jeton de bot depuis le portail developpeur",accessToken:"Jeton d'acces",accessTokenHint:"Jeton d'acces Matrix",homeserver:"URL du serveur domestique",homeserverHint:"URL du serveur domestique Matrix",appId:"ID de l'application",appIdHint:"ID de l'application Feishu",appSecret:"Secret de l'application",appSecretHint:"Secret de l'application Feishu",clientId:"ID client",clientIdHint:"ID client DingTalk",clientSecret:"Secret client",clientSecretHint:"Secret client DingTalk",botId:"ID du bot",botIdHint:"ID du bot WeCom",wecomSecretHint:"Secret du bot WeCom",waEnabled:"Activer WhatsApp",waEnabledHint:"Activer WhatsApp via appairage par code QR",weixinToken:"Jeton Weixin",weixinTokenHint:"Depuis la connexion QR de la CLI weixin (hermes weixin)",accountId:"ID de compte",accountIdHint:"ID du compte Weixin",qrLogin:"Connexion QR",qrRelogin:"Reconnexion",qrFetching:"Recuperation du code QR...",qrScanHint:"Scannez avec WeChat pour vous connecter",qrScanedHint:"Scanne, veuillez confirmer sur le telephone...",qqSandboxHint:"Activer l’environnement sandbox (pour les tests)",qqSandbox:"Mode sandbox",qqQrScanHint:"Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer l’association",qqMarkdownHint:"Activer les messages au format Markdown (certains clients peuvent ne pas le prendre en charge)",qqMarkdown:"Support Markdown",qqAppSecretHint:"App Secret du bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID du bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Liste blanche d’ID utilisateur ou OpenID, séparés par des virgules",allowedUsers:"Utilisateurs autorisés",allowAllUsersHint:"Autoriser les messages de tout utilisateur ; désactivez pour utiliser la liste blanche",allowAllUsers:"Autoriser tous les utilisateurs"},language:{label:"Langue",zh:"中文",en:"English",fr:"Francais"},terminal:{sessions:"Sessions",newTab:"Nouveau terminal",closeSession:"Fermer cette session ?",sessionExited:"Terminee",processExited:"Processus termine avec le code {code}",noSessions:"Aucune session terminal",connectionFailed:"Connexion au terminal impossible",connectionError:"Erreur de connexion",connectionClosed:"Connexion fermée"},usage:{title:"Statistiques d'utilisation",refresh:"Actualiser",totalTokens:"Total des jetons",inputTokens:"Entree",outputTokens:"Sortie",totalSessions:"Total des sessions",avgPerDay:"~{n}/jour en moy.",estimatedCost:"Cout est.",cacheHitRate:"Taux de succes du cache",modelBreakdown:"Repartition par modele",dailyTrend:"Utilisation quotidienne",date:"Date",tokens:"Jetons",cache:"Cache",cacheRead:"Lecture cache",cacheWrite:"Écriture cache",sessions:"Sessions",cost:"Cout",noData:"Aucune donnee d'utilisation"},skillsUsage:{title:"Utilisation des compétences",subtitle:"Suivre les chargements et modifications de compétences dans les sessions Hermes",refresh:"Actualiser",periodSelector:"Période d'utilisation des compétences",periodLabel:"{days} j",summary:"Résumé",totalActions:"Act.",loads:"Charg.",edits:"Modif.",distinctSkills:"Comp.",topSkills:"Top comp.",dailyTrend:"Tendance",periodSummary:"{days} derniers jours",skill:"Comp.",share:"%",lastUsed:"Dern. usage",noData:"Aucune donnée d'utilisation des compétences",loadFailed:"Impossible de charger l'utilisation des compétences",otherSkills:"Autres comp."},changelog:{new_0_5_22_1:"L’API de liste des sessions Hermes lit la base du profil au lieu du store local Web UI",new_0_5_23_1:"Commandes slash de chat réservées au Bridge avec suggestions localisées",new_0_5_23_2:"Historique de commandes persistant pour rejouer les sessions sans polluer le contexte, l’usage ou la compression",new_0_5_23_3:"Variables d’environnement du profil gateway isolées pour éviter les fuites d’identifiants entre profils",new_0_5_23_4:"Port Web UI réservé pendant l’allocation gateway pour éviter les conflits de démarrage",new_0_5_23_5:"Redémarrage d’auto-mise à jour corrigé pour ne pas signaler comme échec les sorties réussies du helper",new_0_5_24_1:"Chat Bridge aligné sur API Server pour l’entrée multimodale, le prompt système et le contexte workspace",new_0_5_25_1:"Actions de réinitialisation et clonage des salons de chat de groupe",new_0_5_25_2:"Répertoire d’état Web UI configurable pour les déploiements personnalisés",new_0_5_25_3:"MiMo ajouté comme fournisseur TTS dans les paramètres vocaux",new_0_5_25_4:"Listes de modèles des fournisseurs personnalisés chargées via le backend pour éviter les erreurs CORS navigateur",new_0_5_25_5:"Flux d’approbation des outils corrigé pour les sessions Bridge",new_0_5_25_6:"Indice de plateforme CLI forcé retiré des prompts Bridge afin de préserver les instructions personnalisées de média/fichier",new_0_5_25_7:"Contenu image base64 affiché correctement dans l’historique des messages utilisateur",new_0_5_25_8:"Tests navigateur Playwright, couverture du contrat de streaming chat, couverture des modèles fournisseur et baseline de couverture ajoutés",new_0_5_26_1:"Chemins média Markdown Windows et locaux pris en charge dans l’historique et les messages rendus",new_0_5_26_2:"Historique assistant vide filtré et état de compression obsolète nettoyé au démarrage d’un nouveau run",new_0_5_26_3:"Écritures verrouillées pour config et profils afin de réduire la corruption par écritures concurrentes",new_0_5_26_4:"Paramètres de canaux QQBot et DingTalk ajoutés",new_0_5_26_5:"Détection de port CLI rendue portable et tiroir terminal mobile amélioré",new_0_5_26_6:"Environnements de profil Bridge isolés et découverte des plugins Hermes corrigée entre environnements Python",new_0_5_26_7:"États gateway arrêtés expliqués avec diagnostics Web UI et état de chargement des logs stabilisé",new_0_5_26_8:"Options de réinitialisation de session, base URL fournisseur personnalisé et cibles de livraison dynamiques corrigées",new_0_5_26_9:"Bascule locale d’affichage des traces tool-call ajoutée dans la barre de saisie du chat",new_0_5_26_10:"Installations du paquet Hermes Agent prises en charge quand aucun checkout source n’est disponible",new_0_5_26_11:"Connexion OAuth xAI Grok pour les abonnés SuperGrok et presets de modèles Grok mis à jour",new_0_5_26_12:"Couverture étendue pour navigateur, streaming chat, fournisseur, gateway, config, plugin et Bridge",new_0_5_27_1:"Paramètres de modèle par session pour les chats Bridge, avec fournisseur et modèle indépendants enregistrés par session",new_0_5_27_2:"Clic droit sur une session Bridge puis Définir le modèle pour changer le modèle de cette session",new_0_5_27_3:"Les runs valident le modèle de session et reviennent au modèle par défaut actuel si le modèle enregistré est indisponible",new_0_5_27_4:"La compression de contexte suit par défaut le modèle sélectionné par défaut du profil courant",new_0_5_30_1:"Bridge chat conserve l’historique structuré, corrigeant les absences de réponse et outils ignorés causés par l’historique d’outils aplati",new_0_5_30_2:"Le routage des mentions en chat de groupe est plus fiable avec plusieurs agents, retire la mention @ de chaque agent avant livraison et garde les noms utilisateur après actualisation",new_0_5_30_3:"Pages modèles, menus de modèle chat et sélection de modèle de session sont limités au profil actif avec marqueurs par défaut précis",new_0_5_30_4:"Gestion gateway simplifiée : page Gateway autonome retirée, chaque profil vérifie sa configuration plateforme avant démarrage et un runner léger gère démarrages/redémarrages",new_0_5_30_5:"Démarrage gateway amélioré sur Docker, Termux et Windows avec gestion runtime-lock, nettoyage des conflits de port, exécution en arrière-plan et support du redémarrage",new_0_5_30_6:"Compatibilité Windows renforcée pour détection de chemins, téléchargements et sous-processus job/update sans fenêtres terminal furtives",new_0_5_30_7:"Écritures config et presets fournisseur corrigés : validation des clés .env, routage FUN-Codex via Responses API et listes modèles Z.AI/GLM actualisées",new_0_5_30_8:"Détails frontend polis : barre latérale repliée, libellés courts de groupe, séparateur latéral et style de plan de conversation",new_0_5_30_9:"La compression de contexte suit les paramètres de profil et durcit les snapshots obsolètes en réutilisant les résumés précédents avec une queue sûre",new_0_5_31_1:"Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {'@'}all ajouté",new_0_5_31_2:"Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat",new_0_5_31_3:"Sélecteur de profils avec avatars, upload d’avatar personnalisé, modal d’état runtime et actions de redémarrage gateway/profil",new_0_5_31_4:"Avatars de profil dans chat individuel, chat de groupe et barre latérale repliée, avec métadonnées Web UI et chemins compatibles Windows",new_0_5_31_5:"Détection et redémarrage gateway améliorés sur Docker, Termux et Windows via gateway_state/gateway.pid pour la vivacité du gateway géré",new_0_5_31_6:"Endpoint média APIKEY.FUN de génération d’images et skill apikey-image-gen intégré pour texte-image, image-image et édition via le fournisseur fun-codex du profil actif",new_0_5_33_1:"Les échecs d’exécution et erreurs Socket en chat individuel et groupe restent maintenant dans la liste comme messages Agent rouges",new_0_5_33_2:"La recherche de sessions peut être limitée au profil sélectionné, ou couvrir tous les profils si aucun profil n’est choisi",new_0_5_33_3:"La page Skills affiche des documents de recommandation chinois/anglais quand aucun skill n’est sélectionné, et un second clic désélectionne le skill",new_0_5_33_4:"Suppression des entrées changelog i18n inutilisées pour réduire la taille frontend",new_0_5_33_5:"Correction du démarrage agent bridge sur Windows chinois lorsque la sortie netstat n’est pas décodée en UTF-8",new_0_5_33_6:"Liste des modèles Nous Portal mise à jour depuis le catalog public et les recommandations Portal",new_0_5_33_7:"Les listes de profils et états runtime lisent les noms depuis les dossiers et les modèles par défaut depuis config, évitant les erreurs de colonnes CLI",new_0_5_34_1:"Normalise les résultats de tools multimodaux lors du stockage des messages session/groupe, afin d’éviter les images base64 dans les replays",new_0_5_34_2:"Persiste les modèles Hermes personnalisés dans une configuration backend et ajoute les endpoints ajout/suppression",new_0_5_34_3:"Maintient corrects l’usage final du contexte Bridge et les états de tools après les exécutions",new_0_5_34_4:"Améliore les filtres Kanban, l’affichage des responsables, les actions de cartes et les détails de tâches",new_0_5_34_5:"Corrige le comptage de compression avec cache du contexte fixe prompt/tools et totaux complets de tokens",new_0_5_34_6:"Met en cache le contexte fixe par agent de chat de groupe et affiche la progression seulement au vrai démarrage de la compression",new_0_5_34_7:"Synchronise les skills intégrées Web UI dans tous les profils et journalise le profil cible",new_0_5_34_8:"Si Kanban échoue sous Windows, mettez Hermes à niveau pour obtenir les derniers correctifs de migration de la base Kanban",new_0_5_35_1:"Les sessions Bridge peuvent maintenant s’exécuter en parallèle entre sessions différentes, tandis que les runs d’une même session restent sérialisés pour préserver l’ordre",new_0_5_35_2:"Ajoute la page Performance Monitor pour le CPU/mémoire système, Web UI, Bridge Broker, Workers et l’état des sessions actives",new_0_5_35_3:"Ajoute des métriques par worker avec CPU, mémoire, Profile, nombre de sessions et état d’exécution",new_0_5_35_4:"Améliore le nettoyage du cycle de vie des Bridge workers afin de récupérer les workers lors de l’arrêt du Broker ou du processus parent et réduire les processus Python orphelins",new_0_5_35_5:"Renforce la compatibilité du monitoring avec des fallbacks de collecte pour macOS, Windows, Linux, Docker et Termux",new_0_5_35_6:"Performance Monitor ne bloque plus sur les requêtes worker pendant l’initialisation des Agents, réduisant les request timeouts sous Windows",new_0_5_35_7:"Chat Markdown prend désormais en charge la prévisualisation inline du contenu texte, et les icônes de téléchargement téléchargent directement les fichiers",new_0_5_35_8:"Améliore le drawer de contenu avec fermeture mobile, largeur complète sur mobile, largeur desktop 800px et fonds texte/Markdown cohérents",new_0_6_0_1:"La gestion par compte et par Profile protège désormais de façon cohérente les sessions, modèles, usage, Kanban, jobs, uploads, médias et APIs Hermes associées",new_0_6_0_2:"Les Skills média intégrés utilisent le token serveur généré uniquement pour les endpoints média et résolvent les identifiants fun-codex/xAI depuis le Profile demandé",new_0_6_0_3:"Le chat individuel et le chat de groupe injectent le Hermes Profile courant dans les instructions de run afin que les Skills envoient X-Hermes-Profile",new_0_6_0_4:"La progression des subagents delegate_task est maintenant diffusée dans l’UI du chat avec les états démarrage, outil, progression et fin",new_0_6_0_5:"L’arrêt ou l’abandon d’un run nettoie les événements temporaires afin que les anciens états abort ne passent pas au chat suivant",new_0_6_0_6:"Met à jour la documentation et le site pour la gestion des comptes, les identifiants par défaut, la gestion compte/Profile, les uploads/downloads et les Skills média",new_0_6_0_7:"Ajoute des commandes CLI de maintenance pour effacer les verrous IP de connexion et réinitialiser le login par défaut admin / 123456",new_0_6_0_8:"La version 0.6.0 marque la limite entre la Web UI mono-utilisateur et multi-utilisateur. En cas de problème avec le mode multi-utilisateur, ouvrez une issue et revenez si besoin à la version mono-utilisateur 0.5.35"},files:{title:"Fichiers",tree:"Arborescence",list:"Liste des fichiers",breadcrumbRoot:"Accueil",newFile:"Nouveau fichier",newFolder:"Nouveau dossier",upload:"Telecharger",refresh:"Actualiser",open:"Ouvrir",edit:"Modifier",preview:"Apercu",download:"Telecharger",copyPath:"Copier le chemin",rename:"Renommer",delete:"Supprimer",name:"Nom",size:"Taille",modified:"Modifie",actions:"Actions",emptyDir:"Dossier vide",loading:"Chargement...",confirmDelete:'Voulez-vous vraiment supprimer "{name}" ?',confirmDeleteDir:'Voulez-vous vraiment supprimer le dossier "{name}" et tout son contenu ?',deleteFailed:"Echec de la suppression",deleted:"Supprime",renameTo:"Renommer en",newFileName:"Nom du fichier",newFolderName:"Nom du dossier",created:"Cree",createFailed:"Echec de la creation",renamed:"Renomme",renameFailed:"Echec du renommage",uploadSuccess:"{count} fichier(s) televerse(s)",uploadFailed:"Echec du televersement",saveFailed:"Echec de l'enregistrement",saved:"Enregistre",unsavedChanges:"Vous avez des modifications non enregistrees. Annuler ?",pathCopied:"Chemin copie",fileTooLarge:"Fichier trop volumineux (max 10 Mo)",permissionDenied:"Impossible de modifier un fichier protege",notFound:"Fichier ou dossier introuvable",backendError:"Echec de l'operation sur le fichier",dragDropHint:"Glissez des fichiers ici pour les televerser",closeEditor:"Fermer l'editeur",closePreview:"Fermer",saveFile:"Enregistrer",fileTree:"Arborescence des fichiers"},groupChat:{title:"Chat de groupe",createRoom:"Creer un salon",joinByCode:"Rejoindre avec un code",roomName:"Nom du salon",roomNamePlaceholder:"Entrez le nom du salon",inviteCode:"Code d'invitation",autoGenerate:"Generer automatiquement",noRooms:"Aucun salon pour le moment",selectOrCreate:"Selectionnez ou creez un salon pour commencer a discuter",agents:"Agents",addAgent:"Ajouter un agent",selectProfile:"Selectionnez un profil",agentAdded:"Agent ajoute",agentAlreadyInRoom:"L'agent est deja dans ce salon",agentAddFailedCount:"{count} agent(s) n'ont pas ete ajoutes : {details}",noAgents:"Aucun agent dans ce salon",members:"Membres",roomCreated:"Salon cree",roomDeleted:"Salon supprime",roomCloned:"Salon clone",cloneRoom:"Cloner le salon",copyRoomLink:"Copier le lien du salon",deleteRoomConfirm:"Supprimer ce salon ?",clearContext:"Effacer le contexte",clearContextConfirm:"Effacer le contexte de ce salon ? Les messages et instantanés de compression seront supprimés, les agents et membres restent.",contextCleared:"Contexte effacé",you:"Vous",joined:"Vous avez rejoint le salon",joinFailed:"Echec de la connexion au salon",inputPlaceholder:"Tapez un message... (Entree pour envoyer)",enterCode:"Entrez le code d'invitation",yourName:"Votre nom",yourNamePlaceholder:"Entrez votre nom d'affichage",yourDescription:"Description (facultatif)",yourDescriptionPlaceholder:"Decrivez-vous aux autres...",agentName:"Nom de l'agent",agentNamePlaceholder:"Nom personnalise (vide = nom du profil)",agentDesc:"Description de l'agent",agentDescPlaceholder:"Decrivez le role de cet agent...",agentReplying:"est en train de répondre...",agentCompressing:"compresse le contexte...",compressionSettings:"Paramètres de compression",triggerTokens:"Seuil de tokens",triggerTokensDesc:"Seuil de tokens pour déclencher la compression",maxHistoryTokens:"Max tokens historique",maxHistoryTokensDesc:"Maximum de tokens pour le contexte compressé",tailMessageCount:"Messages récents",tailMessageCountDesc:"Nombre de messages récents à conserver",compressionConfig:"Config. compression",compressNow:"Comprimer maintenant",compressingInProgress:"Compression en cours",compressionSaved:"Configuration enregistrée"},download:{downloading:"Telechargement...",downloadFailed:"Echec du telechargement",fileNotFound:"Fichier introuvable ou supprime",fileTooLarge:"Fichier trop volumineux (limite depassee)",backendError:"Echec de la lecture du fichier, l'environnement distant est peut-etre indisponible",backendTimeout:"Delai de lecture du fichier depasse",unsupportedBackend:"Le backend de terminal actuel ne prend pas en charge le telechargement de fichiers",invalidPath:"Chemin de fichier invalide",contentDisplay:"Affichage du contenu",download:"Telecharger",downloadFile:"Telecharger le fichier"},gateways:{title:"Passerelles",running:"En cours",stopped:"Arrêté",started:"Démarré",startFailed:"Échec du démarrage du gateway",stopFailed:"Échec de l’arrêt du gateway"},kanban:{title:"Tableau Kanban",createTask:"Nouvelle tâche",noTasks:"Aucune tâche",allStatuses:"Tous les statuts",allAssignees:"Tous les responsables",columns:{triage:"Triage",todo:"À faire",ready:"Prêt",running:"En cours",blocked:"Bloqué",done:"Terminé",archived:"Archivé"},card:{assigneeTooltip:"Responsable",priority:{low:"Basse",medium:"Moyenne",high:"Haute"},timeAgo:{justNow:"à l’instant",minutes:"il y a {count} min",hours:"il y a {count} h",days:"il y a {count} j"}},board:{create:"Nouveau tableau",archive:"Archiver le tableau",archiveConfirm:"Archiver le tableau actuel ?",archived:"Tableau archivé",created:"Tableau créé",slugPlaceholder:"Identifiant du tableau, ex. project-a",namePlaceholder:"Nom affiché (facultatif)",slugRequired:"L’identifiant du tableau est requis"},form:{title:"Titre",titlePlaceholder:"Titre de la tâche",titleRequired:"Le titre est requis",body:"Description",bodyPlaceholder:"Description de la tâche (facultatif)",assignee:"Responsable",selectAssignee:"Choisir un responsable...",priority:"Priorité",selectPriority:"Choisir une priorité..."},detail:{status:"Statut",priority:"Priorité",assignee:"Responsable",tenant:"Locataire",createdAt:"Créé",startedAt:"Démarré",completedAt:"Terminé",comments:"Commentaires",events:"Événements",runs:"Exécutions",artifacts:"Fichiers produits",result:"Résultat",highlights:"Informations clés",sources:"Sources de données",sessions:"Sessions liées",sessionMessages:"Messages de session",noSessions:"Aucune session liée trouvée."},action:{title:"Actions",assign:"Assigner",assignTo:"Assigner à...",block:"Bloquer",blockReason:"Raison du blocage",unblock:"Débloquer",complete:"Terminer",completeSummary:"Résumé de fin (facultatif)"},message:{loadFailed:"Échec du chargement de la tâche",taskCreated:"Tâche créée",taskAssigned:"Tâche assignée",taskBlocked:"Tâche bloquée",taskUnblocked:"Tâche débloquée",taskCompleted:"Tâche terminée"},stats:{total:"Total",tasks:"Tâches"}}},xt={login:{title:"Hermes Web UI",description:"Introduce tu nombre de usuario y contrasena para continuar.",placeholder:"Token de acceso",submit:"Iniciar sesion",tokenRequired:"Por favor, introduce tu token de acceso",invalidToken:"Token invalido",connectionFailed:"No se puede conectar al servidor",passwordLogin:"Contrasena",tokenLogin:"Token",usernamePlaceholder:"Nombre de usuario",passwordPlaceholder:"Contrasena",defaultCredentialsHint:"Nombre de usuario predeterminado: admin. Contrasena predeterminada: 123456.",credentialsRequired:"Por favor, introduzca nombre de usuario y contrasena",invalidCredentials:"Nombre de usuario o contrasena incorrectos",tooManyAttempts:"Demasiados intentos fallidos, por favor intente mas tarde",sessionExpired:"La sesion expiro. Inicia sesion de nuevo.",accessDenied:"No tienes permiso para acceder a este recurso.",passwordMismatch:"Las contrasenas no coinciden",passwordTooShort:"La contrasena debe tener al menos 6 caracteres",setupSuccess:"Login con contrasena configurado correctamente",passwordChanged:"Contrasena cambiada correctamente",passwordRemoved:"Login con contrasena eliminado",setupPassword:"Configurar login con contrasena",changePassword:"Cambiar contrasena",changeUsername:"Cambiar nombre de usuario",removePasswordLogin:"Eliminar",username:"Nombre de usuario",currentPassword:"Contrasena actual",newPassword:"Nueva contrasena",confirmPassword:"Confirmar contrasena",newUsername:"Nuevo nombre de usuario",usernameChanged:"Nombre de usuario cambiado correctamente",usernameTooShort:"El nombre de usuario debe tener al menos 2 caracteres",setupDescription:"Administra el nombre de usuario y la contrasena usados para iniciar sesion.",removeConfirm:"El login con contrasena es obligatorio para las cuentas de usuario.",passwordLoginNotConfigured:"Login con contrasena no configurado",passwordLoginConfigured:"Cuenta actual: {username}",defaultCredentialTitle:"Cambia la cuenta y contrasena predeterminadas",defaultCredentialMessage:"La cuenta actual aun usa el nombre de usuario o la contrasena predeterminados. Para evitar accesos no autorizados, cambia cuanto antes el nombre de usuario y la contrasena de la cuenta actual.",defaultCredentialAction:"Cambiar ahora",defaultCredentialLater:"Recordar mas tarde"},users:{title:"Gestion de cuentas",description:"Crea usuarios, asigna roles y controla que perfiles pueden usar los administradores normales.",create:"Crear usuario",edit:"Editar usuario",username:"Nombre de usuario",role:"Rol",statusLabel:"Estado",profiles:"Perfiles accesibles",profilesPlaceholder:"Selecciona perfiles accesibles",allProfiles:"Todos los perfiles",noProfiles:"Sin perfiles asignados",lastLogin:"Ultimo inicio",newPasswordOptional:"Nueva contrasena (dejar vacio para conservar)",loadFailed:"No se pudieron cargar los usuarios",deleteConfirm:"Eliminar este usuario?",enable:"Activar",disable:"Desactivar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Activo",disabled:"Desactivado"}},common:{loading:"Cargando...",cancel:"Cancelar",retry:"Reintentar",delete:"Eliminar",edit:"Editar",save:"Guardar",saved:"Guardado",update:"Actualizar",create:"Crear",saveFailed:"Error al guardar",deleteFailed:"Error al eliminar",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sin datos",fetch:"Obtener",add:"Anadir",enable:"Activar",disable:"Desactivar",configured:"Configurado",notConfigured:"No configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Contraer",stop:"Detener",start:"Iniciar",expired:"Expirado"},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",performance:"Rendimiento",skillsUsage:"Uso de habilidades",channels:"Canales",terminal:"Terminal",files:"Archivos",groupChat:"Chat grupal",groupConversation:"Conversación",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoreo",groupMonitoringShort:"Mon.",settings:"Configuracion",connected:"Conectado",disconnected:"Desconectado",updateTip:'Ejecuta "hermes-web-ui update" en la terminal para actualizar',updateVersion:"Actualizar a v{version}",reloadClientVersion:"Recargar para v{version}",updating:"Actualizando...",updateSuccess:"Actualizacion completada. Actualiza la pagina en breve. Si no se inicia despues de un tiempo, inicialo manualmente.",updateFailed:"Error al actualizar",logout:"Cerrar sesion",nodeVersionWarning:"Se detecto Node.js v{version}. Actualiza a la version 23 o posterior.",changelog:"Registro de cambios",noChangelog:"No hay registro de cambios",kanban:"Kanban",groupTools:"Herramientas",groupPlatform:"Plataforma",gateways:"Puertas de enlace",expand:"Expandir menú",collapse:"Contraer menú"},performance:{title:"Rendimiento",subtitle:"Supervisa recursos del sistema, Bridge Broker, Workers y sesiones activas",refresh:"Actualizar",autoRefreshOn:"Actualización automática",autoRefreshOff:"Actualización manual",loadFailed:"No se pudieron cargar las métricas de rendimiento",systemCpu:"CPU del sistema",systemMemory:"Memoria del sistema",activeSessions:"Sesiones activas",runningSessions:"En ejecución {count}",workers:"Workers",totalWorkerMemory:"Memoria total de Worker",processes:"Procesos",uptime:"Tiempo activo",running:"En ejecución",stopped:"Detenido",workerMemory:"Memoria de Worker",lastUpdated:"Actualizado",profile:"Profile",memory:"Memoria",sessions:"Sesiones",runningActiveSessions:"En ejecución / Activas",lastUsed:"Último uso",status:"Estado",noWorkers:"Sin Workers",sessionsByProfile:"Sesiones por Profile",noActiveSessions:"No hay sesiones activas"},drawer:{terminal:"Terminal",files:"Espacio de trabajo"},chat:{contextRemaining:"restante",contextClickToEdit:"Haz clic para editar la longitud del contexto",contextEditTitle:"Editar longitud del contexto",contextEditDesc:"Establecer el límite de longitud del contexto para el modelo actual (en tokens)",contextEditPlaceholder:"Ingresa la longitud del contexto",contextEditHint:"Valores comunes: 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",outlineTitle:"Esquema de la conversación",outlineEmpty:"Sin contenido de conversación",outlineUserQuestion:"Pregunta del usuario",inputPlaceholder:"Escribe un mensaje... (Enter para enviar, Shift+Enter para nueva linea)",slashCommandArgs:{message:"<mensaje>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular el uso de la sesión actual",status:"Mostrar estado de sesión y cola",abort:"Detener la ejecución activa de Bridge",queue:"Poner un mensaje en cola tras la ejecución activa",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",allProfiles:"Todos los perfiles",profileMissingModelsTip:'El perfil "{profile}" no tiene proveedor ni modelo disponible para esta sesión',sessionScopeHint:"Chat solo muestra sesiones de Web UI/API Server. Las sesiones de CLI, Telegram, Discord, Cron y otros canales son de solo lectura en Historial.",openHistory:"Abrir historial",hermesHistory:"Historial de Hermes",historyScopeHint:"Sesiones del historial de Hermes del perfil actual, de solo lectura y agrupadas por origen.",noSessions:"Sin sesiones",newChat:"Nuevo chat",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:"Modo de chat",liveMode:"En vivo",liveSessions:"Sesiones en vivo",recentBadge:"Reciente",linkedSessions:"{count} vinculadas",noVisibleMessages:"No hay mensajes visibles para humanos.",monitorRoleUser:"Usuario",monitorRoleAssistant:"Asistente",copySessionLink:"Copiar enlace de sesión",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:"Tiempo de ejecución",thinkingLabel:"Pensamiento",thinkingInProgress:"Pensando…",thinkingShow:"Mostrar pensamiento",thinkingHide:"Ocultar pensamiento",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensaje",copiedBubble:"Mensaje copiado",copyFailed:"Error al copiar",playSpeech:"Reproducir voz",pauseSpeech:"Pausa",resumeSpeech:"Reanudar",stopSpeech:"Detener",speechNotSupported:"Reproducción de voz no soportada en este navegador",searchEnterHint:"Enter para abrir · Esc para cerrar",searchHint:"Cmd/Ctrl+K",searchScope:"Alcance de búsqueda: solo base de datos local de sesiones de Web UI; no incluye sesiones históricas Hermes de solo lectura.",searchFailed:"No se pudieron buscar sesiones",searchNoSnippet:"No hay resumen disponible",searchNoResults:"No hay sesiones que coincidan",searchRecent:"Sesión reciente",searchEmpty:"Sesiones recientes",searchPlaceholder:"Buscar sesiones...",searchSubtitle:"Buscar por título o contenido de mensajes",searchTitle:"Buscar sesiones",stopGateway:"Detener gateway",start:"Iniciar",workspaceSetFailed:"No se pudo definir el workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Introduce la ruta del proyecto, p. ej. /home/user/project",workspace:"Espacio de trabajo",setWorkspaceTitle:"Definir workspace de sesión",setWorkspace:"Definir workspace",modelSetFailed:"No se pudo definir el modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo de sesión",setModel:"Definir modelo",newCliChat:"Nuevo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproducir voz automáticamente"},jobs:{title:"Tareas programadas",createJob:"Crear tarea",editJob:"Editar tarea",noJobs:"No hay tareas programadas aun. Crea una para comenzar.",name:"Nombre",namePlaceholder:"Nombre de la tarea",schedule:"Programacion (expresion Cron)",schedulePlaceholder:"ej. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Seleccionar un preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"Cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos los dias a las 00:00",presetEveryDay9:"Todos los dias a las 09:00",presetEveryMonday:"Cada lunes a las 09:00",presetEveryMonth:"El dia 1 de cada mes a las 09:00",prompt:"Prompt",promptPlaceholder:"El prompt a ejecutar",deliverTarget:"Destino de entrega",origin:"Origen",local:"Local",repeatCount:"Repeticiones (opcional)",modelPlaceholder:"Modelo por defecto",repeatPlaceholder:"Dejar vacio para infinito",jobCreated:"Tarea creada",jobUpdated:"Tarea actualizada",nameRequired:"El nombre es obligatorio",scheduleRequired:"La programacion es obligatoria",loadFailed:"Error al cargar la tarea",jobPaused:"Tarea en pausa",jobResumed:"Tarea reanudada",jobTriggered:"Job ejecutado",modelUpdated:"Modelo actualizado",jobDeleted:"Tarea eliminada",status:{running:"En ejecucion",paused:"En pausa",disabled:"Desactivada",scheduled:"Programada"},info:{model:"Modelo",schedule:"Programacion",lastRun:"Ultima ejecucion",nextRun:"Proxima ejecucion",deliver:"Entrega",repeat:"Repeticion"},action:{pause:"Pausar",pauseJob:"Pausar tarea",resume:"Reanudar",resumeJob:"Reanudar tarea",runNow:"Ejecutar ahora",triggerImmediately:"Ejecutar inmediatamente"},runHistory:{title:"Historial",runs:"ejecuciones",noRuns:"No se encontró historial."}},skills:{title:"Habilidades",searchPlaceholder:"Buscar habilidades...",noMatch:"Ninguna habilidad coincide con tu busqueda",noSkills:"No se encontraron habilidades",backTo:"Volver a",attachedFiles:"Archivos adjuntos",loadFailed:"Error al cargar la habilidad",fileLoadFailed:"Error al cargar el archivo",modified:"Modificado por el usuario",archived:"Archivado",pinned:"Fijado",pin:"Fijar habilidad",unpin:"Desfijar habilidad",pinFailed:"Error al cambiar estado de fijacion",toggleFailed:"Error al activar/desactivar la habilidad",source:{builtin:"Integrado",hub:"Hub",local:"Local"}},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:"Raíz del agente",python:"Python",scanCwd:"Escanear cwd",projectPlugins:"Plugins del proyecto"}},memory:{title:"Memoria",refresh:"Actualizar",loadFailed:"Error al cargar la memoria",myNotes:"Mis notas",noNotes:"Sin notas aun.",notesPlaceholder:"Escribe tus notas...",userProfile:"Perfil de usuario",noProfile:"Sin perfil aun.",profilePlaceholder:"Escribe tu perfil...",soul:"Alma",noSoul:"Sin configuracion de alma aun.",soulPlaceholder:"Escribe la configuracion del alma..."},models:{title:"Modelos",addProvider:"Anadir proveedor",providerType:"Tipo de proveedor",preset:"Preajuste",custom:"Personalizado",selectProvider:"Seleccionar proveedor",chooseProvider:"Elige un proveedor...",name:"Nombre",autoGeneratedName:"Generado automaticamente desde la URL base",baseUrl:"URL base",region:"Región",regionIntl:"Internacional",regionCn:"China continental",baseUrlPlaceholder:"ej. https://api.example.com/v1",apiKey:"Clave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo predeterminado",selectOrInput:"Seleccionar o ingresar un modelo...",selectModel:"Seleccionar un modelo...",providerAdded:"Proveedor anadido",providerDeleted:"Proveedor eliminado",deleteProvider:"Eliminar proveedor",deleteConfirm:'Estas seguro de que quieres eliminar "{name}"?',codexLoginTitle:"Inicio de sesión de OpenAI Codex",codexWaiting:"Ingrese este código en la página de autorización para iniciar sesión:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorización",codexApproved:"Inicio de sesión exitoso",codexExpired:"La autorización ha expirado. Por favor, inténtelo de nuevo.",nousLoginTitle:"Inicio de sesión de Nous Portal",nousWaiting:"Ingrese este código en la página de autorización:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorización",nousApproved:"Inicio de sesión exitoso",nousDenied:"Autorización denegada",nousExpired:"Autorización expirada",copilotLoginTitle:"Inicio de sesión de GitHub Copilot",copilotWaiting:"Abra GitHub e introduzca el código de dispositivo a continuación para autorizar. La ventana se cerrará automáticamente tras la aprobación.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir la página de autorización de GitHub",copilotApproved:"¡Inicio de sesión exitoso!",copilotDenied:"Autorización denegada.",copilotExpired:"El enlace de autorización ha caducado. Vuelva a intentarlo.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Se detectó un token OAuth de GitHub Copilot en este equipo. Haz clic en Agregar para habilitar Copilot en 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",currentDefault:"Predeterminado actual",defaultShort:"Predeterminado",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",xaiWaiting:"Completa la autorización en la página de xAI abierta. La ventana se cerrará automáticamente al aprobarse.",xaiOpenLink:"Abrir página de autorización de xAI",xaiLoginTitle:"Inicio de sesión OAuth de xAI Grok",xaiExpired:"El enlace de autorización expiró. Inténtalo de nuevo.",xaiCopyLink:"Copiar enlace de autorización",xaiApproved:"¡Inicio de sesión correcto!",visibilitySelectOne:"Mantén al menos un modelo visible",visibilitySaved:"Modelos visibles guardados",visibilitySaveFailed:"No se pudieron guardar los modelos visibles",visibilityHint:"Solo afecta al selector de modelos y a la página de modelos de Web UI. No modifica la configuración provider/model de Hermes CLI; las llamadas siguen usando el ID original del modelo.",showAllModels:"Mostrar todos los modelos",searchPlaceholder:"Buscar modelos...",removeCustomModel:"Eliminar este modelo no listado",more:"más",models:"Lista de modelos",manageVisibleModelsFor:"Gestionar modelos visibles de {name}",manageVisibleModels:"Gestionar modelos visibles",getApiKey:"Obtener API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nombre visible de {model}",aliasTitle:"Nombre visible del modelo",aliasSaveFailed:"No se pudo guardar el nombre visible",aliasPlaceholder:"Dejar vacío para usar el ID original del modelo",aliasManageFor:"Nombres visibles de {provider}",aliasManage:"Nombres visibles",aliasHint:"Solo cambia el nombre visible en Web UI. Hermes sigue recibiendo el ID original del modelo.",aliasEdit:"Renombrar",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfiles",create:"Crear perfil",import:"Importar",export:"Exportar",rename:"Renombrar",delete:"Eliminar",switchTo:"Cambiar Hermes Profile",switchConfirm:"Esto ejecutara `hermes profile use {name}` y cambiara el active profile de Hermes CLI. Continuar?",switchSuccess:'Hermes active profile cambiado a "{name}"',switchFailed:"Error al cambiar Hermes Profile. Es posible que la pasarela necesite un reinicio manual.",createSuccess:'Perfil "{name}" creado',createFailed:"Error al crear el perfil",renameSuccess:"Perfil renombrado",renameFailed:"Error al renombrar el perfil",deleteConfirm:'Estas seguro de que quieres eliminar el perfil "{name}"?',deleteSuccess:"Perfil eliminado",deleteFailed:"Error al eliminar el perfil",exportSuccess:"Perfil exportado",exportFailed:"Error al exportar el perfil",importSuccess:"Perfil importado",importFailed:"Error al importar el perfil",importSelectFile:"Seleccionar archivo de archivo",importInvalidFile:"Por favor, selecciona un archivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nombre del perfil",namePlaceholder:"Solo letras, numeros y guiones",nameValidation:"El nombre del perfil solo puede contener letras minúsculas, números, guiones bajos y guiones",newName:"Nuevo nombre",newNamePlaceholder:"Introduce un nuevo nombre",cloneFromCurrent:"Clonar desde el perfil actual",cloneCleanupNotice:"Al clonar se omiten automáticamente las credenciales exclusivas de plataforma (Weixin / Telegram / Slack, etc.) para evitar conflictos con el perfil de origen",cloneStrippedCredentials:"Se eliminaron {count} credenciales exclusivas: {list}",cloneDisabledPlatforms:"Se deshabilitaron {count} plataforma(s): {list}",cloneStrippedConfigCredentials:"Se eliminaron {count} credencial(es) integradas de config.yaml: {list}",archivePath:"Ruta del archivo",archivePathPlaceholder:"Ruta del servidor al archivo de archivo",importName:"Nombre del perfil (opcional)",importNamePlaceholder:"Dejar vacio para usar el nombre del archivo",active:"Activo",model:"Modelo",gateway:"Pasarela",alias:"Alias",provider:"Proveedor",path:"Ruta",skills:"Habilidades",hasEnv:"Tiene .env",hasSoulMd:"Tiene soul.md",noProfiles:"No se encontraron perfiles. Crea uno para comenzar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Subir imagen",random:"Generar aleatorio",reset:"Restaurar predeterminado",hint:"PNG, JPEG o WebP, máximo 1 MB",invalidType:"Elige una imagen PNG, JPEG o WebP",tooLarge:"La imagen del avatar no puede superar 1 MB",saveSuccess:"Avatar guardado",saveFailed:"No se pudo guardar el avatar",resetSuccess:"Avatar predeterminado restaurado",resetFailed:"No se pudo restaurar el avatar predeterminado"},runtime:{activeProfile:"Actual: {name}",bridgeWorker:"Estado del Bridge",gateway:"Puerta de enlace",active:"Activo",activeTag:"Actual",idle:"Inactivo",running:"En ejecución",stopped:"Detenido",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Cambiar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"No se pudo reiniciar el gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"No se pudo reiniciar el perfil"}},logs:{title:"Registros",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Actualizar",noEntries:"Sin entradas de registro"},settings:{title:"Configuracion",saved:"Guardado",saveFailed:"Error al guardar",tabs:{display:"Pantalla",account:"Cuenta actual",users:"Gestion de cuentas",agent:"Agente",memory:"Memoria",compression:"Compresion",session:"Sesion",privacy:"Privacidad",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respuestas en streaming",streamingHint:"Mostrar respuestas de la IA en tiempo real",compact:"Modo compacto",compactHint:"Reducir el espaciado entre mensajes",showReasoning:"Mostrar razonamiento",showReasoningHint:"Mostrar el proceso de pensamiento del modelo",showCost:"Mostrar costo",showCostHint:"Mostrar uso de tokens en las respuestas",inlineDiffs:"Diffs en linea",inlineDiffsHint:"Mostrar cambios de codigo en linea",bellOnComplete:"Sonido de finalizacion",bellOnCompleteHint:"Reproducir un sonido cuando la IA termina",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada mientras la IA procesa",theme:"Tema",themeHint:"Elige claro, oscuro o seguir la preferencia del sistema",themeLight:"Claro",themeDark:"Oscuro",themeSystem:"Sistema"},agent:{maxTurns:"Turnos maximos",maxTurnsHint:"Rondas maximas de interaccion por conversacion",gatewayTimeout:"Tiempo de espera de la pasarela",gatewayTimeoutHint:"Tiempo de espera de la peticion en segundos",restartDrainTimeout:"Tiempo de drenado al reiniciar",restartDrainTimeoutHint:"Tiempo de drenado antes de reiniciar en segundos",toolEnforcement:"Aplicacion de herramientas",toolEnforcementHint:"Controlar el modo de ejecucion de llamadas a herramientas",auto:"Automatico",always:"Siempre",never:"Nunca"},memory:{enabled:"Activar memoria",enabledHint:"Permitir que la IA recuerde el contexto de la conversacion",userProfile:"Perfil de usuario",userProfileHint:"Permitir que la IA recuerde las preferencias del usuario",charLimit:"Limite de caracteres de memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres del perfil de usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Activar compresion",enabledHint:"Comprimir automaticamente el historial largo antes de superar el contexto del modelo",threshold:"Umbral de compresion",thresholdHint:"Iniciar compresion cuando los tokens estimados superen esta proporcion del contexto",targetRatio:"Proporcion objetivo",targetRatioHint:"Tamano objetivo del historial tras comprimir como proporcion del contexto",protectLastN:"Proteger mensajes recientes",protectLastNHint:"Mantener sin comprimir esta cantidad de mensajes recientes",protectFirstN:"Proteger primeros mensajes",protectFirstNHint:"Mantener sin comprimir esta cantidad de mensajes iniciales"},session:{mode:"Modo de reinicio",modeHint:"Condicion de activacion del reinicio de sesion",modeBoth:"Inactividad + Programado",modeIdle:"Solo inactividad",modeDaily:"Solo programado",modeNone:"Nunca (solo manual)",idleMinutes:"Tiempo de inactividad",idleMinutesHint:"Tiempo de espera antes del reinicio automatico (minutos)",atHour:"Hora de reinicio programado",humanOnly:"Mostrar solo sesiones humanas",humanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones",liveMonitorHumanOnly:"Monitor en vivo: mostrar solo sesiones humanas",liveMonitorHumanOnlyHint:"Oculta por defecto el ruido de subagentes y del monitor de sesiones en el monitor en vivo",atHourHint:"Reiniciar sesion a esta hora todos los dias",requireAuth:"Autorización de sesión",requireAuthHint:"Requiere autorización para operaciones de sesión"},privacy:{redactPii:"Ocultar informacion personal",redactPiiHint:"Detectar y ocultar automaticamente informacion sensible (contrasenas, claves, etc.)"},apiServer:{enable:"Activar",enableHint:"Activar servidor API",host:"Host",hostHint:"Direccion de escucha",port:"Puerto",portHint:"Puerto de escucha",key:"Clave",keyHint:"Clave de acceso API",cors:"Origenes CORS",corsHint:"Fuentes cross-origin permitidas"},voice:{ttsProvider:"Proveedor TTS",ttsProviderHint:"Elija el motor de texto a voz para la reproduccion de mensajes",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compatible con OpenAI)",providerEdge:"Edge TTS (Gratuito, sin clave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Seleccione una voz de su navegador o sistema operativo",webspeechVoicePlaceholder:"Auto (voz predeterminada)",openaiKey:"Clave API",openaiKeyHint:"Su clave API de OpenAI con acceso TTS",openaiUrl:"URL base de API",openaiUrlHint:"ej. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mas rapido) / tts-1-hd (mayor calidad)",openaiVoice:"Voz",openaiVoiceHint:"Voz a utilizar para la sintesis",customHint:"Utilice cualquier API TTS compatible con OpenAI — funciona con GPT-SoVITS, CosyVoice, etc.",customUrl:"URL de API",customUrlHint:"URL base de su servicio TTS",customUrlPlaceholder:"Direccion configurada en el adaptador local, ej. http://127.0.0.1:9880",customApiKey:"Clave API (opcional)",customApiKeyHint:"Algunos endpoints personalizados requieren autenticacion",customApiKeyPlaceholder:"Dejar en blanco si no es necesario",edgeHint:"Impulsado por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL del adaptador",edgeUrlHint:"Direccion del adaptador Edge TTS, ej. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Seleccione una voz para la sintesis de voz",edgeRate:"Velocidad",edgeRateHint:"Ajustar velocidad del habla (0.5x ~ 2.0x)",edgePitch:"Tono",edgePitchHint:"Ajustar tono del habla (-20 ~ +20 Hz)",testTitle:"Prueba de voz",testText:"Texto de prueba",testTextPlaceholder:"Ingrese texto para probar...",testTextDefault:"Hola, esta es una prueba de voz.",testButton:"Probar",testButtonPlaying:"Reproduciendo...",testFailed:"Prueba fallida: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — voces predefinidas, diseño de voz y clonación de voz",mimoApiKey:"Clave API",mimoApiKeyHint:"Obtenga su clave en platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Clave API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Introduce API Key",noProviders:"No hay proveedores configurados",save:"Guardar",saveFailed:"Error al guardar",saved:"Guardado"}},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...",qqSandboxHint:"Habilitar entorno sandbox (para pruebas)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escanea el código QR con QQ o abre el enlace en el teléfono para completar la vinculación",qqMarkdownHint:"Habilitar mensajes con formato Markdown (algunos clientes pueden no soportarlo)",qqMarkdown:"Soporte Markdown",qqAppSecretHint:"App Secret del bot de QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID del bot de QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista blanca de IDs de usuario u OpenID, separados por comas",allowedUsers:"Usuarios permitidos",allowAllUsersHint:"Permite mensajes de cualquier usuario; desactívalo para usar la lista blanca",allowAllUsers:"Permitir todos los usuarios"},language:{label:"Idioma",zh:"中文",en:"English",es:"Espanol"},terminal:{sessions:"Sesiones",newTab:"Nueva terminal",closeSession:"Cerrar esta sesion?",sessionExited:"Finalizada",processExited:"Proceso finalizado con codigo {code}",noSessions:"No hay sesiones de terminal",connectionFailed:"No se pudo conectar al terminal",connectionError:"Error de conexión",connectionClosed:"Conexión cerrada"},usage:{title:"Estadisticas de uso",refresh:"Actualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Salida",totalSessions:"Total de sesiones",avgPerDay:"~{n}/dia de promedio",estimatedCost:"Costo est.",cacheHitRate:"Tasa de acierto de cache",modelBreakdown:"Desglose por modelo",dailyTrend:"Uso diario",date:"Fecha",tokens:"Tokens",cache:"Caché",cacheRead:"Lectura de caché",cacheWrite:"Escritura de caché",sessions:"Sesiones",cost:"Costo",noData:"Sin datos de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Sigue las cargas y ediciones de habilidades en sesiones de Hermes",refresh:"Actualizar",periodSelector:"Periodo de uso de habilidades",periodLabel:"{days} d",summary:"Resumen",totalActions:"Acciones",loads:"Cargas",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendencia diaria",periodSummary:"Últimos {days} días",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"No hay datos de uso de habilidades",loadFailed:"No se pudo cargar el uso de habilidades",otherSkills:"Otras habs."},changelog:{new_0_5_22_1:"La API de lista de sesiones de Hermes lee la base de datos del perfil en vez del almacén local de sesiones de la Web UI",new_0_5_23_1:"Comandos slash de chat solo para Bridge con sugerencias localizadas",new_0_5_23_2:"Historial de comandos persistente para reproducir sesiones sin contaminar contexto, uso ni compresión",new_0_5_23_3:"Variables de entorno del perfil gateway aisladas para evitar filtración de credenciales entre perfiles",new_0_5_23_4:"Reserva del puerto de la Web UI durante la asignación del gateway para evitar conflictos de arranque",new_0_5_23_5:"Corrección del reinicio de autoactualización para no reportar como fallo una salida correcta del helper",new_0_5_24_1:"Chat Bridge alineado con API Server para entrada multimodal, prompt del sistema y contexto de workspace",new_0_5_25_1:"Acciones de restablecer y clonar salas de chat grupal",new_0_5_25_2:"Directorio de estado de la Web UI configurable para diseños de despliegue personalizados",new_0_5_25_3:"MiMo agregado como proveedor TTS en ajustes de voz",new_0_5_25_4:"Listas de modelos de proveedores personalizados cargadas desde backend para evitar errores CORS del navegador",new_0_5_25_5:"Corrección del flujo de aprobación de herramientas en sesiones Bridge",new_0_5_25_6:"Eliminada la pista de plataforma CLI forzada en prompts Bridge para preservar instrucciones personalizadas de medios y archivos",new_0_5_25_7:"Contenido de imagen base64 mostrado correctamente en el historial de mensajes de usuario",new_0_5_25_8:"Pruebas Playwright, cobertura de contrato de streaming de chat, cobertura de modelos de proveedor y línea base de cobertura",new_0_5_26_1:"Soporte para rutas de medios Markdown locales y de Windows en historial y mensajes renderizados",new_0_5_26_2:"Filtrado de historial vacío del assistant y limpieza del estado de compresión obsoleto al iniciar una nueva ejecución",new_0_5_26_3:"Escrituras bloqueadas para actualizaciones de configuración y perfil para reducir corrupción por concurrencia",new_0_5_26_4:"Ajustes de canal QQBot y DingTalk",new_0_5_26_5:"Detección de puerto CLI portable y mejoras de tamaño del cajón de terminal móvil",new_0_5_26_6:"Entornos de perfil Bridge aislados y descubrimiento de plugins Hermes corregido entre entornos Python",new_0_5_26_7:"Estados de gateway detenido explicados con diagnósticos de Web UI y estado de carga de logs estable",new_0_5_26_8:"Corrección de opciones de restablecimiento de sesión, base URL de proveedor personalizado y destinos dinámicos de entrega",new_0_5_26_9:"Interruptor local para mostrar trazas de tool calls en la barra de entrada del chat",new_0_5_26_10:"Instalación del paquete Hermes Agent cuando no hay checkout de código fuente disponible",new_0_5_26_11:"Login OAuth de xAI Grok para usuarios SuperGrok y actualización de presets de modelos Grok",new_0_5_26_12:"Cobertura ampliada de navegador, streaming de chat, proveedor, gateway, configuración, plugins y Bridge",new_0_5_27_1:"Ajustes de modelo por sesión para chats Bridge, con proveedor y modelo independientes guardados por sesión",new_0_5_27_2:"Clic derecho en una sesión Bridge y elegir Definir modelo para cambiar el modelo de esa sesión",new_0_5_27_3:"Las ejecuciones validan el modelo de sesión y vuelven al modelo predeterminado actual si el guardado no está disponible",new_0_5_27_4:"La compresión de contexto sigue por defecto el modelo predeterminado seleccionado en el perfil actual",new_0_5_30_1:"Bridge chat conserva historial estructurado, corrigiendo respuestas intermitentes ausentes y herramientas omitidas por historial de herramientas aplanado",new_0_5_30_2:"El enrutamiento de menciones en chat grupal es más fiable con varios agentes, elimina la propia mención @ antes de entregar y mantiene nombres de usuario tras refrescar",new_0_5_30_3:"Páginas de modelos, desplegables de modelo de chat y selección de modelo de sesión se acotan al perfil activo con marcadores predeterminados precisos",new_0_5_30_4:"Gestión del gateway simplificada: se elimina la página independiente, cada perfil verifica configuración de plataforma antes de iniciar y un runner ligero gestiona arranques y reinicios",new_0_5_30_5:"Arranque del gateway mejorado en Docker, Termux y Windows con manejo de runtime-lock, limpieza de conflictos de puerto, ejecución en segundo plano y soporte de reinicio",new_0_5_30_6:"Compatibilidad Windows reforzada para detección de rutas, descargas de archivos y subprocesos de tareas/actualización sin ventanas de terminal parpadeantes",new_0_5_30_7:"Escritura de configuración y presets de proveedores corregidos: validar claves .env, enrutar FUN-Codex por Responses API y actualizar modelos Z.AI/GLM",new_0_5_30_8:"Detalles del frontend pulidos, incluyendo barra lateral colapsada, etiquetas cortas de grupo, divisor lateral y estilo del esquema de conversación",new_0_5_30_9:"La compresión de contexto sigue ajustes del perfil y endurece snapshots obsoletos reutilizando resúmenes previos con una cola segura",new_0_5_31_1:"Reinicios del Bridge broker reforzados, renderizado final del stream de chat grupal corregido y enrutamiento {'@'}all agregado",new_0_5_31_2:"El gestor de archivos puede copiar rutas absolutas y el cajón móvil de sesiones ya no queda detrás del chat",new_0_5_31_3:"Selector de perfiles con avatares, subida de avatar personalizado, modal de estado runtime y acciones de reinicio de gateway/perfil",new_0_5_31_4:"Avatares de perfil en chat individual, grupal y barra lateral colapsada, con metadatos en Web UI y rutas seguras para Windows",new_0_5_31_5:"Mejoras en detección y reinicio de gateway en Docker, Termux y Windows usando gateway_state/gateway.pid para liveness del gateway gestionado",new_0_5_31_6:"Endpoint multimedia de generación de imágenes APIKEY.FUN y skill apikey-image-gen integrado para texto-a-imagen, imagen-a-imagen y edición desde el proveedor fun-codex del perfil activo",new_0_5_33_1:"Los fallos de ejecución y errores Socket en chat individual y grupal quedan como mensajes Agent rojos en la lista de mensajes",new_0_5_33_2:"La búsqueda de sesiones puede limitarse al Profile seleccionado, o buscar en todos los Profiles si no hay uno seleccionado",new_0_5_33_3:"La página Skills muestra documentos de recomendaciones en chino/inglés cuando no hay skill seleccionado, y un segundo clic deselecciona el skill",new_0_5_33_4:"Se eliminan entradas de changelog i18n sin uso para reducir el tamaño del frontend",new_0_5_33_5:"Se corrige el inicio de agent bridge en Windows chino cuando la salida de netstat falla por codificación",new_0_5_33_6:"Lista de modelos Nous Portal actualizada desde el catalog público y recomendaciones Portal",new_0_5_33_7:"Las listas y estados runtime de Profile leen nombres desde directorios y modelos por defecto desde config, evitando errores por ancho de columnas CLI",new_0_5_34_1:"Normaliza resultados de tools multimodales al guardar mensajes de sesión/grupo para evitar imágenes base64 en los replays",new_0_5_34_2:"Persiste modelos Hermes personalizados en configuración gestionada por backend y añade endpoints para agregar/eliminar modelos",new_0_5_34_3:"Mantiene correctos el uso final de contexto Bridge y los estados de tools al completar ejecuciones",new_0_5_34_4:"Mejora filtros de Kanban, visualización de responsables, acciones de tarjetas y detalles de tareas",new_0_5_34_5:"Corrige la contabilidad de compresión con caché de contexto fijo de prompt/tools y totales completos de tokens",new_0_5_34_6:"Cachea contexto fijo por agent de chat grupal y muestra progreso solo cuando la compresión empieza realmente",new_0_5_34_7:"Sincroniza skills integradas de Web UI en todos los Profiles y registra el Profile destino en logs",new_0_5_34_8:"Si Kanban falla en Windows, actualiza Hermes para recibir las últimas correcciones de migración de la base Kanban",new_0_5_35_1:"Las sesiones Bridge ahora pueden ejecutarse en paralelo entre distintos sessions, mientras los runs del mismo session siguen serializados para conservar el orden",new_0_5_35_2:"Añade la página Performance Monitor para CPU/memoria del sistema, Web UI, Bridge Broker, Workers y estado de sesiones activas",new_0_5_35_3:"Añade métricas por worker con CPU, memoria, Profile, número de sesiones y estado de ejecución",new_0_5_35_4:"Mejora la limpieza del ciclo de vida de Bridge workers para recuperar workers al cerrar el Broker o terminar el proceso padre y reducir procesos Python huérfanos",new_0_5_35_5:"Refuerza la compatibilidad del monitoreo con fallbacks de recursos para macOS, Windows, Linux, Docker y Termux",new_0_5_35_6:"Performance Monitor ya no se bloquea con requests a workers durante la inicialización de Agent, reduciendo request timeouts en Windows",new_0_5_35_7:"Chat Markdown ahora soporta vista previa inline de contenido de texto, y los iconos de descarga bajan archivos directamente sin abrir el drawer",new_0_5_35_8:"Mejora el drawer de contenido con cierre en móvil, ancho completo en móvil, 800px en escritorio y fondos consistentes para texto/Markdown",new_0_6_0_1:"La gestión por cuenta y por Profile protege de forma coherente sesiones, modelos, uso, Kanban, jobs, subidas, medios y APIs Hermes relacionadas",new_0_6_0_2:"Los Skills de medios integrados usan el token de servidor generado solo para endpoints de medios y resuelven credenciales fun-codex/xAI desde el Profile solicitado",new_0_6_0_3:"El chat individual y el grupal inyectan el Hermes Profile actual en las instrucciones del run para que los Skills envíen X-Hermes-Profile",new_0_6_0_4:"El progreso de subagents de delegate_task se muestra en la UI del chat con estados de inicio, herramienta, progreso y finalización",new_0_6_0_5:"Al detener o abortar un run se limpian eventos temporales para que el estado abort anterior no pase al siguiente chat",new_0_6_0_6:"Actualiza documentación y sitio web para gestión de cuentas, credenciales predeterminadas, gestión cuenta/Profile, subidas/descargas y Skills de medios",new_0_6_0_7:"Añade comandos CLI de mantenimiento para limpiar bloqueos de IP de login y restablecer el login predeterminado admin / 123456",new_0_6_0_8:"La versión 0.6.0 marca el límite entre la Web UI de usuario único y multiusuario. Si el modo multiusuario causa problemas, abre un issue y vuelve a la versión 0.5.35 de usuario único si es necesario"},files:{title:"Archivos",tree:"Arbol de directorios",list:"Lista de archivos",breadcrumbRoot:"Inicio",newFile:"Nuevo archivo",newFolder:"Nueva carpeta",upload:"Subir",refresh:"Actualizar",open:"Abrir",edit:"Editar",preview:"Vista previa",download:"Descargar",copyPath:"Copiar ruta",rename:"Renombrar",delete:"Eliminar",name:"Nombre",size:"Tamano",modified:"Modificado",actions:"Acciones",emptyDir:"Directorio vacio",loading:"Cargando...",confirmDelete:'?Seguro que quiere eliminar "{name}"?',confirmDeleteDir:'?Seguro que quiere eliminar el directorio "{name}" y todo su contenido?',deleteFailed:"Error al eliminar",deleted:"Eliminado",renameTo:"Renombrar a",newFileName:"Nombre del archivo",newFolderName:"Nombre de la carpeta",created:"Creado",createFailed:"Error al crear",renamed:"Renombrado",renameFailed:"Error al renombrar",uploadSuccess:"{count} archivo(s) subido(s)",uploadFailed:"Error al subir",saveFailed:"Error al guardar",saved:"Guardado",unsavedChanges:"Tiene cambios sin guardar. ?Descartar?",pathCopied:"Ruta copiada",fileTooLarge:"Archivo demasiado grande (max 10MB)",permissionDenied:"No se puede modificar un archivo protegido",notFound:"Archivo o directorio no encontrado",backendError:"Error en la operacion de archivo",dragDropHint:"Arrastra archivos aqui para subir",closeEditor:"Cerrar editor",closePreview:"Cerrar",saveFile:"Guardar",fileTree:"Árbol de archivos"},groupChat:{title:"Chat grupal",createRoom:"Crear sala",joinByCode:"Unirse con codigo",roomName:"Nombre de la sala",roomNamePlaceholder:"Ingrese el nombre de la sala",inviteCode:"Codigo de invitacion",autoGenerate:"Generar automaticamente",noRooms:"Aun no hay salas",selectOrCreate:"Seleccione o cree una sala para comenzar a chatear",agents:"Agentes",addAgent:"Agregar agente",selectProfile:"Seleccione un perfil",agentAdded:"Agente agregado",agentAlreadyInRoom:"El agente ya esta en esta sala",agentAddFailedCount:"No se agregaron {count} agente(s): {details}",noAgents:"No hay agentes en esta sala",members:"Miembros",roomCreated:"Sala creada",roomDeleted:"Sala eliminada",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar enlace de sala",deleteRoomConfirm:"¿Eliminar esta sala?",clearContext:"Limpiar contexto",clearContextConfirm:"¿Limpiar el contexto de esta sala? Se eliminarán mensajes e instantáneas de compresión, pero se conservan agentes y miembros.",contextCleared:"Contexto limpiado",you:"Tú",joined:"Se unio a la sala",joinFailed:"Error al unirse a la sala",inputPlaceholder:"Escriba un mensaje... (Enter para enviar)",enterCode:"Ingrese el codigo de invitacion",yourName:"Tu nombre",yourNamePlaceholder:"Ingresa tu nombre para mostrar",yourDescription:"Descripcion (opcional)",yourDescriptionPlaceholder:"Cuentales a los demas quien eres...",agentName:"Nombre del agente",agentNamePlaceholder:"Nombre personalizado (vacío = nombre del perfil)",agentDesc:"Descripción del agente",agentDescPlaceholder:"Describe lo que hace este agente...",agentReplying:"está respondiendo...",agentCompressing:"está comprimiendo contexto...",compressionSettings:"Configuración de compresión",triggerTokens:"Tokens de activación",triggerTokensDesc:"Umbral de tokens para activar la compresión",maxHistoryTokens:"Tokens máximos de historial",maxHistoryTokensDesc:"Máximo de tokens para el contexto comprimido",tailMessageCount:"Mensajes recientes",tailMessageCountDesc:"Número de mensajes recientes a conservar sin comprimir",compressionConfig:"Config. de compresión",compressNow:"Comprimir ahora",compressingInProgress:"Compresión en progreso",compressionSaved:"Configuración guardada"},download:{downloading:"Descargando...",downloadFailed:"Error en la descarga",fileNotFound:"Archivo no encontrado o eliminado",fileTooLarge:"Archivo demasiado grande (excede el limite)",backendError:"Error al leer el archivo, el entorno remoto puede no estar disponible",backendTimeout:"Tiempo de lectura del archivo agotado",unsupportedBackend:"El backend del terminal actual no admite la descarga de archivos",invalidPath:"Ruta de archivo invalida",contentDisplay:"Contenido",download:"Descargar",downloadFile:"Descargar archivo"},gateways:{title:"Puertas de enlace",running:"En ejecución",stopped:"Detenido",started:"Iniciado",startFailed:"No se pudo iniciar el gateway",stopFailed:"No se pudo detener el gateway"},kanban:{title:"Tablero Kanban",createTask:"Nueva tarea",noTasks:"Sin tareas",allStatuses:"Todos los estados",allAssignees:"Todos los responsables",columns:{triage:"Clasificación",todo:"Pendiente",ready:"Listo",running:"En curso",blocked:"Bloqueado",done:"Completado",archived:"Archivado"},card:{assigneeTooltip:"Responsable",priority:{low:"Baja",medium:"Media",high:"Alta"},timeAgo:{justNow:"ahora mismo",minutes:"hace {count} min",hours:"hace {count} h",days:"hace {count} d"}},board:{create:"Nuevo tablero",archive:"Archivar tablero",archiveConfirm:"¿Archivar el tablero actual?",archived:"Tablero archivado",created:"Tablero creado",slugPlaceholder:"Identificador del tablero, p. ej. project-a",namePlaceholder:"Nombre visible (opcional)",slugRequired:"El identificador del tablero es obligatorio"},form:{title:"Título",titlePlaceholder:"Título de la tarea",titleRequired:"El título es obligatorio",body:"Descripción",bodyPlaceholder:"Descripción de la tarea (opcional)",assignee:"Responsable",selectAssignee:"Seleccionar responsable...",priority:"Prioridad",selectPriority:"Seleccionar prioridad..."},detail:{status:"Estado",priority:"Prioridad",assignee:"Responsable",tenant:"Inquilino",createdAt:"Creada",startedAt:"Iniciada",completedAt:"Completada",comments:"Comentarios",events:"Eventos",runs:"Ejecuciones",artifacts:"Archivos generados",result:"Resultado",highlights:"Información clave",sources:"Fuentes de datos",sessions:"Sesiones relacionadas",sessionMessages:"Mensajes de sesión",noSessions:"No se encontraron sesiones relacionadas."},action:{title:"Acciones",assign:"Asignar",assignTo:"Asignar a...",block:"Bloquear",blockReason:"Motivo del bloqueo",unblock:"Desbloquear",complete:"Completar",completeSummary:"Resumen de finalización (opcional)"},message:{loadFailed:"No se pudo cargar la tarea",taskCreated:"Tarea creada",taskAssigned:"Tarea asignada",taskBlocked:"Tarea bloqueada",taskUnblocked:"Tarea desbloqueada",taskCompleted:"Tarea completada"},stats:{total:"Total",tasks:"Tareas"}}},Ht={login:{title:"Hermes Web UI",description:"Geben Sie Benutzername und Passwort ein, um fortzufahren.",placeholder:"Zugangs-Token",submit:"Anmelden",tokenRequired:"Bitte geben Sie Ihren Zugangs-Token ein",invalidToken:"Ungultiger Token",connectionFailed:"Verbindung zum Server nicht moglich",passwordLogin:"Passwort",tokenLogin:"Token",usernamePlaceholder:"Benutzername",passwordPlaceholder:"Passwort",defaultCredentialsHint:"Standard-Benutzername: admin. Standard-Passwort: 123456.",credentialsRequired:"Bitte Benutzername und Passwort eingeben",invalidCredentials:"Ungultiger Benutzername oder Passwort",tooManyAttempts:"Zu viele fehlgeschlagene Versuche, bitte versuchen Sie es spater erneut",sessionExpired:"Die Anmeldung ist abgelaufen. Bitte melden Sie sich erneut an.",accessDenied:"Sie haben keine Berechtigung fur diese Ressource.",passwordMismatch:"Passworter stimmen nicht uberein",passwordTooShort:"Passwort muss mindestens 6 Zeichen lang sein",setupSuccess:"Passwort-Login erfolgreich konfiguriert",passwordChanged:"Passwort erfolgreich geandert",passwordRemoved:"Passwort-Login entfernt",setupPassword:"Passwort-Login einrichten",changePassword:"Passwort andern",changeUsername:"Benutzername andern",removePasswordLogin:"Entfernen",username:"Benutzername",currentPassword:"Aktuelles Passwort",newPassword:"Neues Passwort",confirmPassword:"Passwort bestatigen",newUsername:"Neuer Benutzername",usernameChanged:"Benutzername erfolgreich geandert",usernameTooShort:"Benutzername muss mindestens 2 Zeichen lang sein",setupDescription:"Verwalten Sie Benutzername und Passwort fur die Anmeldung.",removeConfirm:"Passwort-Login ist fur Benutzerkonten erforderlich.",passwordLoginNotConfigured:"Passwort-Login ist nicht konfiguriert",passwordLoginConfigured:"Aktuelles Konto: {username}",defaultCredentialTitle:"Standardkonto und Passwort andern",defaultCredentialMessage:"Das aktuelle Konto verwendet noch den Standard-Benutzernamen oder das Standard-Passwort. Um unbefugten Zugriff zu vermeiden, andern Sie Benutzername und Passwort des aktuellen Kontos so bald wie moglich.",defaultCredentialAction:"Jetzt andern",defaultCredentialLater:"Spater erinnern"},users:{title:"Kontoverwaltung",description:"Benutzer erstellen, Rollen zuweisen und steuern, auf welche Profile normale Administratoren zugreifen koennen.",create:"Benutzer erstellen",edit:"Benutzer bearbeiten",username:"Benutzername",role:"Rolle",statusLabel:"Status",profiles:"Zugreifbare Profile",profilesPlaceholder:"Zugreifbare Profile auswaehlen",allProfiles:"Alle Profile",noProfiles:"Keine Profile zugewiesen",lastLogin:"Letzte Anmeldung",newPasswordOptional:"Neues Passwort (leer lassen zum Beibehalten)",loadFailed:"Benutzer konnten nicht geladen werden",deleteConfirm:"Diesen Benutzer loeschen?",enable:"Aktivieren",disable:"Deaktivieren",roles:{superAdmin:"Super Admin",admin:"Admin"},status:{active:"Aktiv",disabled:"Deaktiviert"}},common:{loading:"Laden...",cancel:"Abbrechen",retry:"Erneutern",delete:"Loschen",edit:"Bearbeiten",save:"Speichern",saved:"Gespeichert",update:"Aktualisieren",create:"Erstellen",saveFailed:"Speichern fehlgeschlagen",deleteFailed:"Loschen fehlgeschlagen",ok:"OK",copied:"Kopiert",copy:"Kopieren",noData:"Keine Daten",fetch:"Abrufen",add:"Hinzufugen",enable:"Aktivieren",disable:"Deaktivieren",configured:"Konfiguriert",notConfigured:"Nicht konfiguriert",confirm:"Bestatigen",expand:"Aufklappen",collapse:"Zuklappen",stop:"Stoppen",start:"Starten",expired:"Abgelaufen"},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",performance:"Leistung",skillsUsage:"Skill-Nutzung",channels:"Kanale",terminal:"Konsole",files:"Dateien",groupChat:"Gruppenchat",groupConversation:"Konversation",groupConversationShort:"Konv",groupAgent:"Agent",groupAgentShort:"Agent",groupSystem:"System",groupSystemShort:"Sys",groupMonitoring:"Überwachung",groupMonitoringShort:"Überw.",settings:"Einstellungen",connected:"Verbunden",disconnected:"Getrennt",updateTip:'Fuhren Sie "hermes-web-ui update" im Terminal aus, um zu aktualisieren',updateVersion:"Aktualisieren auf v{version}",reloadClientVersion:"Für v{version} neu laden",updating:"Aktualisierung...",updateSuccess:"Aktualisierung erfolgreich. Bitte aktualisieren Sie die Seite in Kurze. Wenn der Dienst langere Zeit nicht startet, starten Sie ihn manuell.",updateFailed:"Aktualisierung fehlgeschlagen",logout:"Abmelden",nodeVersionWarning:"Node.js v{version} erkannt. Bitte aktualisieren Sie auf Version 23 oder neuer.",changelog:"Anderungsprotokoll",noChangelog:"Kein Anderungsprotokoll verfugbar",kanban:"Kanban",groupTools:"Werkzeuge",groupPlatform:"Plattform",gateways:"Gateways",expand:"Menü ausklappen",collapse:"Menü einklappen"},performance:{title:"Leistung",subtitle:"Systemressourcen, Bridge Broker, Workers und aktive Sitzungen überwachen",refresh:"Aktualisieren",autoRefreshOn:"Automatisch aktualisieren",autoRefreshOff:"Manuell aktualisieren",loadFailed:"Leistungsdaten konnten nicht geladen werden",systemCpu:"System-CPU",systemMemory:"Systemspeicher",activeSessions:"Aktive Sitzungen",runningSessions:"Laufend {count}",workers:"Workers",totalWorkerMemory:"Worker-Gesamtspeicher",processes:"Prozesse",uptime:"Laufzeit",running:"Läuft",stopped:"Gestoppt",workerMemory:"Worker-Speicher",lastUpdated:"Aktualisiert",profile:"Profile",memory:"Speicher",sessions:"Sitzungen",runningActiveSessions:"Laufend / Aktiv",lastUsed:"Zuletzt verwendet",status:"Status",noWorkers:"Keine Workers",sessionsByProfile:"Sitzungen nach Profile",noActiveSessions:"Keine aktiven Sitzungen"},drawer:{terminal:"Konsole",files:"Arbeitsbereich"},chat:{contextRemaining:"übrig",contextClickToEdit:"Klicken zum Bearbeiten der Kontextlänge",contextEditTitle:"Kontextlänge bearbeiten",contextEditDesc:"Kontextlängenlimit für aktuelles Modell festlegen (in Tokens)",contextEditPlaceholder:"Kontextlänge eingeben",contextEditHint:"Häufige Werte: 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",outlineTitle:"Konversationsübersicht",outlineEmpty:"Kein Konversationsinhalt",outlineUserQuestion:"Benutzerfrage",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden, Shift+Enter fur neue Zeile)",slashCommandArgs:{message:"<Nachricht>",title:"<Titel>",text:"<Text>"},slashCommands:{usage:"Nutzung der aktuellen Sitzung berechnen",status:"Sitzungsstatus und Warteschlange anzeigen",abort:"Aktiven Bridge-Lauf stoppen",queue:"Nachricht hinter dem aktiven Lauf einreihen",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",allProfiles:"Alle Profile",profileMissingModelsTip:'Profil "{profile}" hat keinen verfuegbaren Provider oder kein Modell fuer diese Sitzung',sessionScopeHint:"Chat zeigt nur Web-UI/API-Server-Sitzungen. CLI-, Telegram-, Discord-, Cron- und andere Kanal-Sitzungen sind schreibgeschützt im Verlauf.",openHistory:"Verlauf öffnen",hermesHistory:"Hermes-Verlauf",historyScopeHint:"Schreibgeschützte Hermes-Verlaufssitzungen des aktuellen Profils, nach Quelle gruppiert.",noSessions:"Keine Sitzungen",newChat:"Neuer Chat",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:"Chatmodus",liveMode:"Live-Modus",liveSessions:"Live-Sitzungen",recentBadge:"Kürzlich",linkedSessions:"{count} verknüpft",noVisibleMessages:"Keine für Menschen sichtbaren Nachrichten.",monitorRoleUser:"Benutzer",monitorRoleAssistant:"Assistent",copySessionLink:"Sitzungslink kopieren",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:"Ausführungszeit",thinkingLabel:"Denkprozess",thinkingInProgress:"Denkt…",thinkingShow:"Denkprozess anzeigen",thinkingHide:"Denkprozess ausblenden",thinkingDuration:"Beobachtet {duration}",thinkingChars:"{count} Zeichen",copyBubble:"Nachricht kopieren",copiedBubble:"Nachricht kopiert",copyFailed:"Kopieren fehlgeschlagen",playSpeech:"Sprache abspielen",pauseSpeech:"Pausieren",resumeSpeech:"Fortsetzen",stopSpeech:"Stoppen",speechNotSupported:"Sprachwiedergabe in diesem Browser nicht unterstützt",searchEnterHint:"Enter zum Öffnen · Esc zum Schließen",searchHint:"Cmd/Ctrl+K",searchScope:"Suchbereich: nur lokale Web-UI-Sitzungsdatenbank; schreibgeschützte Hermes-Verlaufssitzungen sind nicht enthalten.",searchFailed:"Sitzungssuche fehlgeschlagen",searchNoSnippet:"Keine Vorschau verfügbar",searchNoResults:"Keine passenden Sitzungen",searchRecent:"Letzte Sitzung",searchEmpty:"Letzte Sitzungen",searchPlaceholder:"Sitzungen suchen...",searchSubtitle:"Nach Titel oder Nachrichteninhalt suchen",searchTitle:"Sitzungen suchen",stopGateway:"Gateway stoppen",start:"Starten",workspaceSetFailed:"Workspace konnte nicht festgelegt werden",workspaceSet:"Workspace festgelegt",workspacePlaceholder:"Projektpfad eingeben, z. B. /home/user/project",workspace:"Arbeitsbereich",setWorkspaceTitle:"Sitzungs-Workspace festlegen",setWorkspace:"Workspace festlegen",modelSetFailed:"Modell konnte nicht festgelegt werden",modelSet:"Modell festgelegt",setModelTitle:"Sitzungsmodell festlegen",setModel:"Modell festlegen",newCliChat:"Neue CLI",cliEmptyState:"CLI-Chat starten",autoPlaySpeech:"Sprache automatisch abspielen"},jobs:{title:"Geplante Aufgaben",createJob:"Aufgabe erstellen",editJob:"Aufgabe bearbeiten",noJobs:"Noch keine geplanten Aufgaben. Erstellen Sie eine, um zu beginnen.",name:"Name",namePlaceholder:"Aufgabenname",schedule:"Zeitplan (Cron-Ausdruck)",schedulePlaceholder:"z. B. 0 9 * * *",quickPresets:"Schnellvorgaben",selectPreset:"Vorgabe auswahlen...",presetEveryMinute:"Jede Minute",presetEvery5Min:"Alle 5 Minuten",presetEveryHour:"Jede Stunde",presetEveryDay:"Jeden Tag um 00:00",presetEveryDay9:"Jeden Tag um 09:00",presetEveryMonday:"Jeden Montag um 09:00",presetEveryMonth:"Am 1. jedes Monats um 09:00",prompt:"Eingabeaufforderung",promptPlaceholder:"Der auszufuhrende Prompt",deliverTarget:"Zustellziel",origin:"Herkunft",local:"Lokal",repeatCount:"Wiederholungsanzahl (optional)",modelPlaceholder:"Standardmodell",repeatPlaceholder:"Leer lassen fur unendlich",jobCreated:"Aufgabe erstellt",jobUpdated:"Aufgabe aktualisiert",nameRequired:"Name ist erforderlich",scheduleRequired:"Zeitplan ist erforderlich",loadFailed:"Laden der Aufgabe fehlgeschlagen",jobPaused:"Aufgabe pausiert",jobResumed:"Aufgabe fortgesetzt",jobTriggered:"Job ausgelost",modelUpdated:"Modell aktualisiert",jobDeleted:"Aufgabe geloscht",status:{running:"Lauft",paused:"Pausiert",disabled:"Deaktiviert",scheduled:"Geplant"},info:{model:"Modell",schedule:"Zeitplan",lastRun:"Letzte Ausfuhrung",nextRun:"Nachste Ausfuhrung",deliver:"Zustellung",repeat:"Wiederholung"},action:{pause:"Pausieren",pauseJob:"Aufgabe pausieren",resume:"Fortsetzen",resumeJob:"Aufgabe fortsetzen",runNow:"Jetzt ausfuhren",triggerImmediately:"Sofort auslösen"},runHistory:{title:"Verlauf",runs:"Läufe",noRuns:"Kein Verlauf gefunden."}},skills:{title:"Fahigkeiten",searchPlaceholder:"Fahigkeiten suchen...",noMatch:"Keine Fahigkeiten entsprechen Ihrer Suche",noSkills:"Keine Fahigkeiten gefunden",backTo:"Zuruck zu",attachedFiles:"Angehange Dateien",loadFailed:"Laden der Fahigkeit fehlgeschlagen",fileLoadFailed:"Laden der Datei fehlgeschlagen",modified:"Benutzerbearbeitet",archived:"Archiviert",pinned:"Angeheftet",pin:"Fahigkeit anheften",unpin:"Anheften aufheben",pinFailed:"Anheft-Status konnte nicht geandert werden",toggleFailed:"Aktivieren/Deaktivieren der Fahigkeit fehlgeschlagen",source:{builtin:"Integriert",hub:"Hub",local:"Lokal"}},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-Stammverzeichnis",python:"Python",scanCwd:"Arbeitsverzeichnis scannen",projectPlugins:"Projekt-Plugins"}},memory:{title:"Gedachtnis",refresh:"Aktualisieren",loadFailed:"Laden des Gedachtnisses fehlgeschlagen",myNotes:"Meine Notizen",noNotes:"Noch keine Notizen.",notesPlaceholder:"Notizen schreiben...",userProfile:"Benutzerprofil",noProfile:"Noch kein Profil.",profilePlaceholder:"Profil schreiben...",soul:"Seele",noSoul:"Noch keine Seelenkonfiguration.",soulPlaceholder:"Seelenkonfiguration schreiben..."},models:{title:"Modelle",addProvider:"Anbieter hinzufugen",providerType:"Anbietertyp",preset:"Vorgabe",custom:"Benutzerdefiniert",selectProvider:"Anbieter auswahlen",chooseProvider:"Anbieter wahlen...",name:"Name",autoGeneratedName:"Automatisch aus Basis-URL generiert",baseUrl:"Basis-URL",region:"Region",regionIntl:"International",regionCn:"Festlandchina",baseUrlPlaceholder:"z. B. https://api.example.com/v1",apiKey:"API-Schlussel",apiKeyPlaceholder:"sk-...",defaultModel:"Standardmodell",selectOrInput:"Modell auswählen oder eingeben...",selectModel:"Modell auswahlen...",providerAdded:"Anbieter hinzugefugt",providerDeleted:"Anbieter geloscht",deleteProvider:"Anbieter loschen",deleteConfirm:'Mochten Sie "{name}" wirklich loschen?',codexLoginTitle:"OpenAI Codex Anmeldung",codexWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein, um sich anzumelden:",codexCopyCode:"Code kopiert",codexOpenLink:"Autorisierungsseite öffnen",codexApproved:"Anmeldung erfolgreich",codexExpired:"Die Autorisierung ist abgelaufen. Bitte versuchen Sie es erneut.",nousLoginTitle:"Nous-Portal-Anmeldung",nousWaiting:"Geben Sie diesen Code auf der Autorisierungsseite ein:",nousCopyCode:"Code kopiert",nousOpenLink:"Autorisierungsseite öffnen",nousApproved:"Login erfolgreich",nousDenied:"Autorisierung wurde abgelehnt",nousExpired:"Autorisierung abgelaufen",copilotLoginTitle:"GitHub Copilot Anmeldung",copilotWaiting:"Öffnen Sie GitHub und geben Sie den unten angezeigten Gerätecode ein. Das Fenster schließt sich automatisch nach Genehmigung.",copilotCopyCode:"Code kopiert",copilotOpenLink:"GitHub-Autorisierungsseite öffnen",copilotApproved:"Anmeldung erfolgreich!",copilotDenied:"Autorisierung abgelehnt.",copilotExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",copilotAddDetectedTitle:"GitHub Copilot erkannt",copilotAddDetected:'Auf diesem Rechner wurde ein GitHub Copilot OAuth-Token erkannt. Klicken Sie auf „Hinzufügen", um Copilot in 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",currentDefault:"Aktueller Standard",defaultShort:"Standard",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",xaiWaiting:"Schließen Sie die Autorisierung auf der geöffneten xAI-Seite ab. Das Fenster schließt sich nach der Freigabe automatisch.",xaiOpenLink:"xAI-Autorisierungsseite öffnen",xaiLoginTitle:"xAI Grok OAuth-Anmeldung",xaiExpired:"Der Autorisierungslink ist abgelaufen. Bitte erneut versuchen.",xaiCopyLink:"Autorisierungslink kopieren",xaiApproved:"Anmeldung erfolgreich!",visibilitySelectOne:"Mindestens ein sichtbares Modell behalten",visibilitySaved:"Sichtbare Modelle gespeichert",visibilitySaveFailed:"Sichtbare Modelle konnten nicht gespeichert werden",visibilityHint:"Wirkt sich nur auf Modellauswahl und Modellseite der Web UI aus. Die provider/model-Konfiguration der Hermes CLI wird nicht geändert; Aufrufe verwenden weiterhin die ursprüngliche Modell-ID.",showAllModels:"Alle Modelle anzeigen",searchPlaceholder:"Modelle suchen...",removeCustomModel:"Dieses nicht gelistete Modell entfernen",more:"weitere",models:"Modellliste",manageVisibleModelsFor:"Sichtbare Modelle für {name} verwalten",manageVisibleModels:"Sichtbare Modelle verwalten",getApiKey:"API Key abrufen",count:"Modelle",aliasUseOriginal:"Ursprüngliche ID wiederherstellen",aliasTitleFor:"Anzeigename für {model}",aliasTitle:"Modell-Anzeigename",aliasSaveFailed:"Anzeigename konnte nicht gespeichert werden",aliasPlaceholder:"Leer lassen, um die ursprüngliche Modell-ID zu verwenden",aliasManageFor:"Anzeigenamen für {provider}",aliasManage:"Anzeigenamen",aliasHint:"Ändert nur den Anzeigenamen in der Web UI. Hermes erhält weiterhin die ursprüngliche Modell-ID.",aliasEdit:"Umbenennen",aliasCanonical:"Original-ID: {model}"},profiles:{title:"Profile",create:"Profil erstellen",import:"Importieren",export:"Exportieren",rename:"Umbenennen",delete:"Loschen",switchTo:"Hermes Profile wechseln",switchConfirm:"Dies fuehrt `hermes profile use {name}` aus und aendert das aktive Hermes CLI Profile. Fortfahren?",switchSuccess:'Aktives Hermes Profile ist jetzt "{name}"',switchFailed:"Hermes Profile konnte nicht gewechselt werden. Das Gateway muss eventuell manuell neu gestartet werden.",createSuccess:'Profil "{name}" erstellt',createFailed:"Erstellen des Profils fehlgeschlagen",renameSuccess:"Profil umbenannt",renameFailed:"Umbenennung des Profils fehlgeschlagen",deleteConfirm:'Mochten Sie das Profil "{name}" wirklich loschen?',deleteSuccess:"Profil geloscht",deleteFailed:"Loschen des Profils fehlgeschlagen",exportSuccess:"Profil exportiert",exportFailed:"Exportieren des Profils fehlgeschlagen",importSuccess:"Profil importiert",importFailed:"Importieren des Profils fehlgeschlagen",importSelectFile:"Archivdatei auswahlen",importInvalidFile:"Bitte wahlen Sie ein gultiges Archiv (.tar.gz, .tgz, .gz, .zip)",name:"Profilname",namePlaceholder:"Nur Buchstaben, Zahlen und Bindestriche",nameValidation:"Profilname darf nur Kleinbuchstaben, Zahlen, Unterstriche und Bindestriche enthalten",newName:"Neuer Name",newNamePlaceholder:"Neuen Namen eingeben",cloneFromCurrent:"Aus aktuellem Profil klonen",cloneCleanupNotice:"Beim Klonen werden exklusive Plattform-Anmeldeinformationen (Weixin / Telegram / Slack usw.) automatisch übersprungen, um Konflikte mit dem Quellprofil zu vermeiden",cloneStrippedCredentials:"{count} exklusive Anmeldeinformation(en) entfernt: {list}",cloneDisabledPlatforms:"{count} Plattform(en) deaktiviert: {list}",cloneStrippedConfigCredentials:"{count} eingebettete Anmeldeinformation(en) aus config.yaml entfernt: {list}",archivePath:"Archivpfad",archivePathPlaceholder:"Serverpfad zur Archivdatei",importName:"Profilname (optional)",importNamePlaceholder:"Leer lassen, um den Archivnamen zu verwenden",active:"Aktiv",model:"Modell",gateway:"Gateway",alias:"Alias",provider:"Anbieter",path:"Pfad",skills:"Fahigkeiten",hasEnv:"Hat .env",hasSoulMd:"Hat soul.md",noProfiles:"Keine Profile gefunden. Erstellen Sie eines, um zu beginnen.",avatar:{title:"Eigenes Avatar",customize:"Avatar anpassen",upload:"Bild hochladen",random:"Zufällig erzeugen",reset:"Standard wiederherstellen",hint:"PNG, JPEG oder WebP, maximal 1 MB",invalidType:"Bitte ein PNG-, JPEG- oder WebP-Bild wählen",tooLarge:"Das Avatar-Bild darf höchstens 1 MB groß sein",saveSuccess:"Avatar gespeichert",saveFailed:"Avatar konnte nicht gespeichert werden",resetSuccess:"Standard-Avatar wiederhergestellt",resetFailed:"Standard-Avatar konnte nicht wiederhergestellt werden"},runtime:{activeProfile:"Aktuell: {name}",bridgeWorker:"Bridge-Status",gateway:"Gateway",active:"Aktiv",activeTag:"Aktuell",idle:"Leerlauf",running:"Läuft",stopped:"Gestoppt",restartGateway:"Gateway neu starten",restartProfile:"Profil neu starten",switchProfile:"Frontend-Profil wechseln",gatewayRestarted:"Gateway neu gestartet: {name}",gatewayRestartFailed:"Gateway-Neustart fehlgeschlagen",profileRestarted:"Profil neu gestartet: {name}",profileRestartFailed:"Profil-Neustart fehlgeschlagen"}},logs:{title:"Protokolle",all:"Alle",searchPlaceholder:"Suchen...",refresh:"Aktualisieren",noEntries:"Keine Protokolleintrage"},settings:{title:"Einstellungen",saved:"Gespeichert",saveFailed:"Speichern fehlgeschlagen",tabs:{display:"Anzeige",account:"Aktuelles Konto",users:"Kontoverwaltung",agent:"Agent",memory:"Gedachtnis",compression:"Komprimierung",session:"Sitzung",privacy:"Datenschutz",apiServer:"API-Server",models:"Modelle",voice:"Sprache"},display:{streaming:"Streaming-Antworten",streamingHint:"KI-Antworten in Echtzeit anzeigen",compact:"Kompaktmodus",compactHint:"Nachrichtenabstand reduzieren",showReasoning:"Schlussfolgerung anzeigen",showReasoningHint:"Denkprozess des Modells anzeigen",showCost:"Kosten anzeigen",showCostHint:"Token-Nutzung in Antworten anzeigen",inlineDiffs:"Inline-Diffs",inlineDiffsHint:"Codeanderungen inline anzeigen",bellOnComplete:"Abschluss-Signalton",bellOnCompleteHint:"Ton abspielen, wenn die KI fertig ist",busyInputMode:"Eingabemodus bei Beschaftigung",busyInputModeHint:"Eingabe erlauben, wahrend die KI verarbeitet",theme:"Design",themeHint:"Hell, Dunkel oder Systemeinstellung verwenden",themeLight:"Hell",themeDark:"Dunkel",themeSystem:"System"},agent:{maxTurns:"Maximale Runden",maxTurnsHint:"Maximale Interaktionsrunden pro Konversation",gatewayTimeout:"Gateway-Timeout",gatewayTimeoutHint:"Anfrage-Timeout in Sekunden",restartDrainTimeout:"Neustart-Drain-Timeout",restartDrainTimeoutHint:"Drain-Timeout vor Neustart in Sekunden",toolEnforcement:"Werkzeuferzwingung",toolEnforcementHint:"Ausfuhrungsmodus fur Werkzeugaufrufe steuern",auto:"Automatisch",always:"Immer",never:"Nie"},memory:{enabled:"Gedachtnis aktivieren",enabledHint:"KI erlauben, den Konversationskontext zu merken",userProfile:"Benutzerprofil",userProfileHint:"KI erlauben, Benutzereinstellungen zu merken",charLimit:"Zeichenlimit fur Gedachtnis",charLimitHint:"Maximale Zeichen fur MEMORY.md",userCharLimit:"Zeichenlimit fur Benutzerprofil",userCharLimitHint:"Maximale Zeichen fur USER.md"},compression:{enabled:"Komprimierung aktivieren",enabledHint:"Langen Chatverlauf automatisch komprimieren, bevor der Modellkontext uberschritten wird",threshold:"Komprimierungsschwelle",thresholdHint:"Komprimierung starten, wenn geschatzte Token dieses Kontextverhaltnis uberschreiten",targetRatio:"Zielverhaltnis",targetRatioHint:"Zielgroße des Verlaufs nach der Komprimierung als Kontextverhaltnis",protectLastN:"Neueste Nachrichten schutzen",protectLastNHint:"So viele neueste Nachrichten unkomprimiert lassen",protectFirstN:"Erste Nachrichten schutzen",protectFirstNHint:"So viele erste Nachrichten unkomprimiert lassen"},session:{mode:"Zurucksetzungsmodus",modeHint:"Ausloser fur Sitzungszurucksetzung",modeBoth:"Inaktivitat + Geplant",modeIdle:"Nur Inaktivitat",modeDaily:"Nur Geplant",modeNone:"Nie (nur manuell)",idleMinutes:"Inaktivitats-Timeout",idleMinutesHint:"Wartezeit vor automatischer Zurucksetzung (Minuten)",atHour:"Geplante Zurucksetzungszeit",humanOnly:"Nur menschliche Sitzungen anzeigen",humanOnlyHint:"Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",liveMonitorHumanOnly:"Live-Monitor: nur menschliche Sitzungen anzeigen",liveMonitorHumanOnlyHint:"Im Live-Monitor Unteragenten- und Sitzungsmonitor-Rauschen standardmäßig ausblenden",atHourHint:"Sitzung taglich zu dieser Stunde zurucksetzen",requireAuth:"Sitzungsautorisierung",requireAuthHint:"Erfordert Autorisierung für Sitzungsvorgänge"},privacy:{redactPii:"Personliche Daten maskieren",redactPiiHint:"Sensible Informationen automatisch erkennen und ausblenden (Passworter, Schlussel usw.)"},apiServer:{enable:"Aktivieren",enableHint:"API-Server aktivieren",host:"Host",hostHint:"Listen-Adresse",port:"Port",portHint:"Listen-Port",key:"Schlussel",keyHint:"API-Zugangsschlussel",cors:"CORS-Ursprunge",corsHint:"Erlaubte Cross-Origin-Quellen"},voice:{ttsProvider:"TTS-Anbieter",ttsProviderHint:"Waehlen Sie die Sprachsynthese-Engine fuer die Nachrichtenwiedergabe",providerWebSpeech:"WebSpeech API (Browser)",providerOpenai:"OpenAI TTS",providerCustom:"Benutzerdefinierter Endpunkt (OpenAI-kompatibel)",providerEdge:"Edge TTS (Kostenlos, kein API-Key erforderlich)",webspeechVoice:"Stimme",webspeechVoiceHint:"Waehlen Sie eine Stimme aus Ihrem Browser oder Betriebssystem",webspeechVoicePlaceholder:"Auto (Standardstimme)",openaiKey:"API-Key",openaiKeyHint:"Ihr OpenAI API-Key mit TTS-Zugriff",openaiUrl:"API-Basis-URL",openaiUrlHint:"z.B. https://api.openai.com/v1/audio/speech",openaiModel:"Modell",openaiModelHint:"tts-1 (schneller) / tts-1-hd (hoehere Qualitaet)",openaiVoice:"Stimme",openaiVoiceHint:"Stimme fuer die Synthese",customHint:"Jede OpenAI-kompatible TTS-API verwenden — funktioniert mit GPT-SoVITS, CosyVoice, usw.",customUrl:"API-URL",customUrlHint:"Basis-URL Ihres TTS-Dienstes",customUrlPlaceholder:"Die im lokalen Adapter konfigurierte Adresse, z.B. http://127.0.0.1:9880",customApiKey:"API-Key (optional)",customApiKeyHint:"Einige benutzerdefinierte Endpunkte erfordern Authentifizierung",customApiKeyPlaceholder:"Leer lassen wenn nicht benoetigt",edgeHint:"Angetrieben von Microsoft Edge TTS (node-edge-tts).",edgeUrl:"Adapter-URL",edgeUrlHint:"Adresse des Edge TTS-Adapters, z.B. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Stimme",edgeVoiceHint:"Waehlen Sie eine Stimme fuer die Sprachsynthese",edgeRate:"Geschwindigkeit",edgeRateHint:"Sprachgeschwindigkeit anpassen (0,5x ~ 2,0x)",edgePitch:"Tonhöhe",edgePitchHint:"Tonhöhe anpassen (-20 ~ +20 Hz)",testTitle:"Sprachtest",testText:"Testtext",testTextPlaceholder:"Text zum Testen eingeben...",testTextDefault:"Hallo, dies ist ein Sprachtest.",testButton:"Testen",testButtonPlaying:"Wiedergabe...",testFailed:"Test fehlgeschlagen: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — unterstützt Voreingestellte Stimmen, Stimmdesign und Stimmklonung",mimoApiKey:"API-Schluessel",mimoApiKeyHint:"Holen Sie sich Ihren Schluessel auf platform.xiaomimimo.com",mimoApiKeyPlaceholder:"MiMo API-Schluessel",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"API Key eingeben",noProviders:"Keine Provider konfiguriert",save:"Speichern",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert"}},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...",qqSandboxHint:"Sandbox-Umgebung aktivieren (für Tests)",qqSandbox:"Sandbox-Modus",qqQrScanHint:"QR-Code oben mit QQ scannen oder Link auf dem Telefon öffnen, um die Bindung abzuschließen",qqMarkdownHint:"Markdown-formatierte Nachrichten aktivieren (einige Clients unterstützen dies möglicherweise nicht)",qqMarkdown:"Markdown-Unterstützung",qqAppSecretHint:"QQ Open Platform Bot App Secret",qqAppSecret:"App Secret",qqAppIdHint:"QQ Open Platform Bot App ID",qqAppId:"App ID",allowedUsersHint:"Whitelist für Benutzer-IDs oder OpenIDs, durch Kommas getrennt",allowedUsers:"Erlaubte Benutzer",allowAllUsersHint:"Nachrichten von beliebigen Benutzern erlauben; deaktiviert lassen, um die Allowlist zu verwenden",allowAllUsers:"Alle Benutzer erlauben"},language:{label:"Sprache",zh:"中文",en:"English",de:"Deutsch"},terminal:{sessions:"Sitzungen",newTab:"Neues Terminal",closeSession:"Diese Sitzung schliessen?",sessionExited:"Beendet",processExited:"Prozess beendet mit Code {code}",noSessions:"Keine Terminal-Sitzungen",connectionFailed:"Terminaldienstverbindung fehlgeschlagen",connectionClosed:"Terminalverbindung geschlossen",connectionError:"Terminalverbindungsfehler"},usage:{title:"Nutzungsstatistiken",refresh:"Aktualisieren",totalTokens:"Gesamt-Tokens",inputTokens:"Eingabe",outputTokens:"Ausgabe",totalSessions:"Gesamt-Sitzungen",avgPerDay:"~{n}/Tag Durchschn.",estimatedCost:"Gesch. Kosten",cacheHitRate:"Cache-Trefferquote",modelBreakdown:"Modellaufschluesselung",dailyTrend:"Tagliche Nutzung",date:"Datum",tokens:"Tokens",cache:"Cache",cacheRead:"Cache gelesen",cacheWrite:"Cache geschrieben",sessions:"Sitzungen",cost:"Kosten",noData:"Keine Nutzungsdaten"},skillsUsage:{title:"Skill-Nutzung",subtitle:"Skill-Ladevorgänge und -Bearbeitungen aus 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_22_1:"Hermes-Sessionlisten-API liest jetzt die Profil-Datenbank statt des lokalen Web-UI-Session-Stores",new_0_5_23_1:"Bridge-only Chat-Slash-Befehle mit lokalisierten Befehlsvorschlägen hinzugefügt",new_0_5_23_2:"Befehlsverlauf für Session-Replay gespeichert, ohne Modellkontext, Nutzung oder Komprimierung zu verunreinigen",new_0_5_23_3:"Gateway-Profil-Umgebungsvariablen isoliert, damit Zugangsdaten nicht zwischen Profilen durchsickern",new_0_5_23_4:"Web-UI-Port bei Gateway-Zuweisung reserviert, um Startkonflikte zu vermeiden",new_0_5_23_5:"Self-Update-Neustart korrigiert, damit erfolgreiche Helper-Exits nicht als Fehler gemeldet werden",new_0_5_24_1:"Bridge-Chat an API-Server-Verarbeitung für multimodale Eingaben, System-Prompt und Workspace-Kontext angepasst",new_0_5_25_1:"Zurücksetzen und Klonen von Gruppenchat-Räumen hinzugefügt",new_0_5_25_2:"Web-UI-Statusverzeichnis für eigene Deployment-Layouts konfigurierbar gemacht",new_0_5_25_3:"MiMo als TTS-Anbieter in den Spracheinstellungen hinzugefügt",new_0_5_25_4:"Modelllisten eigener Provider werden über das Backend geladen, um Browser-CORS-Fehler zu vermeiden",new_0_5_25_5:"Tool-Freigabeablauf für Bridge-Sitzungen korrigiert",new_0_5_25_6:"Erzwungenen CLI-Plattformhinweis aus Bridge-Prompts entfernt, damit eigene Medien-/Dateianweisungen erhalten bleiben",new_0_5_25_7:"Base64-Bildinhalte werden in der Nachrichtenhistorie korrekt angezeigt",new_0_5_25_8:"Playwright-Browsertests, Chat-Streaming-Vertragsabdeckung, Provider-Modellabdeckung und Coverage-Baseline hinzugefügt",new_0_5_26_1:"Windows- und lokale Markdown-Medienpfade in Chatverlauf und gerenderten Nachrichten unterstützt",new_0_5_26_2:"Leere Assistant-Historie gefiltert und veralteter Komprimierungsstatus bei neuem Lauf gelöscht",new_0_5_26_3:"Gesperrte Schreibvorgänge für Config- und Profil-Updates hinzugefügt, um Beschädigungen durch paralleles Schreiben zu reduzieren",new_0_5_26_4:"QQBot- und DingTalk-Kanaleinstellungen hinzugefügt",new_0_5_26_5:"CLI-Porterkennung portabler gemacht und mobile Terminal-Schublade verbessert",new_0_5_26_6:"Bridge-Profilumgebungen isoliert und Hermes-Plugin-Erkennung über Python-Umgebungen hinweg korrigiert",new_0_5_26_7:"Gestoppte Gateway-Zustände mit Web-UI-Diagnosen erklärt und Log-Ladezustand stabil gehalten",new_0_5_26_8:"Session-Reset-Modi, Custom-Provider-Base-URL und dynamische Zustellziele korrigiert",new_0_5_26_9:"Lokalen Schalter für Tool-Call-Trace-Anzeige in der Chat-Eingabeleiste hinzugefügt",new_0_5_26_10:"Hermes-Agent-Paketinstallationen unterstützt, wenn kein Source-Checkout verfügbar ist",new_0_5_26_11:"xAI-Grok-OAuth-Login für SuperGrok-Abonnenten hinzugefügt und Grok-Modellpresets aktualisiert",new_0_5_26_12:"Browser-, Chat-Streaming-, Provider-, Gateway-, Config-, Plugin- und Bridge-Testabdeckung erweitert",new_0_5_27_1:"Sitzungsbezogene Modelleinstellungen für Bridge-Chats hinzugefügt, mit unabhängig gespeichertem Provider und Modell pro Sitzung",new_0_5_27_2:"Bridge-Sitzung per Rechtsklick über „Modell festlegen“ auf ein anderes Modell umstellen",new_0_5_27_3:"Läufe prüfen jetzt das Sitzungsmodell und fallen auf das aktuelle Standardmodell zurück, wenn es nicht verfügbar ist",new_0_5_27_4:"Kontextkomprimierung folgt standardmäßig dem aktuell im Profil ausgewählten Standardmodell",new_0_5_30_1:"Bridge-Chat bewahrt jetzt strukturierte Historie und behebt sporadisch ausbleibende Antworten sowie übersprungene Tool-Ausführung durch flachgedrückte Tool-Historie",new_0_5_30_2:"Gruppenchat-Mention-Routing ist zuverlässiger für mehrere Agents, entfernt die eigene @-Mention vor der Zustellung und behält Anzeigenamen nach Aktualisierung bei",new_0_5_30_3:"Modellseiten, Chat-Modellauswahl und Sitzungsmodellwahl zeigen Provider und Modelle jetzt passend zum aktiven Profil mit korrekten Standardmarkierungen",new_0_5_30_4:"Gateway-Verwaltung vereinfacht: eigenständige Gateway-Seite entfernt, jedes Profil wird vor Start auf Plattformkonfiguration geprüft, und ein leichter Gateway-Runner verwaltet Starts und Neustarts",new_0_5_30_5:"Gateway-Start unter Docker, Termux und Windows mit Runtime-Lock-Behandlung, Portkonfliktbereinigung, Hintergrundausführung und Neustartunterstützung verbessert",new_0_5_30_6:"Windows-Kompatibilität für Pfaderkennung, Dateidownloads und Job-/Update-Subprozesse gehärtet, damit keine Terminalfenster aufblitzen",new_0_5_30_7:"Config-Schreibvorgänge und Provider-Presets korrigiert: .env-Schlüssel validieren, FUN-Codex über Responses API routen und Z.AI/GLM-Modelllisten aktualisieren",new_0_5_30_8:"Frontend-Details poliert, darunter eingeklappte Seitenleiste, kurze Gruppenlabels, Seitenleisten-Trenner und Gesprächs-Outline",new_0_5_30_9:"Kontextkomprimierung folgt nun Profil-Komprimierungseinstellungen und härtet veraltete Snapshots durch Wiederverwendung alter Zusammenfassungen mit sicherem Rest statt erneuter Vollkomprimierung",new_0_5_31_1:"Bridge-Broker-Neustarts gehärtet, finale Gruppenchat-Stream-Darstellung korrigiert und {'@'}all-Routing für Gruppenchats hinzugefügt",new_0_5_31_2:"Dateimanager kann absolute Pfade kopieren; mobile Session-Schublade liegt nicht mehr hinter Chat-Inhalten",new_0_5_31_3:"Profilauswahl zeigt jetzt Avatare, eigene Avatar-Uploads, Laufzeitstatus-Dialog sowie Gateway-/Profil-Neustartaktionen",new_0_5_31_4:"Profilavatare erscheinen jetzt in Einzelchat, Gruppenchat und eingeklappter Seitenleiste, mit Web-UI-Profilmetadaten und Windows-sicheren Pfaden",new_0_5_31_5:"Docker-, Termux- und Windows-Gateway-Erkennung sowie Neustartprüfungen verbessert, indem gateway_state/gateway.pid für Managed-Gateway-Liveness genutzt wird",new_0_5_31_6:"APIKEY.FUN-Bildgenerierungs-Medienendpunkt und gebündelter apikey-image-gen-Skill für Text-zu-Bild, Bild-zu-Bild und Bildbearbeitung über den fun-codex-Provider des aktiven Profils hinzugefügt",new_0_5_33_1:"Ausführungsfehler und Socket-Fehler in Einzel- und Gruppenchats bleiben nun als rote Agent-Nachrichten in der Nachrichtenliste sichtbar",new_0_5_33_2:"Session-Suche kann auf das ausgewählte Profil begrenzt werden; ohne Auswahl werden weiterhin alle Profile durchsucht",new_0_5_33_3:"Skills-Seite zeigt chinesische/englische Empfehlungstexte, wenn kein Skill ausgewählt ist; erneuter Klick hebt die Auswahl auf",new_0_5_33_4:"Ungenutzte changelog-i18n-Einträge entfernt, um die Frontend-Größe zu reduzieren",new_0_5_33_5:"Agent-Bridge-Startfehler auf chinesischem Windows durch netstat-Ausgabecodierung behoben",new_0_5_33_6:"Nous-Portal-Modellpreset anhand des öffentlichen Catalogs und der Portal-Empfehlungen aktualisiert",new_0_5_33_7:"Profillisten und Laufzeitstatus lesen Profilnamen aus Verzeichnissen und Standardmodelle aus config, um CLI-Tabellenspaltenfehler zu vermeiden",new_0_5_34_1:"Multimodale tool-Ergebnisse werden beim Speichern von Sitzungs-/Gruppenchat-Nachrichten normalisiert, damit keine base64-Bilder in Replays gelangen",new_0_5_34_2:"Benutzerdefinierte Hermes-Modelle werden über backendverwaltete Konfiguration persistiert, mit neuen Endpunkten zum Hinzufügen und Entfernen",new_0_5_34_3:"Finale Bridge-Kontextnutzung und Tool-Statusupdates bleiben nach abgeschlossenen Läufen korrekt",new_0_5_34_4:"Kanban-Filterung, Verantwortlichenanzeige, Kartenaktionen und Aufgabendetails verbessert",new_0_5_34_5:"Komprimierungs-Nutzungszählung korrigiert, indem fixer prompt/tool-Kontext gecacht und vollständige Kontext-token gemeldet werden",new_0_5_34_6:"Gruppenchat-Agents cachen ihren eigenen fixen Kontext und zeigen Komprimierungsfortschritt erst an, wenn die Komprimierung wirklich startet",new_0_5_34_7:"Web-UI-gebündelte Skills werden in jedes Profile synchronisiert und das Ziel-Profile wird pro Injection protokolliert",new_0_5_34_8:"Wenn Kanban unter Windows fehlschlägt, aktualisieren Sie Hermes, um die neuesten Migration-Fixes für die Kanban-Datenbank zu erhalten",new_0_5_35_1:"Bridge-Sessions können nun über verschiedene Sessions hinweg parallel laufen, während Läufe derselben Session zur Wahrung der Nachrichtenreihenfolge serialisiert bleiben",new_0_5_35_2:"Neue Performance-Monitor-Seite für System-CPU/Speicher, Web UI, Bridge Broker, Workers und aktive Sessions",new_0_5_35_3:"Worker-Ressourcenmetriken zeigen CPU, Speicher, Profile, Session-Anzahl und Laufstatus pro worker",new_0_5_35_4:"Bridge-worker-Lifecycle-Cleanup verbessert, damit Broker-Shutdowns und beendete Elternprozesse worker zurückfordern und verwaiste Python-Prozesse reduzieren",new_0_5_35_5:"Monitoring-Kompatibilität mit Fallbacks für Ressourcenmessung unter macOS, Windows, Linux, Docker und Termux gehärtet",new_0_5_35_6:"Performance Monitoring blockiert nicht mehr auf worker-Anfragen während Agent-Initialisierung und reduziert request timeouts unter Windows",new_0_5_35_7:"Chat-Markdown unterstützt Inline-Vorschauen für Textinhalte, und Download-Icons laden Dateien direkt herunter statt die Vorschau zu öffnen",new_0_5_35_8:"Content-Preview-Drawer verbessert: Schließen-Aktion auf Mobilgeräten, mobile Vollbreite, 800px Desktop-Breite und konsistente Text-/Markdown-Hintergründe",new_0_6_0_1:"Account- und Profile-bezogene Verwaltung schützt Sessions, Modelle, Nutzung, Kanban, Jobs, Uploads, Medien und verwandte Hermes APIs konsistent",new_0_6_0_2:"Gebündelte Medien-Skills verwenden das generierte Server-Token nur für Medien-Endpunkte und lösen fun-codex/xAI-Zugangsdaten aus dem angeforderten Profile auf",new_0_6_0_3:"Einzelchat und Gruppenchat injizieren das aktuelle Hermes Profile in Run-Instructions, damit Skills X-Hermes-Profile senden können",new_0_6_0_4:"delegate_task-Subagent-Fortschritt wird mit Start-, Tool-, Fortschritts- und Abschlussstatus in die Chat-UI gestreamt",new_0_6_0_5:"Stoppen oder Abbrechen eines Runs bereinigt temporäre Events, damit alte abort-Zustände nicht in den nächsten Chat gelangen",new_0_6_0_6:"Dokumentation und Website-Texte für Accountverwaltung, Standard-Zugangsdaten, Account/Profile-Verwaltung, Uploads/Downloads und Medien-Skills aktualisiert",new_0_6_0_7:"CLI-Wartungsbefehle zum Löschen von Login-IP-Sperren und Zurücksetzen des Standard-Logins admin / 123456 hinzugefügt",new_0_6_0_8:"Version 0.6.0 ist die Grenze zwischen Single-User- und Multi-User-Web-UI. Bei Problemen im Multi-User-Modus bitte ein Issue erstellen und bei Bedarf auf die Single-User-Version 0.5.35 zurückgehen"},files:{title:"Dateien",tree:"Verzeichnisbaum",list:"Dateiliste",breadcrumbRoot:"Start",newFile:"Neue Datei",newFolder:"Neuer Ordner",upload:"Hochladen",refresh:"Aktualisieren",open:"Offnen",edit:"Bearbeiten",preview:"Vorschau",download:"Herunterladen",copyPath:"Pfad kopieren",rename:"Umbenennen",delete:"Loschen",name:"Name",size:"Grosse",modified:"Geandert",actions:"Aktionen",emptyDir:"Leeres Verzeichnis",loading:"Wird geladen...",confirmDelete:'Mochten Sie "{name}" wirklich loschen?',confirmDeleteDir:'Mochten Sie das Verzeichnis "{name}" und seinen gesamten Inhalt wirklich loschen?',deleteFailed:"Loschen fehlgeschlagen",deleted:"Geloscht",renameTo:"Umbenennen in",newFileName:"Dateiname",newFolderName:"Ordnername",created:"Erstellt",createFailed:"Erstellen fehlgeschlagen",renamed:"Umbenannt",renameFailed:"Umbenennen fehlgeschlagen",uploadSuccess:"{count} Datei(en) hochgeladen",uploadFailed:"Hochladen fehlgeschlagen",saveFailed:"Speichern fehlgeschlagen",saved:"Gespeichert",unsavedChanges:"Sie haben ungespeicherte Anderungen. Verwerfen?",pathCopied:"Pfad kopiert",fileTooLarge:"Datei zu gross (max. 10 MB)",permissionDenied:"Geschutzte Datei kann nicht geandert werden",notFound:"Datei oder Verzeichnis nicht gefunden",backendError:"Dateioperation fehlgeschlagen",dragDropHint:"Dateien hierher ziehen, um sie hochzuladen",closeEditor:"Editor schliessen",closePreview:"Schliessen",saveFile:"Speichern",fileTree:"Dateibaum"},groupChat:{title:"Gruppenchat",createRoom:"Raum erstellen",joinByCode:"Mit Code beitreten",roomName:"Raumname",roomNamePlaceholder:"Raumnamen eingeben",inviteCode:"Einladungscode",autoGenerate:"Automatisch generieren",noRooms:"Noch keine Raume",selectOrCreate:"Wahlen oder erstellen Sie einen Raum, um zu chatten",agents:"Agenten",addAgent:"Agent hinzufugen",selectProfile:"Wahlen Sie ein Profil",agentAdded:"Agent hinzugefugt",agentAlreadyInRoom:"Agent ist bereits in diesem Raum",agentAddFailedCount:"{count} Agent(en) wurden nicht hinzugefugt: {details}",noAgents:"Keine Agenten in diesem Raum",members:"Mitglieder",roomCreated:"Raum erstellt",roomDeleted:"Raum gelöscht",roomCloned:"Raum geklont",cloneRoom:"Raum klonen",copyRoomLink:"Raumlink kopieren",deleteRoomConfirm:"Diesen Raum löschen?",clearContext:"Kontext löschen",clearContextConfirm:"Diesen Raumkontext löschen? Nachrichten und Komprimierungs-Snapshots werden entfernt, Agenten und Mitglieder bleiben.",contextCleared:"Kontext gelöscht",you:"Du",joined:"Raum beigetreten",joinFailed:"Beitreten fehlgeschlagen",inputPlaceholder:"Nachricht eingeben... (Enter zum Senden)",enterCode:"Einladungscode eingeben",yourName:"Dein Name",yourNamePlaceholder:"Gib deinen Anzeigenamen ein",yourDescription:"Beschreibung (optional)",yourDescriptionPlaceholder:"Erzahl anderen wer du bist...",agentName:"Agent-Name",agentNamePlaceholder:"Benutzerdefinierter Name (leer = Profilname)",agentDesc:"Agent-Beschreibung",agentDescPlaceholder:"Beschreiben Sie, was dieser Agent tut...",agentReplying:"antwortet...",agentCompressing:"komprimiert Kontext...",compressionSettings:"Komprimierungseinstellungen",triggerTokens:"Trigger-Token",triggerTokensDesc:"Token-Schwelle für Kontextkomprimierung",maxHistoryTokens:"Max. Verlaufs-Token",maxHistoryTokensDesc:"Maximale Token für komprimierten Kontext",tailMessageCount:"Nachrichten am Ende",tailMessageCountDesc:"Anzahl der letzten Nachrichten, die unverändert bleiben",compressionConfig:"Komprimierungskonfig",compressNow:"Jetzt komprimieren",compressingInProgress:"Komprimierung läuft, bitte warten",compressionSaved:"Konfiguration gespeichert"},download:{downloading:"Wird heruntergeladen...",downloadFailed:"Download fehlgeschlagen",fileNotFound:"Datei nicht gefunden oder geloscht",fileTooLarge:"Datei zu gross (Limit uberschritten)",backendError:"Lesen der Datei fehlgeschlagen, Remote-Umgebung moglicherweise nicht verfugbar",backendTimeout:"Zeituberschreitung beim Lesen der Datei",unsupportedBackend:"Aktuelles Terminal-Backend unterstutzt keine Datei-Downloads",invalidPath:"Ungultiger Dateipfad",contentDisplay:"Inhalt anzeigen",download:"Herunterladen",downloadFile:"Datei herunterladen"},gateways:{title:"Gateways",running:"Läuft",stopped:"Gestoppt",started:"Gestartet",startFailed:"Gateway konnte nicht gestartet werden",stopFailed:"Gateway konnte nicht gestoppt werden"},kanban:{title:"Kanban-Board",createTask:"Neue Aufgabe",noTasks:"Keine Aufgaben",allStatuses:"Alle Status",allAssignees:"Alle Verantwortlichen",columns:{triage:"Sichtung",todo:"Zu erledigen",ready:"Bereit",running:"In Arbeit",blocked:"Blockiert",done:"Erledigt",archived:"Archiviert"},card:{assigneeTooltip:"Verantwortlicher",priority:{low:"Niedrig",medium:"Mittel",high:"Hoch"},timeAgo:{justNow:"gerade eben",minutes:"vor {count} Min.",hours:"vor {count} Std.",days:"vor {count} Tg."}},board:{create:"Neues Board",archive:"Board archivieren",archiveConfirm:"Aktuelles Board archivieren?",archived:"Board archiviert",created:"Board erstellt",slugPlaceholder:"Board-Kennung, z. B. project-a",namePlaceholder:"Anzeigename (optional)",slugRequired:"Board-Kennung ist erforderlich"},form:{title:"Titel",titlePlaceholder:"Aufgabentitel",titleRequired:"Titel ist erforderlich",body:"Beschreibung",bodyPlaceholder:"Aufgabenbeschreibung (optional)",assignee:"Verantwortlicher",selectAssignee:"Verantwortlichen wählen...",priority:"Priorität",selectPriority:"Priorität wählen..."},detail:{status:"Status",priority:"Priorität",assignee:"Verantwortlicher",tenant:"Mandant",createdAt:"Erstellt",startedAt:"Gestartet",completedAt:"Abgeschlossen",comments:"Kommentare",events:"Ereignisse",runs:"Ausführungen",artifacts:"Artefakte",result:"Ergebnis",highlights:"Highlights",sources:"Datenquellen",sessions:"Zugehörige Sitzungen",sessionMessages:"Sitzungsnachrichten",noSessions:"Keine zugehörigen Sitzungen gefunden."},action:{title:"Aktionen",assign:"Zuweisen",assignTo:"Zuweisen an...",block:"Blockieren",blockReason:"Blockierungsgrund",unblock:"Blockierung aufheben",complete:"Abschließen",completeSummary:"Abschlusszusammenfassung (optional)"},message:{loadFailed:"Aufgabe konnte nicht geladen werden",taskCreated:"Aufgabe erstellt",taskAssigned:"Aufgabe zugewiesen",taskBlocked:"Aufgabe blockiert",taskUnblocked:"Blockierung aufgehoben",taskCompleted:"Aufgabe abgeschlossen"},stats:{total:"Gesamt",tasks:"Aufgaben"}}},It={login:{title:"Hermes Web UI",description:"Insira seu nome de usuario e senha para continuar.",placeholder:"Token de acesso",submit:"Entrar",tokenRequired:"Por favor, insira seu token de acesso",invalidToken:"Token invalido",connectionFailed:"Nao foi possivel conectar ao servidor",passwordLogin:"Senha",tokenLogin:"Token",usernamePlaceholder:"Nome de usuario",passwordPlaceholder:"Senha",defaultCredentialsHint:"Nome de usuario padrao: admin. Senha padrao: 123456.",credentialsRequired:"Por favor, insira nome de usuario e senha",invalidCredentials:"Nome de usuario ou senha incorretos",tooManyAttempts:"Muitas tentativas falhadas, por favor tente novamente mais tarde",sessionExpired:"Login expirado. Entre novamente.",accessDenied:"Voce nao tem permissao para acessar este recurso.",passwordMismatch:"As senhas nao conferem",passwordTooShort:"A senha deve ter pelo menos 6 caracteres",setupSuccess:"Login por senha configurado com sucesso",passwordChanged:"Senha alterada com sucesso",passwordRemoved:"Login por senha removido",setupPassword:"Configurar login por senha",changePassword:"Alterar senha",changeUsername:"Alterar nome de usuario",removePasswordLogin:"Remover",username:"Nome de usuario",currentPassword:"Senha atual",newPassword:"Nova senha",confirmPassword:"Confirmar senha",newUsername:"Novo nome de usuario",usernameChanged:"Nome de usuario alterado com sucesso",usernameTooShort:"O nome de usuario deve ter pelo menos 2 caracteres",setupDescription:"Gerencie o nome de usuario e a senha usados para entrar.",removeConfirm:"Login por senha e obrigatorio para contas de usuario.",passwordLoginNotConfigured:"Login por senha nao configurado",passwordLoginConfigured:"Conta atual: {username}",defaultCredentialTitle:"Altere a conta e senha padrao",defaultCredentialMessage:"A conta atual ainda usa o nome de usuario ou a senha padrao. Para evitar acesso nao autorizado, altere o nome de usuario e a senha da conta atual o quanto antes.",defaultCredentialAction:"Alterar agora",defaultCredentialLater:"Lembrar depois"},users:{title:"Gerenciamento de contas",description:"Crie usuarios, atribua funcoes e controle quais perfis administradores comuns podem acessar.",create:"Criar usuario",edit:"Editar usuario",username:"Nome de usuario",role:"Funcao",statusLabel:"Status",profiles:"Perfis acessiveis",profilesPlaceholder:"Selecione perfis acessiveis",allProfiles:"Todos os perfis",noProfiles:"Nenhum perfil atribuido",lastLogin:"Ultimo login",newPasswordOptional:"Nova senha (deixe em branco para manter)",loadFailed:"Falha ao carregar usuarios",deleteConfirm:"Excluir este usuario?",enable:"Ativar",disable:"Desativar",roles:{superAdmin:"Super admin",admin:"Admin"},status:{active:"Ativo",disabled:"Desativado"}},common:{loading:"Carregando...",cancel:"Cancelar",retry:"Tentar novamente",delete:"Excluir",edit:"Editar",save:"Salvar",saved:"Salvo",update:"Atualizar",create:"Criar",saveFailed:"Falha ao salvar",deleteFailed:"Falha ao excluir",ok:"OK",copied:"Copiado",copy:"Copiar",noData:"Sem dados",fetch:"Buscar",add:"Adicionar",enable:"Ativar",disable:"Desativar",configured:"Configurado",notConfigured:"Nao configurado",confirm:"Confirmar",expand:"Expandir",collapse:"Recolher",stop:"Parar",start:"Iniciar",expired:"Expirado"},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",performance:"Desempenho",skillsUsage:"Uso de habilidades",channels:"Canais",terminal:"Terminal",files:"Arquivos",groupChat:"Chat em grupo",groupConversation:"Conversa",groupConversationShort:"Conv.",groupAgent:"Agente",groupAgentShort:"Ag.",groupSystem:"Sistema",groupSystemShort:"Sist",groupMonitoring:"Monitoramento",groupMonitoringShort:"Mon.",settings:"Configuracoes",connected:"Conectado",disconnected:"Desconectado",updateTip:'Execute "hermes-web-ui update" no terminal para atualizar',updateVersion:"Atualizar para v{version}",reloadClientVersion:"Recarregar para v{version}",updating:"Atualizando...",updateSuccess:"Atualizacao concluida. Atualize a pagina em breve. Se nao iniciar apos algum tempo, inicie manualmente.",updateFailed:"Falha na atualizacao",logout:"Sair",nodeVersionWarning:"Node.js v{version} detectado. Atualize para a versao 23 ou posterior.",changelog:"Registro de alteracoes",noChangelog:"Nenhum registro disponivel",kanban:"Kanban",groupTools:"Ferramentas",groupPlatform:"Plataforma",gateways:"Gateways",expand:"Expandir menu",collapse:"Recolher menu"},performance:{title:"Desempenho",subtitle:"Monitore recursos do sistema, Bridge Broker, Workers e sessões ativas",refresh:"Atualizar",autoRefreshOn:"Atualização automática",autoRefreshOff:"Atualização manual",loadFailed:"Falha ao carregar métricas de desempenho",systemCpu:"CPU do sistema",systemMemory:"Memória do sistema",activeSessions:"Sessões ativas",runningSessions:"Em execução {count}",workers:"Workers",totalWorkerMemory:"Memória total de Worker",processes:"Processos",uptime:"Tempo ativo",running:"Em execução",stopped:"Parado",workerMemory:"Memória de Worker",lastUpdated:"Atualizado",profile:"Profile",memory:"Memória",sessions:"Sessões",runningActiveSessions:"Em execução / Ativas",lastUsed:"Último uso",status:"Status",noWorkers:"Nenhum Worker",sessionsByProfile:"Sessões por Profile",noActiveSessions:"Nenhuma sessão ativa"},drawer:{terminal:"Terminal",files:"Espaço de trabalho"},chat:{contextRemaining:"restante",contextClickToEdit:"Clique para editar o tamanho do contexto",contextEditTitle:"Editar tamanho do contexto",contextEditDesc:"Definir o limite de tamanho do contexto para o modelo atual (em tokens)",contextEditPlaceholder:"Digite o tamanho do contexto",contextEditHint:"Valores comuns: 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",outlineTitle:"Esboço da conversa",outlineEmpty:"Nenhum conteúdo da conversa",outlineUserQuestion:"Pergunta do usuário",inputPlaceholder:"Digite uma mensagem... (Enter para enviar, Shift+Enter para nova linha)",slashCommandArgs:{message:"<mensagem>",title:"<titulo>",text:"<texto>"},slashCommands:{usage:"Calcular o uso da sessão atual",status:"Mostrar status da sessão e fila",abort:"Parar a execução ativa do Bridge",queue:"Enfileirar uma mensagem após a execução ativa",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",allProfiles:"Todos os perfis",profileMissingModelsTip:'O perfil "{profile}" não tem provider ou modelo disponível para esta sessão',sessionScopeHint:"O chat mostra apenas sessões da Web UI/API Server. Sessões de CLI, Telegram, Discord, Cron e outros canais são somente leitura no Histórico.",openHistory:"Abrir histórico",hermesHistory:"Histórico Hermes",historyScopeHint:"Sessões do histórico Hermes do perfil atual, somente leitura, agrupadas por origem.",noSessions:"Sem sessoes",newChat:"Novo chat",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:"Modo de chat",liveMode:"Ao vivo",liveSessions:"Sessões ao vivo",recentBadge:"Recente",linkedSessions:"{count} vinculadas",noVisibleMessages:"Nenhuma mensagem visível para humanos.",monitorRoleUser:"Usuário",monitorRoleAssistant:"Assistente",copySessionLink:"Copiar link da sessão",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:"Tempo de execução",thinkingLabel:"Raciocínio",thinkingInProgress:"Pensando…",thinkingShow:"Mostrar raciocínio",thinkingHide:"Ocultar raciocínio",thinkingDuration:"Observado {duration}",thinkingChars:"{count} caracteres",copyBubble:"Copiar mensagem",copiedBubble:"Mensagem copiada",copyFailed:"Falha ao copiar",playSpeech:"Reproduzir voz",pauseSpeech:"Pausar",resumeSpeech:"Retomar",stopSpeech:"Parar",speechNotSupported:"Reprodução de voz não suportada neste navegador",searchEnterHint:"Enter para abrir · Esc para fechar",searchHint:"Cmd/Ctrl+K",searchScope:"Escopo da busca: apenas banco local de sessões da Web UI; sessões históricas Hermes somente leitura não são incluídas.",searchFailed:"Falha ao pesquisar sessões",searchNoSnippet:"Nenhum resumo disponível",searchNoResults:"Nenhuma sessão corresponde à busca",searchRecent:"Sessão recente",searchEmpty:"Sessões recentes",searchPlaceholder:"Pesquisar sessões...",searchSubtitle:"Pesquisar por título ou conteúdo da mensagem",searchTitle:"Pesquisar sessões",stopGateway:"Parar gateway",start:"Iniciar",workspaceSetFailed:"Falha ao definir workspace",workspaceSet:"Workspace definido",workspacePlaceholder:"Digite o caminho do projeto, ex. /home/user/project",workspace:"Área de trabalho",setWorkspaceTitle:"Definir workspace da sessão",setWorkspace:"Definir workspace",modelSetFailed:"Falha ao definir modelo",modelSet:"Modelo definido",setModelTitle:"Definir modelo da sessão",setModel:"Definir modelo",newCliChat:"Novo CLI",cliEmptyState:"Iniciar chat CLI",autoPlaySpeech:"Reproduzir voz automaticamente"},jobs:{title:"Tarefas agendadas",createJob:"Criar tarefa",editJob:"Editar tarefa",noJobs:"Nenhuma tarefa agendada ainda. Crie uma para comecar.",name:"Nome",namePlaceholder:"Nome da tarefa",schedule:"Agendamento (expressao Cron)",schedulePlaceholder:"ex. 0 9 * * *",quickPresets:"Presets rapidos",selectPreset:"Selecionar um preset...",presetEveryMinute:"Cada minuto",presetEvery5Min:"A cada 5 minutos",presetEveryHour:"Cada hora",presetEveryDay:"Todos os dias as 00:00",presetEveryDay9:"Todos os dias as 09:00",presetEveryMonday:"Toda segunda as 09:00",presetEveryMonth:"Dia 1 de cada mes as 09:00",prompt:"Prompt",promptPlaceholder:"O prompt a executar",deliverTarget:"Destino de entrega",origin:"Origem",local:"Local",repeatCount:"Contagem de repeticoes (opcional)",modelPlaceholder:"Modelo padrao",repeatPlaceholder:"Deixar vazio para infinito",jobCreated:"Tarefa criada",jobUpdated:"Tarefa atualizada",nameRequired:"O nome e obrigatorio",scheduleRequired:"O agendamento e obrigatorio",loadFailed:"Falha ao carregar a tarefa",jobPaused:"Tarefa pausada",jobResumed:"Tarefa retomada",jobTriggered:"Job acionado",modelUpdated:"Modelo atualizado",jobDeleted:"Tarefa excluida",status:{running:"Em execucao",paused:"Pausada",disabled:"Desativada",scheduled:"Agendada"},info:{model:"Modelo",schedule:"Agendamento",lastRun:"Ultima execucao",nextRun:"Proxima execucao",deliver:"Entrega",repeat:"Repeticao"},action:{pause:"Pausar",pauseJob:"Pausar tarefa",resume:"Retomar",resumeJob:"Retomar tarefa",runNow:"Executar agora",triggerImmediately:"Acionar imediatamente"},runHistory:{title:"Histórico",runs:"execuções",noRuns:"Nenhum histórico encontrado."}},skills:{title:"Habilidades",searchPlaceholder:"Buscar habilidades...",noMatch:"Nenhuma habilidade corresponde a sua busca",noSkills:"Nenhuma habilidade encontrada",backTo:"Voltar para",attachedFiles:"Arquivos anexados",loadFailed:"Falha ao carregar a habilidade",fileLoadFailed:"Falha ao carregar o arquivo",modified:"Modificado pelo usuário",archived:"Arquivado",pinned:"Fixado",pin:"Fixar habilidade",unpin:"Desfixar habilidade",pinFailed:"Falha ao alterar estado de fixacao",toggleFailed:"Falha ao ativar/desativar a habilidade",source:{builtin:"Integrado",hub:"Hub",local:"Local"}},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:"Raiz do agente",python:"Python",scanCwd:"Verificar cwd",projectPlugins:"Plugins do projeto"}},memory:{title:"Memoria",refresh:"Atualizar",loadFailed:"Falha ao carregar a memoria",myNotes:"Minhas notas",noNotes:"Nenhuma nota ainda.",notesPlaceholder:"Escreva suas notas...",userProfile:"Perfil do usuario",noProfile:"Nenhum perfil ainda.",profilePlaceholder:"Escreva seu perfil...",soul:"Alma",noSoul:"Nenhuma configuracao de alma ainda.",soulPlaceholder:"Escreva a configuracao da alma..."},models:{title:"Modelos",addProvider:"Adicionar provedor",providerType:"Tipo de provedor",preset:"Predefinição",custom:"Personalizado",selectProvider:"Selecionar provedor",chooseProvider:"Escolha um provedor...",name:"Nome",autoGeneratedName:"Gerado automaticamente pela URL base",baseUrl:"URL base",region:"Região",regionIntl:"Internacional",regionCn:"China Continental",baseUrlPlaceholder:"ex. https://api.example.com/v1",apiKey:"Chave API",apiKeyPlaceholder:"sk-...",defaultModel:"Modelo padrao",selectOrInput:"Selecionar ou digitar um modelo...",selectModel:"Selecionar um modelo...",providerAdded:"Provedor adicionado",providerDeleted:"Provedor excluido",deleteProvider:"Excluir provedor",deleteConfirm:'Tem certeza de que deseja excluir "{name}"?',codexLoginTitle:"Login do OpenAI Codex",codexWaiting:"Digite este código na página de autorização para fazer login:",codexCopyCode:"Código copiado",codexOpenLink:"Abrir página de autorização",codexApproved:"Login bem-sucedido",codexExpired:"A autorização expirou. Por favor, tente novamente.",nousLoginTitle:"Login do Nous Portal",nousWaiting:"Insira este código na página de autorização:",nousCopyCode:"Código copiado",nousOpenLink:"Abrir página de autorização",nousApproved:"Login bem-sucedido",nousDenied:"Autorização negada",nousExpired:"Autorização expirada",copilotLoginTitle:"Login do GitHub Copilot",copilotWaiting:"Abra o GitHub e insira o código do dispositivo abaixo para autorizar. A janela fechará automaticamente após a aprovação.",copilotCopyCode:"Código copiado",copilotOpenLink:"Abrir a página de autorização do GitHub",copilotApproved:"Login bem-sucedido!",copilotDenied:"Autorização negada.",copilotExpired:"O link de autorização expirou. Tente novamente.",copilotAddDetectedTitle:"GitHub Copilot detectado",copilotAddDetected:"Foi detectado um token OAuth do GitHub Copilot nesta máquina. Clique em Adicionar para ativar o Copilot no 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",currentDefault:"Padrão atual",defaultShort:"Padrã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",xaiWaiting:"Conclua a autorização na página xAI aberta. A janela será fechada automaticamente após a aprovação.",xaiOpenLink:"Abrir página de autorização xAI",xaiLoginTitle:"Login OAuth xAI Grok",xaiExpired:"O link de autorização expirou. Tente novamente.",xaiCopyLink:"Copiar link de autorização",xaiApproved:"Login concluído!",visibilitySelectOne:"Mantenha pelo menos um modelo visível",visibilitySaved:"Modelos visíveis salvos",visibilitySaveFailed:"Falha ao salvar modelos visíveis",visibilityHint:"Afeta apenas o seletor de modelos e a página de modelos da Web UI. A configuração provider/model da Hermes CLI não é alterada; as chamadas ainda usam o ID original do modelo.",showAllModels:"Mostrar todos os modelos",searchPlaceholder:"Pesquisar modelos...",removeCustomModel:"Remover este modelo não listado",more:"mais",models:"Lista de modelos",manageVisibleModelsFor:"Gerenciar modelos visíveis de {name}",manageVisibleModels:"Gerenciar modelos visíveis",getApiKey:"Obter API Key",count:"modelos",aliasUseOriginal:"Restaurar ID original",aliasTitleFor:"Nome exibido de {model}",aliasTitle:"Nome exibido do modelo",aliasSaveFailed:"Falha ao salvar nome exibido",aliasPlaceholder:"Deixe vazio para usar o ID original do modelo",aliasManageFor:"Nomes exibidos de {provider}",aliasManage:"Nomes exibidos",aliasHint:"Altera apenas o nome exibido na Web UI. O Hermes ainda recebe o ID original do modelo.",aliasEdit:"Renomear",aliasCanonical:"ID original: {model}"},profiles:{title:"Perfis",create:"Criar perfil",import:"Importar",export:"Exportar",rename:"Renomear",delete:"Excluir",switchTo:"Trocar Hermes Profile",switchConfirm:"Isto executara `hermes profile use {name}` e alterara o active profile do Hermes CLI. Continuar?",switchSuccess:'Hermes active profile alterado para "{name}"',switchFailed:"Falha ao trocar Hermes Profile. O gateway pode precisar de reinicio manual.",createSuccess:'Perfil "{name}" criado',createFailed:"Falha ao criar o perfil",renameSuccess:"Perfil renomeado",renameFailed:"Falha ao renomear o perfil",deleteConfirm:'Tem certeza de que deseja excluir o perfil "{name}"?',deleteSuccess:"Perfil excluido",deleteFailed:"Falha ao excluir o perfil",exportSuccess:"Perfil exportado",exportFailed:"Falha ao exportar o perfil",importSuccess:"Perfil importado",importFailed:"Falha ao importar o perfil",importSelectFile:"Selecionar arquivo de arquivo",importInvalidFile:"Por favor, selecione um arquivo valido (.tar.gz, .tgz, .gz, .zip)",name:"Nome do perfil",namePlaceholder:"Apenas letras, numeros e hifens",nameValidation:"O nome do perfil só pode conter letras minúsculas, números, sublinhados e hifens",newName:"Novo nome",newNamePlaceholder:"Digite um novo nome",cloneFromCurrent:"Clonar do perfil atual",cloneCleanupNotice:"Ao clonar, as credenciais exclusivas de plataforma (Weixin / Telegram / Slack, etc.) são automaticamente ignoradas para evitar conflitos com o perfil de origem",cloneStrippedCredentials:"{count} credencial(is) exclusiva(s) removida(s): {list}",cloneDisabledPlatforms:"{count} plataforma(s) desabilitada(s): {list}",cloneStrippedConfigCredentials:"{count} credencial(is) incorporada(s) removida(s) do config.yaml: {list}",archivePath:"Caminho do arquivo",archivePathPlaceholder:"Caminho do servidor para o arquivo",importName:"Nome do perfil (opcional)",importNamePlaceholder:"Deixe vazio para usar o nome do arquivo",active:"Ativo",model:"Modelo",gateway:"Gateway",alias:"Alias",provider:"Provedor",path:"Caminho",skills:"Habilidades",hasEnv:"Tem .env",hasSoulMd:"Tem soul.md",noProfiles:"Nenhum perfil encontrado. Crie um para comecar.",avatar:{title:"Avatar personalizado",customize:"Personalizar avatar",upload:"Enviar imagem",random:"Gerar aleatório",reset:"Restaurar padrão",hint:"PNG, JPEG ou WebP, máximo 1 MB",invalidType:"Escolha uma imagem PNG, JPEG ou WebP",tooLarge:"A imagem do avatar não pode exceder 1 MB",saveSuccess:"Avatar salvo",saveFailed:"Falha ao salvar avatar",resetSuccess:"Avatar padrão restaurado",resetFailed:"Falha ao restaurar avatar padrão"},runtime:{activeProfile:"Atual: {name}",bridgeWorker:"Status do Bridge",gateway:"Gateway",active:"Ativo",activeTag:"Atual",idle:"Ocioso",running:"Em execução",stopped:"Parado",restartGateway:"Reiniciar gateway",restartProfile:"Reiniciar perfil",switchProfile:"Trocar perfil frontend",gatewayRestarted:"Gateway reiniciado: {name}",gatewayRestartFailed:"Falha ao reiniciar gateway",profileRestarted:"Perfil reiniciado: {name}",profileRestartFailed:"Falha ao reiniciar perfil"}},logs:{title:"Logs",all:"Todos",searchPlaceholder:"Buscar...",refresh:"Atualizar",noEntries:"Nenhuma entrada de log"},settings:{title:"Configuracoes",saved:"Salvo",saveFailed:"Falha ao salvar",tabs:{display:"Exibicao",account:"Conta atual",users:"Gerenciamento de contas",agent:"Agente",memory:"Memoria",compression:"Compressao",session:"Sessao",privacy:"Privacidade",apiServer:"Servidor API",models:"Modelos",voice:"Voz"},display:{streaming:"Respostas em streaming",streamingHint:"Mostrar respostas da IA em tempo real",compact:"Modo compacto",compactHint:"Reduzir espacamento entre mensagens",showReasoning:"Mostrar raciocinio",showReasoningHint:"Mostrar processo de pensamento do modelo",showCost:"Mostrar custo",showCostHint:"Mostrar uso de tokens nas respostas",inlineDiffs:"Diffs em linha",inlineDiffsHint:"Mostrar alteracoes de codigo em linha",bellOnComplete:"Som de conclusao",bellOnCompleteHint:"Tocar som quando a IA terminar",busyInputMode:"Modo de entrada ocupada",busyInputModeHint:"Permitir entrada enquanto a IA processa",theme:"Tema",themeHint:"Escolha claro, escuro ou seguir a preferencia do sistema",themeLight:"Claro",themeDark:"Escuro",themeSystem:"Sistema"},agent:{maxTurns:"Maximo de turnos",maxTurnsHint:"Maximo de rodadas de interacao por conversa",gatewayTimeout:"Timeout do gateway",gatewayTimeoutHint:"Timeout da requisicao em segundos",restartDrainTimeout:"Timeout de drenagem ao reiniciar",restartDrainTimeoutHint:"Timeout de drenagem antes de reiniciar em segundos",toolEnforcement:"Obrigatoriedade de ferramentas",toolEnforcementHint:"Controlar o modo de execucao de chamadas de ferramentas",auto:"Automatico",always:"Sempre",never:"Nunca"},memory:{enabled:"Ativar memoria",enabledHint:"Permitir que a IA lembre do contexto da conversa",userProfile:"Perfil do usuario",userProfileHint:"Permitir que a IA lembre das preferencias do usuario",charLimit:"Limite de caracteres da memoria",charLimitHint:"Maximo de caracteres para MEMORY.md",userCharLimit:"Limite de caracteres do perfil do usuario",userCharLimitHint:"Maximo de caracteres para USER.md"},compression:{enabled:"Ativar compressao",enabledHint:"Comprimir automaticamente historico longo antes de exceder o contexto do modelo",threshold:"Limiar de compressao",thresholdHint:"Iniciar compressao quando tokens estimados excederem esta proporcao do contexto",targetRatio:"Proporcao alvo",targetRatioHint:"Tamanho alvo do historico apos compressao como proporcao do contexto",protectLastN:"Proteger mensagens recentes",protectLastNHint:"Manter sem compressao esta quantidade de mensagens recentes",protectFirstN:"Proteger primeiras mensagens",protectFirstNHint:"Manter sem compressao esta quantidade de mensagens iniciais"},session:{mode:"Modo de reinicializacao",modeHint:"Condicao de acionamento para reinicializacao de sessao",modeBoth:"Inatividade + Agendado",modeIdle:"Somente inatividade",modeDaily:"Somente agendado",modeNone:"Nunca (apenas manual)",idleMinutes:"Timeout de inatividade",idleMinutesHint:"Tempo de espera antes da reinicializacao automatica (minutos)",atHour:"Horario de reinicializacao agendada",humanOnly:"Mostrar apenas sessões humanas",humanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões",liveMonitorHumanOnly:"Monitor ao vivo: mostrar apenas sessões humanas",liveMonitorHumanOnlyHint:"Oculta por padrão o ruído de subagentes e do monitor de sessões no monitor ao vivo",atHourHint:"Reiniciar sessao neste horario diariamente",requireAuth:"Autorização de sessão",requireAuthHint:"Requer autorização para operações de sessão"},privacy:{redactPii:"Ocultar dados pessoais",redactPiiHint:"Detectar e ocultar automaticamente informacoes sensiveis (senhas, chaves, etc.)"},apiServer:{enable:"Ativar",enableHint:"Ativar servidor API",host:"Host",hostHint:"Endereco de escuta",port:"Porta",portHint:"Porta de escuta",key:"Chave",keyHint:"Chave de acesso API",cors:"Origens CORS",corsHint:"Fontes cross-origin permitidas"},voice:{ttsProvider:"Provedor TTS",ttsProviderHint:"Escolha o mecanismo de texto para fala para reproducao de mensagens",providerWebSpeech:"WebSpeech API (Navegador)",providerOpenai:"OpenAI TTS",providerCustom:"Endpoint personalizado (compativel com OpenAI)",providerEdge:"Edge TTS (Gratuito, sem chave API)",webspeechVoice:"Voz",webspeechVoiceHint:"Selecione uma voz do seu navegador ou SO",webspeechVoicePlaceholder:"Auto (voz padrao)",openaiKey:"Chave API",openaiKeyHint:"Sua chave API OpenAI com acesso TTS",openaiUrl:"URL base da API",openaiUrlHint:"ex. https://api.openai.com/v1/audio/speech",openaiModel:"Modelo",openaiModelHint:"tts-1 (mais rapido) / tts-1-hd (qualidade superior)",openaiVoice:"Voz",openaiVoiceHint:"Voz a ser usada para sintese",customHint:"Use qualquer API TTS compativel com OpenAI — funciona com GPT-SoVITS, CosyVoice, etc.",customUrl:"URL da API",customUrlHint:"URL base do seu servico TTS",customUrlPlaceholder:"Endereco configurado no adaptador local, ex. http://127.0.0.1:9880",customApiKey:"Chave API (opcional)",customApiKeyHint:"Alguns endpoints personalizados exigem autenticacao",customApiKeyPlaceholder:"Deixe em branco se nao for necessario",edgeHint:"Desenvolvido por Microsoft Edge TTS (node-edge-tts).",edgeUrl:"URL do adaptador",edgeUrlHint:"Endereco do adaptador Edge TTS, ex. http://127.0.0.1:9882",edgeUrlPlaceholder:"http://127.0.0.1:9882",edgeVoice:"Voz",edgeVoiceHint:"Selecione uma voz para sintese de fala",edgeRate:"Velocidade",edgeRateHint:"Ajustar velocidade da fala (0.5x ~ 2.0x)",edgePitch:"Tom",edgePitchHint:"Ajustar tom da fala (-20 ~ +20 Hz)",testTitle:"Teste de voz",testText:"Texto de teste",testTextPlaceholder:"Insira o texto para testar...",testTextDefault:"Ola, este e um teste de voz.",testButton:"Testar",testButtonPlaying:"Reproduzindo...",testFailed:"Teste falhou: {error}",providerMimo:"MiMo TTS",mimoHint:"Xiaomi MiMo TTS — vozes predefinidas, design de voz e clonagem de voz",mimoApiKey:"Chave API",mimoApiKeyHint:"Obtenha sua chave em platform.xiaomimimo.com",mimoApiKeyPlaceholder:"Chave API MiMo",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"},models:{apiKey:"API Key",apiKeyPlaceholder:"Digite a API Key",noProviders:"Nenhum provedor configurado",save:"Salvar",saveFailed:"Falha ao salvar",saved:"Salvo"}},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...",qqSandboxHint:"Ativar ambiente sandbox (para testes)",qqSandbox:"Modo sandbox",qqQrScanHint:"Escaneie o QR code com QQ ou abra o link no celular para concluir a vinculação",qqMarkdownHint:"Ativar mensagens em formato Markdown (alguns clientes podem não suportar)",qqMarkdown:"Suporte a Markdown",qqAppSecretHint:"App Secret do bot QQ Open Platform",qqAppSecret:"App Secret",qqAppIdHint:"App ID do bot QQ Open Platform",qqAppId:"App ID",allowedUsersHint:"Lista de permissões de IDs de usuário ou OpenID, separados por vírgula",allowedUsers:"Usuários permitidos",allowAllUsersHint:"Permite mensagens de qualquer usuário; desative para usar a lista de permissões",allowAllUsers:"Permitir todos os usuários"},language:{label:"Idioma",zh:"中文",en:"English",pt:"Portugues"},terminal:{sessions:"Sessoes",newTab:"Novo terminal",closeSession:"Fechar esta sessao?",sessionExited:"Encerrada",processExited:"Processo encerrado com codigo {code}",noSessions:"Nenhuma sessão de terminal",connectionFailed:"Falha ao conectar ao terminal",connectionError:"Erro de conexão",connectionClosed:"Conexão fechada"},usage:{title:"Estatisticas de uso",refresh:"Atualizar",totalTokens:"Total de tokens",inputTokens:"Entrada",outputTokens:"Saida",totalSessions:"Total de sessoes",avgPerDay:"~{n}/dia em media",estimatedCost:"Custo est.",cacheHitRate:"Taxa de acerto de cache",modelBreakdown:"Detalhamento por modelo",dailyTrend:"Uso diario",date:"Data",tokens:"Tokens",cache:"Cache",cacheRead:"Leitura de cache",cacheWrite:"Escrita de cache",sessions:"Sessoes",cost:"Custo",noData:"Sem dados de uso"},skillsUsage:{title:"Uso de habilidades",subtitle:"Acompanhe carregamentos e edições de habilidades nas sessões Hermes",refresh:"Atualizar",periodSelector:"Período de uso de habilidades",periodLabel:"{days} d",summary:"Resumo",totalActions:"Ações",loads:"Carga",edits:"Ed.",distinctSkills:"Habs.",topSkills:"Top habs.",dailyTrend:"Tendência diária",periodSummary:"Últimos {days} dias",skill:"Hab.",share:"%",lastUsed:"Últ. uso",noData:"Nenhum dado de uso de habilidades",loadFailed:"Falha ao carregar o uso de habilidades",otherSkills:"Outras habs."},changelog:{new_0_5_22_1:"API de lista de sessões Hermes passa a ler o banco do perfil em vez do store local de sessões da Web UI",new_0_5_23_1:"Comandos slash de chat exclusivos do Bridge com sugestões localizadas",new_0_5_23_2:"Histórico de comandos persistente para replay de sessão sem poluir contexto, uso ou compressão",new_0_5_23_3:"Variáveis de ambiente do perfil gateway isoladas para evitar vazamento de credenciais entre perfis",new_0_5_23_4:"Porta da Web UI reservada durante alocação do gateway para evitar conflitos de inicialização",new_0_5_23_5:"Correção do reinício de autoatualização para não reportar saídas bem-sucedidas do helper como falha",new_0_5_24_1:"Chat Bridge alinhado ao API Server para entrada multimodal, prompt de sistema e contexto de workspace",new_0_5_25_1:"Ações de reset e clonagem de salas de chat em grupo",new_0_5_25_2:"Diretório de estado da Web UI configurável para layouts de deploy personalizados",new_0_5_25_3:"MiMo adicionado como provedor TTS nas configurações de voz",new_0_5_25_4:"Listas de modelos de provedores personalizados buscadas pelo backend para evitar falhas CORS do navegador",new_0_5_25_5:"Fluxo de aprovação de ferramentas corrigido para sessões Bridge",new_0_5_25_6:"Dica de plataforma CLI forçada removida dos prompts Bridge para preservar instruções personalizadas de mídia/arquivo",new_0_5_25_7:"Conteúdo de imagem base64 exibido corretamente no histórico de mensagens do usuário",new_0_5_25_8:"Testes Playwright de navegador, cobertura de contrato de streaming de chat, cobertura de modelos de provedor e baseline de cobertura adicionados",new_0_5_26_1:"Suporte a caminhos de mídia Markdown locais e do Windows no histórico e em mensagens renderizadas",new_0_5_26_2:"Histórico vazio do assistant filtrado e estado de compressão obsoleto limpo ao iniciar nova execução",new_0_5_26_3:"Escritas com lock para atualizações de config e perfil a fim de reduzir corrupção por concorrência",new_0_5_26_4:"Configurações de canais QQBot e DingTalk adicionadas",new_0_5_26_5:"Detecção de porta CLI portável e melhorias no tamanho da gaveta de terminal móvel",new_0_5_26_6:"Ambientes de perfil Bridge isolados e descoberta de plugins Hermes corrigida entre ambientes Python",new_0_5_26_7:"Estados de gateway parado explicados com diagnósticos Web UI e estado de carregamento de logs estável",new_0_5_26_8:"Opções de reset de sessão, base URL de provedor personalizado e destinos dinâmicos de entrega corrigidos",new_0_5_26_9:"Toggle local de visibilidade de trace de tool-call adicionado à barra de entrada do chat",new_0_5_26_10:"Instalação do pacote Hermes Agent suportada quando não há checkout de código-fonte disponível",new_0_5_26_11:"Login OAuth xAI Grok para usuários SuperGrok e presets de modelos Grok atualizados",new_0_5_26_12:"Cobertura ampliada de navegador, streaming de chat, provedor, gateway, config, plugin e Bridge",new_0_5_27_1:"Configurações de modelo por sessão para chats Bridge, com provider e model independentes salvos por sessão",new_0_5_27_2:"Clique com o botão direito em uma sessão Bridge e escolha Definir modelo para trocar o modelo daquela sessão",new_0_5_27_3:"Execuções validam o modelo da sessão e voltam ao modelo padrão atual quando o modelo salvo está indisponível",new_0_5_27_4:"Compressão de contexto segue por padrão o modelo selecionado como padrão no Profile atual",new_0_5_30_1:"Bridge chat preserva histórico estruturado, corrigindo ausência intermitente de resposta e execução de ferramentas pulada por histórico de ferramentas achatado",new_0_5_30_2:"Roteamento de menções no chat em grupo é mais confiável para múltiplos agentes, remove a própria menção @ antes da entrega e mantém nomes após atualizar",new_0_5_30_3:"Páginas de modelos, dropdowns de modelo do chat e seleção de modelo da sessão agora usam o Profile ativo com marcadores padrão precisos",new_0_5_30_4:"Gerenciamento de gateway simplificado: página Gateway independente removida, cada Profile verifica configuração de plataforma antes de iniciar e runner leve gerencia start/restart",new_0_5_30_5:"Inicialização do gateway melhorada em Docker, Termux e Windows com runtime-lock, limpeza de conflito de porta, execução em segundo plano e suporte a restart",new_0_5_30_6:"Compatibilidade Windows reforçada para detecção de caminhos, downloads e subprocessos job/update sem flashes de janelas de terminal",new_0_5_30_7:"Escritas de config e presets de provedor corrigidos: validar chaves .env, rotear FUN-Codex pela Responses API e atualizar listas Z.AI/GLM",new_0_5_30_8:"Detalhes de frontend polidos, incluindo sidebar recolhida, rótulos curtos de grupo, divisor lateral e estilo do outline da conversa",new_0_5_30_9:"Compressão de contexto segue configurações do Profile e fortalece snapshots obsoletos reutilizando resumos anteriores com cauda segura",new_0_5_31_1:"Reinícios do Bridge broker reforçados, renderização final do stream de chat em grupo corrigida e roteamento {'@'}all adicionado",new_0_5_31_2:"Gerenciador de arquivos pode copiar caminhos absolutos e a gaveta móvel de sessões não fica mais atrás do chat",new_0_5_31_3:"Seletor de Profile mostra avatares, upload de avatar personalizado, modal de status runtime e ações de restart de gateway/Profile",new_0_5_31_4:"Avatares de Profile aparecem em chat individual, chat em grupo e sidebar recolhida, com metadados Web UI e caminhos seguros para Windows",new_0_5_31_5:"Detecção e restart de gateway em Docker, Termux e Windows melhorados usando gateway_state/gateway.pid para liveness do gateway gerenciado",new_0_5_31_6:"Endpoint de mídia APIKEY.FUN para geração de imagens e skill apikey-image-gen integrado para texto-imagem, imagem-imagem e edição via provider fun-codex do Profile ativo",new_0_5_33_1:"Falhas de execução e erros Socket em chat individual e em grupo agora ficam como mensagens Agent vermelhas na lista de mensagens",new_0_5_33_2:"A busca de sessões pode ser limitada ao Profile selecionado, ou buscar todos os Profiles quando nenhum estiver selecionado",new_0_5_33_3:"A página Skills mostra documentos de recomendação em chinês/inglês quando nenhum skill está selecionado, e um segundo clique desmarca o skill",new_0_5_33_4:"Remove entradas de changelog i18n não usadas para reduzir o tamanho do frontend",new_0_5_33_5:"Corrige falha de inicialização do agent bridge no Windows chinês causada pela codificação da saída do netstat",new_0_5_33_6:"Atualiza a lista de modelos Nous Portal pelo catalog público e recomendações do Portal",new_0_5_33_7:"Listas e status runtime de Profile leem nomes dos diretórios e modelos padrão do config, evitando erros por largura de colunas da CLI",new_0_5_34_1:"Normaliza resultados de tools multimodais ao armazenar mensagens de sessão/grupo, evitando imagens base64 nos replays",new_0_5_34_2:"Persiste modelos Hermes personalizados em configuração gerenciada pelo backend e adiciona endpoints de adicionar/remover modelo",new_0_5_34_3:"Mantém uso final de contexto e status de tools do Bridge corretos após a conclusão das execuções",new_0_5_34_4:"Melhora filtros de Kanban, exibição de responsáveis, ações de cards e detalhes de tarefas",new_0_5_34_5:"Corrige contagem de uso da compressão com cache de contexto fixo de prompt/tools e totais completos de tokens",new_0_5_34_6:"Cacheia contexto fixo por agent no chat em grupo e mostra progresso apenas quando a compressão realmente inicia",new_0_5_34_7:"Sincroniza skills integradas do Web UI em todos os Profiles e registra o Profile alvo nos logs",new_0_5_34_8:"Se o Kanban falhar no Windows, atualize o Hermes para receber as correções mais recentes de migração do banco Kanban",new_0_5_35_1:"Sessões Bridge agora podem executar em paralelo entre sessions diferentes, enquanto runs da mesma session continuam serializados para preservar a ordem",new_0_5_35_2:"Adiciona a página Performance Monitor para CPU/memória do sistema, Web UI, Bridge Broker, Workers e status de sessões ativas",new_0_5_35_3:"Adiciona métricas por worker com CPU, memória, Profile, número de sessões e estado de execução",new_0_5_35_4:"Melhora a limpeza do ciclo de vida dos Bridge workers para recuperar workers no encerramento do Broker ou do processo pai e reduzir processos Python órfãos",new_0_5_35_5:"Fortalece a compatibilidade do monitoramento com fallbacks de coleta para macOS, Windows, Linux, Docker e Termux",new_0_5_35_6:"Performance Monitor não bloqueia mais em requests a workers durante a inicialização de Agents, reduzindo request timeouts no Windows",new_0_5_35_7:"Chat Markdown agora suporta preview inline de conteúdo de texto, e ícones de download baixam arquivos diretamente sem abrir o drawer",new_0_5_35_8:"Melhora o drawer de conteúdo com ação de fechar no mobile, largura total no mobile, 800px no desktop e fundos consistentes para texto/Markdown",new_0_6_0_1:"A gestão por conta e por Profile agora protege de forma consistente sessões, modelos, uso, Kanban, jobs, uploads, mídia e APIs Hermes relacionadas",new_0_6_0_2:"Skills de mídia integrados usam o token de servidor gerado apenas para endpoints de mídia e resolvem credenciais fun-codex/xAI a partir do Profile solicitado",new_0_6_0_3:"Chat individual e em grupo injetam o Hermes Profile atual nas instruções do run para que Skills enviem X-Hermes-Profile",new_0_6_0_4:"O progresso de subagents de delegate_task aparece na UI do chat com estados de início, ferramenta, progresso e conclusão",new_0_6_0_5:"Parar ou abortar um run limpa eventos temporários para que estados abort antigos não passem para o próximo chat",new_0_6_0_6:"Atualiza documentação e site para gestão de contas, credenciais padrão, gestão conta/Profile, uploads/downloads e Skills de mídia",new_0_6_0_7:"Adiciona comandos CLI de manutenção para limpar bloqueios de IP de login e redefinir o login padrão admin / 123456",new_0_6_0_8:"A versão 0.6.0 é o limite entre a Web UI de usuário único e multiusuário. Se o modo multiusuário causar problemas, abra uma issue e volte para a versão 0.5.35 de usuário único se necessário"},files:{title:"Arquivos",tree:"Arvore de diretorios",list:"Lista de arquivos",breadcrumbRoot:"Inicio",newFile:"Novo arquivo",newFolder:"Nova pasta",upload:"Enviar",refresh:"Atualizar",open:"Abrir",edit:"Editar",preview:"Visualizar",download:"Baixar",copyPath:"Copiar caminho",rename:"Renomear",delete:"Excluir",name:"Nome",size:"Tamanho",modified:"Modificado",actions:"Acoes",emptyDir:"Diretorio vazio",loading:"Carregando...",confirmDelete:'Tem certeza de que deseja excluir "{name}"?',confirmDeleteDir:'Tem certeza de que deseja excluir o diretorio "{name}" e todo o seu conteudo?',deleteFailed:"Falha ao excluir",deleted:"Excluido",renameTo:"Renomear para",newFileName:"Nome do arquivo",newFolderName:"Nome da pasta",created:"Criado",createFailed:"Falha ao criar",renamed:"Renomeado",renameFailed:"Falha ao renomear",uploadSuccess:"{count} arquivo(s) enviado(s)",uploadFailed:"Falha ao enviar",saveFailed:"Falha ao salvar",saved:"Salvo",unsavedChanges:"Voce tem alteracoes nao salvas. Descartar?",pathCopied:"Caminho copiado",fileTooLarge:"Arquivo muito grande (max 10MB)",permissionDenied:"Nao e possivel modificar arquivo protegido",notFound:"Arquivo ou diretorio nao encontrado",backendError:"Falha na operacao de arquivo",dragDropHint:"Arraste arquivos aqui para enviar",closeEditor:"Fechar editor",closePreview:"Fechar",saveFile:"Salvar",fileTree:"Árvore de arquivos"},groupChat:{title:"Chat em grupo",createRoom:"Criar sala",joinByCode:"Entrar com codigo",roomName:"Nome da sala",roomNamePlaceholder:"Digite o nome da sala",inviteCode:"Codigo de convite",autoGenerate:"Gerar automaticamente",noRooms:"Nenhuma sala ainda",selectOrCreate:"Selecione ou crie uma sala para comecar a conversar",agents:"Agentes",addAgent:"Adicionar agente",selectProfile:"Selecione um perfil",agentAdded:"Agente adicionado",agentAlreadyInRoom:"O agente ja esta nesta sala",agentAddFailedCount:"{count} agente(s) nao foram adicionados: {details}",noAgents:"Nenhum agente nesta sala",members:"Membros",roomCreated:"Sala criada",roomDeleted:"Sala excluída",roomCloned:"Sala clonada",cloneRoom:"Clonar sala",copyRoomLink:"Copiar link da sala",deleteRoomConfirm:"Excluir esta sala?",clearContext:"Limpar contexto",clearContextConfirm:"Limpar o contexto desta sala? Mensagens e snapshots de compactação serão removidos, mas agentes e membros ficam.",contextCleared:"Contexto limpo",you:"Você",joined:"Entrou na sala",joinFailed:"Falha ao entrar na sala",inputPlaceholder:"Digite uma mensagem... (Enter para enviar)",enterCode:"Digite o codigo de convite",yourName:"Seu nome",yourNamePlaceholder:"Digite seu nome de exibicao",yourDescription:"Descricao (opcional)",yourDescriptionPlaceholder:"Conte aos outros quem voce e...",agentName:"Nome do agente",agentNamePlaceholder:"Nome personalizado (vazio = nome do perfil)",agentDesc:"Descrição do agente",agentDescPlaceholder:"Descreva o que este agente faz...",agentReplying:"está respondendo...",agentCompressing:"está compactando contexto...",compressionSettings:"Configuração de compactação",triggerTokens:"Tokens de acionamento",triggerTokensDesc:"Limite de tokens para acionar a compactação",maxHistoryTokens:"Máx. tokens de histórico",maxHistoryTokensDesc:"Máximo de tokens para o contexto compactado",tailMessageCount:"Mensagens recentes",tailMessageCountDesc:"Número de mensagens recentes a manter",compressionConfig:"Config. de compactação",compressNow:"Compactar agora",compressingInProgress:"Compactação em andamento",compressionSaved:"Configuração salva"},download:{downloading:"Baixando...",downloadFailed:"Falha no download",fileNotFound:"Arquivo nao encontrado ou excluido",fileTooLarge:"Arquivo muito grande (limite excedido)",backendError:"Falha ao ler o arquivo, o ambiente remoto pode estar indisponivel",backendTimeout:"Tempo esgotado para ler o arquivo",unsupportedBackend:"O backend de terminal atual nao suporta download de arquivos",invalidPath:"Caminho de arquivo invalido",contentDisplay:"Exibicao de conteudo",download:"Baixar",downloadFile:"Baixar arquivo"},gateways:{title:"Gateways",running:"Em execução",stopped:"Parado",started:"Iniciado",startFailed:"Falha ao iniciar gateway",stopFailed:"Falha ao parar gateway"},kanban:{title:"Quadro Kanban",createTask:"Nova tarefa",noTasks:"Nenhuma tarefa",allStatuses:"Todos os status",allAssignees:"Todos os responsáveis",columns:{triage:"Triagem",todo:"A fazer",ready:"Pronto",running:"Em andamento",blocked:"Bloqueado",done:"Concluído",archived:"Arquivado"},card:{assigneeTooltip:"Responsável",priority:{low:"Baixa",medium:"Média",high:"Alta"},timeAgo:{justNow:"agora mesmo",minutes:"há {count} min",hours:"há {count} h",days:"há {count} d"}},board:{create:"Novo quadro",archive:"Arquivar quadro",archiveConfirm:"Arquivar o quadro atual?",archived:"Quadro arquivado",created:"Quadro criado",slugPlaceholder:"Identificador do quadro, ex. project-a",namePlaceholder:"Nome exibido (opcional)",slugRequired:"O identificador do quadro é obrigatório"},form:{title:"Título",titlePlaceholder:"Título da tarefa",titleRequired:"Título é obrigatório",body:"Descrição",bodyPlaceholder:"Descrição da tarefa (opcional)",assignee:"Responsável",selectAssignee:"Selecionar responsável...",priority:"Prioridade",selectPriority:"Selecionar prioridade..."},detail:{status:"Status",priority:"Prioridade",assignee:"Responsável",tenant:"Locatário",createdAt:"Criado",startedAt:"Iniciado",completedAt:"Concluído",comments:"Comentários",events:"Eventos",runs:"Execuções",artifacts:"Arquivos gerados",result:"Resultado",highlights:"Informações principais",sources:"Fontes de dados",sessions:"Sessões relacionadas",sessionMessages:"Mensagens da sessão",noSessions:"Nenhuma sessão relacionada encontrada."},action:{title:"Ações",assign:"Atribuir",assignTo:"Atribuir a...",block:"Bloquear",blockReason:"Motivo do bloqueio",unblock:"Desbloquear",complete:"Concluir",completeSummary:"Resumo de conclusão (opcional)"},message:{loadFailed:"Falha ao carregar tarefa",taskCreated:"Tarefa criada",taskAssigned:"Tarefa atribuída",taskBlocked:"Tarefa bloqueada",taskUnblocked:"Tarefa desbloqueada",taskCompleted:"Tarefa concluída"},stats:{total:"Total",tasks:"Tarefas"}}},Io=["en","zh","zh-TW","ja","ko","fr","es","de","pt"];function ia(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function Pa(o,e){const a={...o};for(const[i,r]of Object.entries(e)){const l=o[i];a[i]=ia(l)&&ia(r)?Pa(l,r):r}return a}var Mt={en:Sa,zh:St,"zh-TW":Pt,ja:Ct,ko:At,fr:Tt,es:xt,de:Ht,pt:It},Ca={};for(const[o,e]of Object.entries(Mt))Ca[o]=o==="en"?e:Pa(Sa,e);var Dt=localStorage.getItem("hermes_locale");function Rt(o){if(o&&Io.includes(o))return o;function e(a){const i=a.toLowerCase();if(i.startsWith("zh"))return i.includes("hant")||i.includes("-tw")||i.includes("-hk")||i.includes("-mo")?"zh-TW":"zh";const r=a.slice(0,2);return Io.includes(a)?a:Io.includes(r)?r:null}for(const a of navigator.languages){const i=e(a);if(i)return i}return"en"}function Aa(o){document.documentElement.lang=o}var Ta=Rt(Dt);Aa(Ta);var xa=ut({legacy:!1,locale:Ta,fallbackLocale:"en",messages:Ca});function Et(o){xa.global.locale.value=o,Aa(o)}var Lt,Ft=be((()=>{Lt="/logo.png"}));Ft();xe();var zt={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"}},Ut={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 Nt(o,e){const a=o?Ut:zt;return e?{...a,common:{...a.common,fontFamily:"'Comic Neue', 'ZCOOL KuaiLe', 'Zen Maru Gothic', 'Gaegu', cursive, sans-serif"}}:a}function qt(o){return o==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:o==="dark"}function io(){const o=qt(Ee.value);Ze.value=o,Ne.value=Ue.value==="comic",document.documentElement.classList.toggle("dark",o),document.documentElement.classList.toggle("comic",Ne.value)}function Ha(){const o=se(()=>{const l=Ze.value?"dark":"light";return Ne.value?`comic-${l}`:l});function e(l){Ee.value=l}function a(l){Ue.value=l}function i(){Ee.value=Ze.value?"light":"dark"}function r(){Ue.value=Ne.value?"ink":"comic"}return{brightness:Ee,style:Ue,isDark:Ze,isComic:Ne,themeName:o,setBrightness:e,setStyle:a,toggleBrightness:i,toggleStyle:r}}var Mo,Do,Ee,Ue,Ze,Ne,Ia=be((()=>{Mo="hermes_brightness",Do="hermes_style",Ee=S(localStorage.getItem(Mo)||"system"),Ue=S(localStorage.getItem(Do)||"ink"),Ze=S(!1),Ne=S(!1),io(),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{Ee.value==="system"&&io()}),Re(Ee,o=>{localStorage.setItem(Mo,o),io()}),Re(Ue,o=>{localStorage.setItem(Do,o),io()})}));Ia();ve();bo();ko();Ce();var Bt={class:"model-selector"},Ot={class:"model-label"},Wt=["title"],jt={class:"model-list"},Gt=["onClick"],Kt={class:"model-group-label"},Vt={class:"model-group-count"},$t={class:"model-group-items"},Qt=["title","onClick"],Jt={class:"model-item-label"},Zt={class:"model-item-name"},Yt={key:0,class:"model-item-id"},Xt={key:0,class:"model-badge-preview"},en={key:1,class:"model-badge-disabled"},on={key:2,class:"model-badge-custom"},an=["title","onClick"],tn={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"},nn={key:0,class:"model-empty"},rn={class:"model-custom"},sn={class:"model-custom-row"},ln={class:"model-custom-hint"},dn=Pe({__name:"ModelSelector",setup(o){const{t:e}=He(),a=Ye(),i=Xe(),r=S(!1),l=S(""),d=S({}),g=S(""),T=S(""),O=se(()=>i.activeProfileName||"default"),A=se(()=>a.profileModelGroups.find(R=>R.profile===O.value)?.groups||[]),f=se(()=>(T.value=a.selectedProvider,A.value.map(R=>({label:R.label,value:R.provider})))),B=se(()=>A.value.map(R=>({...R,models:[...R.models,...(a.customModels[R.provider]||[]).filter(h=>!R.models.includes(h))]}))),M=se(()=>B.value.some(R=>R.provider===a.selectedProvider&&R.models.includes(a.selectedModel))),Y=se(()=>M.value?a.displayModelName(a.selectedModel,a.selectedProvider):"");function te(R,h){return(a.customModels[h]||[]).includes(R)}async function ue(R,h){await a.removeCustomModel(R,h)}function J(R){return typeof R=="string"?R.toLowerCase():""}const de=se(()=>{const R=J(l.value).trim();return R?B.value.map(h=>({...h,models:h.models.filter(P=>{const j=a.displayModelName(P,h.provider);return J(P).includes(R)||J(j).includes(R)})})).filter(h=>h.models.length>0||J(h.label).includes(R)):B.value});function ne(R){d.value[R]=!d.value[R]}function p(R){return!!d.value[R]}function H(R,h){A.value.find(P=>P.provider===h)?.model_meta?.[R]?.disabled||(a.switchModel(R,h),r.value=!1,l.value="")}function $(R,h){return a.displayModelName(R,h)}function Q(R,h){return a.getModelAlias(R,h)}function U(){const R=g.value.trim();!R||!T.value||A.value.find(h=>h.provider===T.value)?.model_meta?.[R]?.disabled||(a.switchModel(R,T.value),r.value=!1,l.value="",g.value="")}function ke(){d.value={},l.value="",g.value="",T.value=a.selectedProvider,r.value=!0}return(R,h)=>(I(),L("div",Bt,[n("div",Ot,b(u(e)("models.title")),1),n("button",{class:"model-trigger",onClick:ke},[n("span",{class:"model-name",title:u(a).selectedModel},b(Y.value||"—"),9,Wt),h[4]||(h[4]=n("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"},[n("polyline",{points:"6 9 12 15 18 9"})],-1))]),X(u(Be),{show:r.value,"onUpdate:show":h[3]||(h[3]=P=>r.value=P),preset:"card",title:u(e)("models.title"),style:{width:"min(480px, calc(100vw - 32px))"},"mask-closable":!0},{default:ce(()=>[X(u(zo),{value:l.value,"onUpdate:value":h[0]||(h[0]=P=>l.value=P),placeholder:u(e)("models.searchPlaceholder"),clearable:"",size:"small",class:"model-search"},null,8,["value","placeholder"]),n("div",jt,[(I(!0),L(qe,null,Oe(de.value,P=>(I(),L("div",{key:P.provider,class:"model-group"},[n("div",{class:"model-group-header",onClick:j=>ne(P.provider)},[(I(),L("svg",{class:re(["model-group-arrow",{collapsed:p(P.provider)}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...h[5]||(h[5]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2)),n("span",Kt,b(P.label),1),n("span",Vt,b(P.models.length),1)],8,Gt),Qe(n("div",$t,[(I(!0),L(qe,null,Oe(P.models,j=>(I(),L("div",{key:j,class:re(["model-item",{active:j===u(a).selectedModel&&P.provider===u(a).selectedProvider,disabled:!!P.model_meta?.[j]?.disabled}]),title:P.model_meta?.[j]?.disabled?u(e)("models.disabledTooltip"):"",onClick:ye=>H(j,P.provider)},[n("span",Jt,[n("span",Zt,b($(j,P.provider)),1),Q(j,P.provider)?(I(),L("span",Yt,b(u(e)("models.aliasCanonical",{model:j})),1)):he("",!0)]),P.model_meta?.[j]?.preview?(I(),L("span",Xt,b(u(e)("models.previewBadge")),1)):he("",!0),P.model_meta?.[j]?.disabled?(I(),L("span",en,b(u(e)("models.disabledBadge")),1)):he("",!0),te(j,P.provider)?(I(),L("span",on,b(u(e)("models.customBadge")),1)):he("",!0),te(j,P.provider)?(I(),L("button",{key:3,class:"model-custom-remove",type:"button",title:u(e)("models.removeCustomModel"),onClick:at(ye=>ue(j,P.provider),["stop"])}," × ",8,an)):he("",!0),j===u(a).selectedModel&&P.provider===u(a).selectedProvider?(I(),L("svg",tn,[...h[6]||(h[6]=[n("polyline",{points:"20 6 9 17 4 12"},null,-1)])])):he("",!0)],10,Qt))),128))],512),[[Je,!p(P.provider)]])]))),128)),de.value.length===0?(I(),L("div",nn,b(l.value?"No results":"No models"),1)):he("",!0),n("div",rn,[n("div",sn,[X(u(wa),{value:T.value,"onUpdate:value":h[1]||(h[1]=P=>T.value=P),options:f.value,size:"small",class:"model-custom-provider"},null,8,["value","options"]),X(u(zo),{value:g.value,"onUpdate:value":h[2]||(h[2]=P=>g.value=P),placeholder:u(e)("models.customModelPlaceholder"),size:"small",class:"model-custom-input",onKeydown:ot(U,["enter"])},null,8,["value","placeholder"])]),n("div",ln,b(u(e)("models.customModelHint")),1)])])]),_:1},8,["show","title"])]))}});_t();Me();var cn=De(dn,[["__scopeId","data-v-72b95fdf"]]),ra,sa,la,Ma,da=be((()=>{ve(),ra=Qa(ht()),sa=["src"],la=["innerHTML"],Ma=Pe({__name:"ProfileAvatar",props:{name:{},avatar:{},size:{default:24}},setup(o){const e=o,a=se(()=>e.name||"default"),i=se(()=>(0,ra.default)(e.avatar?.seed||a.value)),r=se(()=>({width:`${e.size}px`,height:`${e.size}px`,flexBasis:`${e.size}px`}));return(l,d)=>(I(),L("span",{class:"profile-avatar-view",style:et(r.value)},[o.avatar?.type==="image"&&o.avatar.dataUrl?(I(),L("img",{key:0,class:"profile-avatar-image",src:o.avatar.dataUrl,alt:"",draggable:"false"},null,8,sa)):(I(),L("span",{key:1,class:"profile-avatar-svg",innerHTML:i.value},null,8,la))],4))}})})),un=be((()=>{})),so,mn=be((()=>{da(),da(),un(),Me(),so=De(Ma,[["__scopeId","data-v-6a9a551b"]])}));ve();xe();ko();mn();Ce();var pn={class:"profile-selector"},gn={class:"selector-label"},hn={class:"profile-name"},fn={class:"profile-modal-header"},vn={class:"profile-popover-title"},_n={class:"profile-popover-name"},wn={class:"profile-popover-subtitle"},bn={class:"profile-runtime-list"},kn={class:"profile-runtime-main"},yn={class:"profile-runtime-info"},Sn={class:"profile-runtime-name-row"},Pn={class:"profile-runtime-name"},Cn={key:0,class:"active-badge"},An={class:"runtime-status-grid"},Tn={class:"runtime-row compact"},xn={class:"runtime-label"},Hn={class:"runtime-row compact"},In={class:"runtime-label"},Mn={key:0,class:"runtime-detail"},Dn={class:"profile-runtime-actions"},Rn={key:0,class:"avatar-editor"},En={class:"avatar-editor-meta"},Ln={class:"avatar-editor-name"},Fn={class:"avatar-editor-hint"},zn={class:"avatar-editor-actions"},Un=Pe({__name:"ProfileSelector",setup(o){const{t:e}=He(),a=_o(),i=Xe(),r=se(()=>i.activeProfileName??""),l=se(()=>r.value||"default"),d=se(()=>i.profiles.find(V=>V.name===l.value)),g=S([]),T=S(!1),O=S(!1),A=S(!1),f=S(null),B=S(!1),M=S(null),Y=S({}),te=S({}),ue=S({}),J=se(()=>new Map(g.value.map(V=>[V.profile,V])));async function de(){T.value=!0;try{g.value=await wt()}catch{g.value=[]}finally{T.value=!1}}function ne(){O.value=!0,de()}function p(V){f.value=V,A.value=!0}function H(){return`profile-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}async function $(V){if(f.value){B.value=!0;try{await i.updateAvatar(f.value.name,V),a.success(e("profiles.avatar.saveSuccess")),A.value=!1}catch(me){a.error(me?.message||e("profiles.avatar.saveFailed"))}finally{B.value=!1}}}async function Q(){await $({type:"generated",seed:H()})}async function U(){if(f.value){B.value=!0;try{await i.deleteAvatar(f.value.name),a.success(e("profiles.avatar.resetSuccess")),A.value=!1}catch(V){a.error(V?.message||e("profiles.avatar.resetFailed"))}finally{B.value=!1}}}function ke(){M.value?.click()}async function R(V){const me=V.target,k=me.files?.[0];if(me.value="",!!k){if(!["image/png","image/jpeg","image/webp"].includes(k.type)){a.warning(e("profiles.avatar.invalidType"));return}if(k.size>1024*1024){a.warning(e("profiles.avatar.tooLarge"));return}await $({type:"image",dataUrl:await new Promise((pe,So)=>{const ie=new FileReader;ie.onload=()=>pe(String(ie.result||"")),ie.onerror=()=>So(ie.error||new Error("Failed to read file")),ie.readAsDataURL(k)})})}}function h(V){return e(V?"profiles.runtime.running":"profiles.runtime.stopped")}function P(V){return e(V?"profiles.runtime.active":"profiles.runtime.idle")}async function j(V){Y.value={...Y.value,[V]:!0};try{const me=await kt(V);J.value.get(V)&&(g.value=g.value.map(k=>k.profile===V?{...k,gateway:me}:k)),a.success(e("profiles.runtime.gatewayRestarted",{name:V}))}catch(me){a.error(me?.message||e("profiles.runtime.gatewayRestartFailed"))}finally{Y.value={...Y.value,[V]:!1}}}async function ye(V){te.value={...te.value,[V]:!0};try{const me=await yt(V);g.value=g.value.map(k=>k.profile===V?me:k),a.success(e("profiles.runtime.profileRestarted",{name:V}))}catch(me){a.error(me?.message||e("profiles.runtime.profileRestartFailed"))}finally{te.value={...te.value,[V]:!1}}}async function We(V){if(V!==l.value){ue.value={...ue.value,[V]:!0};try{if(!await i.switchProfile(V))throw new Error(e("profiles.switchFailed"));a.success(e("profiles.switchSuccess",{name:V})),window.location.reload()}catch(me){a.error(me?.message||e("profiles.switchFailed"))}finally{ue.value={...ue.value,[V]:!1}}}}return eo(()=>{i.profiles.length===0&&i.fetchProfiles()}),(V,me)=>(I(),L("div",pn,[n("div",gn,b(u(e)("sidebar.profiles")),1),n("div",{class:"profile-display","data-testid":"profile-selector-select",onClick:ne},[X(so,{class:"profile-avatar",name:l.value,avatar:d.value?.avatar,size:24},null,8,["name","avatar"]),n("span",hn,b(l.value),1)]),X(u(Be),{show:O.value,"onUpdate:show":me[0]||(me[0]=k=>O.value=k),preset:"card",bordered:!1,style:{width:"720px",maxWidth:"calc(100vw - 32px)"},class:"profile-manager-modal"},{header:ce(()=>[n("div",fn,[n("div",vn,[n("span",_n,b(u(e)("sidebar.profiles")),1),n("span",wn,b(u(e)("profiles.runtime.activeProfile",{name:l.value})),1)])])]),default:ce(()=>[X(u(ba),{show:T.value,size:"small"},{default:ce(()=>[n("div",bn,[(I(!0),L(qe,null,Oe(u(i).profiles,k=>(I(),L("div",{key:k.name,class:re(["profile-runtime-item",{active:k.name===l.value}])},[n("div",kn,[X(so,{class:"profile-runtime-avatar",name:k.name,avatar:k.avatar,size:34},null,8,["name","avatar"]),n("div",yn,[n("div",Sn,[n("span",Pn,b(k.name),1),k.name===l.value?(I(),L("span",Cn,b(u(e)("profiles.runtime.activeTag")),1)):he("",!0)]),n("div",An,[n("div",Tn,[n("span",xn,b(u(e)("profiles.runtime.bridgeWorker")),1),n("span",{class:re(["runtime-value",{running:J.value.get(k.name)?.bridge.running}])},[me[2]||(me[2]=n("span",{class:"runtime-dot"},null,-1)),we(" "+b(P(J.value.get(k.name)?.bridge.running)),1)],2)]),n("div",Hn,[n("span",In,b(u(e)("profiles.runtime.gateway")),1),n("span",{class:re(["runtime-value",{running:J.value.get(k.name)?.gateway.running}])},[me[3]||(me[3]=n("span",{class:"runtime-dot"},null,-1)),we(" "+b(h(J.value.get(k.name)?.gateway.running)),1)],2)])]),!J.value.get(k.name)?.gateway.running&&(J.value.get(k.name)?.gateway.diagnostics?.reason||J.value.get(k.name)?.gateway.error)?(I(),L("div",Mn,b(J.value.get(k.name)?.gateway.diagnostics?.reason||J.value.get(k.name)?.gateway.error),1)):he("",!0)])]),n("div",Dn,[X(u(Se),{size:"small",type:"primary",onClick:pe=>p(k)},{default:ce(()=>[we(b(u(e)("profiles.avatar.customize")),1)]),_:1},8,["onClick"]),X(u(Se),{size:"small",type:"primary",loading:Y.value[k.name],onClick:pe=>j(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.restartGateway")),1)]),_:1},8,["loading","onClick"]),X(u(Se),{size:"small",type:"primary",loading:te.value[k.name],onClick:pe=>ye(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.restartProfile")),1)]),_:1},8,["loading","onClick"]),X(u(Se),{size:"small",type:"primary",disabled:k.name===l.value,loading:ue.value[k.name],onClick:pe=>We(k.name)},{default:ce(()=>[we(b(u(e)("profiles.runtime.switchProfile")),1)]),_:1},8,["disabled","loading","onClick"])])],2))),128))])]),_:1},8,["show"])]),_:1},8,["show"]),X(u(Be),{show:A.value,"onUpdate:show":me[1]||(me[1]=k=>A.value=k),preset:"card",title:u(e)("profiles.avatar.title"),bordered:!1,style:{width:"420px",maxWidth:"calc(100vw - 32px)"}},{default:ce(()=>[f.value?(I(),L("div",Rn,[X(so,{name:f.value.name,avatar:f.value.avatar,size:72},null,8,["name","avatar"]),n("div",En,[n("div",Ln,b(f.value.name),1),n("div",Fn,b(u(e)("profiles.avatar.hint")),1)]),n("input",{ref_key:"fileInputRef",ref:M,class:"avatar-file-input",type:"file",accept:"image/png,image/jpeg,image/webp",onChange:R},null,544),n("div",zn,[X(u(Se),{type:"primary",loading:B.value,onClick:ke},{default:ce(()=>[we(b(u(e)("profiles.avatar.upload")),1)]),_:1},8,["loading"]),X(u(Se),{type:"primary",loading:B.value,onClick:Q},{default:ce(()=>[we(b(u(e)("profiles.avatar.random")),1)]),_:1},8,["loading"]),X(u(Se),{loading:B.value,onClick:U},{default:ce(()=>[we(b(u(e)("profiles.avatar.reset")),1)]),_:1},8,["loading"])])])):he("",!0)]),_:1},8,["show","title"])]))}});Me();var Nn=De(Un,[["__scopeId","data-v-6d14c2f6"]]);ve();Ce();xe();var qn=Pe({__name:"LanguageSwitch",setup(o){const{locale:e}=He(),a=[{label:"简体中文",value:"zh"},{label:"繁體中文",value:"zh-TW"},{label:"English",value:"en"},{label:"日本語",value:"ja"},{label:"한국어",value:"ko"},{label:"Français",value:"fr"},{label:"Español",value:"es"},{label:"Deutsch",value:"de"},{label:"Português",value:"pt"}];function i(r){Et(r),localStorage.setItem("hermes_locale",r)}return(r,l)=>(I(),Le(u(wa),{value:u(e),options:a,size:"tiny","consistent-menu-width":!1,class:"input-sm","onUpdate:value":i},null,8,["value"]))}}),Bn=qn;ve();var On={class:"theme-switch-container",style:{display:"flex",gap:"4px","align-items":"center"}},Wn=["title"],jn={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Gn={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Kn=["title"],Vn={key:0,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},$n={key:1,width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},Qn=Pe({__name:"ThemeSwitch",setup(o){const{isDark:e,isComic:a,toggleBrightness:i,toggleStyle:r}=Ha();return(l,d)=>(I(),L("div",On,[n("button",{class:"theme-switch",title:u(a)?"Ink style":"Comic style",onClick:d[0]||(d[0]=(...g)=>u(r)&&u(r)(...g))},[u(a)?(I(),L("svg",jn,[...d[2]||(d[2]=[n("path",{d:"M12 2.69l5.66 5.66a8 8 0 1 1-11.31 0z"},null,-1)])])):(I(),L("svg",Gn,[...d[3]||(d[3]=[n("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,Wn),n("button",{class:"theme-switch",title:u(e)?"Light mode":"Dark mode",onClick:d[1]||(d[1]=(...g)=>u(i)&&u(i)(...g))},[u(e)?(I(),L("svg",Vn,[...d[4]||(d[4]=[ze('<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(),L("svg",$n,[...d[5]||(d[5]=[n("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"},null,-1)])]))],8,Kn)]))}});Me();var Jn=De(Qn,[["__scopeId","data-v-4c30f4bd"]]);ve();var Ro=S(!1);function $o(){function o(){Ro.value=!0}function e(){Ro.value=!1}return{sessionSearchOpen:Ro,openSessionSearch:o,closeSessionSearch:e}}var Zn=[{version:"0.6.0",date:"2026-05-24",changes:["changelog.new_0_6_0_1","changelog.new_0_6_0_2","changelog.new_0_6_0_3","changelog.new_0_6_0_4","changelog.new_0_6_0_5","changelog.new_0_6_0_6","changelog.new_0_6_0_7","changelog.new_0_6_0_8"]},{version:"0.5.35",date:"2026-05-23",changes:["changelog.new_0_5_35_1","changelog.new_0_5_35_2","changelog.new_0_5_35_3","changelog.new_0_5_35_4","changelog.new_0_5_35_5","changelog.new_0_5_35_6","changelog.new_0_5_35_7","changelog.new_0_5_35_8"]},{version:"0.5.34",date:"2026-05-22",changes:["changelog.new_0_5_34_1","changelog.new_0_5_34_2","changelog.new_0_5_34_3","changelog.new_0_5_34_4","changelog.new_0_5_34_5","changelog.new_0_5_34_6","changelog.new_0_5_34_7","changelog.new_0_5_34_8"]},{version:"0.5.33",date:"2026-05-21",changes:["changelog.new_0_5_33_1","changelog.new_0_5_33_2","changelog.new_0_5_33_3","changelog.new_0_5_33_4","changelog.new_0_5_33_5","changelog.new_0_5_33_6","changelog.new_0_5_33_7"]},{version:"0.5.32",date:"2026-05-20",changes:["changelog.new_0_5_31_1","changelog.new_0_5_31_2","changelog.new_0_5_31_3","changelog.new_0_5_31_4","changelog.new_0_5_31_5","changelog.new_0_5_31_6"]},{version:"0.5.30",date:"2026-05-19",changes:["changelog.new_0_5_30_1","changelog.new_0_5_30_2","changelog.new_0_5_30_3","changelog.new_0_5_30_4","changelog.new_0_5_30_5","changelog.new_0_5_30_6","changelog.new_0_5_30_7","changelog.new_0_5_30_8","changelog.new_0_5_30_9"]},{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"]}];ve();Ce();xe();bo();var Yn=["title"],Xn={width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},ei={key:0,points:"9 18 15 12 9 6"},oi={key:1,points:"15 18 9 12 15 6"},ai={class:"sidebar-nav"},ti={class:"nav-group"},ni={class:"nav-group-items"},ii={class:"nav-item fun-link",href:"https://apikey.fun/register?aff=LIBAPI",target:"_blank",rel:"noopener noreferrer"},ri={class:"nav-group"},si={class:"nav-group-items"},li={class:"nav-group"},di={class:"nav-group-items"},ci={class:"nav-group"},ui={class:"nav-group-items"},mi={class:"sidebar-footer"},pi={class:"status-row"},gi={class:"status-text"},hi={class:"version-info"},fi={class:"changelog-list"},vi={class:"changelog-version-header"},_i={class:"changelog-version-tag"},wi={class:"changelog-date"},bi={class:"changelog-changes"},ki="/logo.png",yi=Pe({__name:"AppSidebar",setup(o){const{t:e}=He(),a=_o(),i=Ko(),r=oo(),l=Ye(),{openSessionSearch:d}=$o(),g=se(()=>i.name==="hermes.session"?"hermes.chat":i.name==="hermes.historySession"?"hermes.history":i.name==="hermes.groupChatRoom"?"hermes.groupChat":i.name),T=se(()=>gt()),O=Ya({});function A(ne){return e(`sidebar.group${ne}${l.sidebarCollapsed?"Short":""}`)}function f(ne){O[ne]=!O[ne]}function B(ne){return!!O[ne]}function M(ne){r.push({name:ne})}async function Y(){await l.doUpdate()?a.success(e("sidebar.updateSuccess"),{duration:5e3}):a.error(e("sidebar.updateFailed"))}function te(){l.reloadClient()}function ue(){localStorage.clear(),r.replace({name:"login"})}const J=S(!1);function de(){J.value=!0}return(ne,p)=>(I(),L("aside",{class:re(["sidebar",{open:u(l).sidebarOpen,collapsed:u(l).sidebarCollapsed}])},[n("div",{class:"sidebar-logo",onClick:p[0]||(p[0]=H=>u(r).push("/hermes/chat"))},[n("img",{src:ki,alt:"Hermes",class:"logo-img"}),p[24]||(p[24]=n("span",{class:"logo-text"},"Hermes",-1))]),n("button",{class:"collapse-btn",onClick:p[1]||(p[1]=H=>u(l).toggleSidebarCollapsed()),title:u(l).sidebarCollapsed?u(e)("sidebar.expand"):u(e)("sidebar.collapse")},[(I(),L("svg",Xn,[u(l).sidebarCollapsed?(I(),L("polyline",ei)):(I(),L("polyline",oi))]))],8,Yn),n("nav",ai,[n("div",ti,[n("div",{class:"nav-group-label",onClick:p[2]||(p[2]=H=>f("conversation"))},[n("span",null,b(A("Conversation")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("conversation")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[25]||(p[25]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",ni,[n("button",{class:re(["nav-item",{active:g.value==="hermes.chat"}]),onClick:p[3]||(p[3]=H=>M("hermes.chat"))},[p[26]||(p[26]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("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)),n("span",null,b(u(e)("sidebar.chat")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.history"}]),onClick:p[4]||(p[4]=H=>M("hermes.history"))},[p[27]||(p[27]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"12",cy:"12",r:"10"}),n("polyline",{points:"12 6 12 12 16 14"})],-1)),n("span",null,b(u(e)("sidebar.history")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.groupChat"}]),onClick:p[5]||(p[5]=H=>M("hermes.groupChat"))},[p[29]||(p[29]=ze('<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-437079c4><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" data-v-437079c4></path><circle cx="9" cy="7" r="4" data-v-437079c4></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" data-v-437079c4></path><path d="M16 3.13a4 4 0 0 1 0 7.75" data-v-437079c4></path></svg>',1)),n("span",null,[we(b(u(e)("sidebar.groupChat")),1),p[28]||(p[28]=n("span",{class:"beta-tag"},"(beta)",-1))])],2),n("button",{class:"nav-item",onClick:p[6]||(p[6]=(...H)=>u(d)&&u(d)(...H))},[p[30]||(p[30]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"11",cy:"11",r:"7"}),n("path",{d:"m20 20-3.5-3.5"})],-1)),n("span",null,b(u(e)("sidebar.search")),1)]),n("a",ii,[p[31]||(p[31]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),n("polyline",{points:"15 3 21 3 21 9"}),n("line",{x1:"10",y1:"14",x2:"21",y2:"3"})],-1)),n("span",null,b(u(e)("sidebar.apiRelay")),1)])],512),[[Je,!B("conversation")]])]),n("div",ri,[n("div",{class:"nav-group-label",onClick:p[7]||(p[7]=H=>f("agent"))},[n("span",null,b(A("Agent")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("agent")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[32]||(p[32]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",si,[n("button",{class:re(["nav-item",{active:g.value==="hermes.jobs"}]),onClick:p[8]||(p[8]=H=>M("hermes.jobs"))},[p[33]||(p[33]=ze('<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-437079c4><rect x="3" y="4" width="18" height="18" rx="2" ry="2" data-v-437079c4></rect><line x1="16" y1="2" x2="16" y2="6" data-v-437079c4></line><line x1="8" y1="2" x2="8" y2="6" data-v-437079c4></line><line x1="3" y1="10" x2="21" y2="10" data-v-437079c4></line></svg>',1)),n("span",null,b(u(e)("sidebar.jobs")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.kanban"}]),onClick:p[9]||(p[9]=H=>M("hermes.kanban"))},[p[34]||(p[34]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("rect",{x:"3",y:"3",width:"5",height:"18",rx:"1"}),n("rect",{x:"10",y:"3",width:"5",height:"12",rx:"1"}),n("rect",{x:"17",y:"3",width:"5",height:"18",rx:"1"})],-1)),n("span",null,b(u(e)("sidebar.kanban")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.channels"}]),onClick:p[10]||(p[10]=H=>M("hermes.channels"))},[p[35]||(p[35]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})],-1)),n("span",null,b(u(e)("sidebar.channels")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.skills"}]),onClick:p[11]||(p[11]=H=>M("hermes.skills"))},[p[36]||(p[36]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("polygon",{points:"12 2 2 7 12 12 22 7 12 2"}),n("polyline",{points:"2 17 12 22 22 17"}),n("polyline",{points:"2 12 12 17 22 12"})],-1)),n("span",null,b(u(e)("sidebar.skills")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.plugins"}]),onClick:p[12]||(p[12]=H=>M("hermes.plugins"))},[p[37]||(p[37]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("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"}),n("path",{d:"M5 19l1-1"})],-1)),n("span",null,b(u(e)("sidebar.plugins")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.memory"}]),onClick:p[13]||(p[13]=H=>M("hermes.memory"))},[p[38]||(p[38]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M9 18h6"}),n("path",{d:"M10 22h4"}),n("path",{d:"M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"})],-1)),n("span",null,b(u(e)("sidebar.memory")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.models"}]),onClick:p[14]||(p[14]=H=>M("hermes.models"))},[p[39]||(p[39]=ze('<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-437079c4><circle cx="12" cy="12" r="3" data-v-437079c4></circle><path d="M12 1v4" data-v-437079c4></path><path d="M12 19v4" data-v-437079c4></path><path d="M1 12h4" data-v-437079c4></path><path d="M19 12h4" data-v-437079c4></path><path d="M4.22 4.22l2.83 2.83" data-v-437079c4></path><path d="M16.95 16.95l2.83 2.83" data-v-437079c4></path><path d="M4.22 19.78l2.83-2.83" data-v-437079c4></path><path d="M16.95 7.05l2.83-2.83" data-v-437079c4></path></svg>',1)),n("span",null,b(u(e)("sidebar.models")),1)],2)],512),[[Je,!B("agent")]])]),n("div",li,[n("div",{class:"nav-group-label",onClick:p[15]||(p[15]=H=>f("monitoring"))},[n("span",null,b(A("Monitoring")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("monitoring")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[40]||(p[40]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",di,[n("button",{class:re(["nav-item",{active:g.value==="hermes.logs"}]),onClick:p[16]||(p[16]=H=>M("hermes.logs"))},[p[41]||(p[41]=ze('<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-437079c4><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" data-v-437079c4></path><polyline points="14 2 14 8 20 8" data-v-437079c4></polyline><line x1="16" y1="13" x2="8" y2="13" data-v-437079c4></line><line x1="16" y1="17" x2="8" y2="17" data-v-437079c4></line><polyline points="10 9 9 9 8 9" data-v-437079c4></polyline></svg>',1)),n("span",null,b(u(e)("sidebar.logs")),1)],2),n("button",{class:re(["nav-item",{active:g.value==="hermes.usage"}]),onClick:p[17]||(p[17]=H=>M("hermes.usage"))},[p[42]||(p[42]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("rect",{x:"3",y:"12",width:"4",height:"9",rx:"1"}),n("rect",{x:"10",y:"7",width:"4",height:"14",rx:"1"}),n("rect",{x:"17",y:"3",width:"4",height:"18",rx:"1"})],-1)),n("span",null,b(u(e)("sidebar.usage")),1)],2),T.value?(I(),L("button",{key:0,class:re(["nav-item",{active:g.value==="hermes.performance"}]),onClick:p[18]||(p[18]=H=>M("hermes.performance"))},[p[43]||(p[43]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("polyline",{points:"22 12 18 12 15 21 9 3 6 12 2 12"})],-1)),n("span",null,b(u(e)("sidebar.performance")),1)],2)):he("",!0),n("button",{class:re(["nav-item",{active:g.value==="hermes.skillsUsage"}]),onClick:p[19]||(p[19]=H=>M("hermes.skillsUsage"))},[p[44]||(p[44]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M21.21 15.89A10 10 0 1 1 8.11 2.79"}),n("path",{d:"M22 12A10 10 0 0 0 12 2v10z"})],-1)),n("span",null,b(u(e)("sidebar.skillsUsage")),1)],2)],512),[[Je,!B("monitoring")]])]),n("div",ci,[n("div",{class:"nav-group-label",onClick:p[20]||(p[20]=H=>f("system"))},[n("span",null,b(A("System")),1),(I(),L("svg",{class:re(["nav-group-arrow",{collapsed:B("system")}]),width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},[...p[45]||(p[45]=[n("polyline",{points:"6 9 12 15 18 9"},null,-1)])],2))]),Qe(n("div",ui,[T.value?(I(),L("button",{key:0,class:re(["nav-item",{active:g.value==="hermes.profiles"}]),onClick:p[21]||(p[21]=H=>M("hermes.profiles"))},[p[46]||(p[46]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),n("circle",{cx:"12",cy:"7",r:"4"})],-1)),n("span",null,b(u(e)("sidebar.profiles")),1)],2)):he("",!0),n("button",{class:re(["nav-item",{active:g.value==="hermes.settings"}]),onClick:p[22]||(p[22]=H=>M("hermes.settings"))},[p[47]||(p[47]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("circle",{cx:"12",cy:"12",r:"3"}),n("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)),n("span",null,b(u(e)("sidebar.settings")),1)],2)],512),[[Je,!B("system")]])])]),X(Nn),X(cn),n("div",mi,[n("button",{class:"nav-item logout-item",onClick:ue},[p[48]||(p[48]=n("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"},[n("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),n("polyline",{points:"16 17 21 12 16 7"}),n("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1)),n("span",null,b(u(e)("sidebar.logout")),1)]),n("div",pi,[n("div",{class:re(["status-indicator",{connected:u(l).connected,disconnected:!u(l).connected}])},[p[49]||(p[49]=n("span",{class:"status-dot"},null,-1)),n("span",gi,b(u(l).connected?u(e)("sidebar.connected"):u(e)("sidebar.disconnected")),1)],2),X(Bn)]),n("div",hi,[p[50]||(p[50]=ze('<div class="version-links" data-v-437079c4><a class="github-link" href="https://github.com/EKKOLearnAI/hermes-web-ui" target="_blank" rel="noopener noreferrer" title="GitHub" data-v-437079c4><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" data-v-437079c4><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-437079c4></path></svg></a><a class="website-link" href="https://ekkolearnai.com/" target="_blank" rel="noopener noreferrer" title="Website" data-v-437079c4><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-437079c4><circle cx="12" cy="12" r="10" data-v-437079c4></circle><line x1="2" y1="12" x2="22" y2="12" data-v-437079c4></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-437079c4></path></svg></a></div>',1)),n("span",{class:"version-text",onClick:de},"Web UI v"+b(u(l).serverVersion||"0.1.0"),1),X(Jn)]),u(l).clientOutdated?(I(),Le(u(Se),{key:0,type:"warning",size:"tiny",block:"",class:"update-btn",onClick:te},{default:ce(()=>[we(b(u(e)("sidebar.reloadClientVersion",{version:u(l).serverVersion})),1)]),_:1})):he("",!0),u(l).updateAvailable?(I(),Le(u(Se),{key:1,type:"primary",size:"tiny",block:"",class:"update-btn",loading:u(l).updating,onClick:Y},{default:ce(()=>[we(b(u(l).updating?u(e)("sidebar.updating"):u(e)("sidebar.updateVersion",{version:u(l).latestVersion})),1)]),_:1},8,["loading"])):he("",!0)]),X(u(Be),{show:J.value,"onUpdate:show":p[23]||(p[23]=H=>J.value=H),preset:"dialog",title:u(e)("sidebar.changelog"),style:{width:"520px"}},{default:ce(()=>[n("div",fi,[(I(!0),L(qe,null,Oe(u(Zn),H=>(I(),L("div",{key:H.version,class:"changelog-version-block"},[n("div",vi,[n("span",_i,"v"+b(H.version),1),n("span",wi,b(H.date),1)]),n("ul",bi,[(I(!0),L(qe,null,Oe(H.changes,($,Q)=>(I(),L("li",{key:Q},b(u(e)($)),1))),128))])]))),128))])]),_:1},8,["show","title"])],2))}});Me();var Si=De(yi,[["__scopeId","data-v-437079c4"]]);function Pi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onMessageDelta&&a.onMessageDelta(o)}function Ci(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onReasoningDelta&&a.onReasoningDelta(o)}function Ai(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onThinkingDelta&&a.onThinkingDelta(o)}function Ti(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onReasoningAvailable&&a.onReasoningAvailable(o)}function xi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onToolStarted&&a.onToolStarted(o)}function Hi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onToolCompleted&&a.onToolCompleted(o)}function ro(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onSubagentEvent&&a.onSubagentEvent(o)}function Ii(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunStarted&&a.onRunStarted(o)}function Mi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunCompleted&&a.onRunCompleted(o),!(o.queue_remaining>0)&&ae.delete(e)}function Di(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunFailed&&a.onRunFailed(o),!(o.queue_remaining>0)&&ae.delete(e)}function Ri(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onRunQueued&&a.onRunQueued(o)}function Ei(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onCompressionStarted&&a.onCompressionStarted(o)}function Li(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onCompressionCompleted&&a.onCompressionCompleted(o)}function Fi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onAbortStarted&&a.onAbortStarted(o)}function zi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onAbortCompleted&&a.onAbortCompleted(o),!(o.queue_length>0)&&ae.delete(e)}function Ui(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onUsageUpdated&&a.onUsageUpdated(o)}function Ni(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onSessionCommand&&a.onSessionCommand(o)}function qi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onApprovalRequested&&a.onApprovalRequested(o)}function Bi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onApprovalResolved&&a.onApprovalResolved(o)}function Oi(o){const e=o.session_id;if(!e)return;const a=ae.get(e);a?.onPeerUserMessage&&a.onPeerUserMessage(o);for(const i of po)i(o)}function Wi(o,e){return ae.set(o,e),()=>{ae.delete(o)}}function ji(o){ae.delete(o)}function Gi(o){return po.add(o),()=>{po.delete(o)}}function Ki(o,e,a){Qo().emit("approval.respond",{session_id:o,approval_id:e,choice:a})}function ca(){return oe}function Qo(o){const e=o?.trim()||null;if(oe?.connected&&(!e||co===e))return oe;oe&&(oe.removeAllListeners(),oe.disconnect(),lo=!1,co=null);const a=Vo(),i=wo();let r=e||"default";try{if(!e){const{useProfilesStore:l}=(ko(),Ja(bt));r=l().activeProfileName||"default"}}catch{r=e||localStorage.getItem("hermes_active_profile_name")||"default"}return co=r,oe=vt(`${a}/chat-run`,{auth:{token:i},query:{profile:r},transports:["websocket","polling"],reconnection:!0,reconnectionAttempts:1/0,reconnectionDelay:1e3,reconnectionDelayMax:3e4,randomizationFactor:.5,timeout:3e4}),lo||(oe.on("message.delta",Pi),oe.on("reasoning.delta",Ci),oe.on("thinking.delta",Ai),oe.on("reasoning.available",Ti),oe.on("tool.started",xi),oe.on("tool.completed",Hi),oe.on("subagent.start",ro),oe.on("subagent.tool",ro),oe.on("subagent.progress",ro),oe.on("subagent.complete",ro),oe.on("run.started",Ii),oe.on("run.failed",Di),oe.on("run.completed",Mi),oe.on("run.queued",Ri),oe.on("approval.requested",qi),oe.on("approval.resolved",Bi),oe.on("run.peer_user_message",Oi),oe.on("compression.started",Ei),oe.on("compression.completed",Li),oe.on("abort.started",Fi),oe.on("abort.completed",zi),oe.on("usage.updated",Ui),oe.on("session.command",Ni),lo=!0),oe}function ua(o,e,a){const i=o;if(typeof i.off=="function"){i.off(e,a);return}i.removeListener?.(e,a)}function ma(o,e,a){const i=Qo(a);return i.once("resumed",e),i.emit("resume",{session_id:o,...a?{profile:a}:{}}),i}function Vi(o,e,a,i,r){const l=o.session_id;if(!l)throw new Error("session_id is required for startRunViaSocket");let d=!1;const g=Qo(o.profile),T=f=>{d||(d=!0,ae.delete(l),i(f))};g.once("connect_error",T);const O=f=>{d||f==="io client disconnect"||T(new Error(`Socket disconnected: ${f}`))};g.once("disconnect",O);const A=()=>{ua(g,"connect_error",T),ua(g,"disconnect",O)};return ae.has(l)?(g.emit("run",o),{abort:()=>{d||g.emit("abort",{session_id:l})}}):(ae.set(l,{onMessageDelta:f=>{d||e(f)},onReasoningDelta:f=>{d||e(f)},onThinkingDelta:f=>{d||e(f)},onReasoningAvailable:f=>{d||e(f)},onToolStarted:f=>{d||e(f)},onToolCompleted:f=>{d||e(f)},onSubagentEvent:f=>{d||e(f)},onRunStarted:f=>{d||(e(f),r?.(f.run_id||""))},onRunCompleted:f=>{d||(e(f),!(f.queue_remaining>0)&&(d=!0,A(),a()))},onRunFailed:f=>{d||(e(f),!(f.queue_remaining>0)&&(d=!0,A(),a()))},onCompressionStarted:f=>{d||e(f)},onCompressionCompleted:f=>{d||e(f)},onAbortStarted:f=>{d||e(f)},onAbortCompleted:f=>{d||(e(f),!(f.queue_length>0)&&(d=!0,A(),a()))},onUsageUpdated:f=>{d||e(f)},onSessionCommand:f=>{d||(e(f),f.terminal!==!1&&(d=!0,A(),ae.delete(l),a()))},onRunQueued:f=>{d||e(f)},onApprovalRequested:f=>{d||e(f)},onApprovalResolved:f=>{d||e(f)}}),g.emit("run",o),{abort:()=>{d||g.emit("abort",{session_id:l})}})}var oe,lo,co,ae,po,$i=be((()=>{ft(),Ie(),oe=null,lo=!1,co=null,ae=new Map,po=new Set}));async function Uo(o,e,a){const i=new URLSearchParams;o&&i.set("source",o),e&&i.set("limit",String(e)),a&&i.set("profile",a);const r=i.toString();return(await le(`/api/hermes/sessions${r?`?${r}`:""}`)).sessions}async function ns(o,e,a){const i=new URLSearchParams;o&&i.set("source",o),e&&i.set("limit",String(e)),a&&i.set("profile",a);const r=i.toString();return(await le(`/api/hermes/sessions/hermes${r?`?${r}`:""}`)).sessions}async function pa(o,e,a,i){const r=new URLSearchParams;return r.set("q",o),e&&r.set("source",e),a&&r.set("limit",String(a)),i&&r.set("profile",i),(await le(`/api/hermes/search/sessions?${r.toString()}`)).results}async function Qi(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return(await le(`/api/hermes/sessions/${o}${i?`?${i}`:""}`)).session}catch{return null}}async function is(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return(await le(`/api/hermes/sessions/hermes/${o}${i?`?${i}`:""}`)).session}catch{return null}}async function Ji(o,e){try{const a=new URLSearchParams;e&&a.set("profile",e);const i=a.toString();return await le(`/api/hermes/sessions/${o}${i?`?${i}`:""}`,{method:"DELETE"}),!0}catch{return!1}}async function rs(o){try{return await le("/api/hermes/sessions/batch-delete",{method:"POST",body:JSON.stringify({ids:o})})}catch(e){throw e}}async function ss(o,e){try{return await le(`/api/hermes/sessions/${o}/rename`,{method:"POST",body:JSON.stringify({title:e})}),!0}catch{return!1}}async function ls(o,e){try{return await le(`/api/hermes/sessions/${o}/workspace`,{method:"POST",body:JSON.stringify({workspace:e||""})}),!0}catch{return!1}}async function Zi(o,e,a){try{return await le(`/api/hermes/sessions/${o}/model`,{method:"POST",body:JSON.stringify({model:e,provider:a})}),!0}catch{return!1}}async function ds(o,e="full",a="json"){const i=Vo(),r=wo(),l=`${i}/api/hermes/sessions/${o}/export?mode=${e}&ext=${a}&token=${encodeURIComponent(r)}`,d=await fetch(l);if(!d.ok)throw new Error("Export failed");const g=await d.blob(),T=d.headers.get("Content-Disposition")||"";let O=`session_${o}.${a}`;const A=T.match(/filename\*?=(?:UTF-8'')?([^;\n]+)/i);A&&(O=decodeURIComponent(A[1].replace(/"/g,"")));const f=document.createElement("a");f.href=URL.createObjectURL(g),f.download=O,f.click(),URL.revokeObjectURL(f.href)}async function cs(o=30){const e=Number.isFinite(o)?Math.max(1,Math.floor(o)):30,a=new URLSearchParams;return a.set("days",String(e)),le(`/api/hermes/usage/stats?${a}`)}async function us(o,e,a){const i=new URLSearchParams;o&&i.set("profile",o),e&&i.set("provider",e),a&&i.set("model",a);const r=i.toString();return(await le(`/api/hermes/sessions/context-length${r?`?${r}`:""}`)).context_length}var Da=be((()=>{Ie()}));function Jo(o,e){const a=Vo();if(o.startsWith("/api/hermes/download?"))try{const d=new URL(o,"http://localhost").searchParams.get("path");d&&(o=d)}catch{}const i=new URLSearchParams({path:decodeURIComponent(o)});if(e){const d=decodeURIComponent(e);i.set("name",d)}const r=ya();r&&i.set("profile",r);const l=wo();return l&&i.set("token",l),`${a}/api/hermes/download?${i.toString()}`}async function ms(o,e){const a=Jo(o,e),i=await fetch(a);if(!i.ok){const g=await i.json().catch(()=>({error:`HTTP ${i.status}`}));throw new Error(g.error||`Download failed: ${i.status}`)}const r=await i.blob(),l=URL.createObjectURL(r),d=document.createElement("a");d.href=l,d.download=e||o.split("/").pop()||"download",document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(l)}async function ps(o,e){const a=Jo(o,e),i=await fetch(a);if(!i.ok){const r=await i.json().catch(()=>({error:`HTTP ${i.status}`}));throw new Error(r.error||`Preview failed: ${i.status}`)}return i.text()}var Yi=be((()=>{Ie()}));async function Xi(o){return le(`/api/hermes/config${o?`?sections=${o.join(",")}`:""}`)}async function er(o,e,a){await le("/api/hermes/config",{method:"PUT",body:JSON.stringify({section:o,values:e,...a})})}async function gs(o,e){await le("/api/hermes/config/credentials",{method:"PUT",body:JSON.stringify({platform:o,values:e})})}async function hs(){return le("/api/hermes/weixin/qrcode")}async function fs(o){return le(`/api/hermes/weixin/qrcode/status?qrcode=${encodeURIComponent(o)}`)}async function vs(o){await le("/api/hermes/weixin/save",{method:"POST",body:JSON.stringify(o)})}var or=be((()=>{Ie()})),No,ar=be((()=>{ve(),or(),No=ka("settings",()=>{const o=S(!1),e=S(!1),a=S({}),i=S({}),r=S({}),l=S({}),d=S({}),g=S({}),T=S({}),O=S({}),A=S({}),f=S({}),B=S({}),M=S({}),Y=S({}),te=S({}),ue=S({}),J=S({}),de=S({}),ne=S({});async function p(){o.value=!0;try{const Q=await Xi();a.value=Q.display||{},i.value=Q.agent||{},r.value=Q.memory||{},l.value=Q.compression||{},d.value=Q.session_reset||{},g.value=Q.privacy||{},T.value=Q.approvals||{},O.value=Q.telegram||{},A.value=Q.discord||{},f.value=Q.slack||{},B.value=Q.whatsapp||{},M.value=Q.matrix||{},Y.value=Q.wecom||{},te.value=Q.feishu||{},ue.value=Q.dingtalk||{},J.value=Q.qqbot||{},de.value=Q.weixin||{},ne.value=Q.platforms||{}}catch(Q){console.error("Failed to fetch settings:",Q)}finally{o.value=!1}}function H(Q,U){switch(Q){case"display":a.value={...a.value,...U};break;case"agent":i.value={...i.value,...U};break;case"memory":r.value={...r.value,...U};break;case"compression":l.value={...l.value,...U};break;case"session_reset":d.value={...d.value,...U};break;case"privacy":g.value={...g.value,...U};break;case"approvals":T.value={...T.value,...U};break;case"telegram":O.value={...O.value,...U};break;case"discord":A.value={...A.value,...U};break;case"slack":f.value={...f.value,...U};break;case"whatsapp":B.value={...B.value,...U};break;case"matrix":M.value={...M.value,...U};break;case"wecom":Y.value={...Y.value,...U};break;case"feishu":te.value={...te.value,...U};break;case"dingtalk":ue.value={...ue.value,...U};break;case"qqbot":J.value={...J.value,...U};break;case"weixin":de.value={...de.value,...U};break;case"platforms":for(const[ke,R]of Object.entries(U))ne.value={...ne.value,[ke]:{...ne.value[ke]||{},...R}};break}}async function $(Q,U,ke){e.value=!0;try{switch(await er(Q,U,ke),Q){case"display":a.value={...a.value,...U};break;case"agent":i.value={...i.value,...U};break;case"memory":r.value={...r.value,...U};break;case"compression":l.value={...l.value,...U};break;case"session_reset":d.value={...d.value,...U};break;case"privacy":g.value={...g.value,...U};break;case"approvals":T.value={...T.value,...U};break;case"telegram":O.value={...O.value,...U};break;case"discord":A.value={...A.value,...U};break;case"slack":f.value={...f.value,...U};break;case"whatsapp":B.value={...B.value,...U};break;case"matrix":M.value={...M.value,...U};break;case"wechat":case"wecom":Y.value={...Y.value,...U};break;case"feishu":te.value={...te.value,...U};break;case"dingtalk":ue.value={...ue.value,...U};break;case"qqbot":J.value={...J.value,...U};break;case"weixin":de.value={...de.value,...U};break;case"platforms":for(const[R,h]of Object.entries(U))ne.value={...ne.value,[R]:{...ne.value[R]||{},...h}};break}}finally{e.value=!1}}return{loading:o,saving:e,display:a,agent:i,memory:r,compression:l,sessionReset:d,privacy:g,approvals:T,telegram:O,discord:A,slack:f,whatsapp:B,matrix:M,wecom:Y,feishu:te,dingtalk:ue,qqbot:J,weixin:de,platforms:ne,fetchSettings:p,saveSection:$,updateLocal:H}})}));function Ra(){if(typeof window>"u")return null;const o=window.AudioContext||window.webkitAudioContext;return o?(uo||(uo=new o),uo):null}function tr(){const o=Ra();!o||o.state!=="suspended"||o.resume().catch(()=>{})}async function nr(){const o=Ra();if(!o)return!1;try{o.state==="suspended"&&await o.resume();const e=o.currentTime,a=.16,i=o.createOscillator(),r=o.createGain();return i.type="sine",i.frequency.setValueAtTime(880,e),i.frequency.exponentialRampToValueAtTime(660,e+a),r.gain.setValueAtTime(1e-4,e),r.gain.exponentialRampToValueAtTime(.18,e+.015),r.gain.exponentialRampToValueAtTime(1e-4,e+a),i.connect(r),r.connect(o.destination),i.start(e),i.stop(e+a),!0}catch(e){return console.warn("Failed to play completion sound:",e),!1}}var uo,ir=be((()=>{uo=null}));function qo(o){const e=[];let a=o.replace(Ea,i=>(e.push(i),`${go}${e.length-1}${ho}`));return a=a.replace(La,i=>(e.push(i),`${go}${e.length-1}${ho}`)),{masked:a,blocks:e}}function Eo(o,e){if(e.length===0)return o;const a=new RegExp(`${go}(\\d+)${ho}`,"g");let i=o;for(let r=0;r<e.length;r+=1){const l=i.replace(a,(d,g)=>e[Number(g)]??"");if(l===i)break;i=l}return i}function _s(o,e){const{masked:a,blocks:i}=qo(o),r=[];let l=null,d="",g=0;Bo.lastIndex=0;let T;for(;(T=Bo.exec(a))!==null;)d+=a.slice(g,T.index),r.push(T[2]),g=T.index+T[0].length;const O=a.slice(g),A=O.match(/<(think|thinking|reasoning)>([\s\S]*)$/i);return A?(d+=O.slice(0,A.index),e.streaming?l=A[2]:d+=O.slice(A.index)):d+=O,{segments:r.map(f=>Eo(f,i)),pending:l===null?null:Eo(l,i),body:Eo(d,i),hasThinking:r.length>0||l!==null}}function ws(o){const e=a=>[...a].length;return o.segments.reduce((a,i)=>a+e(i),0)+e(o.pending||"")}function rr(o,e){const a=qo(o).masked,i=qo(e).masked;return{startedAtBoundary:!Oo.test(a)&&Oo.test(i),endedAtBoundary:!Wo.test(a)&&Wo.test(i)}}var Bo,go,ho,Ea,La,Oo,Wo,sr=be((()=>{Bo=/<(think|thinking|reasoning)>([\s\S]*?)<\/\1>/gi,go="\0THKCODE",ho="\0",Ea=/(^|\n)( {0,3})(`{3,}|~{3,})[^\n]*\n[\s\S]*?\n\2\3[ \t]*(?=\n|$)/g,La=/`[^`\n]*`/g,Oo=/<(think|thinking|reasoning)>/i,Wo=/<\/(think|thinking|reasoning)>/i}));function fe(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Lo(o){if(typeof o!="string"||!o.trim())return!1;try{const e=JSON.parse(o);if(e&&typeof e=="object"){const a=e;if(a.success===!1||a.error!=null&&String(a.error).trim()!=="")return!0}}catch{return!1}return!1}async function lr(o){if(o.length===0)return[];const e=new FormData;for(const d of o)d.file&&e.append("file",d.file,d.name);const a=localStorage.getItem("hermes_api_key")||"",i=ya(),r={};a&&(r.Authorization=`Bearer ${a}`),i&&(r["X-Hermes-Profile"]=i);const l=await fetch("/upload",{method:"POST",body:e,headers:r});if(!l.ok)throw new Error(`Upload failed: ${l.status}`);return(await l.json()).files}async function dr(o,e,a){const i=[];if(o.trim()&&i.push({type:"text",text:o.trim()}),e&&e.length>0&&a)for(let r=0;r<a.length;r++){const l=a[r],d=e[r];d?.type.startsWith("image/")?i.push({type:"image",name:l.name,path:l.path,media_type:d.type}):i.push({type:"file",name:l.name,path:l.path,media_type:d?.type})}return i}function Fo(o){const e=o.filter(l=>l.role==="assistant"?(l.tool_calls?.length||0)>0||l.content&&l.content.trim()!=="":!0),a=new Map,i=new Map;for(const l of e)if(l.role==="assistant"&&l.tool_calls)for(const d of l.tool_calls)d.id&&(d.function?.name&&a.set(d.id,d.function.name),d.function?.arguments&&i.set(d.id,d.function.arguments));const r=[];for(const l of e){if(l.role==="assistant"&&l.tool_calls?.length&&!l.content?.trim()){for(const d of l.tool_calls)r.push({id:String(l.id)+"_"+d.id,role:"tool",content:"",timestamp:Math.round(l.timestamp*1e3),toolName:d.function?.name||void 0,toolCallId:d.id,toolArgs:d.function?.arguments||void 0,toolStatus:"done"});continue}if(l.role==="tool"){const d=l.tool_call_id||"",g=l.tool_name||a.get(d)||void 0,T=i.get(d)||void 0;let O="";if(l.content)try{const f=JSON.parse(l.content);O=f.url||f.title||f.preview||f.summary||""}catch{O=l.content.slice(0,80)}const A=r.findIndex(f=>f.role==="tool"&&f.toolName===g&&!f.toolResult&&f.id.includes("_"+d));A!==-1&&r.splice(A,1),r.push({id:String(l.id),role:"tool",content:"",timestamp:Math.round(l.timestamp*1e3),toolName:g,toolCallId:d||void 0,toolArgs:T,toolPreview:typeof O=="string"&&O.slice(0,100)||void 0,toolResult:l.content||void 0,toolStatus:"done"});continue}r.push({id:String(l.id),role:l.role,content:l.content||"",timestamp:Math.round(l.timestamp*1e3),reasoning:l.reasoning?l.reasoning:void 0,systemType:l.role==="command"?"command":void 0})}return r}function cr(o){return{id:o.id,profile:o.profile||"default",title:o.title||"",source:o.source||void 0,messages:[],createdAt:Math.round(o.started_at*1e3),updatedAt:Math.round((o.last_active||o.ended_at||o.started_at)*1e3),model:o.model,provider:o.provider||o.billing_provider||"",messageCount:o.message_count,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 Fa(){try{return Xe().activeProfileName||"default"}catch{return"default"}}function mo(){return za+Fa()}function ga(){return Fa()==="default"?fo:null}function ur(o){if(!o||typeof o!="object")return!1;const e=o;return e.name==="QuotaExceededError"||e.code===22||e.code===1014}function mr(){try{const o=["hermes_sessions_cache_v1_","hermes_session_msgs_v1_","hermes_session_pins_v1_","hermes_human_only_v1_"],e=[];for(let a=0;a<localStorage.length;a++){const i=localStorage.key(a);i&&(i===mo()||i===fo||o.some(r=>i.startsWith(r))&&e.push(i))}e.forEach(a=>jo(a)),e.length>0&&console.log(`Recovered storage: cleared ${e.length} old session cache entries`)}catch{}}function pr(o,e){try{localStorage.setItem(o,e);return}catch(a){if(!ur(a))return}mr();try{localStorage.setItem(o,e)}catch{}}function ha(o){try{return localStorage.getItem(o)}catch{return null}}function jo(o){try{localStorage.removeItem(o)}catch{}}var za,fo,Zo,Ua=be((()=>{$i(),Da(),Ie(),Yi(),Go(),ve(),bo(),ko(),ar(),ir(),sr(),za="hermes_active_session_",fo="hermes_active_session",Zo=ka("chat",()=>{const o=S([]),e=S(null),a=S(null),i=S(new Map),r=S(new Set),l=S(null),d=S(new Map),g=S(new Map),T=S(new Map),O=se(()=>{const t=e.value;return t&&T.value.get(t)||null}),A=S(!1);function f(t){A.value=t}const B=se(()=>{const t=e.value;return t==null?!1:i.value.has(t)||r.value.has(t)}),M=S(!1),Y=S(!1),te=S(!1),ue=se(()=>B.value),J=S(null);function de(t){J.value=t}const ne=S(null),p=se(()=>ne.value?.aborting===!0);function H(t){ne.value=t}const $=S(null),Q=se(()=>$.value?.messages||[]);function U(t){return i.value.has(t)||r.value.has(t)}function ke(){e.value=null,$.value=null,a.value=null,H(null),de(null),jo(mo())}async function R(t,s){M.value=!0;try{const c=(await Uo(void 0,void 0,t||void 0)).map(cr),v=new Map(o.value.map(K=>[K.id,K.messages]));for(const K of c){const w=v.get(K.id);w&&w.length&&(K.messages=w)}o.value=c;const y=e.value,C=ga(),G=ha(mo())||(C?ha(fo):null),Z=s&&o.value.some(K=>K.id===s)?s:y&&o.value.some(K=>K.id===y)?y:G&&o.value.some(K=>K.id===G)?G:o.value[0]?.id;Z?await ye(Z):ke()}catch(c){console.error("Failed to load sessions:",c)}finally{M.value=!1,Y.value=!0}}async function h(){const t=e.value;if(!t)return!1;try{const s=await Qi(t,$.value?.profile);if(!s)return!1;const c=o.value.find(v=>v.id===t);return c?(c.messages=Fo(s.messages||[]),s.title&&(c.title=s.title),!0):!1}catch(s){return console.error("Failed to refresh active session:",s),!1}}function P(t={}){const s={id:fe(),profile:t.profile||Xe().activeProfileName||"default",title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now(),model:t.model||void 0,provider:t.provider||""};return o.value.unshift(s),s}function j(){const t=new Date,s={id:`${[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0"),"_",String(t.getHours()).padStart(2,"0"),String(t.getMinutes()).padStart(2,"0"),String(t.getSeconds()).padStart(2,"0")].join("")}_${Math.random().toString(16).slice(2,8)}`,title:"",source:"cli",messages:[],createdAt:Date.now(),updatedAt:Date.now()};return o.value.unshift(s),s}async function ye(t,s){na(t),e.value=t,a.value=s??null,pr(mo(),t);const c=ga();if(c&&jo(c),$.value=o.value.find(v=>v.id===t)||null,!!$.value){te.value=!0;try{await new Promise((v,y)=>{const C=setTimeout(()=>y(new Error("resume timeout")),15e3);ma(t,G=>{if(clearTimeout(C),G.session_id!==t||e.value!==t){v();return}const Z=o.value.find(K=>K.id===t);if(!Z){v();return}if(G.isWorking?r.value.add(t):r.value.delete(t),G.queueLength&&G.queueLength>0?d.value.set(t,G.queueLength):d.value.delete(t),Array.isArray(G.queueMessages)?Ao(t,ea(G.queueMessages)):G.queueLength||Ao(t,[]),G.isAborting?H({aborting:!0,synced:null}):G.isWorking||H(null),G.inputTokens!=null&&(Z.inputTokens=G.inputTokens),G.outputTokens!=null&&(Z.outputTokens=G.outputTokens),G.contextTokens!=null&&(Z.contextTokens=G.contextTokens),G.messages?.length&&(Z.messages=Fo(G.messages)),!Z.title){const K=Z.messages.find(w=>w.role==="user");K&&(Z.title=K.content.slice(0,40)+(K.content.length>40?"...":""))}if($.value=Z,G.events?.length)for(const K of G.events){const w=K.data;if(w.event==="compression.started")de({compressing:!0,messageCount:w.message_count||0,beforeTokens:w.token_count||0,afterTokens:0,compressed:null});else if(w.event==="compression.completed"){const m=w.contextTokens||w.afterTokens||0;de({compressing:!1,messageCount:w.totalMessages||0,beforeTokens:w.beforeTokens||0,afterTokens:m,compressed:w.compressed??!1,error:w.error}),w.contextTokens!=null&&(Z.contextTokens=w.contextTokens)}else if(w.event==="abort.started")H({aborting:!0,synced:null});else if(w.event==="abort.completed")H({aborting:!1,synced:w.synced??!1});else if(w.event==="approval.requested")To({...w,session_id:t});else if(w.event==="approval.resolved")xo({...w,session_id:t});else if(w.event==="run.failed")to(t,w.error),r.value.delete(t),d.value.delete(t);else if(w.event==="tool.started"){const m=k(t),z=w.tool_call_id,E=z?m.find(x=>x.role==="tool"&&x.toolCallId===z):null;E?ie(t,E.id,{toolName:w.tool||w.name,toolArgs:typeof w.arguments=="string"?w.arguments:E.toolArgs,toolPreview:w.preview||E.toolPreview,toolStatus:E.toolStatus||"running"}):pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:w.tool||w.name,toolCallId:z,toolPreview:w.preview,toolArgs:typeof w.arguments=="string"?w.arguments:void 0,toolStatus:"running"})}else if(w.event==="tool.completed"){const m=k(t),z=w.tool_call_id,E=z?m.filter(x=>x.role==="tool"&&x.toolCallId===z):m.filter(x=>x.role==="tool"&&x.toolStatus==="running");if(E.length>0){const x=typeof w.output=="string"?w.output:void 0;ie(t,E[E.length-1].id,{toolStatus:w.error===!0||Lo(x)?"error":"done",toolDuration:w.duration,toolResult:x})}}else String(w.event||"").startsWith("subagent.")&&Po(t,w)}v()},$.value?.profile)})}catch(v){console.error("Failed to load session messages via resume:",v)}finally{te.value=!1}e.value===t&&je(t)}}function We(t={}){const s=Ye(),c=P({profile:t.profile,model:t.model||s.selectedModel||void 0,provider:t.provider||s.selectedProvider||""});return ye(c.id),c}async function V(t,s,c){const v=c||$.value?.id;if(!v||!await Zi(v,t,s||""))return!1;const y=o.value.find(C=>C.id===v);return y&&(y.model=t,y.provider=s||""),$.value?.id===v&&($.value.model=t,$.value.provider=s||""),!0}async function me(t){await Ji(t,o.value.find(s=>s.id===t)?.profile),o.value=o.value.filter(s=>s.id!==t),e.value===t&&(o.value.length>0?await ye(o.value[0].id):ye(P().id))}function k(t){return o.value.find(s=>s.id===t)?.messages||[]}function pe(t,s){const c=o.value.find(v=>v.id===t);c&&c.messages.push(s)}function So(t){const s=o.value.findIndex(c=>c.id===t.id);s!==-1?o.value[s]=t:o.value.push(t)}function ie(t,s,c){const v=o.value.find(C=>C.id===t);if(!v)return;const y=v.messages.findIndex(C=>C.id===s);y!==-1&&(v.messages[y]={...v.messages[y],...c})}function Po(t,s){const c=String(s.event||"");if(!c.startsWith("subagent."))return;const v=String(s.subagent_id||`${s.task_index??0}`),y=`subagent:${s.run_id||"run"}:${v}`,C=Number(s.task_index??0),G=Number(s.task_count??1),Z=`${C+1}/${Math.max(1,G||1)}`,K=String(s.tool||s.name||""),w=Number(s.tool_count||0),m=String(s.goal||"").trim(),z=String(s.text||s.preview||"").trim(),E=String(s.summary||"").trim(),x=Number(s.duration_seconds??s.duration);let F=z||E||m;c==="subagent.start"?F=`subagent ${Z} started${m?`: ${m}`:""}`:c==="subagent.tool"?F=`${`subagent ${Z}${w?` turn ${w}`:""}`}${K?`: ${K}`:""}${z?` - ${z}`:""}`:c==="subagent.progress"?F=`subagent ${Z}: ${z||"working"}`:c==="subagent.complete"&&(F=`subagent ${Z} ${String(s.status||"completed")}${E?`: ${E}`:""}`);const ee=k(t).find(no=>no.role==="tool"&&no.toolCallId===y),ge=c==="subagent.complete"?s.status&&String(s.status)!=="completed"?"error":"done":"running",Te={toolName:"delegate_task",toolCallId:y,toolPreview:F.slice(0,220),toolStatus:ge,toolDuration:Number.isFinite(x)?x:void 0,toolResult:c==="subagent.complete"?JSON.stringify({status:s.status||"completed",summary:E||z,api_calls:s.api_calls,input_tokens:s.input_tokens,output_tokens:s.output_tokens},null,2):void 0};if(ee){ie(t,ee.id,Te);return}pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),...Te})}function to(t,s){const c=s?`Error: ${s}`:"Run failed",v=k(t),y=v[v.length-1];if(y?.isStreaming){ie(t,y.id,{role:"assistant",content:c,isStreaming:!1,systemType:"error"});return}y?.role==="assistant"&&y.systemType==="error"&&y.content===c||pe(t,{id:fe(),role:"assistant",content:c,timestamp:Date.now(),systemType:"error"})}function Xo(t){const s=t.session_id;if(!s)return;const c=o.value.find(C=>C.id===s),v=t.action;if(v==="clear"){if(c&&(c.messages=[]),g.value.delete(s),d.value.delete(s),t.clearHistory){const C=String(t.message||"");C&&pe(s,{id:fe(),role:"command",content:C,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}return}v==="title"&&c&&typeof t.title=="string"&&(c.title=t.title,c.updatedAt=Date.now()),v==="usage"&&c&&(c.inputTokens=t.inputTokens,c.outputTokens=t.outputTokens,t.contextTokens!=null&&(c.contextTokens=t.contextTokens)),v==="destroy"&&(i.value.delete(s),r.value.delete(s),d.value.delete(s),g.value.delete(s),H(null),k(s).forEach(C=>{C.isStreaming&&ie(s,C.id,{isStreaming:!1}),C.role==="tool"&&C.toolStatus==="running"&&(C.toolStatus="error")}));const y=String(t.message||"");y&&pe(s,{id:fe(),role:"command",content:y,timestamp:Date.now(),systemType:t.ok===!1?"error":"command",commandAction:v,commandData:{...t}})}function Co(t,s){const c=g.value.get(t)||[];if(c.some(y=>y.id===s.id))return;const v=new Map(g.value);v.set(t,[...c,{...s,queued:!0}]),g.value=v}function Na(t,s){const c=g.value.get(t);if(!c?.length)return;const v=c.filter(C=>C.id!==s),y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y,d.value.set(t,v.length),ca()?.emit("cancel_queued_run",{session_id:t,queue_id:s})}function ea(t){return Array.isArray(t)?t.flatMap(s=>{const c=s,v=typeof c?.content=="string"?c.content:"",y=c?.id!=null?String(c.id):"";return!y||!v.trim()?[]:[{id:y,role:"user",content:v,timestamp:typeof c?.timestamp=="number"&&Number.isFinite(c.timestamp)?Math.round(c.timestamp*1e3):Date.now(),queued:!0}]}):[]}function Ao(t,s){const c=new Map((g.value.get(t)||[]).map(C=>[C.id,C])),v=s.map(C=>({...c.get(C.id)||{},...C,attachments:c.get(C.id)?.attachments||C.attachments,queued:!0})),y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y}function oa(t,s){const c=Number(s.queue_length||0);if(c>0?d.value.set(t,c):d.value.delete(t),Array.isArray(s.queued_messages)&&!s.dequeued_queue_id){Ao(t,ea(s.queued_messages));return}const v=s.message,y=typeof v?.content=="string"?v.content:"",C=v?.id!=null?String(v.id):"";if(!C||!y.trim()||(g.value.get(t)||[]).some(m=>m.id===C))return;const G=typeof v?.timestamp=="number"&&Number.isFinite(v.timestamp)?Math.round(v.timestamp*1e3):Date.now(),Z=k(t),K=Z.findIndex(m=>m.id===C&&m.role==="user"),w=K>=0?Z[K]:null;K>=0&&Z.splice(K,1),Co(t,{...w||{},id:C,role:"user",content:y,timestamp:w?.timestamp||G,attachments:w?.attachments,queued:!0})}function To(t){const s=t.session_id,c=t.approval_id;if(!s||!c)return;const v=(Array.isArray(t.choices)?t.choices:["once","session","deny"]).filter(y=>y==="once"||y==="session"||y==="always"||y==="deny");T.value.set(s,{sessionId:s,approvalId:c,command:String(t.command||""),description:String(t.description||""),choices:v.length?v:["once","session","deny"],allowPermanent:!!t.allow_permanent,requestedAt:Date.now()}),T.value=new Map(T.value)}function xo(t){const s=t.session_id;if(!s)return;const c=T.value.get(s);if(!c)return;const v=t.approval_id;v&&c.approvalId!==v||(T.value.delete(s),T.value=new Map(T.value))}function qa(t){const s=O.value;s&&(Ki(s.sessionId,s.approvalId,t),T.value.delete(s.sessionId),T.value=new Map(T.value))}function aa(t){const s=g.value.get(t);if(!s?.length)return;const[c,...v]=s,y=new Map(g.value);v.length>0?y.set(t,v):y.delete(t),g.value=y,pe(t,{...c,queued:!1}),Fe(t)}function Fe(t){const s=o.value.find(c=>c.id===t);if(s){if(!s.title){const c=s.messages.find(v=>v.role==="user");if(c){const v=c.attachments?.length?c.attachments.map(y=>y.name).join(", "):c.content;s.title=v.slice(0,40)+(v.length>40?"...":"")}}s.updatedAt=Date.now()}}function Ba(){No().display.bell_on_complete&&tr()}function ta(){No().display.bell_on_complete&&nr()}async function Oa(t,s){if(!t.trim()&&!(s&&s.length>0))return;Ba(),$.value||ye(P().id);const c=e.value,v=$.value?$.value.messageCount==null||$.value.messageCount===0:!1,y=t.trim().startsWith("/"),C=y&&/^\/compress(?:\s|$)/i.test(t.trim()),G=U(c)&&!y,Z={id:fe(),role:y?"command":"user",content:t.trim(),timestamp:Date.now(),attachments:s&&s.length>0?s:void 0,queued:G,systemType:y?"command":void 0};G||(pe(c,Z),Fe(c));try{let K;if(s&&s.length>0){const _=await lr(s),W=new Map(_.map(D=>[D.name,Jo(D.path,D.name)]));if(G&&Z.attachments)Z.attachments=Z.attachments.map(D=>{const N=W.get(D.name);return N?{...D,url:N}:D});else{const D=k(c).findLast(N=>N.id===Z.id);D?.attachments&&(D.attachments=D.attachments.map(N=>{const q=W.get(N.name);return q?{...N,url:q}:N}))}K=await dr(t,s,_)}else K=t.trim();const w=Ye();await w.waitForModelsForRun();const m=$.value?.model||w.selectedModel,z=$.value?.provider||w.selectedProvider,E={input:K,session_id:c,profile:$.value?.profile||Xe().activeProfileName||void 0,model:v&&m||void 0,provider:v&&z||void 0,model_groups:w.modelGroups.map(_=>({provider:_.provider,models:_.models})),queue_id:Z.id,source:"cli"};v&&$.value&&($.value.messageCount=Math.max($.value.messageCount||0,1)),G&&Co(c,Z);const x=()=>{i.value.delete(c),r.value.delete(c)};let F=!1,ee=!1,ge=null;const Te=()=>{aa(c)},no=()=>{k(c).forEach(_=>{_.role==="assistant"&&_.isStreaming&&ie(c,_.id,{isStreaming:!1})}),ge=null},Va=Vi(E,_=>{switch(_.event){case"run.started":H(null),de(null),F=!1,ee=!1,no(),Te(),_.queue_length>0?d.value.set(c,_.queue_length):d.value.delete(c);break;case"run.queued":oa(c,_);break;case"session.command":Xo(_);break;case"compression.started":de({compressing:!0,messageCount:_.message_count||0,beforeTokens:_.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const W=_.contextTokens||_.afterTokens||0;if(de({compressing:!1,messageCount:_.totalMessages||0,beforeTokens:_.beforeTokens||0,afterTokens:W,compressed:_.compressed??!1,error:_.error}),_.contextTokens!=null){const D=o.value.find(N=>N.id===c);D&&(D.contextTokens=_.contextTokens)}setTimeout(()=>{J.value&&!J.value.compressing&&de(null)},5e3);break}case"abort.started":H({aborting:!0,synced:null});break;case"abort.completed":{if(H({aborting:!1,synced:_.synced??!1}),_.queue_length>0){d.value.set(c,_.queue_length),H(null);break}const W=k(c),D=W[W.length-1];D?.isStreaming&&ie(c,D.id,{isStreaming:!1}),W.forEach((N,q)=>{N.role==="tool"&&N.toolStatus==="running"&&(W[q]={...N,toolStatus:"done"})}),x(),H(null);break}case"reasoning.delta":case"thinking.delta":{const W=_.text||_.delta||"";if(!W)break;F=!0;const D=k(c),N=ge?D.find(q=>q.id===ge):null;if(N?.role==="assistant"&&N.isStreaming)N.reasoning=(N.reasoning||"")+W,Ke(N.id);else{const q=fe();pe(c,{id:q,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:W}),ge=q,Ke(q)}break}case"reasoning.available":{const W=k(c),D=W[W.length-1];D?.role==="assistant"&&D.isStreaming&&Ve(D.id);break}case"message.delta":{_.delta&&(F=!0);const W=k(c),D=ge?W.find(N=>N.id===ge):null;if(D?.role==="assistant"&&D.isStreaming){const N=D.content,q=N+(_.delta||"");Ge(D.id,N,q),D.reasoning&&Ve(D.id),D.content=q}else{const N=fe(),q=_.delta||"";Ge(N,"",q),pe(c,{id:N,role:"assistant",content:q,timestamp:Date.now(),isStreaming:!0}),ge=N}break}case"tool.started":{ee=!0;const W=k(c),D=_.tool_call_id,N=ge?W.find(_e=>_e.id===ge):W[W.length-1];N?.isStreaming&&ie(c,N.id,{isStreaming:!1}),ge=null;const q=D?W.find(_e=>_e.role==="tool"&&_e.toolCallId===D):null;if(q){ie(c,q.id,{toolName:_.tool||_.name,toolArgs:typeof _.arguments=="string"?_.arguments:q.toolArgs,toolPreview:_.preview||q.toolPreview,toolStatus:q.toolStatus||"running"});break}pe(c,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:_.tool||_.name,toolCallId:D,toolPreview:_.preview,toolArgs:typeof _.arguments=="string"?_.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{ee=!0;const W=k(c),D=_.tool_call_id,N=D?W.filter(q=>q.role==="tool"&&q.toolCallId===D):W.filter(q=>q.role==="tool"&&q.toolStatus==="running");if(N.length>0){const q=N[N.length-1],_e=typeof _.output=="string"?_.output:void 0,$e=_.error===!0||Lo(_e),$a=_.duration;ie(c,q.id,{toolStatus:$e?"error":"done",toolDuration:$a,toolResult:_e})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":ee=!0,Po(c,_);break;case"approval.requested":To(_);break;case"approval.resolved":xo(_);break;case"run.completed":{const W=k(c),D=ge?W.find(q=>q.id===ge):W[W.length-1];if(D?.isStreaming&&ie(c,D.id,{isStreaming:!1}),_.inputTokens!=null){const q=o.value.find(_e=>_e.id===c);q&&(q.inputTokens=_.inputTokens,q.outputTokens=_.outputTokens,_.contextTokens!=null&&(q.contextTokens=_.contextTokens))}let N="";if(_.parsed_content!==void 0){const q=k(c),_e=ge?q.find($e=>$e.id===ge):[...q].reverse().find($e=>$e.role==="assistant");_e&&(ie(c,_e.id,{content:_.parsed_content||""}),_.parsed_reasoning&&ie(c,_e.id,{reasoning:_.parsed_reasoning}),N=(_.parsed_content||"").trim())}else{const q=typeof _.output=="string"?_.output:"";N=q.trim(),!F&&N!==""&&(pe(c,{id:fe(),role:"assistant",content:q,timestamp:Date.now()}),F=!0)}if(!F&&!ee&&N===""?pe(c,{id:fe(),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()}):ta(),A.value){const q=[...k(c)].reverse().find(_e=>_e.role==="assistant");q?.content&&setTimeout(()=>{Ho(q.id,q.content)},300)}_.queue_remaining>0?d.value.set(c,_.queue_remaining):x(),ge=null,Fe(c);break}case"run.failed":{if(_.inputTokens!=null){const D=o.value.find(N=>N.id===c);D&&(D.inputTokens=_.inputTokens,D.outputTokens=_.outputTokens,_.contextTokens!=null&&(D.contextTokens=_.contextTokens))}to(c,_.error);const W=k(c);W.forEach((D,N)=>{D.role==="tool"&&D.toolStatus==="running"&&(W[N]={...D,toolStatus:"error"})}),_.queue_remaining>0?d.value.set(c,_.queue_remaining):x();break}case"usage.updated":{const W=o.value.find(D=>D.id===c);W&&(W.inputTokens=_.inputTokens,W.outputTokens=_.outputTokens,_.contextTokens!=null&&(W.contextTokens=_.contextTokens));break}}},()=>{const _=k(c),W=_[_.length-1];W?.isStreaming&&ie(c,W.id,{isStreaming:!1}),x(),Fe(c)},_=>{console.warn("Socket.IO run stream error:",_.message),to(c,_.message);const W=k(c);W.forEach((D,N)=>{D.role==="tool"&&D.toolStatus==="running"&&(W[N]={...D,toolStatus:"error"})}),x()},void 0);(!y||C)&&i.value.set(c,Va)}catch(K){pe(c,{id:fe(),role:"system",content:`Error: ${K.message}`,timestamp:Date.now()})}}function je(t,s=!1){if(i.value.has(t)||!s&&!r.value.has(t))return;let c=!1,v=!1,y=!1,C=null;const G=()=>{c||(c=!0,i.value.delete(t),r.value.delete(t),ji(t))},Z=()=>{aa(t)},K=()=>{k(t).forEach(m=>{m.role==="assistant"&&m.isStreaming&&ie(t,m.id,{isStreaming:!1})}),C=null};function w(m){if(!c&&!(m.session_id&&m.session_id!==t))switch(m.event){case"run.queued":oa(t,m);break;case"session.command":Xo(m);break;case"run.started":H(null),de(null),v=!1,y=!1,K(),Z(),m.queue_length>0?d.value.set(t,m.queue_length):d.value.delete(t);break;case"compression.started":de({compressing:!0,messageCount:m.message_count||0,beforeTokens:m.token_count||0,afterTokens:0,compressed:null});break;case"compression.completed":{const z=m.contextTokens||m.afterTokens||0;if(de({compressing:!1,messageCount:m.totalMessages||0,beforeTokens:m.beforeTokens||0,afterTokens:z,compressed:m.compressed??!1,error:m.error}),m.contextTokens!=null){const E=o.value.find(x=>x.id===t);E&&(E.contextTokens=m.contextTokens)}setTimeout(()=>{J.value&&!J.value.compressing&&de(null)},5e3);break}case"abort.started":H({aborting:!0,synced:null});break;case"abort.completed":{if(H({aborting:!1,synced:m.synced??!1}),m.queue_length>0){d.value.set(t,m.queue_length),H(null);break}const z=k(t),E=z[z.length-1];E?.isStreaming&&ie(t,E.id,{isStreaming:!1}),z.forEach((x,F)=>{x.role==="tool"&&x.toolStatus==="running"&&(z[F]={...x,toolStatus:"done"})}),G(),H(null);break}case"reasoning.delta":case"thinking.delta":{const z=m.text||m.delta||"";if(!z)break;v=!0;const E=k(t),x=C?E.find(F=>F.id===C):null;if(x?.role==="assistant"&&x.isStreaming)x.reasoning=(x.reasoning||"")+z,Ke(x.id);else{const F=fe();pe(t,{id:F,role:"assistant",content:"",timestamp:Date.now(),isStreaming:!0,reasoning:z}),C=F,Ke(F)}break}case"reasoning.available":{const z=k(t),E=z[z.length-1];E?.role==="assistant"&&E.isStreaming&&Ve(E.id);break}case"message.delta":{m.delta&&(v=!0);const z=k(t),E=C?z.find(x=>x.id===C):null;if(E?.role==="assistant"&&E.isStreaming){const x=E.content,F=x+(m.delta||"");Ge(E.id,x,F),E.reasoning&&Ve(E.id),E.content=F}else{const x=fe(),F=m.delta||"";Ge(x,"",F),pe(t,{id:x,role:"assistant",content:F,timestamp:Date.now(),isStreaming:!0}),C=x}break}case"tool.started":{y=!0;const z=k(t),E=m.tool_call_id,x=C?z.find(ee=>ee.id===C):z[z.length-1];x?.isStreaming&&ie(t,x.id,{isStreaming:!1}),C=null;const F=E?z.find(ee=>ee.role==="tool"&&ee.toolCallId===E):null;if(F){ie(t,F.id,{toolName:m.tool||m.name,toolArgs:typeof m.arguments=="string"?m.arguments:F.toolArgs,toolPreview:m.preview||F.toolPreview,toolStatus:F.toolStatus||"running"});break}pe(t,{id:fe(),role:"tool",content:"",timestamp:Date.now(),toolName:m.tool||m.name,toolCallId:E,toolPreview:m.preview,toolArgs:typeof m.arguments=="string"?m.arguments:void 0,toolStatus:"running"});break}case"tool.completed":{y=!0;const z=k(t),E=m.tool_call_id,x=E?z.filter(F=>F.role==="tool"&&F.toolCallId===E):z.filter(F=>F.role==="tool"&&F.toolStatus==="running");if(x.length>0){const F=typeof m.output=="string"?m.output:void 0,ee=m.error===!0||Lo(F);ie(t,x[x.length-1].id,{toolStatus:ee?"error":"done",toolDuration:m.duration,toolResult:F})}break}case"subagent.start":case"subagent.tool":case"subagent.progress":case"subagent.complete":y=!0,Po(t,m);break;case"approval.requested":To(m);break;case"approval.resolved":xo(m);break;case"run.completed":{const z=m.queue_remaining>0;z?d.value.set(t,m.queue_remaining):d.value.delete(t);const E=k(t),x=C?E.find(ee=>ee.id===C):E[E.length-1];if(x?.isStreaming&&ie(t,x.id,{isStreaming:!1}),m.inputTokens!=null){const ee=o.value.find(ge=>ge.id===t);ee&&(ee.inputTokens=m.inputTokens,ee.outputTokens=m.outputTokens,m.contextTokens!=null&&(ee.contextTokens=m.contextTokens))}let F="";if(m.parsed_content!==void 0){const ee=k(t),ge=C?ee.find(Te=>Te.id===C):[...ee].reverse().find(Te=>Te.role==="assistant");ge&&(ie(t,ge.id,{content:m.parsed_content||""}),m.parsed_reasoning&&ie(t,ge.id,{reasoning:m.parsed_reasoning}),F=(m.parsed_content||"").trim())}else{const ee=typeof m.output=="string"?m.output:"";F=ee.trim(),!v&&F!==""&&pe(t,{id:fe(),role:"assistant",content:ee,timestamp:Date.now()})}if(!v&&!y&&F===""?pe(t,{id:fe(),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()}):ta(),A.value){const ee=[...k(t)].reverse().find(ge=>ge.role==="assistant");ee?.content&&setTimeout(()=>{Ho(ee.id,ee.content)},300)}z||G(),C=null,Fe(t);break}case"run.failed":{if(m.inputTokens!=null){const x=o.value.find(F=>F.id===t);x&&(x.inputTokens=m.inputTokens,x.outputTokens=m.outputTokens,m.contextTokens!=null&&(x.contextTokens=m.contextTokens))}const z=m.queue_remaining>0;z?d.value.set(t,m.queue_remaining):d.value.delete(t),to(t,m.error);const E=k(t);E.forEach((x,F)=>{x.role==="tool"&&x.toolStatus==="running"&&(E[F]={...x,toolStatus:"error"})}),z||G();break}case"usage.updated":{const z=o.value.find(E=>E.id===t);z&&(z.inputTokens=m.inputTokens,z.outputTokens=m.outputTokens,m.contextTokens!=null&&(z.contextTokens=m.contextTokens));break}}}Wi(t,{onMessageDelta:m=>w(m),onReasoningDelta:m=>w(m),onThinkingDelta:m=>w(m),onReasoningAvailable:m=>w(m),onToolStarted:m=>w(m),onToolCompleted:m=>w(m),onSubagentEvent:m=>w(m),onRunStarted:m=>w(m),onRunCompleted:m=>w(m),onRunFailed:m=>w(m),onCompressionStarted:m=>w(m),onCompressionCompleted:m=>w(m),onAbortStarted:m=>w(m),onAbortCompleted:m=>w(m),onUsageUpdated:m=>w(m),onSessionCommand:m=>w(m),onRunQueued:m=>w(m)}),i.value.set(t,{abort:()=>{ca()?.emit("abort",{session_id:t})}})}function Wa(t){const s=t.session_id;if(!s||e.value!==s||!$.value)return;const c=t.message,v=typeof c?.content=="string"?c.content:"";if(!v.trim())return;const y=c?.id!=null?String(c.id):"",C=k(s);if(y&&C.some(K=>K.id===y)){r.value.add(s),je(s,!0);return}if(y&&(g.value.get(s)||[]).some(K=>K.id===y)){r.value.add(s),je(s,!0);return}const G=typeof c?.timestamp=="number"&&Number.isFinite(c.timestamp)?Math.round(c.timestamp*1e3):Date.now(),Z={id:y||fe(),role:"user",content:v,timestamp:G,queued:!!c?.queued};c?.queued?Co(s,Z):(pe(s,Z),Fe(s)),r.value.add(s),je(s,!0)}Gi(Wa);function ja(){const t=e.value;if(!t||p.value)return;const s=i.value.get(t);if(s){H({aborting:!0,synced:null}),s.abort();const c=k(t),v=c[c.length-1];v?.isStreaming&&ie(t,v.id,{isStreaming:!1}),window.setTimeout(()=>{e.value===t&&ne.value?.aborting&&(i.value.delete(t),r.value.delete(t),H(null))},2e4)}}typeof document<"u"&&document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&e.value&&!B.value){const t=e.value;t&&!i.value.has(t)&&ma(t,s=>{s.isWorking?r.value.add(t):r.value.delete(t),s.isAborting?H({aborting:!0,synced:null}):s.isWorking||H(null),s.messages?.length&&$.value&&($.value.messages=Fo(s.messages)),je(t)},$.value?.profile)}});const Ae=new Map;function Ga(t){return Ae.get(t)}function Ge(t,s,c){const{startedAtBoundary:v,endedAtBoundary:y}=rr(s,c);if(!v&&!y)return;const C=Ae.get(t)||{};v&&C.startedAt===void 0&&(C.startedAt=Date.now()),y&&C.endedAt===void 0&&(C.endedAt=Date.now()),Ae.set(t,C)}function Ke(t){const s=Ae.get(t)||{};s.startedAt===void 0&&(s.startedAt=Date.now(),Ae.set(t,s))}function Ve(t){const s=Ae.get(t);!s||s.startedAt===void 0||s.endedAt===void 0&&(s.endedAt=Date.now(),Ae.set(t,s))}function Ka(t){if(!t)return;const s=t.toLowerCase();for(const c of o.value)(c.provider||"").toLowerCase()===s&&(c.model=void 0,c.provider="")}function na(t){Ae.clear()}function Ho(t,s){const c=new CustomEvent("auto-play-speech",{detail:{messageId:t,content:s}});window.dispatchEvent(c)}return{sessions:o,activeSessionId:e,activeSession:$,focusMessageId:a,messages:Q,isStreaming:B,isRunActive:ue,isSessionLive:U,sessionProfileFilter:l,compressionState:J,abortState:ne,isAborting:p,queueLengths:d,queuedUserMessages:g,pendingApprovals:T,activePendingApproval:O,removeQueuedMessage:Na,isLoadingSessions:M,sessionsLoaded:Y,isLoadingMessages:te,newChat:We,newCliSession:j,switchSession:ye,switchSessionModel:V,addOrUpdateSession:So,clearProviderFromSessions:Ka,deleteSession:me,sendMessage:Oa,stopStreaming:ja,respondApproval:qa,loadSessions:R,refreshActiveSession:h,getThinkingObservation:Ga,noteThinkingDelta:Ge,noteReasoningStart:Ke,noteReasoningEnd:Ve,clearThinkingObservationFor:na,setAutoPlaySpeech:f,playMessageSpeech:Ho}})}));ve();ao();Ua();function gr(){const o=oo(),e=Zo(),{sessionSearchOpen:a,openSessionSearch:i,closeSessionSearch:r}=$o();function l(d){const g=d.ctrlKey||d.metaKey;if(g&&d.key==="n"){d.preventDefault(),e.newChat();return}if(g&&d.key==="j"){d.preventDefault(),o.push({name:"hermes.jobs"});return}if(g&&d.key.toLowerCase()==="k"){if(o.currentRoute.value.name==="login")return;d.preventDefault(),i();return}if(d.key==="Escape"){if(a.value){d.preventDefault(),r();return}const T=document.querySelector(".n-modal-mask");T&&T.querySelector(".n-base-close")?.click()}}eo(()=>{window.addEventListener("keydown",l)}),vo(()=>{window.removeEventListener("keydown",l)})}ve();ao();xe();Ce();Da();Ua();var hr={class:"session-search-modal"},fr={class:"search-header"},vr={class:"search-title"},_r={class:"search-hint"},wr={class:"search-scope"},br={class:"search-body"},kr={key:0,class:"search-empty"},yr={key:1,class:"result-list"},Sr=["onClick","onMouseenter"],Pr={class:"result-main"},Cr={class:"result-title-row"},Ar={class:"result-title"},Tr={class:"result-source"},xr={class:"result-snippet"},Hr={class:"result-meta"},Ir={class:"result-time"},Mr={key:0,class:"result-match"},Dr={class:"search-footer"},Rr=Pe({__name:"SessionSearchModal",setup(o){const{t:e}=He(),a=_o(),i=oo(),r=Zo(),{sessionSearchOpen:l}=$o(),d=S(""),g=S(!1),T=S([]),O=S([]),A=S(0),f=S(null),B=se(()=>r.sessionProfileFilter||void 0);let M=null,Y=0;const te=se(()=>d.value.trim().length>0),ue=se(()=>te.value?O.value:T.value.map(h=>({...h,matched_message_id:null,snippet:h.preview||"",rank:0})));function J(h){return{api_server:"API Server",cli:"CLI",telegram:"Telegram",discord:"Discord",slack:"Slack",matrix:"Matrix",whatsapp:"WhatsApp",signal:"Signal",cron:"Cron",weixin:"WeChat"}[h]||h}function de(h){return h?new Date(h*1e3).toLocaleString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function ne(h){const P=h.title?.trim();return P||(h.preview?.trim()?h.preview.trim():h.id)}async function p(){const h=++Y;g.value=!0;try{const P=B.value?await Uo(void 0,8,B.value):await Uo(void 0,8);if(h!==Y)return;T.value=P,O.value=[],A.value=0}catch(P){if(h!==Y)return;a.error(P instanceof Error?P.message:e("chat.searchFailed"))}finally{h===Y&&(g.value=!1)}}async function H(h){const P=++Y;g.value=!0;try{const j=h.trim()?B.value?await pa(h.trim(),void 0,10,B.value):await pa(h.trim(),void 0,10):[];if(P!==Y)return;O.value=j,A.value=0}catch(j){if(P!==Y)return;a.error(j instanceof Error?j.message:e("chat.searchFailed"))}finally{P===Y&&(g.value=!1)}}async function $(){r.sessions.length===0&&await r.loadSessions(r.sessionProfileFilter)}async function Q(h){const P=h.matched_message_id!=null?String(h.matched_message_id):null;l.value=!1,await $(),!r.sessions.some(j=>j.id===h.id)&&typeof r.addOrUpdateSession=="function"&&r.addOrUpdateSession({id:h.id,profile:h.profile||"default",title:h.title||"",source:h.source,messages:[],createdAt:Math.round(h.started_at*1e3),updatedAt:Math.round((h.last_active||h.ended_at||h.started_at)*1e3),model:h.model,provider:h.provider||h.billing_provider||"",messageCount:h.message_count,endedAt:h.ended_at!=null?Math.round(h.ended_at*1e3):null,lastActiveAt:h.last_active!=null?Math.round(h.last_active*1e3):void 0,workspace:h.workspace||null}),await r.switchSession(h.id,P),i.currentRoute.value.name!=="hermes.chat"&&await i.push({name:"hermes.chat"})}function U(){l.value=!1}function ke(h){const P=ue.value;P.length!==0&&(A.value=(A.value+h+P.length)%P.length)}async function R(h){if(l.value){if(h.key==="ArrowDown"){h.preventDefault(),ke(1);return}if(h.key==="ArrowUp"){h.preventDefault(),ke(-1);return}if(h.key==="Enter"){h.preventDefault();const P=ue.value[A.value];P&&await Q(P);return}h.key==="Escape"&&(h.preventDefault(),U())}}return Re(()=>l.value,async h=>{if(!h){d.value="",O.value=[],T.value=[],A.value=0;return}d.value="",O.value=[],A.value=0,await p(),await it(),f.value?.focus?.()}),Re(d,h=>{M&&(clearTimeout(M),M=null),M=setTimeout(()=>{l.value&&H(h)},160)}),Re(ue,()=>{A.value>=ue.value.length&&(A.value=0)}),eo(()=>{window.addEventListener("keydown",R)}),vo(()=>{window.removeEventListener("keydown",R),M&&clearTimeout(M)}),(h,P)=>(I(),Le(u(Be),{show:u(l),"onUpdate:show":P[1]||(P[1]=j=>Za(l)?l.value=j:null),preset:"card",title:u(e)("chat.searchTitle"),style:{width:"min(760px, calc(100vw - 24px))"},"mask-closable":!0,"auto-focus":!1},{default:ce(()=>[n("div",hr,[n("div",fr,[n("div",vr,b(u(e)("chat.searchSubtitle")),1),n("div",_r,b(u(e)("chat.searchHint")),1)]),n("div",wr,b(u(e)("chat.searchScope")),1),X(u(zo),{ref_key:"inputRef",ref:f,value:d.value,"onUpdate:value":P[0]||(P[0]=j=>d.value=j),placeholder:u(e)("chat.searchPlaceholder"),clearable:"",size:"large"},null,8,["value","placeholder"]),n("div",br,[X(u(ba),{show:g.value},{default:ce(()=>[ue.value.length===0?(I(),L("div",kr,b(te.value?u(e)("chat.searchNoResults"):u(e)("chat.searchEmpty")),1)):(I(),L("div",yr,[(I(!0),L(qe,null,Oe(ue.value,(j,ye)=>(I(),L("button",{key:j.id,class:re(["result-item",{active:ye===A.value}]),onClick:We=>Q(j),onMouseenter:We=>A.value=ye},[n("div",Pr,[n("div",Cr,[n("span",Ar,b(ne(j)),1),n("span",Tr,b(J(j.source)),1)]),n("div",xr,b(te.value?j.snippet||u(e)("chat.searchNoSnippet"):j.preview||u(e)("chat.searchRecent")),1)]),n("div",Hr,[n("span",Ir,b(de(j.last_active||j.started_at)),1),te.value&&j.matched_message_id!=null?(I(),L("span",Mr," #"+b(j.matched_message_id),1)):he("",!0)])],42,Sr))),128))]))]),_:1},8,["show"])]),n("div",Dr,[n("span",null,b(u(e)("chat.searchEnterHint")),1),X(u(Se),{quaternary:"",size:"small",onClick:U},{default:ce(()=>[we(b(u(e)("common.cancel")),1)]),_:1})])])]),_:1},8,["show","title"]))}});Me();var Er=De(Rr,[["__scopeId","data-v-971921f4"]]);ve();Ce();xe();var Lr={style:{display:"none"},"aria-hidden":"true"},Fr=Pe({__name:"AuthEventListener",setup(o){const e=_o(),{t:a}=He();let i=0;function r(l){const d=l.detail||{},g=Date.now();if(!(g-i<1200)){if(i=g,d.kind==="forbidden"){e.error(a("login.accessDenied"));return}e.error(a("login.sessionExpired"))}}return eo(()=>{window.addEventListener("hermes-auth-notice",r)}),vo(()=>{window.removeEventListener("hermes-auth-notice",r)}),(l,d)=>(I(),L("span",Lr))}}),zr=Fr;async function bs(){const o=await fetch("/api/auth/status");if(!o.ok)throw new Error("Failed to fetch auth status");return o.json()}async function ks(o,e){const a=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:o,password:e})});if(!a.ok){const i=await a.json().catch(()=>({})),r=new Error(i.error||"Login failed");throw r.status=a.status,r}return(await a.json()).token}async function Ur(){return(await le("/api/auth/me")).user}async function ys(o,e){return le("/api/auth/change-password",{method:"POST",body:JSON.stringify({currentPassword:o,newPassword:e})})}async function Ss(o,e){return le("/api/auth/change-username",{method:"POST",body:JSON.stringify({currentPassword:o,newUsername:e})})}async function Yo(){return le("/api/auth/users")}async function Ps(o){const e=await le("/api/auth/users",{method:"POST",body:JSON.stringify(o)});return{...await Yo(),users:e.users}}async function Cs(o,e){const a=await le(`/api/auth/users/${o}`,{method:"PUT",body:JSON.stringify(e)});return{...await Yo(),users:a.users}}async function As(o){const e=await le(`/api/auth/users/${o}`,{method:"DELETE"});return{...await Yo(),users:e.users}}async function Ts(){return(await le("/api/auth/locked-ips")).locks}async function xs(o){return le(`/api/auth/locked-ips?ip=${encodeURIComponent(o)}`,{method:"DELETE"})}async function Hs(){return(await le("/api/auth/locked-ips",{method:"DELETE"})).count}var Nr=be((()=>{Ie()}));ve();ao();Ce();xe();Nr();Ie();var qr={class:"credential-warning-text"},Br=Pe({__name:"DefaultCredentialPrompt",setup(o){const{t:e}=He(),a=Ko(),i=oo(),r=S(!1),l=S(!1),d=S(""),g=S(null);function T(B){return`hermes_default_credentials_prompt_dismissed_${B}`}async function O(){if(a.name==="login"){r.value=!1;return}const B=wo();if(!(!B||B===d.value)){d.value=B,l.value=!0;try{const M=await Ur();g.value=M.id;const Y=sessionStorage.getItem(T(M.id))==="1";r.value=!!M.requiresCredentialChange&&!Y}catch{r.value=!1}finally{l.value=!1}}}function A(){g.value!=null&&sessionStorage.setItem(T(g.value),"1"),r.value=!1}function f(){r.value=!1,i.push({name:"hermes.settings",query:{tab:"account"}})}return Re(()=>a.fullPath,()=>{O()},{immediate:!0}),(B,M)=>(I(),Le(u(Be),{show:r.value,"onUpdate:show":M[0]||(M[0]=Y=>r.value=Y),preset:"dialog",title:u(e)("login.defaultCredentialTitle"),"mask-closable":!1},{action:ce(()=>[X(u(Se),{disabled:l.value,onClick:A},{default:ce(()=>[we(b(u(e)("login.defaultCredentialLater")),1)]),_:1},8,["disabled"]),X(u(Se),{type:"primary",loading:l.value,onClick:f},{default:ce(()=>[we(b(u(e)("login.defaultCredentialAction")),1)]),_:1},8,["loading"])]),default:ce(()=>[n("p",qr,b(u(e)("login.defaultCredentialMessage")),1)]),_:1},8,["show","title"]))}});Me();var Or=De(Br,[["__scopeId","data-v-1b403be2"]]);ve();ao();xe();Ce();Ia();bo();var Wr={key:0,class:"node-warning-bar"},jr={class:"app-main"},Gr=Pe({__name:"App",setup(o){const{isDark:e,isComic:a}=Ha(),{t:i}=He(),r=Ye(),l=Ko(),d=oo(),g=S(!1),T=se(()=>Nt(e.value,a.value)),O=se(()=>e.value?rt:null),A=se(()=>l.name==="login"),f=se(()=>{const B=r.nodeVersion,M=parseInt(B.split(".")[0],10);return!isNaN(M)&&M<23});return Re(()=>l.path,()=>{r.closeSidebar()}),d.isReady().then(()=>{g.value=!0}),eo(()=>{A.value||(r.loadModels(),r.startHealthPolling())}),vo(()=>{r.stopHealthPolling()}),gr(),(B,M)=>{const Y=Xa("router-view");return I(),Le(u(nt),{theme:O.value,"theme-overrides":T.value},{default:ce(()=>[X(u(tt),null,{default:ce(()=>[X(zr),X(u(dt),null,{default:ce(()=>[X(u(lt),null,{default:ce(()=>[f.value&&g.value?(I(),L("div",Wr,b(u(i)("sidebar.nodeVersionWarning",{version:u(r).nodeVersion})),1)):he("",!0),g.value?(I(),L("div",{key:1,class:re(["app-layout",{"no-sidebar":A.value}])},[A.value?he("",!0):(I(),L("button",{key:0,class:"hamburger-btn",onClick:M[0]||(M[0]=(...te)=>u(r).toggleSidebar&&u(r).toggleSidebar(...te))},[...M[2]||(M[2]=[n("img",{src:"/logo.png",alt:"Menu",style:{width:"24px",height:"24px"}},null,-1)])])),!A.value&&u(r).sidebarOpen?(I(),L("div",{key:1,class:"mobile-backdrop",onClick:M[1]||(M[1]=(...te)=>u(r).closeSidebar&&u(r).closeSidebar(...te))})):he("",!0),A.value?he("",!0):(I(),Le(Si,{key:2})),n("main",jr,[X(Y)])],2)):he("",!0),X(Er),X(Or)]),_:1})]),_:1})]),_:1})]),_:1},8,["theme","theme-overrides"])}}});Me();var Kr=De(Gr,[["__scopeId","data-v-6415d8d3"]]);ve();Go();var fa=localStorage.getItem("hermes_brightness")||"system",Vr=localStorage.getItem("hermes_style")||"ink",$r=window.matchMedia("(prefers-color-scheme: dark)").matches,Qr=fa==="dark"||fa==="system"&&$r,Jr=Vr==="comic";Qr&&document.documentElement.classList.add("dark");Jr&&document.documentElement.classList.add("comic");var Zr=new URLSearchParams(window.location.search),va=window.location.hash.split("?")[1],_a=Zr.get("token")||(va?new URLSearchParams(va).get("token"):null);_a&&(window.__LOGIN_TOKEN__=_a);var yo=st(Kr);yo.use(ct());yo.use(xa);yo.use(mt);yo.mount("#app");export{rs as A,so as B,fs as C,ps as D,ms as E,ns as F,Lt as G,Ia as H,cs as I,Da as L,ds as M,us as N,Jo as O,is as P,ss as R,or as S,vs as T,Ha as U,mn as V,Ft as W,sr as _,bs as a,No as b,Yo as c,Hs as d,xs as f,ws as g,Zo as h,As as i,Ji as j,Yi as k,Nr as l,Ua as m,Ss as n,Ur as o,Cs as p,Ps as r,Ts as s,ys as t,ks as u,_s as v,gs as w,hs as x,ar as y,ls as z};
|