claude-controller 0.1.2 → 0.2.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.
@@ -0,0 +1,337 @@
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
+ close:'닫기', save:'저장', select_session:'세션 선택',
21
+ this_project_only:'이 프로젝트만', search_prompt:'프롬프트 검색...',
22
+ msg_settings_saved:'설정이 저장되었습니다', msg_settings_save_failed:'설정 저장 실패',
23
+ msg_prompt_required:'프롬프트를 입력해주세요.', msg_task_sent:'작업이 전송되었습니다.',
24
+ msg_send_failed:'전송 실패', msg_upload_failed:'업로드 실패',
25
+ msg_file_read_failed:'파일 읽기 실패',
26
+ msg_copy_done:'결과가 클립보드에 복사되었습니다.', msg_copy_failed:'클립보드 복사에 실패했습니다.',
27
+ msg_copy_no_result:'복사할 결과가 없습니다.', msg_copy_no_text:'복사할 텍스트 결과가 없습니다.',
28
+ msg_job_deleted:'작업이 제거되었습니다.', msg_delete_failed:'제거 실패',
29
+ msg_batch_deleted:'개 완료 작업이 제거되었습니다.', msg_batch_delete_failed:'일괄 제거 실패',
30
+ msg_connected:'로컬 서버에 연결되었습니다', msg_disconnected:'연결이 해제되었습니다',
31
+ msg_session_select:'세션 선택',
32
+ msg_fork_mode:'Fork 모드로 전환됨', msg_fork_input:'새 프롬프트를 입력하세요.',
33
+ msg_continue_input:'이어서 실행할 명령을 입력해주세요.',
34
+ msg_no_session_id:'세션 ID가 없어서 이어서 실행할 수 없습니다.',
35
+ msg_continue_sent:'세션 이어서 명령이 전송되었습니다.',
36
+ msg_no_original_prompt:'원본 프롬프트를 찾을 수 없습니다.',
37
+ msg_rerun_done:'같은 프롬프트로 다시 실행되었습니다.', msg_rerun_failed:'재실행 실패',
38
+ msg_refresh_done:'전체 새로고침 완료',
39
+ msg_service_start:'서비스 시작 요청 완료', msg_service_stop:'서비스 중지 요청 완료',
40
+ msg_service_restart:'서비스 재시작 요청 완료', msg_service_failed:'서비스 요청 실패',
41
+ status_running:'실행 중', status_done:'완료', status_failed:'실패', status_pending:'대기 중',
42
+ no_jobs:'작업이 없습니다', connected_to:'연결됨', no_project:'프로젝트 미지정',
43
+ },
44
+ en: {
45
+ title:'Controller Service', send_task:'Send Task', prompt:'Prompt',
46
+ prompt_placeholder:'Enter a command for Claude... (drag & drop or paste files/images)',
47
+ drop_files:'Drop files here', select_directory:'Select a directory...',
48
+ browse_directory:'Browse Directory', create_folder:'New Folder', new_folder_name:'New folder name', create:'Create',
49
+ reset:'Reset', send:'Send',
50
+ job_list:'Job List', status:'Status', folder:'Folder', created_at:'Created',
51
+ delete_completed:'Delete Done', loading_jobs:'Loading job list...',
52
+ local_server_connection:'Local Server Connection', server_address:'Server Address',
53
+ server_address_desc:'Address of the locally running Controller server',
54
+ auth_token:'Auth Token', auth_token_desc:'Auth Token shown in the terminal when the server starts',
55
+ disconnect:'Disconnect', connect:'Connect', settings:'Settings',
56
+ language_settings:'Language', display_language:'Display Language',
57
+ display_language_desc:'Select the language for the interface',
58
+ close:'Close', save:'Save', select_session:'Select Session',
59
+ this_project_only:'This project only', search_prompt:'Search prompts...',
60
+ msg_settings_saved:'Settings saved', msg_settings_save_failed:'Failed to save settings',
61
+ msg_prompt_required:'Please enter a prompt.', msg_task_sent:'Task has been sent.',
62
+ msg_send_failed:'Send failed', msg_upload_failed:'Upload failed',
63
+ msg_file_read_failed:'File read failed',
64
+ msg_copy_done:'Result copied to clipboard.', msg_copy_failed:'Failed to copy to clipboard.',
65
+ msg_copy_no_result:'No result to copy.', msg_copy_no_text:'No text result to copy.',
66
+ msg_job_deleted:'Job deleted.', msg_delete_failed:'Delete failed',
67
+ msg_batch_deleted:' completed jobs deleted.', msg_batch_delete_failed:'Batch delete failed',
68
+ msg_connected:'Connected to local server', msg_disconnected:'Disconnected',
69
+ msg_session_select:'Session selected',
70
+ msg_fork_mode:'Switched to Fork mode', msg_fork_input:'Enter a new prompt.',
71
+ msg_continue_input:'Enter a command to continue.',
72
+ msg_no_session_id:'Cannot continue: no session ID.',
73
+ msg_continue_sent:'Continue command sent.',
74
+ msg_no_original_prompt:'Original prompt not found.',
75
+ msg_rerun_done:'Re-run with the same prompt.', msg_rerun_failed:'Re-run failed',
76
+ msg_refresh_done:'Fully refreshed',
77
+ msg_service_start:'Service start requested', msg_service_stop:'Service stop requested',
78
+ msg_service_restart:'Service restart requested', msg_service_failed:'Service request failed',
79
+ status_running:'Running', status_done:'Done', status_failed:'Failed', status_pending:'Pending',
80
+ no_jobs:'No jobs', connected_to:'Connected', no_project:'No project',
81
+ },
82
+ ja: {
83
+ title:'Controller Service', send_task:'新しいタスク送信', prompt:'プロンプト',
84
+ prompt_placeholder:'Claudeに送信するコマンドを入力... (ファイル/画像のドラッグ&ドロップ可能)',
85
+ drop_files:'ここにファイルをドロップ', select_directory:'ディレクトリを選択...',
86
+ browse_directory:'ディレクトリ参照', create_folder:'新しいフォルダ', new_folder_name:'新しいフォルダ名', create:'作成',
87
+ reset:'リセット', send:'送信',
88
+ job_list:'ジョブ一覧', status:'ステータス', folder:'フォルダ', created_at:'作成日時',
89
+ delete_completed:'完了を削除', loading_jobs:'ジョブ一覧を読み込み中...',
90
+ local_server_connection:'ローカルサーバー接続', server_address:'サーバーアドレス',
91
+ server_address_desc:'ローカルで実行中のControllerサーバーアドレス',
92
+ auth_token:'認証トークン', auth_token_desc:'サーバー起動時にターミナルに表示されるAuth Token',
93
+ disconnect:'切断', connect:'接続', settings:'設定',
94
+ language_settings:'言語設定', display_language:'表示言語',
95
+ display_language_desc:'インターフェースの表示言語を選択します',
96
+ close:'閉じる', save:'保存', select_session:'セッション選択',
97
+ this_project_only:'このプロジェクトのみ', search_prompt:'プロンプト検索...',
98
+ msg_settings_saved:'設定が保存されました', msg_settings_save_failed:'設定の保存に失敗',
99
+ msg_prompt_required:'プロンプトを入力してください。', msg_task_sent:'タスクが送信されました。',
100
+ msg_send_failed:'送信失敗', msg_upload_failed:'アップロード失敗',
101
+ msg_file_read_failed:'ファイル読み取り失敗',
102
+ msg_copy_done:'結果がクリップボードにコピーされました。', msg_copy_failed:'クリップボードへのコピーに失敗。',
103
+ msg_copy_no_result:'コピーする結果がありません。', msg_copy_no_text:'コピーするテキスト結果がありません。',
104
+ msg_job_deleted:'ジョブが削除されました。', msg_delete_failed:'削除失敗',
105
+ msg_batch_deleted:'件の完了ジョブが削除されました。', msg_batch_delete_failed:'一括削除失敗',
106
+ msg_connected:'ローカルサーバーに接続しました', msg_disconnected:'切断されました',
107
+ msg_session_select:'セッション選択',
108
+ msg_fork_mode:'Forkモードに切り替えました', msg_fork_input:'新しいプロンプトを入力してください。',
109
+ msg_continue_input:'続行するコマンドを入力してください。',
110
+ msg_no_session_id:'セッションIDがないため続行できません。',
111
+ msg_continue_sent:'セッション続行コマンドが送信されました。',
112
+ msg_no_original_prompt:'元のプロンプトが見つかりません。',
113
+ msg_rerun_done:'同じプロンプトで再実行しました。', msg_rerun_failed:'再実行失敗',
114
+ msg_refresh_done:'全体リフレッシュ完了',
115
+ msg_service_start:'サービス開始を要求', msg_service_stop:'サービス停止を要求',
116
+ msg_service_restart:'サービス再起動を要求', msg_service_failed:'サービスリクエスト失敗',
117
+ status_running:'実行中', status_done:'完了', status_failed:'失敗', status_pending:'待機中',
118
+ no_jobs:'ジョブがありません', connected_to:'接続済み', no_project:'プロジェクト未指定',
119
+ },
120
+ 'zh-CN': {
121
+ title:'Controller Service', send_task:'发送任务', prompt:'提示词',
122
+ prompt_placeholder:'输入要发送给Claude的指令... (可拖放或粘贴文件/图片)',
123
+ drop_files:'将文件拖放到此处', select_directory:'选择目录...',
124
+ browse_directory:'浏览目录', create_folder:'新建文件夹', new_folder_name:'新文件夹名称', create:'创建',
125
+ reset:'重置', send:'发送',
126
+ job_list:'任务列表', status:'状态', folder:'文件夹', created_at:'创建时间',
127
+ delete_completed:'删除已完成', loading_jobs:'正在加载任务列表...',
128
+ local_server_connection:'本地服务器连接', server_address:'服务器地址',
129
+ server_address_desc:'本地运行的Controller服务器地址',
130
+ auth_token:'认证令牌', auth_token_desc:'服务器启动时在终端显示的Auth Token',
131
+ disconnect:'断开连接', connect:'连接', settings:'设置',
132
+ language_settings:'语言设置', display_language:'显示语言',
133
+ display_language_desc:'选择界面显示的语言',
134
+ close:'关闭', save:'保存', select_session:'选择会话',
135
+ this_project_only:'仅此项目', search_prompt:'搜索提示词...',
136
+ msg_settings_saved:'设置已保存', msg_settings_save_failed:'保存设置失败',
137
+ msg_prompt_required:'请输入提示词。', msg_task_sent:'任务已发送。',
138
+ msg_send_failed:'发送失败', msg_upload_failed:'上传失败',
139
+ msg_file_read_failed:'文件读取失败',
140
+ msg_copy_done:'结果已复制到剪贴板。', msg_copy_failed:'复制到剪贴板失败。',
141
+ msg_copy_no_result:'没有可复制的结果。', msg_copy_no_text:'没有可复制的文本结果。',
142
+ msg_job_deleted:'任务已删除。', msg_delete_failed:'删除失败',
143
+ msg_batch_deleted:'个已完成任务已删除。', msg_batch_delete_failed:'批量删除失败',
144
+ msg_connected:'已连接到本地服务器', msg_disconnected:'已断开连接',
145
+ msg_session_select:'已选择会话',
146
+ msg_fork_mode:'已切换到Fork模式', msg_fork_input:'请输入新的提示词。',
147
+ msg_continue_input:'请输入继续执行的命令。', msg_no_session_id:'没有会话ID,无法继续。',
148
+ msg_continue_sent:'会话继续命令已发送。', msg_no_original_prompt:'找不到原始提示词。',
149
+ msg_rerun_done:'已使用相同提示词重新执行。', msg_rerun_failed:'重新执行失败',
150
+ msg_refresh_done:'全部刷新完成',
151
+ msg_service_start:'服务启动请求已完成', msg_service_stop:'服务停止请求已完成',
152
+ msg_service_restart:'服务重启请求已完成', msg_service_failed:'服务请求失败',
153
+ status_running:'运行中', status_done:'完成', status_failed:'失败', status_pending:'等待中',
154
+ no_jobs:'没有任务', connected_to:'已连接', no_project:'未指定项目',
155
+ },
156
+ 'zh-TW': {
157
+ title:'Controller Service', send_task:'傳送任務', prompt:'提示詞',
158
+ prompt_placeholder:'輸入要傳送給Claude的指令... (可拖放或貼上檔案/圖片)',
159
+ drop_files:'將檔案拖放到此處', select_directory:'選擇目錄...',
160
+ browse_directory:'瀏覽目錄', create_folder:'新建資料夾', new_folder_name:'新資料夾名稱', create:'建立',
161
+ reset:'重設', send:'傳送',
162
+ job_list:'任務列表', status:'狀態', folder:'資料夾', created_at:'建立時間',
163
+ delete_completed:'刪除已完成', loading_jobs:'正在載入任務列表...',
164
+ local_server_connection:'本機伺服器連線', server_address:'伺服器位址',
165
+ server_address_desc:'本機執行的Controller伺服器位址',
166
+ auth_token:'認證權杖', auth_token_desc:'伺服器啟動時在終端顯示的Auth Token',
167
+ disconnect:'斷開連線', connect:'連線', settings:'設定',
168
+ language_settings:'語言設定', display_language:'顯示語言',
169
+ display_language_desc:'選擇介面顯示的語言',
170
+ close:'關閉', save:'儲存', select_session:'選擇工作階段',
171
+ this_project_only:'僅此專案', search_prompt:'搜尋提示詞...',
172
+ msg_settings_saved:'設定已儲存', msg_settings_save_failed:'儲存設定失敗',
173
+ msg_prompt_required:'請輸入提示詞。', msg_task_sent:'任務已傳送。',
174
+ msg_send_failed:'傳送失敗', msg_upload_failed:'上傳失敗',
175
+ msg_file_read_failed:'檔案讀取失敗',
176
+ msg_copy_done:'結果已複製到剪貼簿。', msg_copy_failed:'複製到剪貼簿失敗。',
177
+ msg_copy_no_result:'沒有可複製的結果。', msg_copy_no_text:'沒有可複製的文字結果。',
178
+ msg_job_deleted:'任務已刪除。', msg_delete_failed:'刪除失敗',
179
+ msg_batch_deleted:'個已完成任務已刪除。', msg_batch_delete_failed:'批次刪除失敗',
180
+ msg_connected:'已連線到本機伺服器', msg_disconnected:'已斷開連線',
181
+ msg_session_select:'已選擇工作階段',
182
+ msg_fork_mode:'已切換到Fork模式', msg_fork_input:'請輸入新的提示詞。',
183
+ msg_continue_input:'請輸入繼續執行的命令。', msg_no_session_id:'沒有工作階段ID,無法繼續。',
184
+ msg_continue_sent:'工作階段繼續命令已傳送。', msg_no_original_prompt:'找不到原始提示詞。',
185
+ msg_rerun_done:'已使用相同提示詞重新執行。', msg_rerun_failed:'重新執行失敗',
186
+ msg_refresh_done:'全部重新整理完成',
187
+ msg_service_start:'服務啟動請求已完成', msg_service_stop:'服務停止請求已完成',
188
+ msg_service_restart:'服務重新啟動請求已完成', msg_service_failed:'服務請求失敗',
189
+ status_running:'執行中', status_done:'完成', status_failed:'失敗', status_pending:'等待中',
190
+ no_jobs:'沒有任務', connected_to:'已連線', no_project:'未指定專案',
191
+ },
192
+ es: {
193
+ title:'Controller Service', send_task:'Enviar Tarea', prompt:'Prompt',
194
+ prompt_placeholder:'Ingrese un comando para Claude... (arrastre o pegue archivos/imágenes)',
195
+ drop_files:'Suelte archivos aquí', select_directory:'Seleccionar directorio...',
196
+ browse_directory:'Explorar Directorio', create_folder:'Nueva Carpeta', new_folder_name:'Nombre de carpeta', create:'Crear',
197
+ reset:'Restablecer', send:'Enviar',
198
+ job_list:'Lista de Tareas', status:'Estado', folder:'Carpeta', created_at:'Creado',
199
+ delete_completed:'Eliminar completadas', loading_jobs:'Cargando lista de tareas...',
200
+ local_server_connection:'Conexión al Servidor Local', server_address:'Dirección del Servidor',
201
+ server_address_desc:'Dirección del servidor Controller local',
202
+ auth_token:'Token de Autenticación', auth_token_desc:'Token mostrado en la terminal al iniciar',
203
+ disconnect:'Desconectar', connect:'Conectar', settings:'Configuración',
204
+ language_settings:'Idioma', display_language:'Idioma de Interfaz',
205
+ display_language_desc:'Seleccione el idioma de la interfaz',
206
+ close:'Cerrar', save:'Guardar', select_session:'Seleccionar Sesión',
207
+ this_project_only:'Solo este proyecto', search_prompt:'Buscar prompts...',
208
+ msg_settings_saved:'Configuración guardada', msg_settings_save_failed:'Error al guardar',
209
+ msg_prompt_required:'Ingrese un prompt.', msg_task_sent:'Tarea enviada.',
210
+ msg_send_failed:'Error al enviar', msg_upload_failed:'Error al subir',
211
+ msg_file_read_failed:'Error al leer archivo',
212
+ msg_copy_done:'Resultado copiado.', msg_copy_failed:'Error al copiar.',
213
+ msg_copy_no_result:'No hay resultado.', msg_copy_no_text:'No hay texto.',
214
+ msg_job_deleted:'Tarea eliminada.', msg_delete_failed:'Error al eliminar',
215
+ msg_batch_deleted:' tareas eliminadas.', msg_batch_delete_failed:'Error en eliminación masiva',
216
+ msg_connected:'Conectado al servidor local', msg_disconnected:'Desconectado',
217
+ msg_session_select:'Sesión seleccionada',
218
+ msg_fork_mode:'Modo Fork activado', msg_fork_input:'Ingrese un nuevo prompt.',
219
+ msg_continue_input:'Ingrese un comando para continuar.',
220
+ msg_no_session_id:'Sin ID de sesión.', msg_continue_sent:'Comando de continuación enviado.',
221
+ msg_no_original_prompt:'Prompt original no encontrado.',
222
+ msg_rerun_done:'Re-ejecutado.', msg_rerun_failed:'Error al re-ejecutar',
223
+ msg_refresh_done:'Actualización completa',
224
+ msg_service_start:'Servicio iniciado', msg_service_stop:'Servicio detenido',
225
+ msg_service_restart:'Servicio reiniciado', msg_service_failed:'Error de servicio',
226
+ status_running:'Ejecutando', status_done:'Completado', status_failed:'Fallido', status_pending:'Pendiente',
227
+ no_jobs:'Sin tareas', connected_to:'Conectado', no_project:'Sin proyecto',
228
+ },
229
+ fr: {
230
+ title:'Controller Service', send_task:'Envoyer une Tâche', prompt:'Prompt',
231
+ prompt_placeholder:'Entrez une commande pour Claude... (glisser-déposer ou coller fichiers/images)',
232
+ drop_files:'Déposez les fichiers ici', select_directory:'Sélectionner un répertoire...',
233
+ browse_directory:'Parcourir', create_folder:'Nouveau Dossier', new_folder_name:'Nom du dossier', create:'Créer',
234
+ reset:'Réinitialiser', send:'Envoyer',
235
+ job_list:'Liste des Tâches', status:'Statut', folder:'Dossier', created_at:'Créé le',
236
+ delete_completed:'Supprimer terminées', loading_jobs:'Chargement...',
237
+ local_server_connection:'Connexion au Serveur Local', server_address:'Adresse du Serveur',
238
+ server_address_desc:'Adresse du serveur Controller local',
239
+ auth_token:'Jeton d\'Authentification', auth_token_desc:'Jeton affiché au démarrage du serveur',
240
+ disconnect:'Déconnecter', connect:'Connecter', settings:'Paramètres',
241
+ language_settings:'Langue', display_language:'Langue d\'Affichage',
242
+ display_language_desc:'Sélectionnez la langue de l\'interface',
243
+ close:'Fermer', save:'Enregistrer', select_session:'Sélectionner une Session',
244
+ this_project_only:'Ce projet uniquement', search_prompt:'Rechercher...',
245
+ msg_settings_saved:'Paramètres enregistrés', msg_settings_save_failed:'Échec de l\'enregistrement',
246
+ msg_prompt_required:'Veuillez entrer un prompt.', msg_task_sent:'Tâche envoyée.',
247
+ msg_send_failed:'Échec de l\'envoi', msg_upload_failed:'Échec du téléchargement',
248
+ msg_file_read_failed:'Échec de la lecture',
249
+ msg_copy_done:'Résultat copié.', msg_copy_failed:'Échec de la copie.',
250
+ msg_copy_no_result:'Aucun résultat.', msg_copy_no_text:'Aucun texte.',
251
+ msg_job_deleted:'Tâche supprimée.', msg_delete_failed:'Échec de la suppression',
252
+ msg_batch_deleted:' tâches supprimées.', msg_batch_delete_failed:'Échec de la suppression groupée',
253
+ msg_connected:'Connecté au serveur local', msg_disconnected:'Déconnecté',
254
+ msg_session_select:'Session sélectionnée',
255
+ msg_fork_mode:'Mode Fork activé', msg_fork_input:'Entrez un nouveau prompt.',
256
+ msg_continue_input:'Entrez une commande pour continuer.',
257
+ msg_no_session_id:'Pas d\'ID de session.', msg_continue_sent:'Commande de continuation envoyée.',
258
+ msg_no_original_prompt:'Prompt original introuvable.',
259
+ msg_rerun_done:'Re-exécuté.', msg_rerun_failed:'Échec de la re-exécution',
260
+ msg_refresh_done:'Rafraîchissement complet',
261
+ msg_service_start:'Démarrage du service', msg_service_stop:'Arrêt du service',
262
+ msg_service_restart:'Redémarrage du service', msg_service_failed:'Échec du service',
263
+ status_running:'En cours', status_done:'Terminé', status_failed:'Échoué', status_pending:'En attente',
264
+ no_jobs:'Aucune tâche', connected_to:'Connecté', no_project:'Aucun projet',
265
+ },
266
+ de: {
267
+ title:'Controller Service', send_task:'Aufgabe senden', prompt:'Prompt',
268
+ prompt_placeholder:'Befehl für Claude eingeben... (Dateien/Bilder per Drag & Drop)',
269
+ drop_files:'Dateien hier ablegen', select_directory:'Verzeichnis auswählen...',
270
+ browse_directory:'Verzeichnis durchsuchen', create_folder:'Neuer Ordner', new_folder_name:'Ordnername', create:'Erstellen',
271
+ reset:'Zurücksetzen', send:'Senden',
272
+ job_list:'Aufgabenliste', status:'Status', folder:'Ordner', created_at:'Erstellt',
273
+ delete_completed:'Erledigte löschen', loading_jobs:'Laden...',
274
+ local_server_connection:'Lokale Serververbindung', server_address:'Serveradresse',
275
+ server_address_desc:'Adresse des lokalen Controller-Servers',
276
+ auth_token:'Auth-Token', auth_token_desc:'Auth Token beim Serverstart im Terminal',
277
+ disconnect:'Trennen', connect:'Verbinden', settings:'Einstellungen',
278
+ language_settings:'Sprache', display_language:'Anzeigesprache',
279
+ display_language_desc:'Sprache der Benutzeroberfläche auswählen',
280
+ close:'Schließen', save:'Speichern', select_session:'Sitzung auswählen',
281
+ this_project_only:'Nur dieses Projekt', search_prompt:'Prompts suchen...',
282
+ msg_settings_saved:'Einstellungen gespeichert', msg_settings_save_failed:'Speichern fehlgeschlagen',
283
+ msg_prompt_required:'Bitte Prompt eingeben.', msg_task_sent:'Aufgabe gesendet.',
284
+ msg_send_failed:'Senden fehlgeschlagen', msg_upload_failed:'Upload fehlgeschlagen',
285
+ msg_file_read_failed:'Datei lesen fehlgeschlagen',
286
+ msg_copy_done:'Ergebnis kopiert.', msg_copy_failed:'Kopieren fehlgeschlagen.',
287
+ msg_copy_no_result:'Kein Ergebnis.', msg_copy_no_text:'Kein Text.',
288
+ msg_job_deleted:'Aufgabe gelöscht.', msg_delete_failed:'Löschen fehlgeschlagen',
289
+ msg_batch_deleted:' Aufgaben gelöscht.', msg_batch_delete_failed:'Massenlöschung fehlgeschlagen',
290
+ msg_connected:'Mit Server verbunden', msg_disconnected:'Verbindung getrennt',
291
+ msg_session_select:'Sitzung ausgewählt',
292
+ msg_fork_mode:'Fork-Modus aktiviert', msg_fork_input:'Neuen Prompt eingeben.',
293
+ msg_continue_input:'Befehl zum Fortfahren eingeben.',
294
+ msg_no_session_id:'Keine Sitzungs-ID.', msg_continue_sent:'Fortsetzungsbefehl gesendet.',
295
+ msg_no_original_prompt:'Ursprünglicher Prompt nicht gefunden.',
296
+ msg_rerun_done:'Erneut ausgeführt.', msg_rerun_failed:'Erneute Ausführung fehlgeschlagen',
297
+ msg_refresh_done:'Vollständig aktualisiert',
298
+ msg_service_start:'Dienststart angefordert', msg_service_stop:'Dienststopp angefordert',
299
+ msg_service_restart:'Dienstneustart angefordert', msg_service_failed:'Dienstanforderung fehlgeschlagen',
300
+ status_running:'Läuft', status_done:'Fertig', status_failed:'Fehlgeschlagen', status_pending:'Wartend',
301
+ no_jobs:'Keine Aufgaben', connected_to:'Verbunden', no_project:'Kein Projekt',
302
+ },
303
+ };
304
+
305
+ let _currentLocale = localStorage.getItem('ctrl_locale') || 'ko';
306
+
307
+ function t(key) {
308
+ const dict = I18N[_currentLocale] || I18N['ko'];
309
+ return dict[key] || I18N['ko'][key] || key;
310
+ }
311
+
312
+ function applyI18n() {
313
+ document.querySelectorAll('[data-i18n]').forEach(el => {
314
+ const key = el.getAttribute('data-i18n');
315
+ const text = t(key);
316
+ if (text) el.textContent = text;
317
+ });
318
+ document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
319
+ const key = el.getAttribute('data-i18n-placeholder');
320
+ const text = t(key);
321
+ if (text) el.placeholder = text;
322
+ });
323
+ document.documentElement.lang = _currentLocale.split('-')[0];
324
+ document.documentElement.setAttribute('data-locale', _currentLocale);
325
+ }
326
+
327
+ function setLocale(locale) {
328
+ if (!I18N[locale]) return;
329
+ _currentLocale = locale;
330
+ localStorage.setItem('ctrl_locale', locale);
331
+ applyI18n();
332
+ }
333
+
334
+ function onLocaleChange() {
335
+ const sel = document.getElementById('cfgLocale');
336
+ if (sel) setLocale(sel.value);
337
+ }
@@ -6,7 +6,11 @@
6
6
  <title data-i18n="title">Controller Service</title>
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
8
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
9
- <link rel="stylesheet" href="styles.css">
9
+ <link rel="stylesheet" href="base.css">
10
+ <link rel="stylesheet" href="form.css">
11
+ <link rel="stylesheet" href="jobs.css">
12
+ <link rel="stylesheet" href="settings-style.css">
13
+ <link rel="stylesheet" href="pipeline.css">
10
14
  </head>
