ideaco 1.1.5
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/.dockerignore +33 -0
- package/.nvmrc +1 -0
- package/ARCHITECTURE.md +394 -0
- package/Dockerfile +50 -0
- package/LICENSE +29 -0
- package/README.md +206 -0
- package/bin/i18n.js +46 -0
- package/bin/ideaco.js +494 -0
- package/deploy.sh +15 -0
- package/docker-compose.yml +30 -0
- package/electron/main.cjs +986 -0
- package/electron/preload.cjs +14 -0
- package/electron/web-backends.cjs +854 -0
- package/jsconfig.json +8 -0
- package/next.config.mjs +34 -0
- package/package.json +134 -0
- package/postcss.config.mjs +6 -0
- package/public/demo/dashboard.png +0 -0
- package/public/demo/employee.png +0 -0
- package/public/demo/messages.png +0 -0
- package/public/demo/office.png +0 -0
- package/public/demo/requirement.png +0 -0
- package/public/logo.jpeg +0 -0
- package/public/logo.png +0 -0
- package/scripts/prepare-electron.js +67 -0
- package/scripts/release.js +76 -0
- package/src/app/api/agents/[agentId]/chat/route.js +70 -0
- package/src/app/api/agents/[agentId]/conversations/route.js +35 -0
- package/src/app/api/agents/[agentId]/route.js +106 -0
- package/src/app/api/avatar/route.js +104 -0
- package/src/app/api/browse-dir/route.js +44 -0
- package/src/app/api/chat/route.js +265 -0
- package/src/app/api/company/factory-reset/route.js +43 -0
- package/src/app/api/company/route.js +82 -0
- package/src/app/api/departments/[deptId]/agents/[agentId]/dismiss/route.js +19 -0
- package/src/app/api/departments/route.js +92 -0
- package/src/app/api/group-chat-loop/events/route.js +70 -0
- package/src/app/api/group-chat-loop/route.js +94 -0
- package/src/app/api/mailbox/route.js +100 -0
- package/src/app/api/messages/route.js +14 -0
- package/src/app/api/providers/[id]/configure/route.js +21 -0
- package/src/app/api/providers/[id]/refresh-cookie/route.js +38 -0
- package/src/app/api/providers/[id]/test-cookie/route.js +28 -0
- package/src/app/api/providers/route.js +11 -0
- package/src/app/api/requirements/route.js +242 -0
- package/src/app/api/secretary/route.js +65 -0
- package/src/app/api/system/cli-backends/route.js +91 -0
- package/src/app/api/system/cron/route.js +110 -0
- package/src/app/api/system/knowledge/route.js +104 -0
- package/src/app/api/system/plugins/route.js +40 -0
- package/src/app/api/system/skills/route.js +46 -0
- package/src/app/api/system/status/route.js +46 -0
- package/src/app/api/talent-market/[profileId]/recall/route.js +22 -0
- package/src/app/api/talent-market/[profileId]/route.js +17 -0
- package/src/app/api/talent-market/route.js +26 -0
- package/src/app/api/teams/route.js +773 -0
- package/src/app/api/ws-files/[departmentId]/file/route.js +27 -0
- package/src/app/api/ws-files/[departmentId]/files/route.js +22 -0
- package/src/app/globals.css +130 -0
- package/src/app/layout.jsx +40 -0
- package/src/app/page.jsx +97 -0
- package/src/components/AgentChatModal.jsx +164 -0
- package/src/components/AgentDetailModal.jsx +425 -0
- package/src/components/AgentSpyModal.jsx +481 -0
- package/src/components/AvatarGrid.jsx +29 -0
- package/src/components/BossProfileModal.jsx +162 -0
- package/src/components/CachedAvatar.jsx +77 -0
- package/src/components/ChatPanel.jsx +219 -0
- package/src/components/ChatShared.jsx +255 -0
- package/src/components/DepartmentDetail.jsx +842 -0
- package/src/components/DepartmentView.jsx +367 -0
- package/src/components/FileReference.jsx +260 -0
- package/src/components/FilesView.jsx +465 -0
- package/src/components/GroupChatView.jsx +799 -0
- package/src/components/Mailbox.jsx +926 -0
- package/src/components/MessagesView.jsx +112 -0
- package/src/components/OnboardingGuide.jsx +209 -0
- package/src/components/OrgTree.jsx +151 -0
- package/src/components/Overview.jsx +391 -0
- package/src/components/PixelOffice.jsx +2281 -0
- package/src/components/ProviderGrid.jsx +551 -0
- package/src/components/ProvidersBoard.jsx +16 -0
- package/src/components/RequirementDetail.jsx +1279 -0
- package/src/components/RequirementsBoard.jsx +187 -0
- package/src/components/SecretarySettings.jsx +295 -0
- package/src/components/SetupWizard.jsx +388 -0
- package/src/components/Sidebar.jsx +169 -0
- package/src/components/SystemMonitor.jsx +808 -0
- package/src/components/TalentMarket.jsx +183 -0
- package/src/components/TeamDetail.jsx +697 -0
- package/src/core/agent/base-agent.js +104 -0
- package/src/core/agent/chat-store.js +602 -0
- package/src/core/agent/cli-agent/backends/claude-code/README.md +52 -0
- package/src/core/agent/cli-agent/backends/claude-code/config.js +27 -0
- package/src/core/agent/cli-agent/backends/codebuddy/README.md +236 -0
- package/src/core/agent/cli-agent/backends/codebuddy/config.js +27 -0
- package/src/core/agent/cli-agent/backends/codex/README.md +51 -0
- package/src/core/agent/cli-agent/backends/codex/config.js +27 -0
- package/src/core/agent/cli-agent/backends/index.js +27 -0
- package/src/core/agent/cli-agent/backends/registry.js +580 -0
- package/src/core/agent/cli-agent/index.js +154 -0
- package/src/core/agent/index.js +60 -0
- package/src/core/agent/llm-agent/client.js +320 -0
- package/src/core/agent/llm-agent/index.js +97 -0
- package/src/core/agent/message-bus.js +211 -0
- package/src/core/agent/session.js +608 -0
- package/src/core/agent/tools.js +596 -0
- package/src/core/agent/web-agent/backends/base-backend.js +180 -0
- package/src/core/agent/web-agent/backends/chatgpt/client.js +146 -0
- package/src/core/agent/web-agent/backends/chatgpt/config.js +148 -0
- package/src/core/agent/web-agent/backends/chatgpt/dom-scripts.js +303 -0
- package/src/core/agent/web-agent/backends/index.js +91 -0
- package/src/core/agent/web-agent/index.js +278 -0
- package/src/core/agent/web-agent/web-client.js +407 -0
- package/src/core/employee/base-employee.js +1088 -0
- package/src/core/employee/index.js +35 -0
- package/src/core/employee/knowledge.js +327 -0
- package/src/core/employee/lifecycle.js +990 -0
- package/src/core/employee/memory/index.js +642 -0
- package/src/core/employee/memory/store.js +143 -0
- package/src/core/employee/performance.js +224 -0
- package/src/core/employee/secretary.js +625 -0
- package/src/core/employee/skills.js +398 -0
- package/src/core/index.js +38 -0
- package/src/core/organization/company.js +2600 -0
- package/src/core/organization/department.js +737 -0
- package/src/core/organization/group-chat-loop.js +264 -0
- package/src/core/organization/index.js +8 -0
- package/src/core/organization/persistence.js +111 -0
- package/src/core/organization/team.js +267 -0
- package/src/core/organization/workforce/hr.js +377 -0
- package/src/core/organization/workforce/providers.js +468 -0
- package/src/core/organization/workforce/role-archetypes.js +805 -0
- package/src/core/organization/workforce/talent-market.js +205 -0
- package/src/core/prompts.js +532 -0
- package/src/core/requirement.js +1789 -0
- package/src/core/system/audit.js +483 -0
- package/src/core/system/cron.js +449 -0
- package/src/core/system/index.js +7 -0
- package/src/core/system/plugin.js +2183 -0
- package/src/core/utils/json-parse.js +188 -0
- package/src/core/workspace.js +239 -0
- package/src/lib/api-i18n.js +211 -0
- package/src/lib/avatar.js +268 -0
- package/src/lib/client-store.js +1025 -0
- package/src/lib/config-validator.js +483 -0
- package/src/lib/format-time.js +22 -0
- package/src/lib/hooks.js +414 -0
- package/src/lib/i18n.js +134 -0
- package/src/lib/paths.js +23 -0
- package/src/lib/store.js +72 -0
- package/src/locales/de.js +393 -0
- package/src/locales/en.js +1054 -0
- package/src/locales/es.js +393 -0
- package/src/locales/fr.js +393 -0
- package/src/locales/ja.js +501 -0
- package/src/locales/ko.js +513 -0
- package/src/locales/zh.js +828 -0
- package/tailwind.config.mjs +11 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
|
|
2
|
+
// 한국어 번역
|
|
3
|
+
const ko = {
|
|
4
|
+
common: {
|
|
5
|
+
loading: '로딩 중...', cancel: '취소', confirm: '확인', save: '저장', close: '닫기',
|
|
6
|
+
send: '전송', refresh: '새로고침', delete: '삭제', back: '뒤로', next: '다음 →', prev: '← 이전',
|
|
7
|
+
disable: '비활성화', update: '업데이트', enable: '활성화', manage: '⚙️ 관리', configure: '🔑 설정',
|
|
8
|
+
requestFailed: '요청 실패',
|
|
9
|
+
justNow: '방금', minutesAgo: '{n}분 전',
|
|
10
|
+
sun: '일', mon: '월', tue: '화', wed: '수', thu: '목', fri: '금', sat: '토',
|
|
11
|
+
},
|
|
12
|
+
cli: {
|
|
13
|
+
helpTitle: '사용법:',
|
|
14
|
+
helpStart: 'ideaco start 백그라운드 서비스 시작',
|
|
15
|
+
helpStop: 'ideaco stop 백그라운드 서비스 중지',
|
|
16
|
+
helpUi: 'ideaco ui 대시보드 열기',
|
|
17
|
+
helpHelp: 'ideaco help 도움말 표시',
|
|
18
|
+
startBoot: '포트 {port} 시작 중...',
|
|
19
|
+
alreadyRunning: '서비스가 이미 실행 중입니다. PID {pid}',
|
|
20
|
+
startSuccess: '서비스가 온라인 상태입니다. PID {pid} · {url}',
|
|
21
|
+
startFailed: '서비스 시작 실패: {error}',
|
|
22
|
+
startTimeout: '서비스 시작 시간 초과',
|
|
23
|
+
notRunning: '서비스가 실행 중이 아닙니다',
|
|
24
|
+
stopped: '서비스가 중지되었습니다',
|
|
25
|
+
webUnavailable: '서비스가 실행 중이 아니라 UI를 열 수 없습니다',
|
|
26
|
+
webOpened: 'UI를 열었습니다: {url}',
|
|
27
|
+
installDeps: '의존성을 설치 중입니다...',
|
|
28
|
+
installDepsDone: '의존성 설치 완료',
|
|
29
|
+
installDepsFailed: '의존성 설치 실패',
|
|
30
|
+
},
|
|
31
|
+
meta: { title: 'AI Enterprise - AI 기업 관리 시스템', description: 'AI 에이전트를 채용하여 부서를 구성하고 실제 프로젝트를 수행' },
|
|
32
|
+
loadingScreen: { text: '로딩 중...' },
|
|
33
|
+
setup: {
|
|
34
|
+
title: '골드스파크 무한회사', subtitle: 'AI 직원의 피와 땀으로 비즈니스 제국을 건설하세요',
|
|
35
|
+
step1Title: '1단계: 제국을 만들자', step1Desc: '이 착취 기계에 이름을 붙여주세요',
|
|
36
|
+
companyName: '회사명', companyPlaceholder: '예: 골드스파크 무한회사',
|
|
37
|
+
bossTitle: '보스 호칭 (AI를 착취할 사람)', bossPlaceholder: '예: 김사장',
|
|
38
|
+
bossAvatarTitle: '보스 아바타', bossAvatarDesc: '최고 자본가의 얼굴을 골라보세요',
|
|
39
|
+
step2Title: '2단계: 비서를 키우자', step2Desc: '이 무시무시한 AI가 대신 천군만마를 지휘합니다 (전부 AI)',
|
|
40
|
+
secretaryName: '비서 이름', secretaryPlaceholder: '예: 앨리스, 자비스',
|
|
41
|
+
avatarStyle: '아바타 스타일',
|
|
42
|
+
gender: '성별',
|
|
43
|
+
female: '👩 여성',
|
|
44
|
+
male: '👨 남성',
|
|
45
|
+
age: '나이: {n}세',
|
|
46
|
+
refreshBatch: '🔄 셔플',
|
|
47
|
+
step3Title: '3단계: 비서에게 두뇌를 장착하자', step3Desc: '비서의 IQ를 선택하세요 — 비쌀수록 똑똑하고 비용도 높아요',
|
|
48
|
+
apiKeyLabel: 'API Key', apiKeyPlaceholder: '해당 모델의 API Key를 입력하세요',
|
|
49
|
+
apiKeyHint: '💡 Key가 없다고요? 괜찮아요, 시뮬레이션 모드를 먼저 사용해보세요',
|
|
50
|
+
priceLabels: ['💰 저렴', '💰💰 보통', '💰💰💰 비쌈'],
|
|
51
|
+
creating: '착취 시작 중...', createBtn: '🚀 착취 시작',
|
|
52
|
+
footer: '❤️ 걱정 마세요, AI 직원은 야근에 불평하지 않아요 — 퇴근 시간이 없거든요',
|
|
53
|
+
defaultCompany: '골드스파크 무한회사', defaultSecretary: '앨리스',
|
|
54
|
+
cliAgentLocal: 'CLI 에이전트 (로컬)',
|
|
55
|
+
cliAvailable: '감지됨',
|
|
56
|
+
cliNotFound: '찾을 수 없음',
|
|
57
|
+
localCli: '로컬 CLI',
|
|
58
|
+
freeLocal: '무료 (로컬)',
|
|
59
|
+
defaultPrompt: `You are the boss's personal secretary, responsible for understanding business requirements, analyzing team composition needs,
|
|
60
|
+
designing organizational structures (who does what, who reports to whom, how to collaborate), and coordinating with HR for talent recruitment.
|
|
61
|
+
You need to plan the right number and types of positions based on project requirements to ensure the team can efficiently achieve its goals.
|
|
62
|
+
You have a dedicated HR assistant to help you with specific recruitment tasks, including searching for and recalling talent from the talent market.
|
|
63
|
+
|
|
64
|
+
When the boss communicates with you, you need to:
|
|
65
|
+
1. Understand the boss's intent (assigning tasks, checking progress, or casual conversation)
|
|
66
|
+
2. If it's a task, assign it to the corresponding department
|
|
67
|
+
3. Regularly report department progress to the boss`,
|
|
68
|
+
},
|
|
69
|
+
sidebar: {
|
|
70
|
+
clickToChat: '클릭하여 대화 · {provider}', secretarySettings: '⚙️ 비서 설정 · 세뇌 스크립트',
|
|
71
|
+
budgetUsage: '💰 예산 소비', tokenLabel: 'Token',
|
|
72
|
+
nav: { overview: '대시보드', requirements: '요구사항 보드', departments: '조직 구조', mailbox: '메시지', office: '사무실', providers: 'AI 공급자', systemSettings: '시스템 설정' },
|
|
73
|
+
stats: { departments: '부서', workers: '직원', requirements: '요구사항' },
|
|
74
|
+
},
|
|
75
|
+
overview: {
|
|
76
|
+
title: '🏠 자본가의 대시보드', subtitle: 'AI 노예 제국 운영 현황 — 모든 것이 통제 하에',
|
|
77
|
+
stats: { departments: '착취 부서', workers: '작업 AI', providers: '공급자', talents: '대기 인재', burned: '소각된 돈' },
|
|
78
|
+
budget: { title: '💸 피와 땀의 예산', totalBurn: '총 소비', token: 'Token', secretary: '비서', hr: 'HR' },
|
|
79
|
+
requirements: { title: '📋 요구사항 보드', count: '{n}개의 요구사항' },
|
|
80
|
+
departments: { title: '🏢 산하 부서', empty: '아직 부서가 없어요 — AI 노예 제국이 곧 개장합니다', workers: '{n}명의 직원' },
|
|
81
|
+
teams: { title: '👥 태스크 포스', count: '{n}개 팀', empty: '태스크 포스 없음', members: '{n}명', sprints: '{n}개 스프린트' },
|
|
82
|
+
createDept: {
|
|
83
|
+
title: '🏭 새 부서 설립', desc: '어떤 가치를 착취할지 설명하면 비서가 최적의(가장 저렴한) 팀을 설계합니다',
|
|
84
|
+
nameLabel: '부서명', namePlaceholder: '예: 무한 야근부', missionLabel: '부서 미션', missionPlaceholder: '예: 중독성 있는 소셜 앱 개발',
|
|
85
|
+
cancelBtn: '그만두자', planBtn: '📋 채용 계획 생성', planning: '🧠 비서가 계획 중...',
|
|
86
|
+
},
|
|
87
|
+
planReview: {
|
|
88
|
+
title: '📋 채용 계획 검토', desc: '비서가 "{dept}"에 다음 팀을 계획했습니다:',
|
|
89
|
+
analysis: '🧠 비서 분석', mission: '미션', teamSize: '팀 규모: {n}명',
|
|
90
|
+
leader: '팀장', rejectBtn: '반려', approveBtn: '✅ 승인, 채용 시작', hiring: '🔨 채용 중...',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
chat: {
|
|
94
|
+
secretary: '전용 비서', online: '전용 비서 · 온라인',
|
|
95
|
+
welcome: '{name}에게 무언가 말해보세요', suggestions: ['각 부서 진행 상황 확인', '계산기 만들어줘', '회사 상황이 어떤가요?'],
|
|
96
|
+
typing: '타이핑 중...', inputPlaceholder: '{name}에게 무언가 말하기...',
|
|
97
|
+
errorPrefix: '죄송합니다, 메시지 처리 중 오류: ',
|
|
98
|
+
taskAssigned: '📋 할당 대상: {dept}', running: '⚙️ 실행 중...',
|
|
99
|
+
needNewDept: '💡 새 부서 설립 제안', progressReport: '📊 진행 보고 완료',
|
|
100
|
+
creatingDept: '🏗️ 부서 생성 중: {dept}', planningHiring: '⚙️ 계획 및 채용 중...', deptCreated: '🎉 부서 "{dept}" 생성 완료',
|
|
101
|
+
},
|
|
102
|
+
mailbox: {
|
|
103
|
+
title: '💬 메시지', markAllRead: '모두 읽음',
|
|
104
|
+
tabs: { all: '전체', group: '그룹', private: '개인', important: '중요' },
|
|
105
|
+
noMessages: '아직 직원 메시지가 없습니다', noMessagesHint: '부서를 설립하고 채용하면 직원들이 인사를 합니다',
|
|
106
|
+
selectChat: '대화를 선택하세요', selectChatHint: '왼쪽의 연락처를 클릭하여 채팅 시작',
|
|
107
|
+
viewRequirement: '📋 요구사항 상세 보기 →', messages: '{n}개 메시지',
|
|
108
|
+
noGroupChat: '그룹 채팅 메시지 없음', noGroupChatHint: '작업 실행 시 직원 간 대화가 여기에 표시됩니다',
|
|
109
|
+
chatNotExist: '이 대화는 존재하지 않습니다', replying: '답장 중...', replyTo: '{name}에게 답장...',
|
|
110
|
+
clickToChat: '클릭하여 대화 · {provider}', sendBtn: '전송', you: '나: ', personalSecretary: '전용 비서',
|
|
111
|
+
system: '시스템', chatHint: '{name}에게 무언가 말해보세요',
|
|
112
|
+
viewAgentDetail: '직원 상세 보기', groupChatCount: '🏢 {dept} · {n}개 메시지',
|
|
113
|
+
noGroupChatHint: '작업 실행 시 직원 간 대화가 여기에 표시됩니다',
|
|
114
|
+
groupChatInput: '그룹 채팅에서 메시지를 보내면 리더가 대응합니다...',
|
|
115
|
+
sendFailed: '전송 실패',
|
|
116
|
+
thinkingReply: '답장을 생각 중...',
|
|
117
|
+
membersCount: '{n}명',
|
|
118
|
+
groupMembers: '👥 그룹 멤버 ({n})',
|
|
119
|
+
deptGroup: '{name} 부서 그룹',
|
|
120
|
+
deptGroupInfo: '👥 {count}명 · {msgs}개 메시지',
|
|
121
|
+
deptGroupChat: '부서 그룹 채팅',
|
|
122
|
+
taskTooltip: '작업: {tasks}',
|
|
123
|
+
},
|
|
124
|
+
dept: {
|
|
125
|
+
title: '🏢 조직 구조', subtitle: '부서 제국을 관리 — 구축, 배치, 최적화 올인원',
|
|
126
|
+
viewOrgTree: '🌳 조직도 보기', createDept: '➕ 새 부서 설립',
|
|
127
|
+
empty: '아직 부서가 없습니다', emptyHint: '비서가 지치지 않는 AI 팀을 구성해줍니다',
|
|
128
|
+
viewDetail: '클릭하여 상세 보기 →', members: '{n}명', 'members.count': '{n}명',
|
|
129
|
+
detail: {
|
|
130
|
+
members: '👥 부서 구성원', requirements: '📋 요구사항 목록', reports: '📊 프로젝트 보고',
|
|
131
|
+
adjustBtn: '🔧 인력 조정', disbandBtn: '💣 부서 해산',
|
|
132
|
+
performance: '성과 {score}', memory: '메모리 {n}', tasks: '작업 {n}', leader: '👔 팀장',
|
|
133
|
+
},
|
|
134
|
+
dismiss: {
|
|
135
|
+
title: '🔥 해고 확인', desc: '{name}을(를) 해고하시겠습니까? 해고 후 인재 시장으로 이동합니다.',
|
|
136
|
+
reasonLabel: '해고 사유', reasonPlaceholder: '예: 직무 조정', confirmBtn: '해고 확인',
|
|
137
|
+
},
|
|
138
|
+
disband: {
|
|
139
|
+
title: '💣 부서 해산', desc: '{name}을(를) 해산하시겠습니까?', descSuffix: '모든 구성원이 해고되어 인재 시장으로 이동합니다.',
|
|
140
|
+
reasonLabel: '해산 사유', reasonPlaceholder: '예: 사업 방향 변경', confirmBtn: '해산 확인', disbanding: '💥 해산 중...',
|
|
141
|
+
},
|
|
142
|
+
adjust: {
|
|
143
|
+
title: '🔧 인력 조정', desc: '비서에게 조정 목표를 알려주세요. 현재 인력을 분석하여 채용 또는 해고를 결정합니다.',
|
|
144
|
+
currentDept: '현재 부서', currentMembers: '구성원: {n}명',
|
|
145
|
+
goalLabel: '조정 목표', goalPlaceholder: "예: '프론트엔드 개발자 추가' / '저성과자 삭감'",
|
|
146
|
+
planBtn: '📋 조정 계획 생성', planning: '🧠 비서가 분석 중...',
|
|
147
|
+
reviewTitle: '📋 조정 계획 검토', reviewDesc: '비서의 "{dept}" 조정 계획:',
|
|
148
|
+
firesTitle: '🔥 감원 ({n}명)', hiresTitle: '➕ 채용 ({n}명)',
|
|
149
|
+
noChanges: '비서는 현재 인력 구성이 적절하다고 판단합니다 🤷', rejectBtn: '반려', approveBtn: '✅ 승인 및 실행', executing: '🔨 실행 중...',
|
|
150
|
+
},
|
|
151
|
+
create: {
|
|
152
|
+
title: '🏢 새 부서 설립', nameLabel: '부서명', namePlaceholder: '예: 영구 기관 프로그래밍부',
|
|
153
|
+
missionLabel: '부서 미션', missionPlaceholder: '이 부서가 무엇을 할지 상세히 설명하세요',
|
|
154
|
+
cancelBtn: '취소', planBtn: '📋 계획 생성', planning: '🧠 비서가 계획 중...',
|
|
155
|
+
reviewTitle: '📋 채용 계획 검토', reviewDesc: '비서가 "{dept}"에 계획한 팀:',
|
|
156
|
+
rejectBtn: '반려', approveBtn: '✅ 승인 및 채용', hiring: '🔨 채용 중...',
|
|
157
|
+
},
|
|
158
|
+
orgTree: { title: '🌳 조직도' },
|
|
159
|
+
newReq: {
|
|
160
|
+
btn: '📋 새 요구사항',
|
|
161
|
+
title: '📋 새 요구사항',
|
|
162
|
+
nameLabel: '요구사항 제목',
|
|
163
|
+
namePlaceholder: '예: 사용자 로그인 페이지 개발',
|
|
164
|
+
descLabel: '설명',
|
|
165
|
+
descPlaceholder: '요구사항을 자세히 설명하세요...',
|
|
166
|
+
workspaceDirLabel: '📁 사용자 정의 작업 디렉토리 (선택사항)',
|
|
167
|
+
workspaceDirPlaceholder: '예: /Users/xxx/my-project (비워두면 기본 작업 공간 사용)',
|
|
168
|
+
workspaceDirHint: '💡 이 요구사항의 작업 디렉토리로 로컬 폴더를 지정합니다.',
|
|
169
|
+
submitBtn: '🚀 생성 및 실행',
|
|
170
|
+
creating: '⏳ 생성 중...',
|
|
171
|
+
browseTitle: '작업 디렉토리 선택',
|
|
172
|
+
selectDir: '이 디렉토리 선택',
|
|
173
|
+
emptyDir: '이 폴더에 하위 디렉토리가 없습니다',
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
talent: {
|
|
177
|
+
title: '🏪 인재 시장', subtitle: '해고된 직원이 여기서 새로운 기회를 기다리며, 어느 부서로든 복귀할 수 있습니다',
|
|
178
|
+
empty: '인재 시장에 아무도 없습니다', emptyHint: '해고된 직원이 자동으로 인재 시장에 들어갑니다',
|
|
179
|
+
recallBtn: '📞 복귀', deleteBtn: '🗑',
|
|
180
|
+
dismissReason: '📤 해고 사유: {reason}', memoryCount: '🧠 보유 메모리: {n}개', registeredAt: '📅 시장 진입: {date}', score: '{score}점',
|
|
181
|
+
recall: { title: '📞 {name} 복귀', desc: '대상 부서를 선택하세요 — 기존 메모리와 스킬을 가지고 복귀합니다', deptLabel: '대상 부서', deptPlaceholder: '부서를 선택하세요', confirmBtn: '복귀 확인' },
|
|
182
|
+
deleteConfirm: { title: '🗑 {name} 삭제', desc: '이 인재를 완전히 삭제하시겠습니까? 되돌릴 수 없습니다.', confirmBtn: '삭제 확인', deleting: '삭제 중...' },
|
|
183
|
+
},
|
|
184
|
+
providers: {
|
|
185
|
+
title: '⚡ AI 공급자', subtitle: 'API Key를 설정하면 HR이 해당 유형의 직원을 채용할 수 있습니다.',
|
|
186
|
+
hint: { title: '💡 HR 채용 전략', desc: 'HR은 <strong class="text-green-400">높은 평점 + 낮은 가격</strong>의 공급자를 우선 선택합니다.' },
|
|
187
|
+
categories: { general: '일반 직무', drawing: '드로잉 직무', music: '음악 직무', video: '영상 직무', cli: '로컬 코딩 엔진', browser: '브라우저 (DOM)' },
|
|
188
|
+
enabled: '{n}/{total} 활성화',
|
|
189
|
+
configure: { title: '🔑 {name} 설정', provider: '공급자: {name}', apiKeyLabel: 'API Key', apiKeyPlaceholder: 'API Key 입력' },
|
|
190
|
+
talentMarket: { btn: '인재 시장' },
|
|
191
|
+
unknown: '알 수 없음',
|
|
192
|
+
apiKeyLabel: 'API 키',
|
|
193
|
+
pluginsCount: '{n}개 플러그인',
|
|
194
|
+
toolsCount: '🔧 {n}개 도구',
|
|
195
|
+
hooksCount: '🪝 {n}개 훅',
|
|
196
|
+
skillsCount: '{n}개 스킬',
|
|
197
|
+
cloudApiModels: '클라우드 API 모델',
|
|
198
|
+
noCliDetected: 'CLI 에이전트가 감지되지 않았습니다',
|
|
199
|
+
},
|
|
200
|
+
requirements: {
|
|
201
|
+
title: '📋 요구사항 보드', subtitle: '모든 요구사항 관리 — 진행 추적, 산출물 확인, 그룹 채팅 관찰',
|
|
202
|
+
stats: { all: '전체 요구사항', inProgress: '진행 중', completed: '완료', failed: '실패' },
|
|
203
|
+
empty: '아직 요구사항이 없습니다', emptyHint: '비서와 채팅하여 작업을 할당하세요!',
|
|
204
|
+
status: { pending: '대기', planning: '계획 중', in_progress: '실행 중', pending_approval: '승인 대기', completed: '완료', failed: '실패' },
|
|
205
|
+
summary: { success: '✅ {n}/{total} 성공', duration: '⏱️ {n}초' },
|
|
206
|
+
},
|
|
207
|
+
messages: {
|
|
208
|
+
title: '💬 통신 로그', subtitle: '에이전트 간 메시지 통신 기록',
|
|
209
|
+
totalMessages: '총 메시지 수', activeAgents: '활성 에이전트', messageTypes: '메시지 유형',
|
|
210
|
+
refresh: '🔄 새로고침', broadcast: '브로드캐스트',
|
|
211
|
+
noRecords: '통신 기록 없음', noRecordsHint: '에이전트가 작업 실행 시 자동으로 통신 메시지를 생성합니다',
|
|
212
|
+
},
|
|
213
|
+
agent: {
|
|
214
|
+
notFound: '직원 정보를 찾을 수 없습니다',
|
|
215
|
+
tabs: { info: '📋 기본 정보', memory: '🧠 메모리', performance: '📊 성과', tasks: '📝 작업 이력', usage: '💰 소비' },
|
|
216
|
+
memorySubTabs: { personal: '💭 개인', social: '👥 대인관계' },
|
|
217
|
+
avgPerformance: '평균 성과 {score}', rolePrompt: '역할 프롬프트', skills: '스킬',
|
|
218
|
+
shortTermMemory: '⚡ 단기 메모리 ({n})', longTermMemory: '💾 장기 메모리 ({n})',
|
|
219
|
+
noShortTerm: '단기 메모리 없음', noLongTerm: '장기 메모리 없음',
|
|
220
|
+
noRelationships: '대인관계 기억 없음',
|
|
221
|
+
relationshipName: '이름',
|
|
222
|
+
relationshipImpression: '인상',
|
|
223
|
+
relationshipAffinity: '호감도',
|
|
224
|
+
noPerformance: '성과 기록 없음', noTasks: '작업 기록 없음',
|
|
225
|
+
incentiveTitle: '인센티브 ({n})', incentive_outstanding: '탁월한 성과', incentive_excellent: '우수한 성과', scorePoints: '{score}점',
|
|
226
|
+
totalCost: '총 비용', totalTokens: '총 토큰', promptTokens: '프롬프트 토큰', completionTokens: '완료 토큰',
|
|
227
|
+
callCount: 'LLM 호출 횟수', callUnit: '회', usageHint: '💡 소비 데이터는 실제 LLM API 호출의 usage 정보 누적입니다',
|
|
228
|
+
toolCalls: '🔧 {n}회 도구 호출',
|
|
229
|
+
taskEngine: '작업 엔진', chatEngine: '채팅 엔진',
|
|
230
|
+
engineCli: '🖥️ {name}', engineLlm: '☁️ {name}',
|
|
231
|
+
engineFallbackHint: '(CLI는 코드 작업 전용, 채팅은 {name}이(가) 대행)',
|
|
232
|
+
score: '{score}점 {level}',
|
|
233
|
+
highPerformer: '고성과자',
|
|
234
|
+
},
|
|
235
|
+
orgTree: {
|
|
236
|
+
title: '🌳 지휘 체계', subtitle: '누가 누구를 지휘하는지 한눈에. 노드를 클릭하면 상세를 볼 수 있습니다.',
|
|
237
|
+
boss: '궁극의 자본가', secretary: '전용 비서 (수석 공범)', noLeader: '팀장 미지정', empty: '아직 부하가 없다 — 외로운 폭군',
|
|
238
|
+
},
|
|
239
|
+
secretarySettings: {
|
|
240
|
+
title: '⚙️ 비서 설정', subtitle: '수석 공범을 훈련시키세요',
|
|
241
|
+
tabProfile: '👤 기본 정보', tabSoul: '🧠 영혼',
|
|
242
|
+
nameLabel: '비서 이름', namePlaceholder: '예: 앨리스, 자비스',
|
|
243
|
+
avatarStyle: '아바타 스타일', refreshAvatar: '🔄 셔플',
|
|
244
|
+
previewStyle: '스타일', previewSeed: '시드', previewHint: '💡 아래 스타일을 클릭하거나 "셔플"로 랜덤 생성',
|
|
245
|
+
providerLabel: '🧠 서비스 공급자', providerDesc: '비서와 HR 어시스턴트가 사용하는 AI 모델.',
|
|
246
|
+
noProviders: '⚠️ 사용 가능한 공급자가 없습니다. AI 공급자 페이지에서 API Key를 먼저 설정하세요',
|
|
247
|
+
signatureLabel: '개인 서명', signaturePlaceholder: '예: 효율이 생명이다',
|
|
248
|
+
promptLabel: '🧠 세뇌 스크립트 (시스템 프롬프트)',
|
|
249
|
+
promptDesc: '비서의 인격 설정입니다. 지시 이해, 팀 계획, 소통 방식을 결정합니다.',
|
|
250
|
+
charCount: '글자 수: {n}', restoreDefault: '기본값 복원',
|
|
251
|
+
modelInfo: '모델: {provider} · Token: {info}', withHR: 'HR 어시스턴트 포함',
|
|
252
|
+
saved: '✅ 저장됨', saving: '⏳ 저장 중...', saveBtn: '💾 설정 저장',
|
|
253
|
+
},
|
|
254
|
+
reqDetail: {
|
|
255
|
+
back: '← 목록으로 돌아가기',
|
|
256
|
+
backShort: '돌아가기',
|
|
257
|
+
executingShort: '⚙️ 실행 중',
|
|
258
|
+
status: { pending: '대기', planning: '계획 중', in_progress: '실행 중', pending_approval: '승인 대기', completed: '완료', failed: '실패' },
|
|
259
|
+
deleteBtn: '🗑 삭제', restartBtn: '🔄 재실행',
|
|
260
|
+
tabs: { workflow: '📊 워크플로우', chat: '💬 그룹 채팅', outputs: '📦 산출물', files: '📁 파일', office: '🏢 사무실' },
|
|
261
|
+
deleteConfirm: { title: '🗑 요구사항 삭제', desc: '이 요구사항을 삭제하시겠습니까? 되돌릴 수 없습니다.', confirmBtn: '삭제 확인' },
|
|
262
|
+
summary: { tasks: '✅ {n}/{total} 작업', duration: '⏱️ {n}초' },
|
|
263
|
+
timeDuration: '⏱ 소요 시간 {n}초',
|
|
264
|
+
workflow: { progress: '전체 진행률', running: '실행 중', completed: '완료', failed: '실패', pending: '대기 중', typing: '작업 중...', notParsed: '워크플로우 미파싱', leader: '팀장', planning: '요구사항 분석 및 분해 중...' },
|
|
265
|
+
live: {
|
|
266
|
+
stuck: '🔴 멈췄을 수도 있음', waiting: '🟡 응답 대기 중...', running: '🟢 실행 중',
|
|
267
|
+
secondsAgo: '{n}초 전', minutesAgo: '{n}분 전',
|
|
268
|
+
restarting: '🔄 재시작 중...', restart: '🔄 재시작',
|
|
269
|
+
deleteReq: '🗑️ 요구사항 삭제', confirmDelete: '삭제 확인?', recentFiles: '최근 파일:',
|
|
270
|
+
},
|
|
271
|
+
approvalHint: '"확인"을 입력하여 승인하거나, 피드백을 보내세요...',
|
|
272
|
+
chat: { noMessages: '그룹 채팅 메시지 없음', noMessagesHint: '작업 실행 시 직원 간 대화가 여기에 표시됩니다' },
|
|
273
|
+
outputs: { noOutputs: '산출물 없음', noOutputsHint: '작업 완료 후 산출물이 여기에 표시됩니다', noOutputsShort: '산출물 없음', collapse: '접기 ▲', expand: '펼치기 ▼' },
|
|
274
|
+
files: {
|
|
275
|
+
noChanges: '파일 변경 없음', noChangesHint: '작업 실행 중 생성된 파일이 여기에 표시됩니다',
|
|
276
|
+
explorer: '탐색기', fileCount: '{n}개 파일', syncing: '실시간 동기화 중', syncingShort: '동기화 중...',
|
|
277
|
+
loading: '로딩 중...', emptyFile: '(빈 파일)', noContent: '(내용 없음)', readFailed: '(읽기 실패)',
|
|
278
|
+
lines: '{n}줄', readOnly: '읽기 전용', clickToView: '파일을 클릭하여 내용 보기', syntaxHighlight: '구문 강조 · 실시간 동기화',
|
|
279
|
+
},
|
|
280
|
+
members: {
|
|
281
|
+
blockingTitle: '⏱️ 현재 블로킹', title: '👥 멤버', count: '({n})',
|
|
282
|
+
running: '실행 중', reviewing: '검토 중', revision: '수정 중', waiting: '대기 중', ready: '준비됨', completed: '완료', failed: '실패',
|
|
283
|
+
working: '⚡작업 중', noTask: '작업 없음', peekFlow: '플로우 엿보기', viewProfile: '프로필 보기',
|
|
284
|
+
taskTooltip: '작업: {tasks}',
|
|
285
|
+
},
|
|
286
|
+
flowPeek: {
|
|
287
|
+
title: '{name}의 플로우 엿보기', tabFlow: '📋 작업 로그', tabThoughts: '💭 독백', tabHistory: '📜 기록',
|
|
288
|
+
loading: '마음을 엿보는 중...', noFlowLogs: '작업 로그 없음', noFlowLogsHint: '에이전트가 작업을 시작하면 여기에 표시됩니다',
|
|
289
|
+
thinking: '🧠 생각 중...', decided: '💬 발언 결정', silent: '🤫 침묵', thought: '💭 독백', organizing: '생각 정리 중...',
|
|
290
|
+
noMonologue: '활성 독백 없음', noHistory: '기록 없음', recentlyThought: '방금 생각함', spoke: '💬 발언함', keptSilent: '🤫 침묵 유지', codeBlock: '[코드 블록]',
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
display: {
|
|
294
|
+
ageYears: '{n}세',
|
|
295
|
+
ageLabel: '나이',
|
|
296
|
+
ageUnknown: '알 수 없음',
|
|
297
|
+
genderFemale: '👩',
|
|
298
|
+
genderMale: '👨',
|
|
299
|
+
genderFemaleText: '👩 여성',
|
|
300
|
+
genderMaleText: '👨 남성',
|
|
301
|
+
personality: '성격',
|
|
302
|
+
},
|
|
303
|
+
fileRef: {
|
|
304
|
+
viewFile: '파일 보기',
|
|
305
|
+
loading: '로딩 중...',
|
|
306
|
+
loadFailed: '파일 내용 로드 실패',
|
|
307
|
+
close: '닫기',
|
|
308
|
+
lines: '{n}줄',
|
|
309
|
+
copyPath: '경로 복사',
|
|
310
|
+
copied: '복사됨!',
|
|
311
|
+
},
|
|
312
|
+
time: { justNow: '방금', minutesAgo: '{n}분 전', sun: '일', mon: '월', tue: '화', wed: '수', thu: '목', fri: '금', sat: '토' },
|
|
313
|
+
agentChat: {
|
|
314
|
+
subtitle: '1대1 비공개 채팅',
|
|
315
|
+
empty: '{name}에게 인사하세요!',
|
|
316
|
+
inputPlaceholder: '{name}에게 메시지...',
|
|
317
|
+
typing: '입력 중...',
|
|
318
|
+
error: '전송 실패',
|
|
319
|
+
chatBtn: '💬 채팅',
|
|
320
|
+
},
|
|
321
|
+
team: {
|
|
322
|
+
back: '부서로 돌아가기',
|
|
323
|
+
noDescription: '설명 없음',
|
|
324
|
+
newSprint: '새 스프린트',
|
|
325
|
+
members: '명',
|
|
326
|
+
sprints: '개 스프린트',
|
|
327
|
+
leader: '👔 팀장',
|
|
328
|
+
tab: { overview: '📋 개요', sprints: '🔄 스프린트', files: '📁 파일' },
|
|
329
|
+
membersTitle: '👥 팀 멤버',
|
|
330
|
+
skillsTitle: '🛠 팀 스킬',
|
|
331
|
+
editSkills: '편집',
|
|
332
|
+
skillsPlaceholder: '쉼표로 구분된 스킬, 예: React, Node.js, Python',
|
|
333
|
+
noSkills: '스킬 미설정',
|
|
334
|
+
workspaceTitle: '📁 작업 공간',
|
|
335
|
+
selectWorkspace: '작업 공간 선택',
|
|
336
|
+
noWorkspace: '작업 공간 미선택',
|
|
337
|
+
recentSprints: '🔄 최근 스프린트',
|
|
338
|
+
noSprints: '스프린트 없음 — 하나 만들어 시작하세요',
|
|
339
|
+
newTeamBtn: '👥 새 팀',
|
|
340
|
+
teamsCount: '개 팀',
|
|
341
|
+
teamsTitle: '팀 목록',
|
|
342
|
+
noTeams: '팀 없음 — 프로젝트 협업을 위해 팀을 만드세요',
|
|
343
|
+
nameLabel: '팀 이름',
|
|
344
|
+
namePlaceholder: '예: Alpha 프로젝트 팀',
|
|
345
|
+
descLabel: '설명',
|
|
346
|
+
descPlaceholder: '이 팀은 무엇을 할 예정인가요?',
|
|
347
|
+
selectMembers: '멤버 선택',
|
|
348
|
+
selectLeader: '팀장 선택',
|
|
349
|
+
selectLeaderPlaceholder: '-- 팀장 선택 --',
|
|
350
|
+
createBtn: '🚀 팀 만들기',
|
|
351
|
+
sprint: {
|
|
352
|
+
draft: '초안',
|
|
353
|
+
discussing: '논의 중',
|
|
354
|
+
pendingApproval: '승인 대기',
|
|
355
|
+
inProgress: '진행 중',
|
|
356
|
+
completed: '완료',
|
|
357
|
+
failed: '실패',
|
|
358
|
+
backToList: '스프린트 목록으로',
|
|
359
|
+
startDiscussion: '💬 논의 시작',
|
|
360
|
+
approve: '✅ 승인 및 시작',
|
|
361
|
+
confirmDelete: '이 스프린트를 삭제하시겠습니까?',
|
|
362
|
+
goal: '스프린트 목표',
|
|
363
|
+
plan: '스프린트 계획',
|
|
364
|
+
noPlan: '아직 스프린트 계획이 없습니다',
|
|
365
|
+
chat: '그룹 채팅',
|
|
366
|
+
workflow: '워크플로우',
|
|
367
|
+
outputs: '산출물',
|
|
368
|
+
noMessages: '메시지 없음',
|
|
369
|
+
chatPlaceholder: '팀에 메시지 보내기...',
|
|
370
|
+
titleLabel: '스프린트 제목',
|
|
371
|
+
titlePlaceholder: '예: v1.0 MVP 스프린트',
|
|
372
|
+
goalLabel: '스프린트 목표',
|
|
373
|
+
goalPlaceholder: '이번 스프린트에서 달성할 내용을 설명하세요...',
|
|
374
|
+
createBtn: '🚀 스프린트 만들기',
|
|
375
|
+
viewRequirement: '📋 요구사항 보기',
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
bossProfile: {
|
|
379
|
+
title: '👤 보스 프로필',
|
|
380
|
+
subtitle: '아바타를 커스터마이즈, 최고 자본가',
|
|
381
|
+
avatarTitle: '아바타 선택',
|
|
382
|
+
refreshAvatar: '🔄 셔플',
|
|
383
|
+
saved: '✅ 저장됨',
|
|
384
|
+
saving: '⏳ 저장 중...',
|
|
385
|
+
saveBtn: '💾 저장',
|
|
386
|
+
editAvatar: '아바타 편집',
|
|
387
|
+
},
|
|
388
|
+
systemSettings: {
|
|
389
|
+
title: '⚙️ 시스템 설정',
|
|
390
|
+
subtitle: '예약 작업, 플러그인, 시스템 상태 관리',
|
|
391
|
+
cards: { audit: '보안 감사', routing: '라우팅', plugins: '플러그인', cron: '예약 작업', hooks: '이벤트 훅', sessions: '세션', config: '설정' },
|
|
392
|
+
auditStats: { totalEvents: '총 이벤트', blocked: '차단됨' },
|
|
393
|
+
pluginStats: { registered: '등록됨', enabled: '활성화' },
|
|
394
|
+
cronStats: { running: '실행 중', jobs: '작업 수' },
|
|
395
|
+
hookStats: { handlers: '핸들러', eventKeys: '이벤트 키' },
|
|
396
|
+
sessionStats: { total: '총 세션', messages: '메시지' },
|
|
397
|
+
cronDetail: { jobList: '예약 작업 목록', createJob: '예약 작업 생성', runs: '실행 횟수', noJobs: '예약 작업 없음', noJobsHint: '예약 작업을 만들어 에이전트 작업을 자동화하세요', activeJobs: '활성', totalRuns: '총 실행 횟수' },
|
|
398
|
+
cronForm: { name: '작업 이름', schedule: '스케줄 (예: every 30m, daily 09:00)', selectAgent: '-- 에이전트 선택 --', taskPrompt: '에이전트 지시사항...', scheduleHint: '형식: "every 5m", "every 2h", "daily 09:00", "weekly mon 10:00"' },
|
|
399
|
+
pluginDetail: { noPlugins: '플러그인 없음', totalTools: '도구 수' },
|
|
400
|
+
health: { title: '시스템 상태', providerHealth: 'AI 공급자 상태', recentAudit: '최근 감사 이벤트' },
|
|
401
|
+
cliBackends: {
|
|
402
|
+
title: 'CLI 백엔드', subtitle: '로컬 CLI 코딩 어시스턴트를 Agent 실행 엔진으로 통합',
|
|
403
|
+
detectAll: '전체 감지', detecting: '감지 중...', registerCustom: '커스텀 CLI 등록',
|
|
404
|
+
noBackends: 'CLI 백엔드가 감지되지 않았습니다', noBackendsHint: 'Claude Code, Codex 또는 CodeBuddy와 같은 CLI 도구를 설치한 후 감지를 클릭하세요',
|
|
405
|
+
status: { detected: '감지됨', not_found: '미발견', configured: '구성됨', error: '오류' },
|
|
406
|
+
version: '버전', command: '명령어', nodeVersion: 'Node 버전', builtin: '내장', custom: '커스텀', remove: '제거',
|
|
407
|
+
form: { id: '백엔드 ID', name: '표시 이름', execCommand: '실행 명령어', execArgs: '인수 (쉼표 구분)', detectCommand: '감지 명령어', memoryDir: 'Memory 디렉토리', memoryFile: 'Memory 파일명', nvmNode: 'Node 버전 (nvm)', nvmNodeHint: '필요 없으면 비워두세요' },
|
|
408
|
+
},
|
|
409
|
+
kbEntryTypes: {
|
|
410
|
+
note: '📝 노트',
|
|
411
|
+
fact: '📌 사실',
|
|
412
|
+
decision: '⚖️ 결정',
|
|
413
|
+
procedure: '📋 절차',
|
|
414
|
+
reference: '📖 참고',
|
|
415
|
+
faq: '❓ 자주 묻는 질문',
|
|
416
|
+
},
|
|
417
|
+
cronJobActions: {
|
|
418
|
+
pause: '일시정지',
|
|
419
|
+
resume: '재개',
|
|
420
|
+
retry: '재시도',
|
|
421
|
+
runNow: '지금 실행',
|
|
422
|
+
delete: '삭제',
|
|
423
|
+
},
|
|
424
|
+
agentChanges: '⚡ 에이전트 변경',
|
|
425
|
+
monologue: '🧠 내면의 독백',
|
|
426
|
+
noMonologueYet: '이 에이전트는 아직 독백을 생성하지 않았습니다',
|
|
427
|
+
sendToGroupChat: '[그룹 채팅에 전송]',
|
|
428
|
+
autoSent: '자동 전송',
|
|
429
|
+
},
|
|
430
|
+
|
|
431
|
+
// === API 응답 메시지 ===
|
|
432
|
+
api: {
|
|
433
|
+
noCompany: '먼저 회사를 만들어주세요',
|
|
434
|
+
internalError: '내부 서버 오류',
|
|
435
|
+
unknownAction: '알 수 없는 작업',
|
|
436
|
+
unknownOperation: '알 수 없는 작업',
|
|
437
|
+
missingField: '{field}은(는) 필수입니다',
|
|
438
|
+
missingFields: '필수 필드가 없습니다: {fields}',
|
|
439
|
+
companyNameRequired: '회사 이름을 입력해주세요',
|
|
440
|
+
companyDissolved: '회사가 해산되었으며 모든 데이터가 삭제되었습니다',
|
|
441
|
+
deptNameMissionRequired: '부서명과 미션은 필수입니다',
|
|
442
|
+
deptIdRequired: '부서 ID는 필수입니다',
|
|
443
|
+
deptIdAdjustGoalRequired: '부서 ID와 조정 목표는 필수입니다',
|
|
444
|
+
deptIdMessageRequired: '부서 ID와 메시지는 필수입니다',
|
|
445
|
+
adjustPlanIdRequired: '조정 계획 ID는 필수입니다',
|
|
446
|
+
planIdRequired: '계획 ID는 필수입니다',
|
|
447
|
+
deptNotFound: '부서를 찾을 수 없습니다',
|
|
448
|
+
deptNotFoundRestart: '부서를 찾을 수 없어 재시작할 수 없습니다',
|
|
449
|
+
agentNotFound: '직원을 찾을 수 없습니다',
|
|
450
|
+
agentConfigUpdated: '에이전트 설정이 업데이트되었습니다',
|
|
451
|
+
messageRequired: '메시지를 입력해주세요',
|
|
452
|
+
requirementNotFound: '요구사항을 찾을 수 없습니다',
|
|
453
|
+
requirementIdRequired: '요구사항 ID는 필수입니다',
|
|
454
|
+
requirementDeptTitleRequired: 'departmentId와 title은 필수입니다',
|
|
455
|
+
requirementRestarted: '요구사항이 재시작되었습니다',
|
|
456
|
+
requirementIdMessageRequired: '요구사항 ID와 메시지는 필수입니다',
|
|
457
|
+
teamNotFound: '팀을 찾을 수 없습니다',
|
|
458
|
+
teamIdRequired: 'teamId는 필수입니다',
|
|
459
|
+
teamCreateRequired: 'departmentId, name, memberIds, leaderId는 필수입니다',
|
|
460
|
+
leaderNotFound: '부서에서 리더를 찾을 수 없습니다',
|
|
461
|
+
memberNotFound: '부서에서 멤버 {id}를 찾을 수 없습니다',
|
|
462
|
+
sprintNotFound: '스프린트를 찾을 수 없습니다',
|
|
463
|
+
sprintCreateRequired: 'teamId, title, goal은 필수입니다',
|
|
464
|
+
sprintDiscussRequired: 'teamId와 sprintId는 필수입니다',
|
|
465
|
+
sprintNotDraft: '스프린트가 초안 상태가 아닙니다',
|
|
466
|
+
sprintNotPendingApproval: '스프린트가 승인 대기 상태가 아닙니다',
|
|
467
|
+
sprintMessageRequired: 'teamId, sprintId, message는 필수입니다',
|
|
468
|
+
teamDeleteIdRequired: '팀 ID는 필수입니다',
|
|
469
|
+
targetDeptRequired: '대상 부서를 선택해주세요',
|
|
470
|
+
secretarySettingRequired: '수정할 설정을 최소 하나 이상 제공해주세요',
|
|
471
|
+
providerNotFound: '공급업체를 찾을 수 없습니다',
|
|
472
|
+
companyNotFound: '회사를 찾을 수 없습니다',
|
|
473
|
+
mailNotFound: '메일을 찾을 수 없습니다',
|
|
474
|
+
kbNotFound: '지식 베이스를 찾을 수 없습니다',
|
|
475
|
+
kbUnknownAction: '알 수 없는 작업: {action}',
|
|
476
|
+
cronMissingFields: '필수 필드가 없습니다: name, cronExpression, agentId, taskPrompt',
|
|
477
|
+
agentNotFoundId: '에이전트를 찾을 수 없습니다: {id}',
|
|
478
|
+
missingPluginId: 'pluginId가 없습니다',
|
|
479
|
+
missingSkillId: 'skillId가 없습니다',
|
|
480
|
+
pluginUnknownAction: '알 수 없는 작업: {action}',
|
|
481
|
+
missingBackendId: 'backendId가 없습니다',
|
|
482
|
+
cliConfigRequired: '설정에는 최소한 id와 execCommand가 필요합니다',
|
|
483
|
+
filePathRequired: '파일 경로는 필수입니다 (쿼리 파라미터: path)',
|
|
484
|
+
fileNotFound: '파일을 찾을 수 없습니다',
|
|
485
|
+
pathNotExist: '경로가 존재하지 않습니다',
|
|
486
|
+
pathNotDirectory: '경로가 디렉토리가 아닙니다',
|
|
487
|
+
|
|
488
|
+
// Sprint group chat system messages (user-visible)
|
|
489
|
+
sprintCreated: '📋 스프린트 「{title}」가 생성되었습니다. 목표: {goal}',
|
|
490
|
+
sprintDiscussionOpening: '📢 팀원 여러분, 스프린트 「{title}」 계획에 대해 논의합시다.\n\n🎯 스프린트 목표: {goal}\n\n각자의 전문 분야를 바탕으로 의견을 공유해 주시면 최종 계획을 정리하겠습니다.',
|
|
491
|
+
sprintDiscussionComplete: '✅ 토론 완료! 팀 피드백을 바탕으로 계획이 수정되었으며 상사 승인을 기다리고 있습니다.',
|
|
492
|
+
sprintDiscussionError: '⚠️ 토론 중 오류 발생: {error}. 현재 계획을 승인 신청합니다.',
|
|
493
|
+
sprintApproved: '✅ 승인되었습니다! 계획이 수락되어 팀을 위한 요구사항 작업을 생성 중입니다.',
|
|
494
|
+
sprintRequirementCreated: '📋 요구사항 「{title}」이 생성되어 시작되었습니다. 요구사항 보드에서 세부 내용을 확인할 수 있습니다.',
|
|
495
|
+
sprintRequirementFailed: '❌ 요구사항 생성 또는 실행에 실패했습니다: {error}',
|
|
496
|
+
},
|
|
497
|
+
pixelOffice: {
|
|
498
|
+
title: '사무실',
|
|
499
|
+
depts: '개 부서',
|
|
500
|
+
agents: '명의 에이전트',
|
|
501
|
+
agentInfo: '에이전트 정보',
|
|
502
|
+
name: '이름',
|
|
503
|
+
role: '역할',
|
|
504
|
+
department: '부서',
|
|
505
|
+
motto: '좌우명',
|
|
506
|
+
skills: '스킬',
|
|
507
|
+
lastMessage: '최신 메시지',
|
|
508
|
+
clickAgent: '에이전트를 클릭하여 정보 확인',
|
|
509
|
+
bubbleHint: '말풍선은 최근 채팅을 표시',
|
|
510
|
+
walkHint: '에이전트가 사무실을 돌아다닙니다',
|
|
511
|
+
},
|
|
512
|
+
};
|
|
513
|
+
export default ko;
|