claude-controller 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/bin/autoloop.sh +382 -0
  3. package/bin/ctl +1189 -0
  4. package/bin/native-app.py +6 -3
  5. package/bin/watchdog.sh +357 -0
  6. package/cognitive/__init__.py +14 -0
  7. package/cognitive/__pycache__/__init__.cpython-314.pyc +0 -0
  8. package/cognitive/__pycache__/dispatcher.cpython-314.pyc +0 -0
  9. package/cognitive/__pycache__/evaluator.cpython-314.pyc +0 -0
  10. package/cognitive/__pycache__/goal_engine.cpython-314.pyc +0 -0
  11. package/cognitive/__pycache__/learning.cpython-314.pyc +0 -0
  12. package/cognitive/__pycache__/orchestrator.cpython-314.pyc +0 -0
  13. package/cognitive/__pycache__/planner.cpython-314.pyc +0 -0
  14. package/cognitive/dispatcher.py +192 -0
  15. package/cognitive/evaluator.py +289 -0
  16. package/cognitive/goal_engine.py +232 -0
  17. package/cognitive/learning.py +189 -0
  18. package/cognitive/orchestrator.py +303 -0
  19. package/cognitive/planner.py +207 -0
  20. package/cognitive/prompts/analyst.md +31 -0
  21. package/cognitive/prompts/coder.md +22 -0
  22. package/cognitive/prompts/reviewer.md +33 -0
  23. package/cognitive/prompts/tester.md +21 -0
  24. package/cognitive/prompts/writer.md +25 -0
  25. package/config.sh +6 -1
  26. package/dag/__init__.py +5 -0
  27. package/dag/__pycache__/__init__.cpython-314.pyc +0 -0
  28. package/dag/__pycache__/graph.cpython-314.pyc +0 -0
  29. package/dag/graph.py +222 -0
  30. package/lib/jobs.sh +12 -1
  31. package/package.json +11 -5
  32. package/postinstall.sh +1 -1
  33. package/service/controller.sh +43 -11
  34. package/web/audit.py +122 -0
  35. package/web/checkpoint.py +80 -0
  36. package/web/config.py +2 -5
  37. package/web/handler.py +634 -473
  38. package/web/handler_fs.py +153 -0
  39. package/web/handler_goals.py +203 -0
  40. package/web/handler_jobs.py +372 -0
  41. package/web/handler_memory.py +203 -0
  42. package/web/handler_sessions.py +132 -0
  43. package/web/jobs.py +585 -13
  44. package/web/personas.py +419 -0
  45. package/web/pipeline.py +981 -0
  46. package/web/presets.py +506 -0
  47. package/web/projects.py +246 -0
  48. package/web/static/api.js +141 -0
  49. package/web/static/app.js +25 -1937
  50. package/web/static/attachments.js +144 -0
  51. package/web/static/base.css +497 -0
  52. package/web/static/context.js +204 -0
  53. package/web/static/dirs.js +246 -0
  54. package/web/static/form.css +763 -0
  55. package/web/static/goals.css +363 -0
  56. package/web/static/goals.js +300 -0
  57. package/web/static/i18n.js +625 -0
  58. package/web/static/index.html +215 -13
  59. package/web/static/{styles.css → jobs.css} +746 -1141
  60. package/web/static/jobs.js +1270 -0
  61. package/web/static/memoryview.js +117 -0
  62. package/web/static/personas.js +228 -0
  63. package/web/static/pipeline.css +338 -0
  64. package/web/static/pipelines.js +487 -0
  65. package/web/static/presets.js +244 -0
  66. package/web/static/send.js +135 -0
  67. package/web/static/settings-style.css +291 -0
  68. package/web/static/settings.js +81 -0
  69. package/web/static/stream.js +534 -0
  70. package/web/static/utils.js +131 -0
  71. package/web/webhook.py +210 -0