11
15
  <body>
12
16
 
@@ -58,7 +62,11 @@
58
62
  <div class="recent-dirs" id="recentDirs"></div>
59
63
 
60
64
  <div class="form-group">
61
- <label class="form-label"><span data-i18n="prompt">프롬프트</span> <span class="img-count-badge" id="imgCountBadge"></span></label>
65
+ <label class="form-label" style="display:flex;align-items:center;gap:6px;">
66
+ <span data-i18n="prompt">프롬프트</span>
67
+ <span class="img-count-badge" id="imgCountBadge"></span>
68
+ <span id="promptSessionInfo" style="margin-left:auto;font-size:0.68rem;font-weight:400;color:var(--text-muted);font-family:var(--font-mono,monospace);"></span>
69
+ </label>
62
70
  <div class="prompt-wrapper" id="promptWrapper">
63
71
  <textarea id="promptInput" data-i18n-placeholder="prompt_placeholder" placeholder="Claude에게 전달할 명령을 입력하세요... (파일/이미지 드래그 또는 붙여넣기 가능)" rows="2"></textarea>
64
72
  <div class="prompt-mirror" id="promptMirror"></div>
@@ -91,8 +99,20 @@
91
99
  <div class="dir-browser-panel" id="dirBrowserPanel">
92
100
  <div class="dir-modal-header">
