export default { // 로그인 login: { title: 'Hermes Studio', description: '계속하려면 사용자 이름과 비밀번호를 입력하세요.', placeholder: '액세스 토큰', submit: '로그인', tokenRequired: '액세스 토큰을 입력해 주세요', invalidToken: '유효하지 않은 토큰입니다', connectionFailed: '서버에 연결할 수 없습니다', passwordLogin: '비밀번호', tokenLogin: '토큰', usernamePlaceholder: '사용자 이름', passwordPlaceholder: '비밀번호', defaultCredentialsHint: '기본 로그인 이름: admin, 기본 비밀번호: 123456', credentialsRequired: '사용자 이름과 비밀번호를 입력해 주세요', invalidCredentials: '사용자 이름 또는 비밀번호가 올바르지 않습니다', tooManyAttempts: '로그인 시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요', lockResetHint: '본인 서버라면 다음 명령으로 로그인 잠금을 해제할 수 있습니다:', defaultLoginResetHint: '기본 admin 비밀번호를 재설정하려면 다음을 실행하세요:', desktopLockResetHint: 'Too many failed login attempts. Open the system tray menu and choose Reset Login to reset the password.', sessionExpired: '로그인이 만료되었습니다. 다시 로그인해 주세요.', accessDenied: '이 리소스에 접근할 권한이 없습니다.', passwordMismatch: '비밀번호가 일치하지 않습니다', passwordTooShort: '비밀번호는 6자 이상이어야 합니다', setupSuccess: '비밀번호 로그인이 설정되었습니다', passwordChanged: '비밀번호가 변경되었습니다', passwordRemoved: '비밀번호 로그인이 제거되었습니다', setupPassword: '비밀번호 로그인 설정', changePassword: '비밀번호 변경', changeUsername: '사용자 이름 변경', removePasswordLogin: '제거', username: '사용자 이름', currentPassword: '현재 비밀번호', newPassword: '새 비밀번호', confirmPassword: '비밀번호 확인', newUsername: '새 사용자 이름', usernameChanged: '사용자 이름이 변경되었습니다', usernameTooShort: '사용자 이름은 2자 이상이어야 합니다', setupDescription: '로그인에 사용할 사용자 이름과 비밀번호를 관리합니다.', removeConfirm: '사용자 계정에는 비밀번호 로그인이 필요합니다.', passwordLoginNotConfigured: '비밀번호 로그인 미설정', passwordLoginConfigured: '현재 계정: {username}', defaultCredentialTitle: '기본 계정과 비밀번호를 변경하세요', defaultCredentialMessage: '현재 로그인 계정이 아직 기본 사용자 이름 또는 기본 비밀번호를 사용하고 있습니다. 무단 접근을 방지하려면 현재 계정에서 사용자 이름과 비밀번호를 가능한 한 빨리 변경하세요.', defaultCredentialAction: '변경하기', defaultCredentialLater: '나중에 알림', }, users: { title: '계정 관리', description: '사용자를 만들고 역할을 할당하며 일반 관리자가 접근할 수 있는 프로필을 제어합니다.', create: '사용자 만들기', edit: '사용자 편집', username: '사용자 이름', role: '역할', statusLabel: '상태', profiles: '접근 가능한 프로필', profilesPlaceholder: '접근 가능한 프로필 선택', allProfiles: '모든 프로필', noProfiles: '할당된 프로필 없음', lastLogin: '마지막 로그인', newPasswordOptional: '새 비밀번호 (비워두면 유지)', loadFailed: '사용자 목록을 불러오지 못했습니다', deleteConfirm: '이 사용자를 삭제하시겠습니까?', enable: '활성화', disable: '비활성화', roles: { superAdmin: '슈퍼 관리자', admin: '관리자', }, status: { active: '활성', disabled: '비활성', }, }, // 공통 common: { loading: '로딩 중...', cancel: '취소', retry: '재시도', reset: '초기화', delete: '삭제', edit: '편집', save: '저장', saved: '저장됨', update: '업데이트', create: '생성', saveFailed: '저장 실패', deleteFailed: '삭제 실패', ok: '확인', copied: '복사됨', copy: '복사', noData: '데이터 없음', fetch: '가져오기', add: '추가', enable: '활성화', disable: '비활성화', configured: '구성됨', notConfigured: '미구성', confirm: '확인', expand: '펼치기', collapse: '접기', stop: '중지', start: '시작', expired: '만료됨', }, // 사이드바 // MCP 관리 mcp: { title: 'MCP 서버', loadFailed: 'MCP 서버를 불러오지 못했습니다', reloadAll: '모두 다시 로드', refresh: '새로고침', total: '합계', connected: '연결됨', disconnected: '연결 끊김', tools: '도구', tool: '도구', searchPlaceholder: '서버 검색...', addServer: '+ 서버 추가', zeroTools: '0개 도구', loading: '로딩...', empty: 'MCP 서버가 설정되지 않았습니다', reloaded: '{server} 다시 로드됨', reloadedAll: '모든 MCP 서버가 다시 로드되었습니다', reloadFailed: '다시 로드 실패', serverAdded: '서버 "{name}" 추가됨', addFailed: '서버 추가 실패', serverUpdated: '서버 "{name}" 업데이트됨', updateFailed: '서버 업데이트 실패', saveFailed: '저장 실패', serverRemoved: '"{name}" 제거됨', enabled: "{name} 활성화됨", disabled: "{name} 비활성화됨", connectedStatus: '연결됨', disconnectedStatus: '연결 끊김', disabledStatus: '비활성화됨', toolList: '도구 목록', count: ' ', more: '개 더보기', removeFailed: '서버 제거 실패', testOk: '테스트 성공 — {count}개 도구 사용 가능', testEmpty: '테스트에서 도구가 반환되지 않았습니다', testFailed: '테스트 실패', edit: '편집', test: '테스트', reload: '다시 로드', remove: '제거', confirmRemove: '서버 "{name}"을(를) 제거하시겠습니까?', cancel: '취소', add: '추가', save: '저장', addTitle: 'MCP 서버 추가', editTitle: 'MCP 서버 편집', invalidJson: 'JSON 형식 오류', invalidYaml: 'YAML 형식이 올바르지 않습니다', invalidConfig: '올바르지 않은 설정', invalidServerConfig: '서버 설정이 올바르지 않습니다', missingCommandOrUrl: 'command 또는 url이 필요합니다', manageTools: '도구 관리', toolsVisibilityTitle: '도구 가시성 관리', fetchTools: '도구 목록 가져오기', fetchToolsFailed: '도구 목록을 가져오지 못했습니다', toolsMode: '모드:', toolsModeAll: '전체', toolsModeInclude: '포함', toolsModeExclude: '제외', toolsListHeader: '도구 이름', toolsEmpty: '도구가 없습니다. 먼저 도구 목록을 가져오세요', toolsSummaryAll: '총 {count}개 도구, 모두 활성화', toolsSummaryInclude: '총 {total}개 도구, {count}개 선택됨', toolsSummaryExclude: '총 {total}개 도구, {count}개 제외됨', toolsVisibilitySaved: '도구 가시성이 저장되었습니다', toolsSelectAll: '모두 선택', toolsClearSelection: '선택 지우기', toolsExcludeAll: '모두 제외', toolsClearExcluded: '제외 항목 지우기', }, sidebar: { chat: '채팅', backToChat: '뒤로', search: '검색', apiRelay: 'API 릴레이', history: '기록', jobs: '예약 작업', models: '모델', profiles: '프로필', plugins: '플러그인', mcp: 'MCP', petdex: 'Pets', skills: '스킬', memory: '메모리', logs: '로그', usage: '사용량', performance: '성능 모니터링', journey: '학습 경로', skillsUsage: '스킬 사용량', channels: '채널', terminal: '터미널', singleChat: '채팅', globalAgent: 'Global Agent', files: '파일', devices: '기기', groupChat: '그룹 채팅', groupConversation: '대화', groupConversationShort: '대화', groupAgent: '에이전트', groupAgentShort: '에전', groupSystem: '시스템', groupSystemShort: '시스템', groupMonitoring: '모니터링', groupMonitoringShort: '모니터', settings: '설정', connected: '연결됨', disconnected: '연결 끊김', updateTip: '터미널에서 "hermes-web-ui update"를 실행하여 업데이트하세요', updateVersion: 'v{version}(으)로 업그레이드', reloadClientVersion: 'v{version}(으)로 새로고침', updating: '업데이트 중...', updateSuccess: '업데이트가 완료되었습니다. 잠시 후 페이지를 새로고침하세요. 오랫동안 시작되지 않으면 수동으로 시작하세요.', updateFailed: '업데이트 실패', logout: '로그아웃', nodeVersionWarning: 'Node.js v{version}이 감지되었습니다. 버전 23 이상으로 업그레이드하세요.', changelog: '변경 이력', noChangelog: '변경 이력이 없습니다', versionManagement: '버전 관리', updateAvailableLabel: '(새 버전 있음)', dockerUpdateTitle: 'Docker 업데이트', dockerUpdateGuide: 'Docker 환경에서 실행 중입니다. 최신 이미지를 가져와 컨테이너를 다시 생성하세요:', dockerUpdateNote: '데이터는 유지되며 컨테이너 재생성 후에도 손실되지 않습니다.', kanban: '칸반', workflow: '워크플로', groupTools: '도구', groupToolsShort: "도구", codingAgents: "코딩 에이전트", versionPreview: "버전 미리보기", groupPlatform: '플랫폼', gateways: '게이트웨이', expand: '메뉴 펼치기', collapse: '메뉴 접기', }, runtimeVersions: { title: '버전 관리', runtimeTitle: 'Hermes Runtime', webUiTitle: 'Web UI', platform: '플랫폼', currentWebUi: '현재 Web UI', activeVersion: '활성 버전', active: '활성', installed: '설치됨', download: '다운로드', downloadGithub: 'GitHub 다운로드', downloadCf: 'Cloudflare 다운로드', github: 'GitHub', cf: 'Cloudflare', useVersion: '다음 시작 시 사용', deleteVersion: '삭제', deleteRuntimeConfirm: 'Hermes Runtime {version}을 삭제할까요?', deleteWebUiConfirm: 'Web UI {version}을 삭제할까요?', deleteRuntimeSuccess: 'Runtime이 삭제되었습니다', deleteWebUiSuccess: 'Web UI가 삭제되었습니다', refresh: '새로고침', noVersions: '사용 가능한 버전이 없습니다', remoteLoadFailed: '원격 버전을 불러오지 못했습니다', downloadTasks: '다운로드 작업', downloadStarted: '다운로드를 시작했습니다', activateSuccess: '버전 선택이 저장되었습니다. Hermes Studio를 다시 시작하면 적용됩니다.', jobStatus: { queued: '대기 중', running: '실행 중', completed: '완료', failed: '실패', }, jobStageStatus: { queued: '대기 중', resolve: '확인 중', download: '다운로드 중', verify: '검증 중', extract: '압축 해제 중', install: '설치 중', completed: '완료', failed: '실패', }, jobStage: { queued: '대기 중', download: '다운로드 중', resolveRuntime: 'Runtime 패키지 확인 중', verifyRuntime: 'Runtime 압축 파일 검증 중', extractRuntime: 'Runtime 압축 파일 해제 중', installRuntime: 'Runtime 설치 중', resolveWebUi: 'Web UI 패키지 확인 중', verifyWebUi: 'Web UI 압축 파일 검증 중', extractWebUi: 'Web UI 압축 파일 해제 중', installWebUi: 'Web UI 설치 중', completed: '완료', failed: '실패', }, }, mcuDevices: { title: 'Little Box', subtitle: 'View device link status', name: 'Name', nameOptional: 'Name is optional', deviceCode: 'Device code', deviceCodePlaceholder: 'Enter device code', deviceCodeRequired: 'Enter device code', channel: 'Channel', official: 'Official', unofficial: 'Unofficial', createdAt: 'Added at', lanStatus: 'LAN', remoteStatus: '원격', connected: '연결됨', disconnected: '연결 안 됨', remoteConnect: '원격 연결', remoteConnected: '원격 연결됨', remoteConnectFailed: '원격 연결 실패', remoteDisconnect: '연결 해제', remoteDisconnected: '원격 연결 해제됨', remoteDisconnectFailed: '원격 연결 해제 실패', actions: 'Actions', add: 'Add', addTitle: 'Add MCU device', added: 'MCU device added', addFailed: 'Failed to add MCU device', purchase: 'Buy', edit: 'Edit', editNameTitle: 'Edit name', nameUpdated: 'Name updated', nameUpdateFailed: 'Failed to update name', delete: 'Delete', deleteTitle: 'Delete MCU device', deleteConfirm: 'Delete "{name}"?', deleted: 'MCU device deleted', deleteFailed: 'Failed to delete MCU device', loadFailed: 'Failed to load MCU devices', close: 'Close', }, devices: { title: '기기', count: '기기 {count}개', lastScanned: '마지막 스캔: {time}', refresh: '새로고침', empty: '기기를 찾을 수 없습니다', computer: '컴퓨터', endpointLabel: '엔드포인트', statusLabel: '상태', online: '온라인', offline: '오프라인', address: '주소', os: 'OS', agentVersion: 'Agent', webUiVersion: 'Web UI', responseMs: '지연 시간', lastSeen: '마지막 발견', open: '열기', never: '없음', unknown: '알 수 없음', loadFailed: '기기를 불러오지 못했습니다', scanFailed: '기기 스캔에 실패했습니다', updateFailed: '기기를 업데이트하지 못했습니다', duplicateRequest: '대기 중인 페어링 요청이 이미 있습니다', manualPairing: 'Pair by URL', copyPairingLink: 'Copy pairing link', manualUrlPlaceholder: 'https://device.example.com', manualUrlRequired: 'Enter a device URL', manualRequestSent: 'Pairing request sent', manualRequestFailed: 'Failed to request remote pairing', pairingLinkCopied: 'Pairing link copied', pairingLinkCopyFailed: 'Failed to copy pairing link', pairingCodeTitle: 'Enter pairing code', pairingCodePlaceholder: 'Pairing code', pairingCodeRequired: 'Enter the pairing code', submitPairingRequest: 'Submit request', processed: '처리됨', unprocessed: '미처리', deleteHistory: '기록 삭제', deleteHistoryConfirm: '이 요청 기록을 삭제하고 이 기기의 연결 권한을 취소할까요?', requests: '요청 목록', requestsWithCount: '요청 목록 ({count})', noRequests: '요청 없음', requestPairing: '페어링 요청', paired: '페어링됨', approve: '승인', reject: '거절', block: '차단', unblock: '차단 해제', inboundStatus: { none: '요청 허용', pending: '대기 중', approved: '승인됨', rejected: '거절됨', blocked: '차단됨', }, outboundStatus: { none: '미페어링', pending: '요청됨', approved: '페어링됨', rejected: '거절됨', blocked: '차단됨', }, endpoint: { web: 'Web', desktop: '데스크톱', custom: '사용자 지정', }, }, performance: { title: '성능 모니터링', subtitle: '시스템 리소스, Bridge Broker, Workers, 활성 세션 확인', refresh: '새로고침', autoRefreshOn: '자동 새로고침', autoRefreshOff: '수동 새로고침', loadFailed: '성능 데이터를 불러오지 못했습니다', systemCpu: '시스템 CPU', systemMemory: '시스템 메모리', activeSessions: '활성 세션', runningSessions: '실행 중 {count}', workers: 'Workers', totalWorkerMemory: 'Worker 총 메모리', processes: '프로세스', uptime: '실행 시간', running: '실행 중', stopped: '중지됨', workerMemory: 'Worker 메모리', lastUpdated: '업데이트 시간', profile: 'Profile', memory: '메모리', sessions: '세션', runningActiveSessions: '실행 중 / 활성', lastUsed: '마지막 사용', status: '상태', noWorkers: 'Worker 없음', sessionsByProfile: 'Profile별 세션', noActiveSessions: '활성 세션 없음', }, journey: { title: '학습 경로', play: '학습 경로 재생', pause: '학습 경로 일시정지', refresh: '새로고침', loadFailed: '학습 경로를 불러오지 못했습니다', nodes: '노드', edges: '연결', skills: '스킬', memories: '메모리', clusters: '클러스터', profile: '프로필', source: '소스', learnedSkills: '학습된 스킬', memorySkillEdges: '메모리 링크', allKinds: '모든 종류', allCategories: '모든 카테고리', searchPlaceholder: '노드 검색', noClusters: '클러스터 없음', noNodes: '학습 경로 노드 없음', noCategory: '미분류', category: '카테고리', useCount: '사용 횟수', createdBy: '생성자', timestamp: '시간', pinned: '고정됨', }, // 서랍 drawer: { terminal: '터미널', files: '작업 공간', }, // 채팅 chat: { contextRemaining: '남음', contextClickToEdit: '클릭하여 컨텍스트 길이 편집', contextEditTitle: '컨텍스트 길이 편집', contextEditDesc: '현재 모델의 컨텍스트 길이 제한 설정 (토큰 수)', contextEditPlaceholder: '컨텍스트 길이 입력', contextEditHint: '일반적인 값: 256k (Hermes 기본값), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: '저장', contextEditCancel: '취소', contextEditInvalid: '유효한 컨텍스트 길이를 입력하세요', contextEditSuccess: '컨텍스트 길이가 업데이트되었습니다', contextEditFailed: '업데이트 실패', emptyState: 'Hermes Agent와 대화를 시작하세요', emptyStateAgent: '{agent}와 대화를 시작하세요', viewOlderInHistory: '이전 메시지는 기록에서 보기', scrollToBottom: '맨 아래로 이동', outlineTitle: '대화 개요', outlineEmpty: '대화 내용이 없습니다', outlineUserQuestion: '사용자 질문', inputPlaceholder: '메시지를 입력하세요... (Enter로 전송, Shift+Enter로 줄바꿈)', inputHeightResizeHint: '드래그해서 채팅 입력창 높이를 바꾸고, 더블클릭하면 자동 높이로 돌아갑니다.', slashCommandArgs: { message: '<메시지>', title: '<제목>', text: '<텍스트>', }, slashCommands: { usage: '현재 세션 사용량 계산', status: '세션 상태와 대기열 표시', abort: '활성 Bridge 실행 중지', queue: '활성 실행 뒤에 메시지 대기열 추가', learn: '설명한 소스에서 재사용 가능한 스킬 학습', plan: 'Markdown 구현 계획 작성', goal: 'Set a standing goal that continues across turns', goalStatus: 'Show the active goal status', goalPause: 'Pause the active goal loop', goalResume: 'Resume the paused goal loop', goalDone: 'Complete and clear the active goal', goalClear: 'Clear the active goal', subgoal: 'Add a criterion to the active goal', clear: '현재 표시 내용 지우기', clearHistory: '이 세션의 저장된 메시지 기록 삭제', title: '이 세션 이름 변경', compress: '유휴 상태에서 컨텍스트 압축 실행', steer: '활성 Bridge 실행에 지시 텍스트 보내기', destroy: '이 세션의 Bridge Agent 해제', reloadMcp: 'MCP 서버 다시 로드', reloadSkills: '스킬 명령 다시 로드', }, attachFiles: '파일 첨부', reasoningEffort: { tooltip: '추론 노력', defaultLabel: '기본값', options: { default: '기본값 (config.yaml)', none: '없음', minimal: '최소', low: '낮음', medium: '중간', high: '높음', xhigh: '매우 높음', }, }, showToolCalls: '도구 호출 표시', hideToolCalls: '도구 호출 숨기기', messageQueue: '메시지 대기열', removeQueuedMessage: '대기열 메시지 제거', stop: '중지', send: '전송', contextUsed: '사용된 컨텍스트:', sessions: '세션', webUiSessions: '세션', allProfiles: '모든 프로필', profileMissingModelsTip: '이 세션의 프로필 "{profile}"에는 사용 가능한 공급자 또는 모델이 없습니다', sessionScopeHint: '채팅에는 Web UI/API Server 세션만 표시됩니다. CLI, Telegram, Discord, Cron 등 채널 세션은 기록에서 읽기 전용으로 볼 수 있습니다.', openHistory: '기록 열기', hermesHistory: 'Hermes 기록', historyScopeHint: '현재 profile의 Hermes 기록 세션을 소스별로 읽기 전용으로 봅니다.', noSessions: '세션 없음', newChat: '새 채팅', agent: 'Agent', approvalKicker: '터미널 권한', approvalTitle: '실행 전에 명령 확인', approvalAgree: '동의', approvalAllowOnce: '한 번만 허용', approvalAllowSession: '이 세션에서 허용', approvalAlways: '항상 허용', approvalDeny: '거부', clarifyKicker: '에이전트 확인 필요', clarifyTitle: '에이전트가 질문이 있습니다', clarifyPlaceholder: '답변 입력...', clarifySubmit: '답장', clarifyDismiss: '무시', deleteSession: '이 세션을 삭제하시겠습니까?', toggleBatchMode: '일괄 선택', selectAll: '모두 선택', confirmBatchDelete: '선택한 {count}개의 세션을 삭제하시겠습니까?', batchDeleteSuccess: '{count}개의 세션을 삭제했습니다', batchDeletePartial: '{failed}개의 세션 삭제 실패', batchDeleteFailed: '일괄 삭제 실패', importToWebUi: 'Web UI로 가져오기', importSessionSuccess: '세션을 Web UI로 가져왔습니다', importSessionAlreadyExists: '세션이 이미 Web UI에 있습니다', importSessionFailed: '세션 가져오기 실패', sessionDeleted: '세션이 삭제되었습니다', rename: '이름 변경', archiveSession: '보관', unarchiveSession: '보관 해제', pin: '고정', unpin: '고정 해제', pinned: '고정됨', chatMode: '채팅', liveMode: '라이브', liveSessions: '라이브 세션', recentBadge: '최근', linkedSessions: '{count}개 연결됨', noVisibleMessages: '사람이 볼 수 있는 메시지가 없습니다.', monitorRoleUser: '사용자', monitorRoleAssistant: '어시스턴트', copySessionLink: '세션 링크 복사', openSessionInNewTab: '새 탭에서 열기', sessionLinkCopied: 'Session link copied', copySessionId: '세션 ID 복사', export: '내보내기', editConfig: '구성 편집', exportFull: '전체 내보내기 (JSON)', exportCompressed: '압축 내보내기 (TXT)', exportCompressing: '컨텍스트 압축 중, 잠시 기다려주세요...', exportSuccess: '세션을 내보냈습니다', exportFailed: '내보내기 실패', renamed: '이름이 변경되었습니다', renameFailed: '이름 변경 실패', sessionArchived: '세션을 보관했습니다', archiveSessionFailed: '세션 보관 실패', sessionUnarchived: '세션 보관을 해제했습니다', unarchiveSessionFailed: '세션 보관 해제 실패', renameSession: '세션 이름 변경', sessionNotFound: '세션을 찾을 수 없습니다', enterNewTitle: '새 제목을 입력하세요', other: '기타', runFailed: '실행 실패', error: '오류', tool: '도구', arguments: '인수', result: '결과', workspaceChanges: '작업공간 변경', changedFiles: '{files}개 파일 변경됨', diffUnavailable: 'diff를 표시할 수 없습니다', binaryFileDiffUnavailable: '바이너리 파일 diff를 표시할 수 없습니다', truncated: '... (잘림)', unchangedLines: '변경 없음 {count}줄', executionDuration: '실행 시간', thinkingLabel: '사고 과정', thinkingInProgress: '사고 중', thinkingShow: '사고 과정 펼치기', thinkingHide: '사고 과정 접기', thinkingDuration: '관측 {duration}', thinkingChars: '{count}자', copyBubble: '메시지 복사', copiedBubble: '복사됨', copyFailed: '복사 실패', playSpeech: '음성 재생', pauseSpeech: '일시정지', resumeSpeech: '재개', stopSpeech: '중지', speechNotSupported: '이 브라우저는 음성 재생을 지원하지 않습니다', searchEnterHint: 'Enter로 열기 · Esc로 닫기', searchHint: 'Cmd/Ctrl+K', searchScope: '검색 범위: Web UI 로컬 세션 DB만 포함하며 읽기 전용 Hermes 기록 세션은 포함하지 않습니다.', searchFailed: '세션 검색 실패', searchNoSnippet: '표시할 요약이 없습니다', searchNoResults: '일치하는 세션이 없습니다', searchRecent: '최근 세션', searchEmpty: '최근 세션', searchPlaceholder: '세션 검색...', searchSubtitle: '제목 또는 메시지 내용으로 검색', searchTitle: '세션 검색', stopGateway: 'Gateway 중지', start: '시작', workspaceSetFailed: 'Workspace 설정 실패', workspaceSet: 'Workspace가 설정되었습니다', workspacePlaceholder: '프로젝트 경로 입력, 예: /home/user/project', folderPickerEmpty: '(비어 있음)', folderPickerNoFolders: 'Workspace 폴더가 없습니다', folderPickerSelected: '선택됨:', workspaceDefault: '기본', workspaceDefaultTooltip: '이 작업 공간은 기본값으로 설정되어 새 채팅에 자동 입력됩니다', workspacePin: '기본 작업 공간으로 설정', workspaceUnpin: '기본 작업 공간 해제', workspaceRecent: '최근 사용', defaultWorkspace: '기본 작업 공간', more: '더보기', workspace: '작업 공간', setWorkspaceTitle: '세션 Workspace 설정', setWorkspace: 'Workspace 설정', modelSetFailed: '모델 설정 실패', modelSet: '모델이 설정되었습니다', setModelTitle: '세션 모델 설정', setModel: '모델 설정', newCliChat: '새 CLI', cliEmptyState: 'CLI 채팅 시작', autoPlaySpeech: '음성 자동 재생', voiceInput: { startCapture: '음성 입력 시작', stopCaptureAndInsert: '음성 입력을 중지하고 입력창에 삽입', cancelCapture: '음성 입력 취소', statusLabel: '상태: {status}', transcriptLabel: '전사: {text}', errorLabel: '오류: {error}', recentEvents: '최근 이벤트', status: { idle: '대기', capturing: '듣는 중', transcribing: '전사 중', sending: '입력창에 삽입 중', error: '오류', }, browserSpeechUnsupported: '이 브라우저는 내장 음성 인식을 지원하지 않습니다.', browserSpeechFailed: '브라우저 음성 인식에 실패했습니다.', browserSpeechFailedWithReason: '브라우저 음성 인식에 실패했습니다: {error}.', microphoneUnsupported: '이 브라우저는 마이크 녹음을 지원하지 않습니다.', microphoneRecordingFailed: '마이크 녹음에 실패했습니다.', }, }, // 예약 작업 jobs: { title: '예약 작업', createJob: '작업 생성', editJob: '작업 편집', noJobs: '예약된 작업이 없습니다. 새로 만들어 시작하세요.', sortBy: '정렬', sortByName: '이름순', sortByTime: '날짜순', sortByNameHint: '이름으로 정렬', sortByTimeHint: '날짜로 정렬', sortAsc: '오름차순', sortDesc: '내림차순', name: '이름', namePlaceholder: '작업 이름', schedule: '스케줄 (Cron 표현식)', schedulePlaceholder: '예: 0 9 * * *', quickPresets: '빠른 프리셋', selectPreset: '프리셋 선택...', presetEveryMinute: '매 분', presetEvery5Min: '매 5분', presetEveryHour: '매 시간', presetEveryDay: '매일 00:00', presetEveryDay9: '매일 09:00', presetEveryMonday: '매주 월요일 09:00', presetEveryMonth: '매월 1일 09:00', prompt: '프롬프트', promptPlaceholder: '실행할 프롬프트', skills: '스킬', skillsPlaceholder: '스킬 선택...', provider: 'Provider', model: 'Model', defaultProvider: 'Default provider', defaultModel: 'Default model', deliverTarget: '전송 대상', origin: '출처', local: '로컬', repeatCount: '반복 횟수 (선택)', modelPlaceholder: '기본 모델', repeatPlaceholder: '비워두면 무한 반복', jobCreated: '작업이 생성되었습니다', jobUpdated: '작업이 업데이트되었습니다', nameRequired: '이름을 입력해 주세요', scheduleRequired: '스케줄을 입력해 주세요', loadFailed: '작업을 불러오지 못했습니다', jobPaused: '작업이 일시 정지되었습니다', jobResumed: '작업이 재개되었습니다', jobTriggered: '작업이 실행되었습니다', modelUpdated: '모델이 업데이트되었습니다', jobDeleted: '작업이 삭제되었습니다', status: { running: '실행 중', paused: '일시 정지', disabled: '비활성화', scheduled: '예약됨', }, info: { model: '모델', provider: 'Provider', schedule: '일정', lastRun: '마지막 실행', nextRun: '다음 실행', deliver: '전송', repeat: '반복', }, action: { pause: '일시 정지', pauseJob: '작업 일시 정지', resume: '재개', resumeJob: '작업 재개', runNow: '즉시 실행', triggerImmediately: '즉시 실행', }, runHistory: { title: '실행 기록', runs: '회 실행', noRuns: '실행 기록이 없습니다.', }, }, // 스킬 skills: { title: '스킬', targetFilter: '런타임', targets: { hermes: 'Hermes', claude: 'Claude', codex: 'Codex', }, searchPlaceholder: '스킬 검색...', noMatch: '검색과 일치하는 스킬이 없습니다', noSkills: '스킬을 찾을 수 없습니다', backTo: '돌아가기', attachedFiles: '첨부 파일', loadFailed: '스킬을 불러오지 못했습니다', fileLoadFailed: '파일을 불러오지 못했습니다', modified: '사용자 수정됨', archived: '보관됨', pinned: '고정됨', pin: '스킬 고정', unpin: '고정 해제', pinFailed: '고정 상태 변경 실패', edit: '편집', saving: '저장 중...', editorLabel: '스킬 편집기', saveSuccess: '스킬 저장됨', saveFailed: '스킬 저장 실패', toggleFailed: '스킬 상태를 전환하지 못했습니다', source: { builtin: '내장', hub: 'Hub', local: '로컬', external: '외부', }, delete: '삭제', deleteConfirm: '스킬 "{name}"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', deleteSuccess: '스킬이 삭제되었습니다', deleteFailed: '삭제 실패', import: '가져오기', importTitle: '스킬 가져오기', importModeZip: 'Zip', importModeFolder: '폴더', importHintZip: 'SKILL.md를 포함한 디렉터리의 .zip 파일 업로드', importHintFolder: '로컬 스킬 폴더 선택 (SKILL.md 필요)', importTargetCategory: '대상 카테고리 (선택)', importTargetCategoryPlaceholder: '비워두면 misc에 배치', importSelectFile: '.zip 파일 선택', importSelectFolder: '폴더 선택', importInvalidFile: '.zip 파일만 지원됩니다', importFileCount: '개 파일', importNoSelection: '먼저 파일 또는 폴더를 선택하세요', importSuccess: '스킬이 가져와졌습니다', importFailed: '가져오기 실패', path: { local: '로컬', external: '외부', }, externalDirs: { manage: '외부 디렉터리', title: '외부 디렉터리 관리', hint: 'config.skills.external_dirs 를 관리합니다. ~ 과 $VAR 지원. 존재하지 않는 경로는 흐리게 표시됩니다.', add: '외부 디렉터리 추가', placeholder: '/path/to/skills 또는 ~/my-skills', empty: '외부 디렉터리가 없습니다', missing: '경로를 찾을 수 없음', notDir: '디렉터리가 아님', saveSuccess: '외부 디렉터리 저장됨', saveFailed: '저장 실패', loadFailed: '외부 디렉터리 로드 실패', removeRow: '제거', }, pathCopied: '경로 복사됨', pathCopyFailed: '경로 복사 실패', reloadHint: '활성 세션에서는 /reload-skills 실행. 새 세션은 자동 로드됩니다.', writeApprovalButton: '대기 {count}', writeApprovalTitle: '쓰기 승인 대기', writeApprovalDescription: 'Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.', writeApprovalRefresh: '새로고침', writeApprovalEmpty: '승인 대기 중인 쓰기가 없습니다.', writeApprovalUnsupported: '이 Hermes Agent 버전은 쓰기 승인을 지원하지 않습니다. 이 기능을 사용하려면 Hermes Agent를 업그레이드하세요.', writeApprovalMemory: '메모리', writeApprovalSkills: '스킬', writeApprovalViewDiff: '검토', writeApprovalHideDiff: '숨기기', writeApprovalNoDiff: '표시할 차이가 없습니다.', writeApprovalLoadFailed: '승인 대기 쓰기를 불러오지 못했습니다', writeApprovalDiffFailed: '쓰기 세부 정보를 불러오지 못했습니다', writeApprovalActionFailed: '승인 대기 쓰기를 처리하지 못했습니다', writeApprovalApproved: '쓰기가 승인되었습니다', writeApprovalRejected: '쓰기가 거부되었습니다', writeApprovalApprove: '승인', writeApprovalReject: '거부', writeApprovalPendingMemoryWrite: '승인 대기 메모리 쓰기', writeApprovalCurrentFile: '현재 {file}', writeApprovalProposedFile: '제안된 {file}', writeApprovalDiffSection: '차이', writeApprovalPatchOldStringMissing: '패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.', writeApprovalRequestedOldString: '요청된 old_string', writeApprovalCurrentReadFailed: '현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.', writeApprovalDeleteSkill: '이 승인은 스킬 {skill}을 삭제합니다.', writeApprovalRemoveFile: '이 승인은 스킬 {skill}에서 {file}을 제거합니다.', }, // 플러그인 plugins: { title: '플러그인', refresh: '새로고침', notice: '탐색 가능한 Hermes 플러그인 manifest 인벤토리입니다. 탐색 메타데이터는 플러그인 코드를 로드하지 않고 읽습니다. standalone 사용자 플러그인은 여기에서 활성화하거나 비활성화할 수 있으며, 변경 사항은 새 Hermes 세션에서 적용됩니다.', loadFailed: '플러그인을 불러오지 못했습니다', updateFailed: '플러그인을 업데이트하지 못했습니다', enableSuccess: '{name} 활성화됨', disableSuccess: '{name} 비활성화됨', commandCopied: '명령을 복사했습니다', searchPlaceholder: 'key, 이름, 설명, 경로 검색...', source: '소스', kind: '종류', statusTitle: '상태', configStatus: 'config: {status}', notAvailable: 'n/a', copyCommand: '명령 복사', managedElsewhere: '다른 곳에서 관리됨', noMatch: '현재 필터와 일치하는 플러그인이 없습니다', enabled: '활성화됨', disabled: '비활성화됨', summary: { total: '전체', active: '활성 / 자동', inactive: '비활성', disabled: '비활성화됨', providerManaged: 'Provider 관리', }, status: { enabled: '활성화됨', 'auto-active': '자동 활성', inactive: '비활성', disabled: '비활성화됨', 'provider-managed': 'Provider 관리', }, statusLabel: { enabled: '설정으로 활성화됨', 'auto-active': '자동 활성', inactive: '비활성', disabled: '비활성화됨', 'provider-managed': 'Provider 관리', }, configStatuses: { enabled: '활성화됨', disabled: '비활성화됨', 'not-enabled': '활성화되지 않음', auto: '자동', 'provider-managed': 'Provider 관리', }, table: { plugin: '플러그인', status: '상태', source: '소스', kind: '종류', capabilities: '기능', path: '경로 / entrypoint', manage: '관리', }, capabilities: { tools: '{count} tools', hooks: '{count} hooks', env: '{count} env', }, metadata: { agentRoot: '에이전트 루트', python: 'Python', scanCwd: 'cwd 스캔', projectPlugins: '프로젝트 플러그인', }, }, // 메모리 petdex: { title: 'Petdex Pets', subtitle: 'Browse the public petdex catalog used by Hermes desktop pets.', refresh: 'Refresh', adopt: 'Adopt', active: 'Active', adopted: 'Adopted {name}', adoptFailed: 'Failed to adopt pet', loadFailed: 'Failed to load petdex catalog', searchPlaceholder: 'Search by name, slug, author, or kind', kindFilter: 'Kind', spritesheet: 'Spritesheet', submittedBy: 'By {name}', empty: 'No pets match the current filters.', showMore: 'Show {count} more', summary: { total: 'Catalog total', visible: 'Matching', kinds: 'Kinds', generatedAt: 'Generated at', }, }, memory: { title: '메모리', refresh: '새로고침', loadFailed: '메모리를 불러오지 못했습니다', myNotes: '내 메모', noNotes: '메모가 없습니다.', notesPlaceholder: '메모를 작성하세요...', userProfile: '사용자 프로필', noProfile: '프로필이 없습니다.', profilePlaceholder: '프로필을 작성하세요...', soul: '소울', noSoul: '소울 설정이 없습니다.', soulPlaceholder: '소울 설정을 작성하세요...', }, // 모델 models: { title: '모델', addProvider: 'Provider 추가', refreshModelCache: '모델 캐시 새로고침', refreshModelCacheLoading: '모델 캐시를 새로고침하는 중...', refreshModelCacheSuccess: '모델 캐시를 새로고침했습니다', refreshModelCacheFailed: '모델 캐시 새로고침 실패', providerType: 'Provider 유형', preset: '프리셋', custom: '사용자 지정', selectProvider: 'Provider 선택', chooseProvider: 'Provider를 선택하세요...', name: '이름', autoGeneratedName: 'Base URL에서 자동 생성', baseUrl: 'Base URL', region: '지역', regionIntl: '국제판', regionCn: '중국 본토', baseUrlPlaceholder: '예: https://api.example.com/v1', apiKey: 'API Key', apiKeyPlaceholder: 'sk-...', defaultModel: '기본 모델', selectOrInput: '모델 선택 또는 직접 입력...', selectModel: '모델 선택...', providerAdded: 'Provider가 추가되었습니다', providerDeleted: 'Provider가 삭제되었습니다', providerCredentialsCleared: 'Provider 자격 증명이 삭제되었습니다', clearProviderCredentials: '자격 증명 삭제', clearCredentialsConfirm: '"{name}"의 저장된 자격 증명을 삭제하시겠습니까? 이 기본 제공 Provider는 목록에 남으며, 자격 증명을 다시 설정하면 사용할 수 있습니다.', disableProvider: 'Provider 비활성화', disableProviderConfirm: '기본 제공 Provider "{name}"을(를) 비활성화하시겠습니까? 이 Provider는 기본 제공 항목으로 남으며 나중에 다시 활성화할 수 있습니다.', providerDisabled: 'Provider가 비활성화되었습니다', defaultProviderUpdated: '기본 Provider가 업데이트되었습니다', defaultProviderUpdateFailed: '기본 Provider 업데이트에 실패했습니다', defaultModelUpdated: '기본 모델이 업데이트되었습니다', defaultModelUpdateFailed: '기본 모델 업데이트에 실패했습니다', deleteProvider: 'Provider 삭제', deleteConfirm: '"{name}"을(를) 삭제하시겠습니까?', codexLoginTitle: 'OpenAI Codex 로그인', codexWaiting: '인증 페이지에서 아래 코드를 입력하여 로그인하세요:', codexCopyCode: '코드가 복사되었습니다', codexOpenLink: '인증 페이지 열기', codexApproved: '로그인 성공', codexExpired: '인증이 만료되었습니다. 다시 시도해주세요.', nousLoginTitle: 'Nous Portal 로그인', nousWaiting: '인증 페이지에서 이 코드를 입력하세요:', nousCopyCode: '코드 복사됨', nousOpenLink: '인증 페이지 열기', nousApproved: '로그인 성공', nousDenied: '인증이 거부되었습니다', nousExpired: '인증이 만료되었습니다', copilotLoginTitle: 'GitHub Copilot 로그인', copilotWaiting: 'GitHub을 열고 아래의 디바이스 코드를 입력하여 인증하세요. 승인 후 창이 자동으로 닫힙니다.', copilotCopyCode: '코드가 복사되었습니다', copilotOpenLink: 'GitHub 인증 페이지 열기', copilotApproved: '로그인 성공!', copilotDenied: '인증이 거부되었습니다.', copilotExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.', copilotAddDetectedTitle: 'GitHub Copilot 감지됨', copilotAddDetected: '이 컴퓨터에서 GitHub Copilot OAuth 토큰이 감지되었습니다. 추가를 클릭하여 Hermes에서 Copilot을 활성화하세요.', copilotAddSourceEnv: '출처: ~/.hermes/.env (COPILOT_GITHUB_TOKEN)', copilotAddSourceGhCli: '출처: gh CLI (gh auth token)', copilotAddSourceAppsJson: '출처: VS Code Copilot 확장 (apps.json)', copilotDeleteHintEnv: '이 작업은 ~/.hermes/.env의 COPILOT_GITHUB_TOKEN을 지웁니다. 다른 도구에는 영향이 없습니다.', copilotDeleteHintGhCli: 'Copilot이 Hermes에서 숨겨집니다. gh CLI 로그인에는 영향이 없으며 `gh auth status`는 여전히 로그인 상태를 표시합니다.', copilotDeleteHintAppsJson: 'Copilot이 Hermes에서 숨겨집니다. VS Code Copilot 확장 로그인에는 영향이 없습니다.', customBadge: '커스텀', previewBadge: '프리뷰', disabledBadge: '사용 불가', disabledTooltip: "이 모델은 현재 계정에서 사용할 수 없습니다.", customModelPlaceholder: '목록에 없는 모델 ID', customModelHint: '제공자는 지원하지만 API가 반환하지 않는 모델용입니다. 표시 이름 변경이 아닙니다. Enter로 불러옵니다.', noProviders: 'Provider가 없습니다. 사용자 지정 Provider를 추가하여 시작하세요.', clearVisibleModels: '선택 지우기', generalTitle: '일반 모델', combinationTitle: '모델 앙상블', combinationSubtitle: 'MoA 프리셋을 설정합니다. 참조 모델이 먼저 관점을 제공하고, 이후 하나의 집계 모델이 최종 응답과 도구 호출을 처리합니다.', combinationPreset: '프리셋', combinationName: '이름', combinationAddModel: '모델 앙상블 추가', combinationEditModel: '모델 앙상블 편집', combinationNewPreset: '새 프리셋', combinationPresetPlaceholder: '예: review', combinationAddPreset: '프리셋 추가', combinationSetDefault: '기본값으로 설정', combinationEnabled: '참조 모델 활성화', combinationReferenceModels: '참조 모델', combinationReferenceModel: '참조 모델', combinationAddReference: '참조 모델 추가', combinationAggregator: '집계 모델', combinationReferenceTemperature: '참조 온도', combinationAggregatorTemperature: '집계 온도', combinationMaxTokens: '최대 토큰', combinationNotSet: '설정 안 됨', combinationSaved: '모델 앙상블 저장됨', combinationLoadFailed: '모델 앙상블을 불러오지 못했습니다', combinationSaveFailed: '모델 앙상블을 저장하지 못했습니다', combinationPresetExists: '프리셋이 이미 존재합니다', combinationNameRequired: '모델 앙상블 이름을 입력하세요', combinationNameInvalid: '이름에는 문자, 숫자, 밑줄, 하이픈, 점만 사용할 수 있습니다', combinationReferenceRequired: '참조 모델을 하나 이상 추가하세요', combinationAggregatorRequired: '집계 모델을 선택하세요', auxiliaryTitle: '보조 모델', auxiliarySubtitle: '압축, 비전, 승인, MCP, 백그라운드 유지 관리 같은 보조 작업별 모델 재정의입니다.', auxiliaryRefresh: '새로고침', auxiliaryTask: '작업', auxiliaryTimeout: '시간 제한', auxiliaryDownloadTimeout: '다운로드 시간 제한', auxiliaryActions: '작업', auxiliaryDefault: '기본값', auxiliaryCustomEndpoint: '사용자 지정 엔드포인트', auxiliaryProviderAuto: '자동', auxiliaryProviderMain: '메인 모델', auxiliaryProviderPlaceholder: 'auto, main 또는 provider key', auxiliaryDownloadShort: '다운로드', auxiliaryExtraBody: 'Extra body JSON', auxiliaryClear: '초기화', auxiliarySaved: '보조 모델을 저장했습니다', auxiliaryLoadFailed: '보조 모델을 불러오지 못했습니다', auxiliarySaveFailed: '보조 모델을 저장하지 못했습니다', auxiliaryInvalidExtraBody: 'Extra body는 JSON 객체여야 합니다', auxiliaryTaskCompression: '압축', auxiliaryTaskVision: '비전', auxiliaryTaskWebExtract: '웹 추출', auxiliaryTaskSkillsHub: '스킬 허브', auxiliaryTaskApproval: '승인', auxiliaryTaskMcp: 'MCP', auxiliaryTaskTitleGeneration: '제목 생성', auxiliaryTaskTriageSpecifier: '트리아지 지정', auxiliaryTaskKanbanDecomposer: 'Kanban 분해', auxiliaryTaskProfileDescriber: '프로필 설명', auxiliaryTaskCurator: '큐레이터', auxiliaryTaskSessionSearch: '세션 검색', auxiliaryTaskFlushMemories: '메모리 쓰기', currentDefault: '현재 기본값', defaultShort: '기본값', setDefaultProvider: '기본 Provider로 설정', setDefault: '기본값으로 설정', builtIn: '내장', customType: '사용자 지정', provider: '공급자', contextLength: '컨텍스트 길이', contextLengthPlaceholder: '예: 256000 (선택사항)', apiMode: 'API 모드', local: '로컬 ({host})', selectProviderRequired: 'Provider를 선택해 주세요', baseUrlRequired: 'Base URL을 입력해 주세요', apiKeyRequired: 'API Key를 입력해 주세요', modelRequired: '기본 모델을 선택해 주세요', enterBaseUrl: '먼저 Base URL을 입력해 주세요', unexpectedFormat: '예상치 못한 응답 형식입니다', foundModels: '{count}개의 모델을 찾았습니다', fetchFailed: '모델을 가져오지 못했습니다', xaiWaiting: '열린 xAI 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.', xaiOpenLink: 'xAI 인증 페이지 열기', xaiLoginTitle: 'xAI Grok OAuth 로그인', xaiExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.', xaiCopyLink: '인증 링크 복사', xaiApproved: '로그인 성공!', anthropicLoginTitle: 'Claude OAuth 로그인', anthropicWaiting: 'Claude 인증 페이지에서 인증을 완료한 뒤 반환된 코드를 여기에 붙여넣으세요.', anthropicOpenLink: 'Claude 인증 페이지 열기', anthropicCopyLink: '인증 링크 복사', anthropicCodePlaceholder: '인증 코드 붙여넣기...', anthropicSubmitCode: '코드 제출', anthropicApproved: '로그인 성공!', anthropicExpired: '인증이 만료되었습니다. 다시 시도하세요.', geminiLoginTitle: 'Google Gemini OAuth 로그인', geminiWaiting: '열린 Google 페이지에서 인증을 완료하세요. 승인되면 창이 자동으로 닫힙니다.', geminiOpenLink: 'Google 인증 페이지 열기', geminiCopyLink: '인증 링크 복사', geminiApproved: '로그인 성공!', geminiExpired: '인증 링크가 만료되었습니다. 다시 시도하세요.', visibilitySelectOne: '최소 하나의 표시 모델을 유지하세요', visibilitySaved: '표시 모델이 저장되었습니다', visibilitySaveFailed: '표시 모델 저장 실패', visibilityHint: 'Web UI의 모델 선택기와 모델 페이지 표시에만 영향을 줍니다. Hermes CLI의 provider/model 설정은 변경되지 않으며 실제 호출은 원본 모델 ID를 사용합니다.', showAllModels: '모든 모델 표시', searchPlaceholder: '모델 검색...', noResults: '결과 없음', noModels: '모델 없음', removeCustomModel: '목록에 없는 이 모델 제거', refresh: '모델 목록 새로고침 (config.yaml 다시 불러오기)', more: '개 더', models: '모델 목록', manageVisibleModelsFor: '{name} 표시 모델 관리', manageVisibleModels: '표시 모델 관리', getApiKey: 'API Key 가져오기', count: '개 모델', aliasUseOriginal: '원본 ID로 복원', aliasTitleFor: '{model}의 표시 이름', aliasTitle: '모델 표시 이름', aliasSaveFailed: '표시 이름 저장 실패', aliasPlaceholder: '비워두면 원본 모델 ID 사용', aliasManageFor: '{provider}의 표시 이름', aliasManage: '표시 이름', aliasHint: 'Web UI 표시 이름만 변경합니다. Hermes에는 여전히 원본 모델 ID가 전달됩니다.', aliasEdit: '이름 변경', aliasCanonical: '원본 ID: {model}', }, // 프로필 profiles: { title: '프로필', create: '프로필 생성', import: '가져오기', export: '내보내기', rename: '이름 변경', delete: '삭제', switchTo: 'Hermes Profile 전환', switchConfirm: '`hermes profile use {name}`를 실행하고 Hermes CLI active profile을 변경합니다. 계속하시겠습니까?', switchSuccess: 'Hermes active profile이 "{name}"(으)로 전환되었습니다', switchFailed: 'Hermes Profile 전환 실패. 게이트웨이를 수동으로 재시작해야 할 수 있습니다.', createSuccess: '프로필 "{name}"이(가) 생성되었습니다', createFailed: '프로필 생성 실패', renameSuccess: '프로필 이름이 변경되었습니다', renameFailed: '프로필 이름 변경 실패', deleteConfirm: '프로필 "{name}"을(를) 삭제하시겠습니까?', deleteSuccess: '프로필이 삭제되었습니다', deleteFailed: '프로필 삭제 실패', exportSuccess: '프로필이 내보내기되었습니다', exportFailed: '프로필 내보내기 실패', importSuccess: '프로필이 가져오기되었습니다', importFailed: '프로필 가져오기 실패', importSelectFile: '아카이브 파일 선택', importInvalidFile: '유효한 아카이브 파일을 선택해 주세요 (.tar.gz, .tgz, .gz, .zip)', name: '프로필 이름', namePlaceholder: '영문, 숫자, 하이픈만 사용 가능', nameValidation: '프로필 이름에는 소문자, 숫자, 밑줄, 하이픈만 사용할 수 있습니다', newName: '새 이름', newNamePlaceholder: '새 이름을 입력하세요', cloneFromCurrent: '현재 프로필에서 복제', cloneCleanupNotice: '복제 시 독점형 플랫폼 자격 증명(Weixin / Telegram / Slack 등)은 자동으로 건너뛰어 원본 프로필과의 충돌을 방지합니다', cloneStrippedCredentials: '독점 자격 증명 {count}개 제거됨: {list}', cloneDisabledPlatforms: '플랫폼 {count}개 비활성화됨: {list}', cloneStrippedConfigCredentials: 'config.yaml에서 임베디드 자격 증명 {count}개 제거됨: {list}', archivePath: '아카이브 경로', archivePathPlaceholder: '아카이브 파일의 서버 경로', importName: '프로필 이름 (선택)', importNamePlaceholder: '비워두면 아카이브 이름을 사용합니다', active: '활성', model: '모델', gateway: '게이트웨이', alias: '별칭', provider: '공급자', path: '경로', skills: '스킬', hasEnv: '.env 있음', hasSoulMd: 'soul.md 있음', noProfiles: '프로필이 없습니다. 새로 만들어 시작하세요.', avatar: { title: '사용자 지정 아바타', customize: '아바타', upload: '이미지 업로드', random: '무작위 생성', reset: '기본값 복원', hint: 'PNG, JPEG, WebP 지원, 최대 1MB', invalidType: 'PNG, JPEG 또는 WebP 이미지를 선택하세요', tooLarge: '아바타 이미지는 1MB를 초과할 수 없습니다', saveSuccess: '아바타가 저장되었습니다', saveFailed: '아바타 저장 실패', resetSuccess: '기본 아바타로 복원되었습니다', resetFailed: '기본 아바타 복원 실패', }, runtime: { activeProfile: '현재: {name}', bridgeWorker: 'Bridge 상태', gateway: '게이트웨이', active: '활성', activeTag: '현재', idle: '대기 중', checking: '확인 중', running: '실행 중', stopped: '중지됨', restartGateway: 'Gateway 재시작', restartProfile: '프로필 재시작', switchProfile: '프론트엔드 프로필 전환', gatewayRestarted: 'Gateway가 재시작되었습니다: {name}', gatewayRestartFailed: 'Gateway 재시작 실패', profileRestarted: '프로필이 재시작되었습니다: {name}', profileRestartFailed: '프로필 재시작 실패', }, }, // 로그 logs: { title: '로그', all: '전체', searchPlaceholder: '검색...', refresh: '새로고침', noEntries: '로그 항목 없음', }, // 설정 settings: { title: '설정', saved: '저장됨', saveFailed: '저장 실패', tabs: { display: '표시', account: '현재 계정', users: '계정 관리', agent: '에이전트', proxy: '프록시', memory: '메모리', compression: '압축', session: '세션', privacy: '개인정보', apiServer: 'API 서버', models: '모델', voice: '음성', }, display: { streaming: '스트리밍 응답', streamingHint: 'AI 응답을 실시간으로 표시', compact: '컴팩트 모드', compactHint: '메시지 간격 줄이기', showReasoning: '추론 과정 표시', showReasoningHint: '모델의 생각 과정 표시', showCost: '비용 표시', showCostHint: '응답에 토큰 사용량 표시', inlineDiffs: '인라인 변경사항', inlineDiffsHint: '코드 변경사항을 인라인으로 표시', bellOnComplete: '완료 알림음', bellOnCompleteHint: 'AI 응답 완료 시 알림음 재생', notifyOnComplete: '완료 알림', notifyOnCompleteHint: 'AI 응답 완료 시 시스템 알림 표시', notifyOnCompleteMacHint: 'macOS 에서는 시스템 설정에서 브라우저 알림을 허용해야 합니다.', notifyOnCompleteDenied: '알림 권한이 거부되었습니다', notifyOnCompleteInsecure: '브라우저 알림은 HTTPS 또는 localhost 가 필요합니다', notifyOnCompleteUnsupported: '이 브라우저는 알림을 지원하지 않습니다', notifyOnCompleteTest: '알림이 활성화되었습니다.', notifyOnCompleteTestButton: '테스트', notifyOnCompleteTesting: '테스트 알림을 보내는 중...', notifyOnCompleteTestSent: '테스트 알림을 보냈습니다', notifyOnCompleteTestFailed: '테스트 알림 전송 실패', busyInputMode: '바쁨 입력 모드', busyInputModeHint: 'AI 처리 중에도 입력 허용', theme: '테마', themeHint: '라이트, 다크 또는 시스템 설정 따르기', themeLight: '라이트', themeDark: '다크', themeSystem: '시스템', chatInputHeight: '채팅 입력 높이', chatInputHeightHint: '데스크톱 채팅 입력창 기본 높이(px). 모바일은 자동 높이를 유지합니다.' }, agent: { maxTurns: '최대 턴 수', maxTurnsHint: '대화당 최대 상호작용 라운드 수', gatewayTimeout: '게이트웨이 시간초과', gatewayTimeoutHint: '요청 시간초과 (초)', restartDrainTimeout: '재시작 드레인 시간초과', restartDrainTimeoutHint: '재시작 전 드레인 시간초과 (초)', toolEnforcement: '도구 실행 정책', toolEnforcementHint: '도구 호출 실행 모드 제어', auto: '자동', always: '항상', never: '사용 안 함', }, gatewayAutoStart: { title: 'Gateway 자동 시작', description: 'Web UI 시작 시 자동으로 실행할 로컬 Hermes profile gateway를 제어합니다. 이 값은 profile config.yaml이 아니라 Web UI 설정에 저장됩니다.', enabled: 'Gateway 자동 시작', enabledHint: '끄면 시작 시 어떤 profile gateway도 자동으로 실행하지 않습니다.', management: '통합 gateway', managementHint: 'Hermes Agent 0.17.0 이상이 필요합니다. 켜면 Web UI가 multiplex_profiles를 기록해 default gateway가 모든 profiles를 처리합니다. 다른 profile은 Feishu, Weixin, QQBot 같은 메시징 진입점을 별도로 설정할 수 없습니다. 끄면 해당 설정을 제거합니다.', managementAuto: '자동', managementPerProfile: 'Profile별 gateway 하나', managementUnified: '통합 default gateway', mode: 'Profile 정책', modeHint: '발견된 모든 profiles를 시작하거나 명시적으로 포함한 목록만 시작합니다.', modeAll: '발견된 모든 profiles', modeInclude: '포함된 profiles만', include: '포함할 profiles', includeHint: '쉼표로 구분한 profile 이름입니다. 포함 모드에서 빈 목록은 아무것도 시작하지 않습니다.', exclude: '제외할 profiles', excludeHint: 'include/all 정책 적용 후 건너뛸 profile 이름을 쉼표로 구분해 입력합니다.', profileListPlaceholder: 'default, reviewer', }, proxy: { title: 'Gateway 프록시', description: '선택한 profile gateway의 프록시 환경 변수를 설정합니다. 변경 사항을 저장하면 gateway가 재시작되어 메시징 플랫폼이 새 네트워크 설정을 사용합니다.', httpsProxy: 'HTTPS_PROXY', httpsProxyHint: 'HTTPS 요청용 프록시입니다. 보통 가장 먼저 설정하는 값입니다.', httpProxy: 'HTTP_PROXY', httpProxyHint: '일반 HTTP 요청용 프록시입니다.', allProxy: 'ALL_PROXY', allProxyHint: '프로토콜별 프록시가 없을 때 사용하는 대체 프록시입니다.', noProxy: 'NO_PROXY', noProxyHint: '프록시를 우회할 호스트 또는 도메인을 쉼표로 구분합니다.', save: '프록시 설정 저장', }, memory: { enabled: '메모리 활성화', enabledHint: 'AI가 대화 컨텍스트를 기억하도록 허용', userProfile: '사용자 프로필', userProfileHint: 'AI가 사용자 선호를 기억하도록 허용', charLimit: '메모리 문자 제한', charLimitHint: 'MEMORY.md 최대 문자 수', userCharLimit: '사용자 프로필 문자 제한', userCharLimitHint: 'USER.md 최대 문자 수', }, compression: { enabled: '압축 활성화', enabledHint: '긴 채팅 기록이 모델 컨텍스트를 넘기 전에 자동 압축', threshold: '압축 임계값', thresholdHint: '추정 토큰이 이 컨텍스트 비율을 넘으면 압축 시작', targetRatio: '목표 비율', targetRatioHint: '압축 후 기록 크기를 컨텍스트 비율로 지정', protectLastN: '최근 메시지 보호', protectLastNHint: '이 수만큼 최신 메시지는 압축하지 않음', protectFirstN: '처음 메시지 보호', protectFirstNHint: '이 수만큼 처음 메시지는 압축하지 않음', }, session: { mode: '초기화 모드', modeHint: '세션 초기화 트리거 조건', modeBoth: '유휴 + 예약', modeIdle: '유휴만', modeDaily: '예약만', modeNone: '안함 (수동만)', idleMinutes: '유휴 시간초과', idleMinutesHint: '자동 초기화 대기 시간 (분)', atHour: '예약 초기화 시간', humanOnly: '사람 세션만 표시', humanOnlyHint: '하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다', liveMonitorHumanOnly: '라이브 모니터: 사람 세션만 표시', liveMonitorHumanOnlyHint: '라이브 모니터에서 하위 에이전트 및 세션 모니터 노이즈를 기본으로 숨깁니다', atHourHint: '매일 지정한 시간에 세션 초기화', requireAuth: '세션 승인', requireAuthHint: '세션 작업에 승인을 요구합니다', memoryWriteApproval: '메모리 쓰기 검토', memoryWriteApprovalHint: 'Hermes Agent의 메모리 쓰기를 저장하기 전에 승인 대기 상태로 둡니다.', skillsWriteApproval: '스킬 쓰기 검토', skillsWriteApprovalHint: 'Hermes Agent의 스킬 변경을 저장하기 전에 승인 대기 상태로 둡니다.', writeApprovalTitle: '쓰기 승인 대기', writeApprovalDescription: 'Hermes Agent가 보류한 메모리와 스킬 쓰기를 승인하거나 거부합니다.', writeApprovalRefresh: '새로고침', writeApprovalEmpty: '승인 대기 중인 쓰기가 없습니다.', writeApprovalMemory: '메모리', writeApprovalSkills: '스킬', writeApprovalViewDiff: '검토', writeApprovalHideDiff: '숨기기', writeApprovalNoDiff: '표시할 차이가 없습니다.', writeApprovalLoadFailed: '승인 대기 쓰기를 불러오지 못했습니다', writeApprovalDiffFailed: '쓰기 세부 정보를 불러오지 못했습니다', writeApprovalActionFailed: '승인 대기 쓰기를 처리하지 못했습니다', writeApprovalApproved: '쓰기가 승인되었습니다', writeApprovalRejected: '쓰기가 거부되었습니다', writeApprovalApprove: '승인', writeApprovalReject: '거부', writeApprovalPendingMemoryWrite: '승인 대기 메모리 쓰기', writeApprovalCurrentFile: '현재 {file}', writeApprovalProposedFile: '제안된 {file}', writeApprovalDiffSection: '차이', writeApprovalPatchOldStringMissing: '패치 old_string을 현재 {file}에서 찾지 못해 승인해도 파일은 변경되지 않습니다.', writeApprovalRequestedOldString: '요청된 old_string', writeApprovalCurrentReadFailed: '현재 {file}을 UTF-8 텍스트로 읽을 수 없습니다.', writeApprovalDeleteSkill: '이 승인은 스킬 {skill}을 삭제합니다.', writeApprovalRemoveFile: '이 승인은 스킬 {skill}에서 {file}을 제거합니다.', }, privacy: { redactPii: '개인정보 마스킹', redactPiiHint: '민감 정보 자동 감지 및 숨김 (비밀번호, 키 등)', }, apiServer: { enable: '활성화', enableHint: 'API 서버 활성화', host: '호스트', hostHint: '수신 주소', port: '포트', portHint: '수신 포트', key: '키', keyHint: 'API 접근 키', cors: 'CORS 출처', corsHint: '허용된 교차 출처', }, voice: { activeTtsApi: '활성 TTS API', activeSttApi: '활성 STT API', ttsProvidersTitle: 'TTS 제공자', ttsProvidersDescription: '어시스턴트 응답 재생과 음성 미리듣기에 사용하는 텍스트 음성 변환 연동을 관리합니다.', sttProvidersTitle: 'STT 제공자', sttProvidersDescription: '마이크와 음성 입력 흐름에서 사용하는 음성 텍스트 변환 연동을 관리합니다.', noneSelected: '선택 없음', keyStored: '저장됨', keyMissing: '없음', customApi: 'API', localBuiltin: '로컬 내장', ttsCardHint: '음성 합성 제공자', sttCardHint: '음성 전사 제공자', setActive: '활성화', testAction: '테스트', connect: '연결', presetEdgeTtsLabel: 'Edge TTS', presetEdgeTtsDescription: 'Microsoft Edge의 무료 고품질 클라우드 음성입니다.', presetOpenaiTtsLabel: 'OpenAI TTS', presetMimoTtsLabel: 'MiMo TTS', presetDoubaoTtsLabel: 'Volcengine Doubao TTS', presetCustomTtsLabel: '사용자 지정 TTS', presetBrowserSttLabel: '브라우저 STT', presetBrowserSttDescription: '브라우저 기본 음성 인식 API입니다.', presetOpenaiWhisperLabel: 'OpenAI Whisper', presetGroqSttLabel: 'Groq STT', presetDoubaoSttLabel: 'Volcengine Doubao STT', presetCustomSttLabel: '사용자 지정 STT', apiCompatibility: 'API 호환성', openaiCompatible: 'OpenAI 호환', manualCustomEndpoint: '수동 사용자 지정 엔드포인트', connectionStep: '연결', discoveryManualHint: '수동 사용자 지정 엔드포인트가 선택되었습니다. 모델 검색을 사용할 수 없으므로 모델 이름을 직접 입력하세요.', discoveryCredentialHint: 'Base URL과 API key를 입력한 뒤 연결하여 사용 가능한 모델을 가져오세요.', discoveryNoAutoProbeHint: '입력 중에는 요청을 보내지 않습니다. 자격 증명이 준비되면 Connect를 사용하세요.', apiKeyConnectPlaceholder: '연결할 API key를 붙여넣으세요. 저장된 key는 표시되지 않습니다', connectFetchModels: '연결 및 모델 가져오기', modelRecommendedSuffix: '추천', modelConnectManualHint: '연결하여 자동 입력하거나 직접 입력하세요.', modelRequiredConnectManual: '모델은 필수입니다. 연결하여 자동 입력하거나 직접 입력하세요.', apiKeyRequired: 'API key는 필수입니다.', apiKeyRequiredForDiscovery: '모델을 가져오려면 API key가 필요합니다.', baseUrlRequired: 'Base URL은 필수입니다.', baseUrlHttpsRequired: 'http:// 또는 https:// 프로토콜을 사용하세요.', baseUrlInvalid: 'https://를 포함한 올바른 Base URL을 입력하세요.', discoveryFailedManualFallback: '모델을 가져올 수 없습니다. 모델 이름은 직접 입력할 수 있습니다.', completeRequiredProviderFields: '저장하기 전에 필수 provider 필드를 완료하세요.', fetchingModels: '모델 가져오는 중...', recommendedModel: '추천: {model}.', useRecommendedModel: '이 모델 사용', modelsDiscovered: '{count}개 모델을 발견했습니다. 필드가 비어 있으면 추천 모델이 선택됩니다.', remove: '제거', testSuccess: '테스트 완료', testTextRequired: '테스트하기 전에 텍스트를 입력하세요.', keyMissingForTest: '이 제공자를 테스트하기 전에 API 키를 추가하세요.', testing: '테스트 중...', transcribing: '전사 중...', browserSttTestHint: '브라우저 STT는 채팅 마이크에서 테스트합니다.', sttEmptyAudio: '녹음된 오디오가 없습니다. 다시 시도하세요.', sttTestSuccess: '전사가 완료되었습니다', sttRecordingHint: '녹음 중... 전사하려면 중지를 클릭하세요.', keepStoredKeyPlaceholder: '저장된 키를 유지하려면 비워 두세요', apiKeyPlaceholder: 'API 키 입력', lastTest: '마지막 테스트', notTested: '—', recording: '녹음 중', testFailedShort: '실패', testFailedSummary: '테스트에 실패했습니다. 제공자 설정을 확인하고 다시 시도하세요.', showDetails: '세부 정보 표시', hideDetails: '세부 정보 숨기기', moreActions: '더보기', moreActionsFor: '{provider} 추가 작업', addTtsApi: 'TTS API 추가', addSttApi: 'STT API 추가', active: '활성', builtin: '내장', connected: '연결됨', disconnected: '연결 끊김', source: '소스', model: '모델', voice: '음성', doubaoVoiceHint: 'Seed TTS 2.0 음색을 선택하면 리소스 필드가 자동으로 업데이트됩니다.', apiKey: 'API 키', confirmDeleteSecret: '이 음성 API의 저장된 API 키를 삭제할까요?', ttsTitle: '텍스트 음성 변환', ttsSaved: 'TTS 설정이 서버에 저장되었습니다', ttsSaveFailed: 'TTS 설정 저장에 실패했습니다', ttsTestSaved: '미리듣기에 성공했습니다. TTS 설정이 서버에 저장되었습니다', ttsTestSaving: '미리듣기 전에 TTS 설정을 저장하는 중...', ttsMissingBaseUrl: '테스트 전에 Base URL이 필요합니다. 제공자 엔드포인트를 입력한 뒤 다시 테스트하세요.', ttsMissingApiKey: '테스트 전에 API 키가 필요합니다. 키를 붙여넣거나 먼저 서버 저장 키를 저장하세요.', ttsCleared: '저장된 TTS 키를 삭제했습니다', ttsClearFailed: '저장된 TTS 키 삭제에 실패했습니다', storedBaseUrlsTitle: '저장된 Base URLs', storedBaseUrlsHint: '저장된 음성 provider endpoint를 여기서 관리합니다. 위 입력란은 현재 값만 지우고, 저장된 URL 삭제는 여기서 합니다.', storedBaseUrlsEmpty: '서버에 저장된 사용자 지정 음성 Base URL이 없습니다.', storedBaseUrlDelete: 'URL 삭제', storedApiKeysTitle: '저장된 API keys', storedApiKeysHint: '서버에 저장된 음성 API key 목록입니다. 용도와 출처만 표시하고 전체 key는 표시하지 않습니다.', storedApiKeysEmpty: '서버에 저장된 음성 API key가 없습니다.', storedKeyKindTts: 'TTS', storedKeyKindStt: 'STT', storedApiKeyMasked: '[stored]', storedApiKeyDelete: 'key 삭제', baseUrlPresetClear: 'URL 지우기', baseUrlPresetCleared: '현재 Base URL을 지웠습니다.', baseUrlPresetDelete: 'URL 삭제', baseUrlPresetDeleted: '저장 목록에서 Base URL을 제거했습니다.', baseUrlPresetDeleteFailed: '저장된 Base URL 제거에 실패했습니다.', ttsPendingSecret: '새 키가 저장됩니다', ttsStoredSecret: '서버에 저장된 키가 있습니다: {value}', ttsClearKey: '저장된 키 삭제', sttTitle: '음성 텍스트 변환', sttProvider: 'STT 제공자', sttProviderHint: '음성 입력을 전사하는 방식을 선택하세요', sttProviderBrowser: '브라우저', sttProviderOpenai: 'OpenAI 호환', sttProviderCustom: '사용자 지정', sttBrowserHint: '사용 가능한 경우 브라우저 내장 음성 인식을 사용합니다.', sttApiKey: 'API 키', sttApiKeyHint: '인증이 필요한 STT 제공자를 위해 서버 측에 저장됩니다.', sttStoredSecret: '저장된 서버 키: {value}', sttPendingSecret: '저장된 서버 키: 저장 시 업데이트됩니다', sttClearKey: '저장된 키 삭제', sttModel: '모델', sttModelHint: '사용할 음성 텍스트 변환 모델입니다.', sttLanguage: '언어', sttLanguageHint: 'en 또는 zh 같은 선택적 언어 힌트입니다.', sttPrompt: '프롬프트', sttPromptHint: '선택적 전사 프롬프트입니다.', sttAudioTranscode: '오디오 트랜스코딩', sttAudioTranscodeNone: '원본 오디오 전송', sttAudioTranscodeFfmpeg: 'ffmpeg로 WAV 변환', sttBaseUrl: 'Base URL', sttBaseUrlHint: 'OpenAI 호환 사용자 지정 음성 텍스트 변환 엔드포인트입니다.', sttSave: 'STT 설정 저장', sttSaved: 'STT 설정이 서버에 저장되었습니다.', sttSaveFailed: 'STT 설정 저장에 실패했습니다.', sttCleared: '저장된 STT 비밀 값이 서버에서 삭제되었습니다.', sttClearFailed: '저장된 STT 비밀 값 삭제에 실패했습니다.', sttActiveSaved: '활성 STT 제공자가 서버에 저장되었습니다.', sttSaveActive: '활성 STT 제공자 저장', sttEndpointHint: '최종 전사 엔드포인트: {endpoint}', sttTestTitle: '음성 텍스트 변환 테스트', sttTestButton: 'STT API 테스트', sttTestStopButton: '중지하고 전사', sttTestBackendOnly: 'STT API 테스트는 OpenAI 호환 및 사용자 지정 제공자에서 사용할 수 있습니다.', sttTestRecording: '테스트 샘플 녹음 중... 완료되면 중지하고 전사를 클릭하세요.', sttTestTranscribing: '테스트 샘플 전사 중...', sttTestEmpty: 'STT 테스트용 오디오가 녹음되지 않았습니다.', sttTestSucceeded: 'STT 테스트가 성공했습니다.', sttTestFailed: 'STT 테스트 실패: {error} — {hint}', sttFailureHintMissingConfig: '테스트 전에 제공자가 Base URL/모델 및 API 키와 함께 저장되었는지 확인하세요.', sttFailureHintAuth: 'API 키를 확인하세요. 키가 이미 저장되어 있었다면 현재 키를 다시 붙여넣고 저장한 뒤 테스트하세요.', sttFailureHintForbidden: '키가 제공자에 도달했지만 이 STT 모델 또는 계정에 대한 권한이 없습니다. 제공자 접근 권한/결제를 확인하세요.', sttFailureHintEndpointModel: 'Base URL과 모델을 확인하세요. Groq의 경우 {endpoint}에 whisper-large-v3-turbo 또는 다른 Groq STT 모델을 사용하세요.', sttFailureHintModel: '선택한 STT 모델이 존재하며 이 계정에서 활성화되어 있는지 확인하세요.', sttFailureHintQuota: '제공자가 할당량, 결제 또는 속도 제한 문제를 보고했습니다. 계정 할당량/결제를 확인하거나 나중에 다시 시도하세요.', sttFailureHintNetworkCustom: '서버가 사용자 지정 STT 엔드포인트에 연결할 수 없습니다. {endpoint}가 Web UI 서버에서 접근 가능하고 OpenAI 호환인지 확인하세요.', sttFailureHintNetwork: 'Web UI 서버가 STT 제공자에 연결할 수 없습니다. 네트워크/프록시/방화벽을 확인하고 다시 시도하세요.', sttFailureHintAudio: '녹음된 오디오가 비어 있거나 거부되었습니다. 짧고 명확한 샘플을 시도하고, 마이크 접근을 허용하거나 Chrome에서 다시 시도하세요.', sttFailureHintGenericCustom: 'API 키, Base URL, 모델, 최종 엔드포인트 {endpoint}를 확인하세요.', sttFailureHintGeneric: 'API 키, 모델, 제공자 계정 접근 권한을 확인한 뒤 다시 시도하세요.', sttTestRecordFailed: '마이크 녹음을 시작할 수 없습니다: {error}', sttTestTranscript: '전사 결과: {text}', ttsProvider: 'TTS 제공자', ttsProviderHint: '메시지 재생에 사용할 텍스트 음성 변환 엔진 선택', providerWebSpeech: 'WebSpeech API (브라우저)', providerOpenai: 'OpenAI TTS', providerCustom: '사용자 정의 엔드포인트 (OpenAI 호환)', providerEdge: 'Edge TTS (무료, API Key 불필요)', // WebSpeech webspeechVoice: '음성', webspeechVoiceHint: '브라우저 또는 OS에서 음성 선택', webspeechVoicePlaceholder: '자동 (기본 음성)', // OpenAI 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: '합성에 사용할 음색', // Custom endpoint customHint: '모든 OpenAI 호환 TTS API 사용 가능 — GPT-SoVITS, CosyVoice 등 지원', customUrl: 'API URL', customUrlHint: 'TTS 서비스의 기본 URL', customUrlPlaceholder: '로컬 어댑터에 설정된 주소 (예: http://127.0.0.1:9880)', customApiKey: 'API 키 (선택사항)', customApiKeyHint: '일부 사용자 정의 엔드포인트는 인증 필요', customApiKeyPlaceholder: '필요하지 않으면 비워둠', // Edge TTS 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)', // Test testTitle: '음성 테스트', testText: '테스트 텍스트', testTextPlaceholder: '테스트할 텍스트 입력...', testTextDefault: '안녕하세요, 음성 테스트입니다.', testButton: '테스트', testButtonPlaying: '재생 중...', testFailed: '테스트 실패: {error}', // MiMo TTS providerMimo: 'MiMo TTS', mimoHint: '샤오미 MiMo TTS — 프리셋 음성, 음성 디자인, 음성 클론 세 가지 모드 지원', mimoApiKey: 'API Key', mimoApiKeyHint: 'platform.xiaomimimo.com에서 발급', mimoApiKeyPlaceholder: 'MiMo API Key', mimoAuthMode: '인증 모드', mimoAuthModeHint: '선택한 MiMo 엔드포인트가 요구하는 헤더 형식', mimoAuthModeBearer: 'Bearer 토큰 (Authorization)', mimoAuthModeApiKey: 'API key 헤더 (api-key)', mimoAuthModeBoth: '두 헤더 모두', mimoBaseUrl: 'Base URL', mimoBaseUrlHint: 'MiMo API 엔드포인트 URL', mimoModel: '모델', mimoModelHint: '음성 합성 모델 선택', mimoModelPreset: '프리셋 음성', mimoModelVoiceDesign: '음성 디자인', mimoModelVoiceClone: '음성 클론', mimoVoice: '음성', mimoVoiceHint: '프리셋 음성 선택', mimoVoiceDesignPrompt: '음성 설명', mimoVoiceDesignPromptHint: '원하는 음성 특징을 설명하세요', mimoVoiceDesignPromptPlaceholder: '예: 따뜻한 젊은 여성 목소리, 약간 느린 속도, 마그네틱한 톤', mimoCloneAudio: '오디오 업로드', mimoCloneAudioHint: '음성 클론용 오디오 샘플 업로드 (mp3/wav, 최대 10MB)', mimoCloneAudioUpload: '파일 선택', mimoCloneAudioClear: '지우기', mimoStylePrompt: '스타일 프롬프트', mimoStylePromptHint: '선택사항 — 자연어로 말하기 스타일 설명', mimoStylePromptPlaceholder: '예: 밝고 경쾌한 톤, 빠른 속도', }, lockedIps: { title: '잠긴 IP 관리', count: '{count}개 잠김', empty: '잠긴 IP 없음', unlock: '잠금 해제', unlockAll: '전체 해제', unlockAllConfirm: '모든 잠긴 IP를 해제하시겠습니까?', unlocked: 'IP 잠금 해제됨', allUnlocked: '{count}개 IP 잠금 해제됨', type: { password: 'Password', token: 'API token', pairing: 'Device pairing', }, }, userAvatar: { title: '사용자 아바타', upload: '이미지 업로드', random: '무작위 생성', reset: '기본값으로 재설정', hint: 'PNG, JPEG, WebP를 최대 1MB까지 지원하며 500KB 미만으로 자동 압축됩니다.', invalidType: 'PNG, JPEG 또는 WebP 이미지를 선택하세요', tooLarge: '아바타 이미지는 1MB 이하여야 합니다', saveSuccess: '아바타 저장됨', saveFailed: '아바타 저장 실패', resetSuccess: '아바타 재설정됨', resetFailed: '아바타 재설정 실패', }, models: { apiKey: 'API Key', apiKeyPlaceholder: 'API Key 입력', noProviders: '구성된 공급자가 없습니다', save: '저장', saveFailed: '저장 실패', saved: '저장됨', }, }, githubPreview: { title: "버전 미리보기", description: "선택한 GitHub tag 를 Web UI 미리보기 작업 디렉터리에 클론하고, 의존성을 설치한 뒤 개발 포트로 실행합니다.", refresh: "새로고침", selectTag: "tag 선택", prepare: "코드 준비", install: "의존성 설치", start: "미리보기 시작", stop: "중지", note: "미리보기 코드는 Web UI 데이터 홈 아래에 저장됩니다. 프로덕션은 8648을 유지하고, 미리보기 개발 환경은 프론트엔드 8651, 백엔드 8650에서 실행됩니다.", path: "미리보기 경로", webuiHome: "미리보기 데이터 홈", currentTag: "현재 Tag", repoReady: "저장소 준비됨", dependencies: "의존성 설치됨", running: "실행 상태", notRunning: "실행 중 아님", open: "미리보기 열기", log: "작업 로그 경로", logOutput: "로그 출력", actionLog: "작업 로그", devLog: "개발 서버 로그", yes: "예", no: "아니요", actionFailed: "작업 실패", nodeEnvironmentMissing: "Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.", prepareSuccess: "미리보기 코드가 준비되었습니다", installSuccess: "의존성이 설치되었습니다", startSuccess: "미리보기가 완료되었습니다", stopSuccess: "미리보기가 중지되었습니다", }, codingAgents: { title: "코딩 에이전트", notice: "모든 제공업체와 모델이 호환되는 것은 아닙니다.", claudeDescription: "print mode 단발 작업과 대화형 코딩 세션을 위한 Anthropic CLI입니다.", codexDescription: "저장소 작업을 위한 OpenAI CLI 및 Hermes openai-codex 제공업체 흐름입니다.", copyCommand: "복사", commandCopied: "명령이 복사되었습니다", commandCopyFailed: "복사 실패", refresh: "새로고침", checking: "확인 중", installStatus: "설치 상태", installed: "설치됨", notInstalled: "설치되지 않음", installRequired: "{agent}이(가) 설치되어 있지 않습니다. 세션을 만들기 전에 설치하세요.", installNow: "설치", installing: "설치 중", installSuccess: "설치됨", installFailed: "설치 실패", installFailedHermesHint: "설치에 실패했습니다. Hermes에게 설치를 요청하세요.", installFailureReason: "오류 원인", nodeEnvironmentMissing: "Node/npm 환경을 찾을 수 없습니다. Node.js를 설치한 뒤 다시 시도하세요.", deleteNow: "삭제", deleting: "삭제 중", deleteSuccess: "삭제됨", deleteFailed: "삭제 실패", configFiles: "설정 파일", profileScope: "프로필", providerScope: "제공업체", providerPlaceholder: "예: custom:glm", modelScope: "모델", modelPlaceholder: "모델 선택", launchModeScope: "시작 모드", launchModeGlobal: "전역 설정", launchModeScoped: "제공업체와 모델", protocolScope: "프로토콜", protocolOpenAiChat: "OpenAI Chat Completions (/v1/chat/completions)", protocolOpenAiResponses: "OpenAI Responses (/v1/responses)", protocolAnthropicMessages: "Anthropic Messages (/v1/messages)", reloadConfig: "설정 다시 읽기", configFileNotCreated: "생성되지 않음", configLoadFailed: "설정 파일을 읽지 못했습니다", loadFailed: "코딩 에이전트를 확인하지 못했습니다", launch: "시작", launchTitle: "코딩 에이전트 시작", nativeTerminal: "네이티브 터미널", builtInTerminal: "내장 터미널", launchPrepared: "시작 설정이 준비되었습니다", launchPrepareFailed: "시작 설정 준비 실패", nativeLaunchStarted: "네이티브 터미널을 열었습니다", nativeLaunchFailed: "네이티브 터미널을 열지 못했습니다", terminalTitle: "코딩 에이전트 터미널", loadProvidersFailed: "현재 프로필의 제공업체를 불러오지 못했습니다", selectProviderModel: "제공업체와 모델을 선택하세요", launchConfigDir: "시작 설정 디렉터리", launchCommand: "시작 명령", table: { tool: "도구", kind: "단계", command: "명령", note: "설명", action: "작업", }, kinds: { install: "설치", auth: "인증", health: "상태", run: "실행", }, notes: { claudeInstall: "Claude Code CLI를 전역으로 설치합니다.", codexInstall: "Codex CLI를 전역으로 설치합니다.", claudeAuth: "Claude Code 로그인 상태를 확인합니다. 로그인이 없으면 claude를 한 번 실행하세요.", codexAuth: "Hermes가 관리하는 OpenAI Codex OAuth 자격 증명을 추가합니다.", claudeHealth: "업데이터와 로컬 CLI 상태를 확인합니다.", codexHealth: "Codex CLI가 PATH에서 사용 가능한지 확인합니다.", claudeRun: "API 기반 단발 작업에는 print mode가 가장 깔끔한 경로입니다.", codexRun: "Codex 단발 작업은 git 저장소 안에서 실행해야 합니다.", }, }, platform: { requireMention: "{'@'}멘션 필요", requireMentionGroup: "그룹에서 {'@'}멘션 시에만 응답", requireMentionChannel: "채널에서 {'@'}멘션 시에만 응답", requireMentionRoom: "방에서 {'@'}멘션 시에만 응답", reactions: '반응', reactionsHint: '메시지에 이모지 반응', freeResponseChats: '자유 응답 채팅', freeResponseChatsHint: "{'@'}멘션 없이 응답할 채팅 ID (쉼표로 구분)", freeResponseChannels: '자유 응답 채널', freeResponseChannelsHint: "{'@'}멘션 없이 응답할 채널 ID (쉼표로 구분)", freeResponseRooms: '자유 응답 방', freeResponseRoomsHint: "{'@'}멘션 없이 응답할 방 ID (쉼표로 구분)", mentionPatterns: '사용자 지정 멘션 패턴', mentionPatternsHint: '추가 트리거 패턴', autoThread: '자동 스레드', autoThreadHint: "{'@'}멘션 후 자동으로 스레드 생성", autoThreadHintRoom: '방에서 자동으로 스레드 생성', dmMentionThreads: 'DM 멘션 스레드', dmMentionThreadsHint: 'DM에서 멘션 시 스레드로 응답', allowBots: '봇 메시지 허용', allowBotsHint: '다른 봇의 메시지에 응답', allowedChannels: '허용된 채널', allowedChannelsHint: '채널 ID 허용 목록 (쉼표로 구분)', ignoredChannels: '무시할 채널', ignoredChannelsHint: '봇이 응답하지 않는 채널 ID (쉼표로 구분)', noThreadChannels: '스레드 없는 채널', noThreadChannelsHint: '스레드 없이 응답할 채널 ID (쉼표로 구분)', exclusiveTokenWarning: '이 플랫폼은 독점 토큰 잠금을 사용합니다. 각 프로필은 다른 프로필과 충돌하지 않도록 서로 다른 ID 토큰을 사용해야 합니다.', botToken: '봇 토큰', botTokenHint: '개발자 포털에서 발급받은 봇 토큰', proxyUrl: '프록시 URL', proxyUrlHint: '선택 사항인 플랫폼 전용 프록시입니다. http://, https://, socks5:// 지원', accessToken: '액세스 토큰', accessTokenHint: 'Matrix 액세스 토큰', homeserver: '홈서버 URL', homeserverHint: 'Matrix 홈서버 URL', matrixUserId: 'Matrix 사용자 ID', matrixUserIdHint: '비밀번호 로그인에는 필수, 액세스 토큰에는 선택 사항', matrixPassword: 'Matrix 비밀번호', matrixPasswordHint: '액세스 토큰 대신 사용할 로그인 비밀번호', appId: 'App ID', appIdHint: 'Feishu의 App ID', appSecret: 'App Secret', appSecretHint: 'Feishu의 App Secret', encryptKey: '암호화 키', encryptKeyHint: 'Feishu 암호화 키', verificationToken: '검증 토큰', verificationTokenHint: 'Feishu 검증 토큰', clientId: 'Client ID', clientIdHint: 'DingTalk의 Client ID', clientSecret: 'Client Secret', clientSecretHint: 'DingTalk의 Client Secret', cardTemplateId: 'AI 카드 템플릿 ID', cardTemplateIdHint: 'DingTalk AI 카드 템플릿 ID; 비워 두면 AI 카드를 사용하지 않음', botId: 'Bot ID', botIdHint: 'WeCom 봇 ID', wecomSecretHint: 'WeCom 봇 Secret', waEnabled: 'WhatsApp 활성화', waEnabledHint: 'QR 코드 페어링으로 WhatsApp 활성화', weixinToken: 'Weixin 토큰', weixinTokenHint: 'weixin CLI QR 로그인에서 가져오기 (hermes weixin)', accountId: '계정 ID', accountIdHint: 'Weixin 계정 ID', qrLogin: 'QR 로그인', qrRelogin: '다시 로그인', qrFetching: 'QR 코드를 가져오는 중...', qrScanHint: 'WeChat으로 QR 코드를 스캔하여 로그인', qrScanedHint: '스캔됨, 휴대폰에서 확인해 주세요...', qqSandboxHint: '샌드박스 환경 활성화(테스트용)', qqSandbox: '샌드박스 모드', qqQrScanHint: 'QQ로 위 QR 코드를 스캔하거나 휴대폰에서 링크를 열어 바인딩을 완료하세요', qqMarkdownHint: 'Markdown 형식 메시지 활성화(일부 클라이언트는 지원하지 않을 수 있음)', qqMarkdown: 'Markdown 지원', qqAppSecretHint: 'QQ Open Platform Bot의 App Secret', qqAppSecret: 'App Secret', qqAppIdHint: 'QQ Open Platform Bot의 App ID', qqAppId: 'App ID', allowedUsersHint: '사용자 ID 또는 OpenID 허용 목록, 쉼표로 구분', allowedUsers: '허용 사용자', allowAllUsersHint: '모든 사용자의 메시지를 허용합니다. 끄면 허용 목록을 사용합니다', allowAllUsers: '모든 사용자 허용', }, // 언어 language: { label: '언어', zh: '中文', en: 'English', ko: '한국어', }, // 터미널 terminal: { sessions: '세션', newTab: '새 터미널', closeSession: '이 세션을 닫으시겠습니까?', sessionExited: '종료됨', processExited: '프로세스가 종료되었습니다 (코드 {code})', noSessions: '터미널 세션이 없습니다', connectionFailed: '터미널에 연결하지 못했습니다', connectionError: '연결 오류', connectionClosed: '연결이 닫혔습니다', }, // 사용량 usage: { title: '사용량 통계', refresh: '새로고침', totalTokens: '총 토큰 수', inputTokens: '입력', outputTokens: '출력', totalSessions: '총 세션 수', avgPerDay: '일평균 ~{n}', estimatedCost: '예상 비용', cacheHitRate: '캐시 적중률', modelBreakdown: '모델별 분포', agentBreakdown: 'Agent별 분포', agents: { hermes: 'Hermes Agent', claudeCode: 'Claude Code', codex: 'Codex', ekkoAgent: 'Ekko Agent', unknown: '알 수 없음' }, 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: '기타', }, workflow: { node: { approvalRequired: '완료 후 승인', }, status: { pending_approval: '승인 대기', approval_rejected: '승인 거부', }, }, // 변경 이력 changelog: { new_0_6_29_1: '이번 릴리스는 0.6.28 이후 병합된 14개 PR을 모두 포함하며 UI 일관성, MCU 오디오와 v2 하드웨어, workspace diff, 사용량 분석, Docker 업데이트, MiMo 음성 복제를 다룹니다', new_0_6_29_2: '페이지 헤더, 다크 표면, 모서리 반경을 하나의 시각 시스템으로 통일하고 버전 미리보기는 유효한 태그를 시맨틱 버전순으로 정렬합니다 (#2014, #2015)', new_0_6_29_3: 'ESP32 제품 페이지를 반응형으로 개편하고 웹사이트 버전 선택기에 Hermes Agent 0.18.2를 추가했습니다 (#2020, #2042)', new_0_6_29_4: 'ESP32-C3 v1 업링크 오디오에 IMA-ADPCM을 적용해 대역폭을 약 4분의 1로 줄이고 녹음 한도를 2분으로 늘렸으며, OLED는 임시 상태 후 LAN IP로 돌아갑니다 (#2024, #2025)', new_0_6_29_5: 'Workspace diff를 기본 접힘 상태로 표시하고 0줄 변경을 제거했으며 표준 다크 채팅 입력 배경을 복원했습니다 (#2032)', new_0_6_29_6: '세션 내보내기는 잘못된 퍼센트 기호가 있는 파일명을 처리하고, Docker 업데이트는 컨테이너 내부 npm 대신 이미지 pull/recreate 안내를 표시합니다 (#2026, #2033)', new_0_6_29_7: 'Bridge 도구 결과는 전체 저장하되 모델 컨텍스트에서는 앞뒤를 사용한 5,500자 요약으로 제한해 반복적인 컨텍스트 증가를 막습니다 (#2036)', new_0_6_29_8: 'Hermes Agent, Claude Code, Codex, Ekko Agent의 모델 호출을 통합 기록하고 Agent 분포 보기를 추가했습니다 (#2039)', new_0_6_29_9: '독립된 ESP32-C3 v2 펌웨어에 새 핀 맵을 추가해 v1과 분리했으며, v2는 기본 80% 볼륨과 1.5배 PCM 게인 및 소프트 리미팅을 사용합니다 (#2044, #2045)', new_0_6_29_10: 'MiMo 음성 복제에 WAV/MP3 참조 오디오 업로드를 복원하고 현재 API 요구사항에 따라 audio.voice로 전송합니다 (#2046)', new_0_6_28_1: '이번 릴리스는 0.6.27 이후 병합된 PR을 반영하며 MCU 관리, 그룹 채팅 workspace diff, Coding Agent 수정, Workflow 승인, workspace diff 필터링, scheduled job 모델 선택, desktop 새 버전 표시를 포함합니다', new_0_6_28_2: 'MCU는 device management를 추가하고 global-agent event에 API token 인증을 요구하며 ESP32-C3 firmware를 갱신하고 remote relay login을 안정화했습니다', new_0_6_28_3: '그룹 채팅 workspace 변경은 workspace diff run으로 저장되어 세션 완료 후에도 room-level agent activity를 확인할 수 있습니다', new_0_6_28_4: 'Coding Agent는 scoped external MCP server를 상속하고 workflow agent abort를 올바르게 라우팅하며 완료된 Codex 및 Claude Code native session을 best-effort로 export합니다', new_0_6_28_5: 'Workspace file drawer를 수정하고 깨진 starred-history embed를 제거했으며 bridge session의 ended_at 및 end_reason metadata를 기록합니다', new_0_6_28_6: 'Workflow node는 완료 후 approval gate를 지원하고 반복 실행 시 rerun approval state도 수정했습니다', new_0_6_28_7: 'Workspace diff는 SQLite WAL/SHM sidecar를 필터링하고 변경 없는 파일을 지나 계속 scan해 새로 만든 일반 파일이 보이도록 합니다', new_0_6_28_8: 'Scheduled job은 provider/model을 선택해 저장할 수 있으며 현재 Hermes cron CLI가 지원하지 않는 model flag는 전달하지 않습니다', new_0_6_28_9: 'Desktop 버전 관리 버튼은 업데이트가 있을 때 지역화된 새 버전 표시를 보여주며 public version manifest에 0.6.28을 추가했습니다', new_0_6_27_1: '이번 릴리스는 0.6.26 이후 병합된 모든 PR을 반영하며 데스크톱 시작 fallback, Windows runtime 수정, remote MCU relay, 그룹 채팅 workspace, 기본 workspace 개선, 빈 diff 필터링을 포함합니다', new_0_6_27_2: '데스크톱 시작은 active Web UI 디렉터리가 없거나 불완전할 때 bundled Web UI로 fallback하며 pinned runtime은 유지합니다', new_0_6_27_3: 'Windows 데스크톱 runtime은 Web UI server 호출에서 취약한 .exe trampoline 대신 이동 가능한 hermes.cmd wrapper를 사용합니다', new_0_6_27_4: 'Remote MCU traffic은 Socket.IO /global-agent relay를 사용하며 ESP32-C3 로그인, 검색, 음성 재생 큐, Wi-Fi 자격 증명 저장, 업데이트된 firmware가 더 안정적으로 동작합니다', new_0_6_27_5: '그룹 채팅 room은 검증된 workspace를 보유하고 group-agent run에 전달할 수 있으며, 읽기 전용 멤버에게는 workspace, invite code, 관리 컨트롤이 숨겨집니다', new_0_6_27_6: '기본 workspace 즐겨찾기는 folder picker의 선택된 path 행 안으로 이동했으며 workspace picker label의 locale coverage도 완료했습니다', new_0_6_27_7: 'Workspace diff 카드는 patch나 줄 변화가 없는 0 byte change를 건너뛰어 의미 없는 +0/-0 changed-file 카드를 피합니다', new_0_6_26_1: '이번 릴리스는 0.6.25 이후 병합된 PR을 반영하며 Ekko Agent, Coding Agent context 표시, Journey, 그룹 채팅 baseline, 데스크톱 수정, MCP payload size에 중점을 둡니다', new_0_6_26_2: 'Ekko Agent는 이제 채팅에서 사용할 수 있으며 runtime context 처리, browser tools, 더 안정적인 tool event, context usage 계산을 위한 tool-result history 복원을 지원합니다', new_0_6_26_3: 'Coding Agent session은 reasoning과 context 설정을 더 명확히 보여 주고 API mode를 유지하며 Codex app-server mode 오용을 피하고 follow-up turn 뒤 context usage가 튀는 문제를 줄입니다', new_0_6_26_4: 'Journey에는 learning graph view와 다듬어진 graph interaction이 추가되었고, 그룹 채팅에는 새 기능 라인의 baseline coverage가 추가되었습니다', new_0_6_26_5: '데스크톱 안정성이 개선되어 login persistence와 reset flow, Windows worker dynamic port fallback, stdout/stderr EPIPE handling, 분리된 ESP32-C3 v1 firmware packaging을 보강했습니다', new_0_6_26_6: 'Hermes Studio MCP는 이제 available-models를 기본적으로 compact summary로 반환하며 filter와 명시적인 full-detail option으로 agent context에 많은 모델 데이터가 들어가는 일을 피합니다', new_0_6_25_1: 'Hermes Agent 0.18.0에서 Agent Bridge 승인 메모리 wrapper가 새 has_host_access 매개변수를 전달하지 않아 execute_code가 실패하던 문제를 수정했습니다', new_0_6_24_1: '이번 릴리스는 0.6.23 이후 병합된 PR을 반영하며 채팅 입력, workspace 표시, 플러그인 관리, 기본 모델, workspace diff 확인을 개선합니다', new_0_6_24_2: '단일 채팅과 그룹 채팅 입력 영역은 통합 툴바, 간결한 모델 컨트롤, 모아진 입력 설정, 더 명확한 context 사용량, 모바일 chrome, 단일 채팅 수동 높이 조절 복구를 포함합니다', new_0_6_24_3: 'Workspace run 변경 사항은 지속되는 chat diff 카드로 표시되며 오른쪽 drawer에서 diff 보기와 파일 편집을 지원하고 session resume 후에도 복원되며 모바일 보기도 조정되었습니다', new_0_6_24_4: 'Workspace folder picker는 Windows drive와 junction workflow를 더 안정적으로 탐색하고 .hermes, .config, .codex 같은 dot-prefixed folder를 WORKSPACE_BASE 안전 경계 안에서 표시합니다', new_0_6_24_5: 'Plugins 페이지에서 관리 가능한 user plugin을 enable / disable할 수 있으며 Hermes base config와 현재 profile config의 plugin state를 더 정확히 표시합니다', new_0_6_24_6: 'Models 페이지에 default provider와 default model 작업을 추가했고 bridge terminal error 오탐을 줄였으며 Hermes Agent runtime packaging을 0.18.0으로 올리고 website version manifest도 갱신했습니다', }, }