@@ -0,0 +1,625 @@
1
+ /* ═══════════════════════════════════════════════
2
+ i18n — 국제화 (Internationalization)
3
+ ═══════════════════════════════════════════════ */
4
+
5
+ const I18N = {
6
+ ko: {
7
+ title:'Controller Service', send_task:'새 작업 전송', prompt:'프롬프트',
8
+ prompt_placeholder:'Claude에게 전달할 명령을 입력하세요... (파일/이미지 드래그 또는 붙여넣기 가능)',
9
+ drop_files:'파일을 여기에 놓으세요', select_directory:'디렉토리를 선택하세요...',
10
+ browse_directory:'디렉토리 탐색', create_folder:'새 폴더', new_folder_name:'새 폴더 이름', create:'생성',
11
+ reset:'초기화', send:'전송',
12
+ job_list:'작업 목록', status:'상태', folder:'폴더', created_at:'생성 시간',
13
+ delete_completed:'완료 삭제', loading_jobs:'작업 목록을 불러오는 중...',
14
+ local_server_connection:'로컬 서버 연결', server_address:'서버 주소',
15
+ server_address_desc:'로컬에서 실행 중인 Controller 서버 주소',
16
+ auth_token:'인증 토큰', auth_token_desc:'서버 시작 시 터미널에 표시되는 Auth Token',
17
+ disconnect:'연결 해제', connect:'연결', settings:'설정',
18
+ language_settings:'언어 설정', display_language:'표시 언어',
19
+ display_language_desc:'인터페이스에 표시되는 언어를 선택합니다',
20
+ webhook_settings:'웹훅 설정', webhook_url:'Webhook URL',
21
+ webhook_url_desc:'작업 완료/실패 시 결과를 POST할 URL',
22
+ webhook_secret:'Webhook Secret', webhook_secret_desc:'HMAC-SHA256 서명용 비밀 키 (선택사항)',
23
+ webhook_events:'이벤트 필터', webhook_events_desc:'웹훅을 보낼 이벤트 (done, failed)',
24
+ webhook_test:'연결 테스트', webhook_test_desc:'설정된 URL로 테스트 이벤트를 전송합니다',
25
+ close:'닫기', save:'저장', select_session:'세션 선택',
26
+ this_project_only:'이 프로젝트만', search_prompt:'프롬프트 검색...',
27
+ msg_settings_saved:'설정이 저장되었습니다', msg_settings_save_failed:'설정 저장 실패',
28
+ msg_prompt_required:'프롬프트를 입력해주세요.', msg_task_sent:'작업이 전송되었습니다.',
29
+ msg_send_failed:'전송 실패', msg_upload_failed:'업로드 실패',
30
+ msg_file_read_failed:'파일 읽기 실패',
31
+ msg_copy_done:'결과가 클립보드에 복사되었습니다.', msg_copy_failed:'클립보드 복사에 실패했습니다.',
32
+ msg_copy_no_result:'복사할 결과가 없습니다.', msg_copy_no_text:'복사할 텍스트 결과가 없습니다.',
33
+ msg_job_deleted:'작업이 제거되었습니다.', msg_delete_failed:'제거 실패',
34
+ msg_batch_deleted:'개 완료 작업이 제거되었습니다.', msg_batch_delete_failed:'일괄 제거 실패',
35
+ msg_connected:'로컬 서버에 연결되었습니다', msg_disconnected:'연결이 해제되었습니다',
36
+ msg_session_select:'세션 선택',
37
+ msg_fork_mode:'Fork 모드로 전환됨', msg_fork_input:'새 프롬프트를 입력하세요.',
38
+ msg_continue_input:'이어서 실행할 명령을 입력해주세요.',
39
+ msg_no_session_id:'세션 ID가 없어서 이어서 실행할 수 없습니다.',
40
+ msg_continue_sent:'세션 이어서 명령이 전송되었습니다.',
41
+ msg_no_original_prompt:'원본 프롬프트를 찾을 수 없습니다.',
42
+ msg_rerun_done:'같은 프롬프트로 다시 실행되었습니다.', msg_rerun_failed:'재실행 실패',
43
+ msg_refresh_done:'전체 새로고침 완료',
44
+ msg_service_start:'서비스 시작 요청 완료', msg_service_stop:'서비스 중지 요청 완료',
45
+ msg_service_restart:'서비스 재시작 요청 완료', msg_service_failed:'서비스 요청 실패',
46
+ status_running:'실행 중', status_done:'완료', status_failed:'실패', status_pending:'대기 중',
47
+ no_jobs:'작업이 없습니다', connected_to:'연결됨', no_project:'프로젝트 미지정',
48
+ conn_lost:'서버 연결이 끊어졌습니다. 재연결 시도 중...',
49
+ all_projects:'전체 프로젝트',
50
+ presets:'프리셋', automations:'자동화', save_as_preset:'프리셋 저장',
51
+ confirm_delete_job:'이 작업을 삭제하시겠습니까?', confirm_delete_completed:'완료된 작업을 모두 삭제하시겠습니까?',
52
+ err_show_log:'상세 로그 보기',
53
+ stream_no_output:'출력 데이터 없음',
54
+ checkpoints:'체크포인트', diff_viewer:'Diff 뷰어', diff_compare:'비교',
55
+ diff_no_checkpoints:'체크포인트가 없습니다.', diff_select_hint:'두 체크포인트를 선택하여 비교하세요.',
56
+ diff_loading:'Diff를 불러오는 중...', diff_no_changes:'변경사항이 없습니다.',
57
+ diff_files:'파일', diff_additions:'추가', diff_deletions:'삭제',
58
+ stream_job_done:'작업 완료', stream_job_failed:'작업 실패',
59
+ stream_copy_all:'전체 복사', stream_delete_job:'작업 제거',
60
+ stream_followup_label:'이어서',
61
+ stream_followup_placeholder:'이 세션에 이어서 실행할 명령... (파일/이미지 붙여넣기 가능)',
62
+ stream_load_failed:'스트림 데이터를 불러오지 못했습니다',
63
+ stream_retry:'다시 시도', stream_reconnect:'다시 연결',
64
+ stat_jobs_summary:'{total} 작업 ({running} 실행)',
65
+ stat_success:'성공 {pct}%',
66
+ pd_total:'전체', pd_running:'실행 중', pd_done:'완료', pd_failed:'실패',
67
+ pd_avg:'평균', pd_success_rate:'성공률', pd_registered:'등록',
68
+ pd_send_task:'작업 전송', pd_send_task_title:'이 프로젝트에 작업 전송', pd_show_all_title:'전체 프로젝트 보기',
69
+ pd_other:'기타',
70
+ job_retry:'다시 실행', job_retry_title:'같은 프롬프트로 다시 실행',
71
+ job_resume_title:'세션 이어서 명령 (resume)', job_fork_title:'이 세션에서 분기 (fork)',
72
+ job_delete_title:'작업 제거',
73
+ job_zombie:'응답 없음', job_zombie_title:'5분 이상 응답 없음 — 프로세스 확인 필요',
74
+ job_dep_title:'선행 작업: {deps}',
75
+ job_count:'{n}건',
76
+ job_count_filtered:'{filtered}/{total}건',
77
+ stream_loading:'스트림 데이터를 불러오는 중...',
78
+ stream_preview_wait:'대기 중...',
79
+ msg_resume_mode:'Resume 모드: {sid} 세션에 이어서 전송합니다.',
80
+ // Goals
81
+ goals:'목표', goal_create:'목표 생성', goal_objective:'목표', goal_mode:'실행 모드',
82
+ goal_budget:'예산 (USD)', goal_max_tasks:'최대 태스크 수',
83
+ goal_mode_full_auto:'완전 자율', goal_mode_gate:'단계별 승인', goal_mode_watch:'관찰 모드', goal_mode_pair:'페어 모드',
84
+ goal_status_pending:'대기', goal_status_planning:'계획 중', goal_status_ready:'준비 완료',
85
+ goal_status_running:'실행 중', goal_status_gate_waiting:'승인 대기', goal_status_evaluating:'평가 중',
86
+ goal_status_completed:'완료', goal_status_failed:'실패', goal_status_cancelled:'취소됨',
87
+ goal_approve:'승인', goal_cancel:'취소', goal_no_goals:'등록된 목표가 없습니다.',
88
+ goal_dag:'실행 계획 (DAG)', goal_tasks:'태스크', goal_progress:'진행률',
89
+ goal_filter_all:'전체', goal_filter_active:'진행 중', goal_filter_done:'완료', goal_filter_cancelled:'취소',
90
+ goal_create_placeholder:'달성하고자 하는 목표를 입력하세요...',
91
+ goal_confirm_cancel:'이 목표를 취소하시겠습니까?',
92
+ msg_goal_created:'목표가 생성되었습니다.', msg_goal_approved:'다음 단계가 승인되었습니다.',
93
+ msg_goal_cancelled:'목표가 취소되었습니다.', msg_goal_failed:'목표 작업 실패',
94
+ // Memory
95
+ memory:'메모리', memory_search:'메모리 검색', memory_add:'메모리 추가',
96
+ memory_type:'유형', memory_title:'제목', memory_content:'내용', memory_tags:'태그',
97
+ memory_project:'프로젝트', memory_type_decision:'결정', memory_type_pattern:'패턴',
98
+ memory_type_failure:'실패', memory_type_context:'맥락',
99
+ memory_no_items:'저장된 메모리가 없습니다.', memory_search_placeholder:'키워드로 검색...',
100
+ memory_confirm_delete:'이 메모리를 삭제하시겠습니까?',
101
+ msg_memory_created:'메모리가 저장되었습니다.', msg_memory_deleted:'메모리가 삭제되었습니다.',
102
+ msg_memory_updated:'메모리가 수정되었습니다.', msg_memory_failed:'메모리 작업 실패',
103
+ },
104
+ en: {
105
+ title:'Controller Service', send_task:'Send Task', prompt:'Prompt',
106
+ prompt_placeholder:'Enter a command for Claude... (drag & drop or paste files/images)',
107
+ drop_files:'Drop files here', select_directory:'Select a directory...',
108
+ browse_directory:'Browse Directory', create_folder:'New Folder', new_folder_name:'New folder name', create:'Create',
109
+ reset:'Reset', send:'Send',
110
+ job_list:'Job List', status:'Status', folder:'Folder', created_at:'Created',
111
+ delete_completed:'Delete Done', loading_jobs:'Loading job list...',
112
+ local_server_connection:'Local Server Connection', server_address:'Server Address',
113
+ server_address_desc:'Address of the locally running Controller server',
114
+ auth_token:'Auth Token', auth_token_desc:'Auth Token shown in the terminal when the server starts',
115
+ disconnect:'Disconnect', connect:'Connect', settings:'Settings',
116
+ language_settings:'Language', display_language:'Display Language',
117
+ display_language_desc:'Select the language for the interface',
118
+ webhook_settings:'Webhook Settings', webhook_url:'Webhook URL',
119
+ webhook_url_desc:'URL to POST results when a job completes or fails',
120
+ webhook_secret:'Webhook Secret', webhook_secret_desc:'Secret key for HMAC-SHA256 signature (optional)',
121
+ webhook_events:'Event Filter', webhook_events_desc:'Events to send webhooks for (done, failed)',
122
+ webhook_test:'Test Connection', webhook_test_desc:'Send a test event to the configured URL',
123
+ close:'Close', save:'Save', select_session:'Select Session',
124
+ this_project_only:'This project only', search_prompt:'Search prompts...',
125
+ msg_settings_saved:'Settings saved', msg_settings_save_failed:'Failed to save settings',
126
+ msg_prompt_required:'Please enter a prompt.', msg_task_sent:'Task has been sent.',
127
+ msg_send_failed:'Send failed', msg_upload_failed:'Upload failed',
128
+ msg_file_read_failed:'File read failed',
129
+ msg_copy_done:'Result copied to clipboard.', msg_copy_failed:'Failed to copy to clipboard.',
130
+ msg_copy_no_result:'No result to copy.', msg_copy_no_text:'No text result to copy.',
131
+ msg_job_deleted:'Job deleted.', msg_delete_failed:'Delete failed',
132
+ msg_batch_deleted:' completed jobs deleted.', msg_batch_delete_failed:'Batch delete failed',
133
+ msg_connected:'Connected to local server', msg_disconnected:'Disconnected',
134
+ msg_session_select:'Session selected',
135
+ msg_fork_mode:'Switched to Fork mode', msg_fork_input:'Enter a new prompt.',
136
+ msg_continue_input:'Enter a command to continue.',
137
+ msg_no_session_id:'Cannot continue: no session ID.',
138
+ msg_continue_sent:'Continue command sent.',
139
+ msg_no_original_prompt:'Original prompt not found.',
140
+ msg_rerun_done:'Re-run with the same prompt.', msg_rerun_failed:'Re-run failed',
141
+ msg_refresh_done:'Fully refreshed',
142
+ msg_service_start:'Service start requested', msg_service_stop:'Service stop requested',
143
+ msg_service_restart:'Service restart requested', msg_service_failed:'Service request failed',
144
+ status_running:'Running', status_done:'Done', status_failed:'Failed', status_pending:'Pending',
145
+ no_jobs:'No jobs', connected_to:'Connected', no_project:'No project',
146
+ conn_lost:'Server connection lost. Reconnecting...',
147
+ all_projects:'All Projects',
148
+ presets:'Presets', automations:'Automations', save_as_preset:'Save Preset',
149
+ confirm_delete_job:'Delete this job?', confirm_delete_completed:'Delete all completed jobs?',
150
+ err_show_log:'Show detailed log',
151
+ stream_no_output:'No output data',
152
+ checkpoints:'Checkpoints', diff_viewer:'Diff Viewer', diff_compare:'Compare',
153
+ diff_no_checkpoints:'No checkpoints found.', diff_select_hint:'Select two checkpoints to compare.',
154
+ diff_loading:'Loading diff...', diff_no_changes:'No changes.',
155
+ diff_files:'files', diff_additions:'additions', diff_deletions:'deletions',
156
+ stream_job_done:'Job Complete', stream_job_failed:'Job Failed',
157
+ stream_copy_all:'Copy All', stream_delete_job:'Delete Job',
158
+ stream_followup_label:'Follow Up',
159
+ stream_followup_placeholder:'Enter a command to continue in this session... (paste files/images)',
160
+ stream_load_failed:'Failed to load stream data',
161
+ stream_retry:'Retry', stream_reconnect:'Reconnect',
162
+ stat_jobs_summary:'{total} jobs ({running} running)',
163
+ stat_success:'Success {pct}%',
164
+ pd_total:'Total', pd_running:'Running', pd_done:'Done', pd_failed:'Failed',
165
+ pd_avg:'Avg', pd_success_rate:'Success Rate', pd_registered:'Registered',
166
+ pd_send_task:'Send Task', pd_send_task_title:'Send task to this project', pd_show_all_title:'View all projects',
167
+ pd_other:'Other',
168
+ job_retry:'Retry', job_retry_title:'Re-run with the same prompt',
169
+ job_resume_title:'Continue session (resume)', job_fork_title:'Branch from this session (fork)',
170
+ job_delete_title:'Delete job',
171
+ job_zombie:'No Response', job_zombie_title:'No response for 5+ minutes — check process',
172
+ job_dep_title:'Depends on: {deps}',
173
+ job_count:'{n}',
174
+ job_count_filtered:'{filtered}/{total}',
175
+ stream_loading:'Loading stream data...',
176
+ stream_preview_wait:'Waiting...',
177
+ msg_resume_mode:'Resume mode: continuing session {sid}',
178
+ // Goals
179
+ goals:'Goals', goal_create:'Create Goal', goal_objective:'Objective', goal_mode:'Mode',
180
+ goal_budget:'Budget (USD)', goal_max_tasks:'Max Tasks',
181
+ goal_mode_full_auto:'Full Auto', goal_mode_gate:'Gate', goal_mode_watch:'Watch', goal_mode_pair:'Pair',
182
+ goal_status_pending:'Pending', goal_status_planning:'Planning', goal_status_ready:'Ready',
183
+ goal_status_running:'Running', goal_status_gate_waiting:'Awaiting Approval', goal_status_evaluating:'Evaluating',
184
+ goal_status_completed:'Completed', goal_status_failed:'Failed', goal_status_cancelled:'Cancelled',
185
+ goal_approve:'Approve', goal_cancel:'Cancel', goal_no_goals:'No goals registered.',
186
+ goal_dag:'Execution Plan (DAG)', goal_tasks:'Tasks', goal_progress:'Progress',
187
+ goal_filter_all:'All', goal_filter_active:'Active', goal_filter_done:'Done', goal_filter_cancelled:'Cancelled',
188
+ goal_create_placeholder:'Describe the goal you want to achieve...',
189
+ goal_confirm_cancel:'Cancel this goal?',
190
+ msg_goal_created:'Goal created.', msg_goal_approved:'Next stage approved.',
191
+ msg_goal_cancelled:'Goal cancelled.', msg_goal_failed:'Goal operation failed',
192
+ // Memory
193
+ memory:'Memory', memory_search:'Search Memory', memory_add:'Add Memory',
194
+ memory_type:'Type', memory_title:'Title', memory_content:'Content', memory_tags:'Tags',
195
+ memory_project:'Project', memory_type_decision:'Decision', memory_type_pattern:'Pattern',
196
+ memory_type_failure:'Failure', memory_type_context:'Context',
197
+ memory_no_items:'No memories stored.', memory_search_placeholder:'Search by keyword...',
198
+ memory_confirm_delete:'Delete this memory?',
199
+ msg_memory_created:'Memory saved.', msg_memory_deleted:'Memory deleted.',
200
+ msg_memory_updated:'Memory updated.', msg_memory_failed:'Memory operation failed',
201
+ },
202
+ ja: {
203
+ title:'Controller Service', send_task:'新しいタスク送信', prompt:'プロンプト',
204
+ prompt_placeholder:'Claudeに送信するコマンドを入力... (ファイル/画像のドラッグ&ドロップ可能)',
205
+ drop_files:'ここにファイルをドロップ', select_directory:'ディレクトリを選択...',
206
+ browse_directory:'ディレクトリ参照', create_folder:'新しいフォルダ', new_folder_name:'新しいフォルダ名', create:'作成',
207
+ reset:'リセット', send:'送信',
208
+ job_list:'ジョブ一覧', status:'ステータス', folder:'フォルダ', created_at:'作成日時',
209
+ delete_completed:'完了を削除', loading_jobs:'ジョブ一覧を読み込み中...',
210
+ local_server_connection:'ローカルサーバー接続', server_address:'サーバーアドレス',
211
+ server_address_desc:'ローカルで実行中のControllerサーバーアドレス',
212
+ auth_token:'認証トークン', auth_token_desc:'サーバー起動時にターミナルに表示されるAuth Token',
213
+ disconnect:'切断', connect:'接続', settings:'設定',
214
+ language_settings:'言語設定', display_language:'表示言語',
215
+ display_language_desc:'インターフェースの表示言語を選択します',
216
+ close:'閉じる', save:'保存', select_session:'セッション選択',
217
+ this_project_only:'このプロジェクトのみ', search_prompt:'プロンプト検索...',
218
+ msg_settings_saved:'設定が保存されました', msg_settings_save_failed:'設定の保存に失敗',
219
+ msg_prompt_required:'プロンプトを入力してください。', msg_task_sent:'タスクが送信されました。',
220
+ msg_send_failed:'送信失敗', msg_upload_failed:'アップロード失敗',
221
+ msg_file_read_failed:'ファイル読み取り失敗',
222
+ msg_copy_done:'結果がクリップボードにコピーされました。', msg_copy_failed:'クリップボードへのコピーに失敗。',
223
+ msg_copy_no_result:'コピーする結果がありません。', msg_copy_no_text:'コピーするテキスト結果がありません。',
224
+ msg_job_deleted:'ジョブが削除されました。', msg_delete_failed:'削除失敗',
225
+ msg_batch_deleted:'件の完了ジョブが削除されました。', msg_batch_delete_failed:'一括削除失敗',
226
+ msg_connected:'ローカルサーバーに接続しました', msg_disconnected:'切断されました',
227
+ msg_session_select:'セッション選択',
228
+ msg_fork_mode:'Forkモードに切り替えました', msg_fork_input:'新しいプロンプトを入力してください。',
229
+ msg_continue_input:'続行するコマンドを入力してください。',
230
+ msg_no_session_id:'セッションIDがないため続行できません。',
231
+ msg_continue_sent:'セッション続行コマンドが送信されました。',
232
+ msg_no_original_prompt:'元のプロンプトが見つかりません。',
233
+ msg_rerun_done:'同じプロンプトで再実行しました。', msg_rerun_failed:'再実行失敗',
234
+ msg_refresh_done:'全体リフレッシュ完了',
235
+ msg_service_start:'サービス開始を要求', msg_service_stop:'サービス停止を要求',
236
+ msg_service_restart:'サービス再起動を要求', msg_service_failed:'サービスリクエスト失敗',
237
+ status_running:'実行中', status_done:'完了', status_failed:'失敗', status_pending:'待機中',
238
+ no_jobs:'ジョブがありません', connected_to:'接続済み', no_project:'プロジェクト未指定',
239
+ conn_lost:'サーバー接続が切断されました。再接続中...',
240
+ all_projects:'全プロジェクト',
241
+ presets:'プリセット', automations:'自動化', save_as_preset:'プリセット保存',
242
+ confirm_delete_job:'このジョブを削除しますか?', confirm_delete_completed:'完了したジョブをすべて削除しますか?',
243
+ err_show_log:'詳細ログを表示',
244
+ stream_no_output:'出力データなし',
245
+ stream_job_done:'ジョブ完了', stream_job_failed:'ジョブ失敗',
246
+ stream_copy_all:'全体コピー', stream_delete_job:'ジョブ削除',
247
+ stream_followup_label:'続行',
248
+ stream_followup_placeholder:'このセッションで続行するコマンドを入力... (ファイル/画像の貼り付け可)',
249
+ stream_load_failed:'ストリームデータの読み込みに失敗しました',
250
+ stream_retry:'再試行', stream_reconnect:'再接続',
251
+ stat_jobs_summary:'{total} ジョブ ({running} 実行中)',
252
+ stat_success:'成功 {pct}%',
253
+ pd_total:'全体', pd_running:'実行中', pd_done:'完了', pd_failed:'失敗',
254
+ pd_avg:'平均', pd_success_rate:'成功率', pd_registered:'登録済み',
255
+ pd_send_task:'タスク送信', pd_send_task_title:'このプロジェクトにタスク送信', pd_show_all_title:'全プロジェクト表示',
256
+ pd_other:'その他',
257
+ job_retry:'再実行', job_retry_title:'同じプロンプトで再実行',
258
+ job_resume_title:'セッション続行 (resume)', job_fork_title:'このセッションから分岐 (fork)',
259
+ job_delete_title:'ジョブ削除',
260
+ job_zombie:'応答なし', job_zombie_title:'5分以上応答なし — プロセスを確認してください',
261
+ job_dep_title:'先行タスク: {deps}',
262
+ job_count:'{n}件',
263
+ job_count_filtered:'{filtered}/{total}件',
264
+ stream_loading:'ストリームデータを読み込み中...',
265
+ stream_preview_wait:'待機中...',
266
+ msg_resume_mode:'Resumeモード: {sid} セッションに続行します。',
267
+ },
268
+ 'zh-CN': {
269
+ title:'Controller Service', send_task:'发送任务', prompt:'提示词',
270
+ prompt_placeholder:'输入要发送给Claude的指令... (可拖放或粘贴文件/图片)',
271
+ drop_files:'将文件拖放到此处', select_directory:'选择目录...',
272
+ browse_directory:'浏览目录', create_folder:'新建文件夹', new_folder_name:'新文件夹名称', create:'创建',
273
+ reset:'重置', send:'发送',
274
+ job_list:'任务列表', status:'状态', folder:'文件夹', created_at:'创建时间',
275
+ delete_completed:'删除已完成', loading_jobs:'正在加载任务列表...',
276
+ local_server_connection:'本地服务器连接', server_address:'服务器地址',
277
+ server_address_desc:'本地运行的Controller服务器地址',
278
+ auth_token:'认证令牌', auth_token_desc:'服务器启动时在终端显示的Auth Token',
279
+ disconnect:'断开连接', connect:'连接', settings:'设置',
280
+ language_settings:'语言设置', display_language:'显示语言',
281
+ display_language_desc:'选择界面显示的语言',
282
+ close:'关闭', save:'保存', select_session:'选择会话',
283
+ this_project_only:'仅此项目', search_prompt:'搜索提示词...',
284
+ msg_settings_saved:'设置已保存', msg_settings_save_failed:'保存设置失败',
285
+ msg_prompt_required:'请输入提示词。', msg_task_sent:'任务已发送。',
286
+ msg_send_failed:'发送失败', msg_upload_failed:'上传失败',
287
+ msg_file_read_failed:'文件读取失败',
288
+ msg_copy_done:'结果已复制到剪贴板。', msg_copy_failed:'复制到剪贴板失败。',
289
+ msg_copy_no_result:'没有可复制的结果。', msg_copy_no_text:'没有可复制的文本结果。',
290
+ msg_job_deleted:'任务已删除。', msg_delete_failed:'删除失败',
291
+ msg_batch_deleted:'个已完成任务已删除。', msg_batch_delete_failed:'批量删除失败',
292
+ msg_connected:'已连接到本地服务器', msg_disconnected:'已断开连接',
293
+ msg_session_select:'已选择会话',
294
+ msg_fork_mode:'已切换到Fork模式', msg_fork_input:'请输入新的提示词。',
295
+ msg_continue_input:'请输入继续执行的命令。', msg_no_session_id:'没有会话ID,无法继续。',
296
+ msg_continue_sent:'会话继续命令已发送。', msg_no_original_prompt:'找不到原始提示词。',
297
+ msg_rerun_done:'已使用相同提示词重新执行。', msg_rerun_failed:'重新执行失败',
298
+ msg_refresh_done:'全部刷新完成',
299
+ msg_service_start:'服务启动请求已完成', msg_service_stop:'服务停止请求已完成',
300
+ msg_service_restart:'服务重启请求已完成', msg_service_failed:'服务请求失败',
301
+ status_running:'运行中', status_done:'完成', status_failed:'失败', status_pending:'等待中',
302
+ no_jobs:'没有任务', connected_to:'已连接', no_project:'未指定项目',
303
+ conn_lost:'服务器连接已断开,正在重新连接...',
304
+ all_projects:'全部项目',
305
+ presets:'预设', automations:'自动化', save_as_preset:'保存预设',
306
+ confirm_delete_job:'此任务要删除吗?', confirm_delete_completed:'删除所有已完成的任务吗?',
307
+ err_show_log:'详细日志查看',
308
+ stream_no_output:'无输出数据',
309
+ stream_job_done:'任务完成', stream_job_failed:'任务失败',
310
+ stream_copy_all:'全部复制', stream_delete_job:'删除任务',
311
+ stream_followup_label:'继续',
312
+ stream_followup_placeholder:'输入继续执行的命令... (可粘贴文件/图片)',
313
+ stream_load_failed:'无法加载流数据',
314
+ stream_retry:'重试', stream_reconnect:'重新连接',
315
+ stat_jobs_summary:'{total} 任务 ({running} 运行中)',
316
+ stat_success:'成�� {pct}%',
317
+ pd_total:'总计', pd_running:'运行中', pd_done:'完成', pd_failed:'��败',
318
+ pd_avg:'平均', pd_success_rate:'成功率', pd_registered:'已注册',
319
+ pd_send_task:'发送任务', pd_send_task_title:'向此项目发送任务', pd_show_all_title:'查看全部项目',
320
+ pd_other:'其他',
321
+ job_retry:'重新执行', job_retry_title:'使用相同提示词重��执行',
322
+ job_resume_title:'继续会话 (resume)', job_fork_title:'从此会话分支 (fork)',
323
+ job_delete_title:'删除任务',
324
+ job_zombie:'无响应', job_zombie_title:'超过5分钟无响应 — 请检查进程',
325
+ job_dep_title:'前置任务: {deps}',
326
+ job_count:'{n}个',
327
+ job_count_filtered:'{filtered}/{total}个',
328
+ stream_loading:'正在加载流数据...',
329
+ stream_preview_wait:'等待中...',
330
+ msg_resume_mode:'Resume模式: 继续会话 {sid}',
331
+ },
332
+ 'zh-TW': {
333
+ title:'Controller Service', send_task:'傳送任務', prompt:'提示詞',
334
+ prompt_placeholder:'輸入要傳送給Claude的指令... (可拖放或貼上檔案/圖片)',
335
+ drop_files:'將檔案拖放到此處', select_directory:'選擇目錄...',
336
+ browse_directory:'瀏覽目錄', create_folder:'新建資料夾', new_folder_name:'新資料夾名稱', create:'建立',
337
+ reset:'重設', send:'傳送',
338
+ job_list:'任務列表', status:'狀態', folder:'資料夾', created_at:'建立時間',
339
+ delete_completed:'刪除已完成', loading_jobs:'正在載入任務列表...',
340
+ local_server_connection:'本機伺服器連線', server_address:'伺服器位址',
341
+ server_address_desc:'本機執行的Controller伺服器位址',
342
+ auth_token:'認證權杖', auth_token_desc:'伺服器啟動時在終端顯示的Auth Token',
343
+ disconnect:'斷開連線', connect:'連線', settings:'設定',
344
+ language_settings:'語言設定', display_language:'顯示語言',
345
+ display_language_desc:'選擇介面顯示的語言',
346
+ close:'關閉', save:'儲存', select_session:'選擇工作階段',
347
+ this_project_only:'僅此專案', search_prompt:'搜尋提示詞...',
348
+ msg_settings_saved:'設定已儲存', msg_settings_save_failed:'儲存設定失敗',
349
+ msg_prompt_required:'請輸入提示詞。', msg_task_sent:'任務已傳送。',
350
+ msg_send_failed:'傳送失敗', msg_upload_failed:'上傳失敗',
351
+ msg_file_read_failed:'檔案讀取失敗',
352
+ msg_copy_done:'結果已複製到剪貼簿。', msg_copy_failed:'複製到剪貼簿失敗。',
353
+ msg_copy_no_result:'沒有可複製的結果。', msg_copy_no_text:'沒有可複製的文字結果。',
354
+ msg_job_deleted:'任務已刪除。', msg_delete_failed:'刪除失敗',
355
+ msg_batch_deleted:'個已完成任務已刪除。', msg_batch_delete_failed:'批次刪除失敗',
356
+ msg_connected:'已連線到本機伺服器', msg_disconnected:'已斷開連線',
357
+ msg_session_select:'已選擇工作階段',
358
+ msg_fork_mode:'已切換到Fork模式', msg_fork_input:'請輸入新的提示詞。',
359
+ msg_continue_input:'請輸入繼續執行的命令。', msg_no_session_id:'沒有工作階段ID,無法繼續。',
360
+ msg_continue_sent:'工作階段繼續命令已傳送。', msg_no_original_prompt:'找不到原始提示詞。',
361
+ msg_rerun_done:'已使用相同提示詞重新執行。', msg_rerun_failed:'重新執行失敗',
362
+ msg_refresh_done:'全部重新整理完成',
363
+ msg_service_start:'服務啟動請求已完成', msg_service_stop:'服務停止請求已完成',
364
+ msg_service_restart:'服務重新啟動請求已完成', msg_service_failed:'服務請求失敗',
365
+ status_running:'執行中', status_done:'完成', status_failed:'失敗', status_pending:'等待中',
366
+ no_jobs:'沒有任務', connected_to:'已連線', no_project:'未指定專案',
367
+ conn_lost:'伺服器連線已中斷,正在重新連線...',
368
+ all_projects:'全部專案',
369
+ presets:'預設', automations:'自動化', save_as_preset:'儲存預設',
370
+ confirm_delete_job:'此任務要刪除嗎?', confirm_delete_completed:'刪除所有已完成的任務嗎?',
371
+ err_show_log:'詳細日誌查看',
372
+ stream_no_output:'無輸出資料',
373
+ stream_job_done:'任務完成', stream_job_failed:'任務失敗',
374
+ stream_copy_all:'全部複製', stream_delete_job:'刪除任務',
375
+ stream_followup_label:'繼續',
376
+ stream_followup_placeholder:'輸入繼續執行的命令... (可貼上檔案/圖片)',
377
+ stream_load_failed:'無法載入串流資料',
378
+ stream_retry:'重試', stream_reconnect:'重新連線',
379
+ stat_jobs_summary:'{total} 任務 ({running} 執行中)',
380
+ stat_success:'成功 {pct}%',
381
+ pd_total:'全部', pd_running:'執行中', pd_done:'完成', pd_failed:'失敗',
382
+ pd_avg:'平均', pd_success_rate:'成功率', pd_registered:'已註冊',
383
+ pd_send_task:'傳送任務', pd_send_task_title:'向此專案傳送任務', pd_show_all_title:'檢視全部專案',
384
+ pd_other:'其他',
385
+ job_retry:'重新執行', job_retry_title:'使用相同提示詞重新執行',
386
+ job_resume_title:'繼續工作階段 (resume)', job_fork_title:'從此工作階段分支 (fork)',
387
+ job_delete_title:'刪除任務',
388
+ job_zombie:'無回應', job_zombie_title:'超過5分鐘無回應 — 請檢查程序',
389
+ job_dep_title:'前置任務: {deps}',
390
+ job_count:'{n}個',
391
+ job_count_filtered:'{filtered}/{total}個',
392
+ stream_loading:'正在載入串流資料...',
393
+ stream_preview_wait:'等待中...',
394
+ msg_resume_mode:'Resume模式: 繼續工作階段 {sid}',
395
+ },
396
+ es: {
397
+ title:'Controller Service', send_task:'Enviar Tarea', prompt:'Prompt',
398
+ prompt_placeholder:'Ingrese un comando para Claude... (arrastre o pegue archivos/imágenes)',
399
+ drop_files:'Suelte archivos aquí', select_directory:'Seleccionar directorio...',
400
+ browse_directory:'Explorar Directorio', create_folder:'Nueva Carpeta', new_folder_name:'Nombre de carpeta', create:'Crear',
401
+ reset:'Restablecer', send:'Enviar',
402
+ job_list:'Lista de Tareas', status:'Estado', folder:'Carpeta', created_at:'Creado',
403
+ delete_completed:'Eliminar completadas', loading_jobs:'Cargando lista de tareas...',
404
+ local_server_connection:'Conexión al Servidor Local', server_address:'Dirección del Servidor',
405
+ server_address_desc:'Dirección del servidor Controller local',
406
+ auth_token:'Token de Autenticación', auth_token_desc:'Token mostrado en la terminal al iniciar',
407
+ disconnect:'Desconectar', connect:'Conectar', settings:'Configuración',
408
+ language_settings:'Idioma', display_language:'Idioma de Interfaz',
409
+ display_language_desc:'Seleccione el idioma de la interfaz',
410
+ close:'Cerrar', save:'Guardar', select_session:'Seleccionar Sesión',
411
+ this_project_only:'Solo este proyecto', search_prompt:'Buscar prompts...',
412
+ msg_settings_saved:'Configuración guardada', msg_settings_save_failed:'Error al guardar',
413
+ msg_prompt_required:'Ingrese un prompt.', msg_task_sent:'Tarea enviada.',
414
+ msg_send_failed:'Error al enviar', msg_upload_failed:'Error al subir',
415
+ msg_file_read_failed:'Error al leer archivo',
416
+ msg_copy_done:'Resultado copiado.', msg_copy_failed:'Error al copiar.',
417
+ msg_copy_no_result:'No hay resultado.', msg_copy_no_text:'No hay texto.',
418
+ msg_job_deleted:'Tarea eliminada.', msg_delete_failed:'Error al eliminar',
419
+ msg_batch_deleted:' tareas eliminadas.', msg_batch_delete_failed:'Error en eliminación masiva',
420
+ msg_connected:'Conectado al servidor local', msg_disconnected:'Desconectado',
421
+ msg_session_select:'Sesión seleccionada',
422
+ msg_fork_mode:'Modo Fork activado', msg_fork_input:'Ingrese un nuevo prompt.',
423
+ msg_continue_input:'Ingrese un comando para continuar.',
424
+ msg_no_session_id:'Sin ID de sesión.', msg_continue_sent:'Comando de continuación enviado.',
425
+ msg_no_original_prompt:'Prompt original no encontrado.',
426
+ msg_rerun_done:'Re-ejecutado.', msg_rerun_failed:'Error al re-ejecutar',
427
+ msg_refresh_done:'Actualización completa',
428
+ msg_service_start:'Servicio iniciado', msg_service_stop:'Servicio detenido',
429
+ msg_service_restart:'Servicio reiniciado', msg_service_failed:'Error de servicio',
430
+ status_running:'Ejecutando', status_done:'Completado', status_failed:'Fallido', status_pending:'Pendiente',
431
+ no_jobs:'Sin tareas', connected_to:'Conectado', no_project:'Sin proyecto',
432
+ conn_lost:'Conexión con el servidor perdida. Reconectando...',
433
+ all_projects:'Todos los Proyectos',
434
+ presets:'Presets', automations:'Automatizaciones', save_as_preset:'Guardar Preset',
435
+ confirm_delete_job:'¿Eliminar esta tarea?', confirm_delete_completed:'¿Eliminar todas las tareas completadas?',
436
+ err_show_log:'Ver registro detallado',
437
+ stream_no_output:'Sin datos de salida',
438
+ stream_job_done:'Tarea Completada', stream_job_failed:'Tarea Fallida',
439
+ stream_copy_all:'Copiar Todo', stream_delete_job:'Eliminar Tarea',
440
+ stream_followup_label:'Continuar',
441
+ stream_followup_placeholder:'Ingrese un comando para continuar en esta sesión... (pegue archivos/imágenes)',
442
+ stream_load_failed:'No se pudieron cargar los datos del stream',
443
+ stream_retry:'Reintentar', stream_reconnect:'Reconectar',
444
+ stat_jobs_summary:'{total} tareas ({running} ejecutando)',
445
+ stat_success:'Éxito {pct}%',
446
+ pd_total:'Total', pd_running:'Ejecutando', pd_done:'Completado', pd_failed:'Fallido',
447
+ pd_avg:'Promedio', pd_success_rate:'Tasa de Éxito', pd_registered:'Registrado',
448
+ pd_send_task:'Enviar Tarea', pd_send_task_title:'Enviar tarea a este proyecto', pd_show_all_title:'Ver todos los proyectos',
449
+ pd_other:'Otros',
450
+ job_retry:'Reintentar', job_retry_title:'Re-ejecutar con el mismo prompt',
451
+ job_resume_title:'Continuar sesión (resume)', job_fork_title:'Bifurcar desde esta sesión (fork)',
452
+ job_delete_title:'Eliminar tarea',
453
+ job_zombie:'Sin respuesta', job_zombie_title:'Sin respuesta por más de 5 minutos — verificar proceso',
454
+ job_dep_title:'Depende de: {deps}',
455
+ job_count:'{n}',
456
+ job_count_filtered:'{filtered}/{total}',
457
+ stream_loading:'Cargando datos del stream...',
458
+ stream_preview_wait:'Esperando...',
459
+ msg_resume_mode:'Modo Resume: continuando sesión {sid}',
460
+ },
461
+ fr: {
462
+ title:'Controller Service', send_task:'Envoyer une Tâche', prompt:'Prompt',
463
+ prompt_placeholder:'Entrez une commande pour Claude... (glisser-déposer ou coller fichiers/images)',
464
+ drop_files:'Déposez les fichiers ici', select_directory:'Sélectionner un répertoire...',
465
+ browse_directory:'Parcourir', create_folder:'Nouveau Dossier', new_folder_name:'Nom du dossier', create:'Créer',
466
+ reset:'Réinitialiser', send:'Envoyer',
467
+ job_list:'Liste des Tâches', status:'Statut', folder:'Dossier', created_at:'Créé le',
468
+ delete_completed:'Supprimer terminées', loading_jobs:'Chargement...',
469
+ local_server_connection:'Connexion au Serveur Local', server_address:'Adresse du Serveur',
470
+ server_address_desc:'Adresse du serveur Controller local',
471
+ auth_token:'Jeton d\'Authentification', auth_token_desc:'Jeton affiché au démarrage du serveur',
472
+ disconnect:'Déconnecter', connect:'Connecter', settings:'Paramètres',
473
+ language_settings:'Langue', display_language:'Langue d\'Affichage',
474
+ display_language_desc:'Sélectionnez la langue de l\'interface',
475
+ close:'Fermer', save:'Enregistrer', select_session:'Sélectionner une Session',
476
+ this_project_only:'Ce projet uniquement', search_prompt:'Rechercher...',
477
+ msg_settings_saved:'Paramètres enregistrés', msg_settings_save_failed:'Échec de l\'enregistrement',
478
+ msg_prompt_required:'Veuillez entrer un prompt.', msg_task_sent:'Tâche envoyée.',
479
+ msg_send_failed:'Échec de l\'envoi', msg_upload_failed:'Échec du téléchargement',
480
+ msg_file_read_failed:'Échec de la lecture',
481
+ msg_copy_done:'Résultat copié.', msg_copy_failed:'Échec de la copie.',
482
+ msg_copy_no_result:'Aucun résultat.', msg_copy_no_text:'Aucun texte.',
483
+ msg_job_deleted:'Tâche supprimée.', msg_delete_failed:'Échec de la suppression',
484
+ msg_batch_deleted:' tâches supprimées.', msg_batch_delete_failed:'Échec de la suppression groupée',
485
+ msg_connected:'Connecté au serveur local', msg_disconnected:'Déconnecté',
486
+ msg_session_select:'Session sélectionnée',
487
+ msg_fork_mode:'Mode Fork activé', msg_fork_input:'Entrez un nouveau prompt.',
488
+ msg_continue_input:'Entrez une commande pour continuer.',
489
+ msg_no_session_id:'Pas d\'ID de session.', msg_continue_sent:'Commande de continuation envoyée.',
490
+ msg_no_original_prompt:'Prompt original introuvable.',
491
+ msg_rerun_done:'Re-exécuté.', msg_rerun_failed:'Échec de la re-exécution',
492
+ msg_refresh_done:'Rafraîchissement complet',
493
+ msg_service_start:'Démarrage du service', msg_service_stop:'Arrêt du service',
494
+ msg_service_restart:'Redémarrage du service', msg_service_failed:'Échec du service',
495
+ status_running:'En cours', status_done:'Terminé', status_failed:'Échoué', status_pending:'En attente',
496
+ no_jobs:'Aucune tâche', connected_to:'Connecté', no_project:'Aucun projet',
497
+ conn_lost:'Connexion au serveur perdue. Reconnexion en cours...',
498
+ all_projects:'Tous les Projets',
499
+ presets:'Presets', automations:'Automatisations', save_as_preset:'Enregistrer le Preset',
500
+ confirm_delete_job:'Supprimer cette tâche ?', confirm_delete_completed:'Supprimer toutes les tâches terminées ?',
501
+ err_show_log:'Voir le journal détaillé',
502
+ stream_no_output:'Aucune donnée de sortie',
503
+ stream_job_done:'Tâche Terminée', stream_job_failed:'Tâche Échouée',
504
+ stream_copy_all:'Tout Copier', stream_delete_job:'Supprimer la Tâche',
505
+ stream_followup_label:'Continuer',
506
+ stream_followup_placeholder:'Entrez une commande pour continuer dans cette session... (collez fichiers/images)',
507
+ stream_load_failed:'Impossible de charger les données du stream',
508
+ stream_retry:'Réessayer', stream_reconnect:'Reconnecter',
509
+ stat_jobs_summary:'{total} tâches ({running} en cours)',
510
+ stat_success:'Réussite {pct}%',
511
+ pd_total:'Total', pd_running:'En cours', pd_done:'Terminé', pd_failed:'Échoué',
512
+ pd_avg:'Moyenne', pd_success_rate:'Taux de Réussite', pd_registered:'Enregistré',
513
+ pd_send_task:'Envoyer Tâche', pd_send_task_title:'Envoyer une tâche à ce projet', pd_show_all_title:'Voir tous les projets',
514
+ pd_other:'Autres',
515
+ job_retry:'Réessayer', job_retry_title:'Re-exécuter avec le même prompt',
516
+ job_resume_title:'Continuer la session (resume)', job_fork_title:'Bifurquer depuis cette session (fork)',
517
+ job_delete_title:'Supprimer la tâche',
518
+ job_zombie:'Pas de réponse', job_zombie_title:'Pas de réponse depuis 5+ minutes — vérifier le processus',
519
+ job_dep_title:'Dépend de : {deps}',
520
+ job_count:'{n}',
521
+ job_count_filtered:'{filtered}/{total}',
522
+ stream_loading:'Chargement des données du stream...',
523
+ stream_preview_wait:'En attente...',
524
+ msg_resume_mode:'Mode Resume : continuation de la session {sid}',
525
+ },
526
+ de: {
527
+ title:'Controller Service', send_task:'Aufgabe senden', prompt:'Prompt',
528
+ prompt_placeholder:'Befehl für Claude eingeben... (Dateien/Bilder per Drag & Drop)',
529
+ drop_files:'Dateien hier ablegen', select_directory:'Verzeichnis auswählen...',
530
+ browse_directory:'Verzeichnis durchsuchen', create_folder:'Neuer Ordner', new_folder_name:'Ordnername', create:'Erstellen',
531
+ reset:'Zurücksetzen', send:'Senden',
532
+ job_list:'Aufgabenliste', status:'Status', folder:'Ordner', created_at:'Erstellt',
533
+ delete_completed:'Erledigte löschen', loading_jobs:'Laden...',
534
+ local_server_connection:'Lokale Serververbindung', server_address:'Serveradresse',
535
+ server_address_desc:'Adresse des lokalen Controller-Servers',
536
+ auth_token:'Auth-Token', auth_token_desc:'Auth Token beim Serverstart im Terminal',
537
+ disconnect:'Trennen', connect:'Verbinden', settings:'Einstellungen',
538
+ language_settings:'Sprache', display_language:'Anzeigesprache',
539
+ display_language_desc:'Sprache der Benutzeroberfläche auswählen',
540
+ close:'Schließen', save:'Speichern', select_session:'Sitzung auswählen',
541
+ this_project_only:'Nur dieses Projekt', search_prompt:'Prompts suchen...',
542
+ msg_settings_saved:'Einstellungen gespeichert', msg_settings_save_failed:'Speichern fehlgeschlagen',
543
+ msg_prompt_required:'Bitte Prompt eingeben.', msg_task_sent:'Aufgabe gesendet.',
544
+ msg_send_failed:'Senden fehlgeschlagen', msg_upload_failed:'Upload fehlgeschlagen',
545
+ msg_file_read_failed:'Datei lesen fehlgeschlagen',
546
+ msg_copy_done:'Ergebnis kopiert.', msg_copy_failed:'Kopieren fehlgeschlagen.',
547
+ msg_copy_no_result:'Kein Ergebnis.', msg_copy_no_text:'Kein Text.',
548
+ msg_job_deleted:'Aufgabe gelöscht.', msg_delete_failed:'Löschen fehlgeschlagen',
549
+ msg_batch_deleted:' Aufgaben gelöscht.', msg_batch_delete_failed:'Massenlöschung fehlgeschlagen',
550
+ msg_connected:'Mit Server verbunden', msg_disconnected:'Verbindung getrennt',
551
+ msg_session_select:'Sitzung ausgewählt',
552
+ msg_fork_mode:'Fork-Modus aktiviert', msg_fork_input:'Neuen Prompt eingeben.',
553
+ msg_continue_input:'Befehl zum Fortfahren eingeben.',
554
+ msg_no_session_id:'Keine Sitzungs-ID.', msg_continue_sent:'Fortsetzungsbefehl gesendet.',
555
+ msg_no_original_prompt:'Ursprünglicher Prompt nicht gefunden.',
556
+ msg_rerun_done:'Erneut ausgeführt.', msg_rerun_failed:'Erneute Ausführung fehlgeschlagen',
557
+ msg_refresh_done:'Vollständig aktualisiert',
558
+ msg_service_start:'Dienststart angefordert', msg_service_stop:'Dienststopp angefordert',
559
+ msg_service_restart:'Dienstneustart angefordert', msg_service_failed:'Dienstanforderung fehlgeschlagen',
560
+ status_running:'Läuft', status_done:'Fertig', status_failed:'Fehlgeschlagen', status_pending:'Wartend',
561
+ no_jobs:'Keine Aufgaben', connected_to:'Verbunden', no_project:'Kein Projekt',
562
+ conn_lost:'Serververbindung verloren. Erneuter Verbindungsversuch...',
563
+ all_projects:'Alle Projekte',
564
+ presets:'Presets', automations:'Automatisierungen', save_as_preset:'Preset speichern',
565
+ confirm_delete_job:'Diese Aufgabe löschen?', confirm_delete_completed:'Alle erledigten Aufgaben löschen?',
566
+ err_show_log:'Detailliertes Protokoll anzeigen',
567
+ stream_no_output:'Keine Ausgabedaten',
568
+ stream_job_done:'Aufgabe Abgeschlossen', stream_job_failed:'Aufgabe Fehlgeschlagen',
569
+ stream_copy_all:'Alles Kopieren', stream_delete_job:'Aufgabe Löschen',
570
+ stream_followup_label:'Fortfahren',
571
+ stream_followup_placeholder:'Befehl zum Fortfahren in dieser Sitzung eingeben... (Dateien/Bilder einfügen)',
572
+ stream_load_failed:'Stream-Daten konnten nicht geladen werden',
573
+ stream_retry:'Wiederholen', stream_reconnect:'Erneut Verbinden',
574
+ stat_jobs_summary:'{total} Aufgaben ({running} laufend)',
575
+ stat_success:'Erfolg {pct}%',
576
+ pd_total:'Gesamt', pd_running:'Laufend', pd_done:'Fertig', pd_failed:'Fehlgeschlagen',
577
+ pd_avg:'Durchschn.', pd_success_rate:'Erfolgsrate', pd_registered:'Registriert',
578
+ pd_send_task:'Aufgabe senden', pd_send_task_title:'Aufgabe an dieses Projekt senden', pd_show_all_title:'Alle Projekte anzeigen',
579
+ pd_other:'Sonstige',
580
+ job_retry:'Wiederholen', job_retry_title:'Mit gleichem Prompt erneut ausführen',
581
+ job_resume_title:'Sitzung fortsetzen (resume)', job_fork_title:'Von dieser Sitzung abzweigen (fork)',
582
+ job_delete_title:'Aufgabe löschen',
583
+ job_zombie:'Keine Antwort', job_zombie_title:'Keine Antwort seit 5+ Minuten — Prozess überprüfen',
584
+ job_dep_title:'Abhängig von: {deps}',
585
+ job_count:'{n}',
586
+ job_count_filtered:'{filtered}/{total}',
587
+ stream_loading:'Stream-Daten werden geladen...',
588
+ stream_preview_wait:'Warten...',
589
+ msg_resume_mode:'Resume-Modus: Sitzung {sid} wird fortgesetzt',
590
+ },
591
+ };
592
+
593
+ let _currentLocale = localStorage.getItem('ctrl_locale') || 'ko';
594
+
595
+ function t(key) {
596
+ const dict = I18N[_currentLocale] || I18N['ko'];
597
+ return dict[key] || I18N['ko'][key] || key;
598
+ }
599
+
600
+ function applyI18n() {
601
+ document.querySelectorAll('[data-i18n]').forEach(el => {
602
+ const key = el.getAttribute('data-i18n');
603
+ const text = t(key);
604
+ if (text) el.textContent = text;
605
+ });
606
+ document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
607
+ const key = el.getAttribute('data-i18n-placeholder');
608
+ const text = t(key);
609
+ if (text) el.placeholder = text;
610
+ });
611
+ document.documentElement.lang = _currentLocale.split('-')[0];
612
+ document.documentElement.setAttribute('data-locale', _currentLocale);
613
+ }
614
+
615
+ function setLocale(locale) {
616
+ if (!I18N[locale]) return;
617
+ _currentLocale = locale;
618
+ localStorage.setItem('ctrl_locale', locale);
619
+ applyI18n();
620
+ }
621
+
622
+ function onLocaleChange() {
623
+ const sel = document.getElementById('cfgLocale');
624
+ if (sel) setLocale(sel.value);
625
+ }