93
101
  <span class="dir-modal-title" data-i18n="browse_directory">디렉토리 탐색</span>
94
- <button type="button" class="dir-modal-close" onclick="closeDirBrowser()">
95
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
102
+ <div style="display:flex;align-items:center;gap:4px;">
103
+ <button type="button" class="dir-modal-close" onclick="showCreateDirInput()" title=" 폴더 만들기">
104
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/><line x1="12" y1="11" x2="12" y2="17"/><line x1="9" y1="14" x2="15" y2="14"/></svg>
105
+ </button>
106
+ <button type="button" class="dir-modal-close" onclick="closeDirBrowser()">
107
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
108
+ </button>
109
+ </div>
110
+ </div>
111
+ <div class="dir-create-row" id="dirCreateRow" style="display:none;">
112
+ <input type="text" id="dirCreateInput" class="dir-create-input" placeholder="새 폴더 이름" onkeydown="if(event.key==='Enter')createDir();if(event.key==='Escape')hideCreateDirInput();">
113
+ <button type="button" class="btn btn-sm btn-primary" onclick="createDir()" data-i18n="create">생성</button>
114
+ <button type="button" class="btn btn-sm" onclick="hideCreateDirInput()">
115
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
96
116
  </button>
97
117
  </div>
98
118
  <div class="dir-modal-path" id="dirBreadcrumb"></div>
@@ -105,11 +125,23 @@
105
125
  </div>
106
126
 
107
127
  <div class="form-actions">
108
- <button type="button" class="btn" onclick="clearPromptForm();" data-i18n="reset">초기화</button>
109
- <button type="submit" class="btn btn-primary" id="btnSend">
110
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>
111
- <span data-i18n="send">전송</span>
112
- </button>
128
+ <div class="automation-inline" id="automationRow" style="display:none;">
129
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="var(--primary)" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
130
+ <span class="automation-inline-label">반복 간격</span>
131
+ <input type="text" class="setting-input" id="automationInterval" placeholder="5m" style="width:60px;padding:3px 8px;font-size:0.72rem;">
132
+ <span class="automation-inline-hint">예: 30s, 5m, 1h</span>
133
+ </div>
134
+ <div class="form-actions-buttons">
135
+ <button type="button" class="btn" onclick="clearPromptForm();" data-i18n="reset">초기화</button>
136
+ <button type="button" class="btn" id="btnAutoToggle" onclick="toggleAutomation()" title="자동화 모드 전환" style="display:flex;align-items:center;gap:4px;">
137
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
138
+ <span>자동화</span>
139
+ </button>
140
+ <button type="submit" class="btn btn-primary" id="btnSend">
141
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>
142
+ <span data-i18n="send">전송</span>
143
+ </button>
144
+ </div>
113
145
  </div>
114
146
  </form>
115
147
  </div>
@@ -133,9 +165,12 @@
133
165
  <button class="btn btn-sm btn-icon" onclick="fetchJobs()" title="새로고침">
134
166
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg>
135
167
  </button>
168
+ <button class="btn btn-sm btn-icon btn-collapse" id="btnCollapseJobs" onclick="toggleJobListCollapse()" title="최소화">
169
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg>
170
+ </button>
136
171
  </div>
137
172
  </div>
138
- <div class="table-wrap">
173
+ <div class="table-wrap" id="jobTableWrap">
139
174
  <table>
140
175
  <thead>
141
176
  <tr>
@@ -158,9 +193,34 @@
158
193
  </div>
159
194
  </div>
160
195
 
196
+ <!-- Section 3: Automations -->
197
+ <div class="section" id="pipelineSection">
198
+ <div class="card">
199
+ <div class="card-header">
200
+ <div class="card-title">
201
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
202
+ <span>자동화</span>
203
+ <span id="pipelineCount" style="font-size:0.72rem; color:var(--text-muted); font-weight:400;"></span>
204
+ </div>
205
+ <div class="card-header-actions">
206
+ <button class="btn btn-sm btn-icon" onclick="fetchPipelines()" title="새로고침">
207
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/></svg>
208
+ </button>
209
+ </div>
210
+ </div>
211
+ <div id="pipelineList" class="pipeline-list">
212
+ <div class="empty-state" style="padding:20px; text-align:center; color:var(--text-muted); font-size:0.8rem;">
213
+ 자동화가 없습니다. 위 입력창에서 자동화 버튼을 눌러 등록하세요.
214
+ </div>
215
+ </div>
216
+ </div>
217
+ </div>
218
+
161
219
  </main>
162
220
  </div>
163
221
 
222
+ <!-- Pipeline modal removed — 자동화 등록은 입력창에서 직접 수행 -->
223
+
164
224
  <!-- Settings FAB -->
165
225
  <button class="settings-fab" onclick="openSettings()" title="설정">
166
226
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
@@ -211,9 +271,15 @@
211
271
  </div>
212
272
  </div>
213
273
 
274
+ <!-- Project Modal -->
275
+
214
276
  <!-- Toast Container -->
215
277
  <div class="toast-container" id="toastContainer"></div>
216
278
 
217
- <script src="app.js"></script>
279
+ <script>
280
+ // 캐시 버스팅: 순서 보장 로드
281
+ ['i18n','utils','api','context','attachments','dirs','send','stream','jobs','pipelines','settings','app']
282
+ .forEach(m => { const s = document.createElement('script'); s.src = m + '.js?t=' + Date.now(); s.async = false; document.body.appendChild(s); });
283
+ </script>
218
284
  </body>
219
285
  </html>