loadtoagent 1.3.1 → 1.3.2

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 (40) hide show
  1. package/README.ko.md +11 -9
  2. package/docs/PROVIDER-CONTRACTS.md +8 -6
  3. package/main.js +25 -3
  4. package/package.json +1 -1
  5. package/preload.js +7 -2
  6. package/renderer/app-dashboard.js +18 -12
  7. package/renderer/app-graph-view.js +1 -1
  8. package/renderer/app-management.js +91 -45
  9. package/renderer/app-run-modal.js +1 -1
  10. package/renderer/app.js +1 -1
  11. package/renderer/i18n-messages.js +212 -199
  12. package/renderer/index.html +28 -27
  13. package/renderer/styles-agent-map.css +10 -10
  14. package/renderer/styles-cards.css +19 -19
  15. package/renderer/styles-collaboration.css +23 -23
  16. package/renderer/styles-components.css +36 -36
  17. package/renderer/styles-management.css +23 -14
  18. package/renderer/styles-onboarding.css +8 -8
  19. package/renderer/styles-overlays.css +5 -5
  20. package/renderer/styles-product.css +24 -24
  21. package/renderer/styles-quality.css +4 -4
  22. package/renderer/styles-readability.css +179 -1
  23. package/renderer/styles-responsive-runtime.css +5 -5
  24. package/renderer/styles-responsive-workflows.css +2 -2
  25. package/renderer/styles-run-composer.css +23 -23
  26. package/renderer/styles-runtime-overview.css +22 -22
  27. package/renderer/styles-settings.css +21 -21
  28. package/renderer/styles-terminal.css +66 -66
  29. package/renderer/styles-tmux.css +49 -49
  30. package/renderer/styles-workflows.css +48 -48
  31. package/renderer/styles.css +7 -7
  32. package/renderer/terminal-events.js +34 -11
  33. package/renderer/terminal-workbench.js +52 -21
  34. package/renderer/terminal.js +9 -1
  35. package/src/contracts.js +5 -5
  36. package/src/ipc/registerTerminalIpc.js +6 -14
  37. package/src/sessionIntelligence.js +18 -4
  38. package/src/terminalHost.js +98 -26
  39. package/src/terminalHostDaemon.js +1 -0
  40. package/src/terminalManager.js +61 -4
@@ -41,13 +41,13 @@
41
41
  <nav class="view-nav" aria-label="화면 선택" data-i18n-aria-label="app.nav.label">
42
42
  <button class="nav-item active" type="button" data-view="all" aria-label="홈" data-i18n-aria-label="app.nav.home" aria-keyshortcuts="Meta+1 Control+1" aria-controls="operationsOverview liveSection globalStats sessionSection beginnerGuide providerOverview" title="홈" data-i18n-title="app.nav.home"><span class="nav-icon">⌂</span><span data-i18n="app.nav.home">홈</span><b><span id="navAllCount">0</span><small data-i18n="quality.unit.tasks">작업</small></b></button>
43
43
  <button class="nav-item" type="button" data-view="active" aria-label="진행 중" data-i18n-aria-label="app.nav.active" aria-keyshortcuts="Meta+2 Control+2" aria-controls="operationsOverview liveSection activeEmptyState" title="진행 중" data-i18n-title="app.nav.active"><span class="nav-icon live-dot"></span><span data-i18n="app.nav.active">진행 중</span><b><span id="navActiveCount">0</span><small data-i18n="quality.unit.tasks">작업</small></b></button>
44
- <button class="nav-item" type="button" data-view="waiting" aria-label="확인·주의" data-i18n-aria-label="app.nav.needs_review" aria-keyshortcuts="Meta+3 Control+3" aria-controls="attentionInbox" title="확인·주의" data-i18n-title="app.nav.needs_review"><span class="nav-icon">!</span><span data-i18n="app.nav.needs_review">확인·주의</span><b><span id="navWaitingCount">0</span><small data-i18n="quality.unit.tasks">작업</small></b></button>
44
+ <button class="nav-item" type="button" data-view="waiting" aria-label="확인할 일" data-i18n-aria-label="app.nav.needs_review" aria-keyshortcuts="Meta+3 Control+3" aria-controls="attentionInbox" title="확인할 일" data-i18n-title="app.nav.needs_review"><span class="nav-icon">!</span><span data-i18n="app.nav.needs_review">확인할 일</span><b><span id="navWaitingCount">0</span><small data-i18n="quality.unit.items">항목</small></b></button>
45
45
  <details id="advancedToolsNav" class="advanced-tools-nav">
46
46
  <summary><span class="nav-icon">⌁</span><span data-i18n="management.advanced_tools">고급 도구</span><b><span id="advancedToolsCount">0</span><small data-i18n="quality.unit.items">항목</small></b><i aria-hidden="true">⌄</i></summary>
47
47
  <div class="advanced-tools-list">
48
- <button class="nav-item runtime-nav-item" type="button" data-view="runtime" aria-label="예약·반복" data-i18n-aria-label="app.nav.runtime" aria-keyshortcuts="Meta+4 Control+4" aria-controls="automationOverview" title="예약·반복" data-i18n-title="app.nav.runtime"><span class="nav-icon runtime-nav-icon">↻</span><span data-i18n="app.nav.runtime">예약·반복</span><b><span id="navRuntimeCount">0</span><small data-i18n="quality.unit.runs">실행</small></b></button>
49
- <button class="nav-item" type="button" data-view="terminal" aria-label="대화·명령창" data-i18n-aria-label="app.nav.session_terminal" aria-keyshortcuts="Meta+5 Control+5" aria-controls="terminalSection" title="대화·명령창" data-i18n-title="app.nav.session_terminal"><span class="nav-icon">›_</span><span data-i18n="app.nav.session_terminal">대화·명령창</span><b><span id="navTerminalCount">0</span><small data-i18n="quality.unit.sessions">세션</small></b></button>
50
- <button class="nav-item tmux-nav-item" type="button" data-view="tmux" aria-label="여러 명령창" data-i18n-aria-label="app.nav.tmux" aria-keyshortcuts="Meta+6 Control+6" aria-controls="tmuxSection" title="여러 명령창" data-i18n-title="app.nav.tmux"><span class="nav-icon">▦</span><span data-i18n="app.nav.tmux">여러 명령창</span><b><span id="navTmuxCount">0</span><small data-i18n="quality.unit.groups">묶음</small></b></button>
48
+ <button class="nav-item runtime-nav-item" type="button" data-view="runtime" aria-label="예약·실행 단계" data-i18n-aria-label="app.nav.runtime" aria-keyshortcuts="Meta+4 Control+4" aria-controls="automationOverview" title="예약·실행 단계" data-i18n-title="app.nav.runtime"><span class="nav-icon runtime-nav-icon">↻</span><span data-i18n="app.nav.runtime">예약·실행 단계</span><b><span id="navRuntimeCount">0</span><small data-i18n="quality.unit.runs">실행</small></b></button>
49
+ <button class="nav-item" type="button" data-view="terminal" aria-label="AI 세션 터미널" data-i18n-aria-label="app.nav.session_terminal" aria-keyshortcuts="Meta+5 Control+5" aria-controls="terminalSection" title="AI 세션 터미널" data-i18n-title="app.nav.session_terminal"><span class="nav-icon">›_</span><span data-i18n="app.nav.session_terminal">AI 세션 터미널</span><b><span id="navTerminalCount">0</span><small data-i18n="quality.unit.sessions">세션</small></b></button>
50
+ <button class="nav-item tmux-nav-item" type="button" data-view="tmux" aria-label="tmux 터미널 관리" data-i18n-aria-label="app.nav.tmux" aria-keyshortcuts="Meta+6 Control+6" aria-controls="tmuxSection" title="tmux 터미널 관리" data-i18n-title="app.nav.tmux"><span class="nav-icon">▦</span><span data-i18n="app.nav.tmux">tmux 터미널 관리</span><b><span id="navTmuxCount">0</span><small data-i18n="quality.unit.sessions">세션</small></b></button>
51
51
  </div>
52
52
  </details>
53
53
  <div class="nav-group-label" data-i18n="app.nav.application">프로그램</div>
@@ -56,13 +56,13 @@
56
56
  </nav>
57
57
 
58
58
  <section class="sidebar-section">
59
- <div class="section-title"><span data-i18n="ui.available_ai">사용 가능한 AI</span><button id="probeBtn" class="icon-button" type="button" title="AI 연결 상태 다시 확인" data-i18n-title="ui.check_ai_connections_again" aria-label="AI 연결 상태 다시 확인" data-i18n-aria-label="ui.check_ai_connections_again" aria-controls="providerRail">↻</button></div>
59
+ <div class="section-title"><span data-i18n="ui.available_ai">설치가 감지된 AI CLI</span><button id="probeBtn" class="icon-button" type="button" title="AI CLI 설치 상태 다시 확인" data-i18n-title="ui.check_ai_connections_again" aria-label="AI CLI 설치 상태 다시 확인" data-i18n-aria-label="ui.check_ai_connections_again" aria-controls="providerRail">↻</button></div>
60
60
  <div id="providerRail" class="provider-rail"></div>
61
61
  </section>
62
62
 
63
63
  <section class="sidebar-section workspace-section">
64
- <div class="section-title"><span data-i18n="ui.workspaces">프로젝트</span><button id="addWorkspaceBtn" class="icon-button" type="button" title="프로젝트 추가" data-i18n-title="ui.add_workspace" aria-label="프로젝트 추가" data-i18n-aria-label="ui.add_workspace" aria-controls="workspaceList">+</button></div>
65
- <div id="workspaceList" class="workspace-list" role="group" aria-label="프로젝트별 세션 필터" data-i18n-aria-label="quality.workspace_filter"></div>
64
+ <div class="section-title"><span data-i18n="ui.workspaces">프로젝트 폴더 필터</span><button id="addWorkspaceBtn" class="icon-button" type="button" title="폴더 필터 추가" data-i18n-title="ui.add_workspace" aria-label="폴더 필터 추가" data-i18n-aria-label="ui.add_workspace" aria-controls="workspaceList">+</button></div>
65
+ <div id="workspaceList" class="workspace-list" role="group" aria-label="작업 시작 폴더별 AI 세션 필터" data-i18n-aria-label="quality.workspace_filter"></div>
66
66
  </section>
67
67
 
68
68
  <div class="sidebar-footer">
@@ -77,7 +77,7 @@
77
77
  <div>
78
78
  <p id="pageEyebrow" class="eyebrow" data-i18n="ui.ai_work_overview">AI 작업 현황</p>
79
79
  <h1 id="pageTitle" data-i18n="ui.see_all_ai_work_at_a_glance">AI 작업을 한눈에 확인하세요.</h1>
80
- <p id="pageSubtitle" class="subtitle" data-i18n="ui.active_work_and_items_needing_your_review_appear_first_find">진행 중인 일과 내 확인이 필요한 일을 먼저 보여주고, 나머지 기록은 아래에서 찾을 수 있습니다.</p>
80
+ <p id="pageSubtitle" class="subtitle" data-i18n="ui.active_work_and_items_needing_your_review_appear_first_find">진행 중인 일과 내 응답·상태 확인이 필요한 일을 먼저 보여주고, 나머지 기록은 아래에서 찾을 수 있습니다.</p>
81
81
  </div>
82
82
  <div class="top-actions">
83
83
  <button id="shortcutHelpBtn" class="top-icon-action" type="button" aria-label="키보드 단축키 보기" data-i18n-aria-label="quality.shortcuts.open" aria-keyshortcuts="?" aria-controls="shortcutHelpModal"><span aria-hidden="true">⌨</span></button>
@@ -103,7 +103,7 @@
103
103
  <ol>
104
104
  <li data-guide-step="create"><button type="button" data-guide-action="create"><i>1</i><span><b data-i18n="ui.assign_work_to_ai">AI에게 일 맡기기</b><small data-i18n="ui.choose_a_task_and_workspace_to_get_started">할 일과 작업 폴더를 고르면 바로 시작돼요.</small><em data-i18n="ui.try_it">직접 해보기 →</em></span></button></li>
105
105
  <li data-guide-step="active"><button type="button" data-guide-action="active"><i>2</i><span><b data-i18n="ui.check_progress">진행 상황 확인</b><small data-i18n="ui.ai_with_a_green_indicator_is_working_now">초록 표시가 있는 AI는 지금 일하고 있어요.</small><em data-i18n="ui.view_active_work">진행 중 보기 →</em></span></button></li>
106
- <li data-guide-step="waiting"><button type="button" data-guide-action="waiting"><i>3</i><span><b data-i18n="ui.find_items_to_review">확인·주의 항목 찾기</b><small data-i18n="ui.items_marked_needs_review_need_a_response_or_choice">답변·선택이 필요하거나 오류·주의 신호가 있는 일을 모아봐요.</small><em data-i18n="ui.view_review_items">확인·주의 항목 보기 →</em></span></button></li>
106
+ <li data-guide-step="waiting"><button type="button" data-guide-action="waiting"><i>3</i><span><b data-i18n="ui.find_items_to_review">내 응답과 상태 신호 확인</b><small data-i18n="ui.items_marked_needs_review_need_a_response_or_choice">내가 답할 요청과 AI 상태 위험 신호를 구분해서 확인해요.</small><em data-i18n="ui.view_review_items">확인할 보기 →</em></span></button></li>
107
107
  <li data-guide-step="detail"><button type="button" data-guide-action="detail"><i>4</i><span><b data-i18n="drawer.title">작업 자세히 보기</b><small data-i18n="ui.see_conversation_progress_and_usage_in_one_place">대화, 진행 과정, 사용량을 한곳에서 확인해요.</small><em data-i18n="ui.open_a_task">작업 열어보기 →</em></span></button></li>
108
108
  </ol>
109
109
  <button id="dismissGuideBtn" class="guide-dismiss" type="button" data-i18n="ui.collapse_guide">가이드 접기</button>
@@ -117,7 +117,7 @@
117
117
  <button id="updateNoticeBtn" type="button" aria-controls="updatePanel"><span data-i18n="settings.update.view">업데이트 보기</span> <span>→</span></button>
118
118
  </section>
119
119
 
120
- <section id="automationOverview" class="automation-overview hidden" aria-label="예약 작업과 실행 루프" data-i18n-aria-label="runtime.section_label"></section>
120
+ <section id="automationOverview" class="automation-overview hidden" aria-label="예약 작업과 AI 실행 단계" data-i18n-aria-label="runtime.section_label"></section>
121
121
 
122
122
  <section id="operationsOverview" class="operations-overview hidden" aria-label="에이전트 운영 상태" data-i18n-aria-label="management.operations_label"></section>
123
123
 
@@ -198,7 +198,7 @@
198
198
 
199
199
  <section id="terminalSection" class="terminal-section hidden" aria-label="명령창 직접 다루기" data-i18n-aria-label="terminal.direct_control">
200
200
  <div class="terminal-section-head">
201
- <div><span class="terminal-logo">›_</span><div><p class="eyebrow" data-i18n="ui.conversation_and_execution_together">대화와 실행 화면을 한곳에서</p><h2 data-i18n="app.nav.session_terminal">대화·명령창</h2><p id="terminalPlatformExplain" class="section-explain" data-i18n="ui.choose_a_session_on_the_left_to_continue_with_its">왼쪽에서 세션을 고르면 이전 AI 대화와 실시간 터미널을 나란히 보며 그대로 이어서 작업할 수 있습니다.</p></div></div>
201
+ <div><span class="terminal-logo">›_</span><div><p class="eyebrow" data-i18n="ui.conversation_and_execution_together">대화와 실행 화면을 한곳에서</p><h2 data-i18n="app.nav.session_terminal">AI 세션 터미널</h2><p id="terminalPlatformExplain" class="section-explain" data-i18n="ui.choose_a_session_on_the_left_to_continue_with_its">왼쪽에서 세션을 고르면 이전 AI 대화와 실시간 터미널을 나란히 보며 그대로 이어서 작업할 수 있습니다.</p></div></div>
202
202
  <div class="terminal-create-actions">
203
203
  <button id="newPowerShellBtn" class="accent" type="button" data-i18n="ui.windows_session">+ Windows 세션</button>
204
204
  <button id="newWslBtn" type="button" data-i18n="ui.linux_session">+ Linux 세션</button>
@@ -225,19 +225,20 @@
225
225
  <button id="terminalRestartBtn" type="button" data-i18n="ui.restart">다시 시작</button>
226
226
  <button id="terminalAttachBtn" class="hidden" type="button" data-i18n="ui.control_directly">직접 조작하기</button>
227
227
  <button id="terminalCloseBtn" class="terminal-danger-button" type="button" data-i18n="ui.end_session">세션 종료</button>
228
+ <button id="terminalEndSessionBtn" class="terminal-danger-button hidden" type="button" data-i18n="terminal.end_ai_session">AI 세션 종료</button>
228
229
  </div>
229
230
  </details>
230
231
  </div>
231
232
  </div>
232
233
  <div id="terminalTmuxTools" class="terminal-tmux-tools hidden">
233
- <button type="button" data-tmux-manage="rename-session" data-i18n="ui.rename_workspace">작업 묶음 이름 바꾸기</button>
234
+ <button type="button" data-tmux-manage="rename-session" data-i18n="ui.rename_workspace">tmux 세션 이름 바꾸기</button>
234
235
  <button type="button" data-tmux-manage="new-window" data-i18n="ui.add_window">창 추가</button>
235
236
  <button type="button" data-tmux-manage="split-horizontal" data-i18n="ui.split_left_right">좌우로 나누기</button>
236
237
  <button type="button" data-tmux-manage="split-vertical" data-i18n="ui.split_top_bottom">상하로 나누기</button>
237
238
  <label><span data-i18n="terminal.window_layout">창 배치</span> <select id="terminalTmuxLayout"><option value="tiled" data-i18n="ui.tiled">바둑판</option><option value="even-horizontal" data-i18n="ui.equal_width">같은 너비</option><option value="even-vertical" data-i18n="ui.equal_height">같은 높이</option><option value="main-horizontal" data-i18n="ui.main_window_on_top">중요 창 위쪽</option><option value="main-vertical" data-i18n="ui.main_window_on_left">중요 창 왼쪽</option></select></label>
238
239
  <button type="button" class="danger" data-tmux-manage="kill-pane" data-i18n="ui.close_selected_pane">선택한 칸 닫기</button>
239
240
  <button type="button" class="danger" data-tmux-manage="kill-window" data-i18n="ui.close_entire_window">창 전체 닫기</button>
240
- <button type="button" class="danger" data-tmux-manage="kill-session" data-i18n="ui.end_workspace">작업 묶음 끝내기</button>
241
+ <button type="button" class="danger" data-tmux-manage="kill-session" data-i18n="ui.end_workspace">tmux 세션 종료</button>
241
242
  </div>
242
243
  <div id="terminalStage" class="terminal-stage">
243
244
  <aside id="terminalHistoryPanel" class="terminal-history-panel hidden" aria-label="선택한 AI의 이전 대화" data-i18n-aria-label="ui.previous_conversation_for_selected_ai">
@@ -273,10 +274,10 @@
273
274
  </div>
274
275
  </section>
275
276
 
276
- <section id="tmuxSection" class="tmux-section hidden" aria-label="여러 명령창 작업 보기" data-i18n-aria-label="ui.view_multi_terminal_work">
277
+ <section id="tmuxSection" class="tmux-section hidden" aria-label="tmux 터미널 관리 보기" data-i18n-aria-label="ui.view_multi_terminal_work">
277
278
  <div class="tmux-section-head">
278
- <div><span class="tmux-logo">tmux</span><div><p class="eyebrow" data-i18n="ui.tmux_workspace">tmux 전용 공간</p><h2 data-i18n="ui.work_grouped_with_tmux">tmux 묶은 작업</h2><p class="section-explain" data-i18n="ui.only_work_using_tmux_appears_here_regular_terminals_are_kept">tmux를 사용하는 작업만 모아 봅니다. 일반 명령창은 이 화면에 섞이지 않습니다.</p></div></div>
279
- <div class="tmux-section-actions"><button id="refreshTmuxTerminalBtn" type="button" data-i18n="ui.refresh">↻ 새로고침</button><button id="newTmuxSessionBtn" class="accent" type="button" data-i18n="ui.create_tmux_workspace">+ 여러 명령창 만들기</button></div>
279
+ <div><span class="tmux-logo">tmux</span><div><p class="eyebrow" data-i18n="ui.tmux_workspace">tmux 전용 공간</p><h2 data-i18n="ui.work_grouped_with_tmux">tmux 세션과 분할 터미널</h2><p class="section-explain" data-i18n="ui.only_work_using_tmux_appears_here_regular_terminals_are_kept">tmux를 사용하는 작업만 모아 봅니다. 일반 명령창은 이 화면에 섞이지 않습니다.</p></div></div>
280
+ <div class="tmux-section-actions"><button id="refreshTmuxTerminalBtn" type="button" data-i18n="ui.refresh">↻ 새로고침</button><button id="newTmuxSessionBtn" class="accent" type="button" data-i18n="ui.create_tmux_workspace">+ tmux 세션 만들기</button></div>
280
281
  </div>
281
282
  <div id="tmuxStats" class="tmux-stats"></div>
282
283
  <div class="tmux-map-toolbar">
@@ -301,9 +302,9 @@
301
302
  <div class="live-section-title"><span class="live-beacon"></span><div><p class="eyebrow" data-i18n="ui.active_now">지금 진행 중</p><h2 data-i18n="ui.work_assigned_to_ai">AI들이 맡은 일</h2></div></div>
302
303
  <div class="live-section-tools">
303
304
  <p class="live-section-description" data-i18n="ui.open_a_task_to_see_who_started_it_and_what">일을 누르면 누가 시작했고, 다른 AI에게 어떤 도움을 맡겼는지 쉽게 볼 수 있습니다.</p>
304
- <button id="openTmuxFromAgentWork" class="live-tmux-shortcut" type="button" aria-label="여러 명령창 보기 · 묶음 0개" data-i18n-aria-label="graph.open_tmux_workspace_count" data-i18n-params='{"count":0}' title="여러 명령창 보기" data-i18n-title="graph.open_tmux_workspace">
305
+ <button id="openTmuxFromAgentWork" class="live-tmux-shortcut" type="button" aria-label="tmux 터미널 관리 · 세션 0개" data-i18n-aria-label="graph.open_tmux_workspace_count" data-i18n-params='{"count":0}' title="tmux 터미널 관리" data-i18n-title="graph.open_tmux_workspace">
305
306
  <span class="live-tmux-shortcut-icon" aria-hidden="true">▦</span>
306
- <span data-i18n="graph.open_tmux_workspace">여러 명령창 보기</span>
307
+ <span data-i18n="graph.open_tmux_workspace">tmux 터미널 관리</span>
307
308
  <b id="agentWorkTmuxCount">0</b>
308
309
  </button>
309
310
  </div>
@@ -351,12 +352,12 @@
351
352
  <aside id="mobileToolsMenu" class="mobile-tools-menu hidden" role="dialog" aria-modal="true" aria-labelledby="mobileToolsTitle" aria-hidden="true" tabindex="-1" inert>
352
353
  <div class="mobile-tools-head"><span><b id="mobileToolsTitle" data-i18n="app.nav.more">더보기</b><small data-i18n="ui.advanced_tools_to_open_only_when_needed">필요할 때만 여는 고급 기능이에요.</small></span><button id="mobileToolsCloseBtn" type="button" aria-label="닫기" data-i18n-aria-label="common.close">×</button></div>
353
354
  <details class="mobile-project-picker">
354
- <summary><i aria-hidden="true">□</i><span><b data-i18n="ui.workspaces">프로젝트</b><small id="mobileWorkspaceSummary" data-i18n="project.all">모든 프로젝트</small></span><em aria-hidden="true">⌄</em></summary>
355
- <div class="mobile-project-picker-body"><div id="mobileWorkspaceList" class="workspace-list" role="group" aria-label="프로젝트별 세션 필터" data-i18n-aria-label="quality.workspace_filter"></div><button id="mobileAddWorkspaceBtn" type="button" data-i18n="ui.add_workspace">프로젝트 고정</button></div>
355
+ <summary><i aria-hidden="true">□</i><span><b data-i18n="ui.workspaces">프로젝트 폴더 필터</b><small id="mobileWorkspaceSummary" data-i18n="project.all">모든 프로젝트 폴더</small></span><em aria-hidden="true">⌄</em></summary>
356
+ <div class="mobile-project-picker-body"><div id="mobileWorkspaceList" class="workspace-list" role="group" aria-label="작업 시작 폴더별 AI 세션 필터" data-i18n-aria-label="quality.workspace_filter"></div><button id="mobileAddWorkspaceBtn" type="button" data-i18n="ui.add_workspace">폴더 필터 추가</button></div>
356
357
  </details>
357
- <button type="button" data-mobile-view="runtime"><i aria-hidden="true">↻</i><span><b data-i18n="runtime.title">예약·반복 작업</b><small data-i18n="runtime.description">다음 예약과 지금 반복 중인 에이전트 흐름을 함께 봅니다.</small></span></button>
358
- <button type="button" data-mobile-view="terminal"><i aria-hidden="true">›_</i><span><b data-i18n="app.nav.session_terminal">대화·명령창</b><small data-i18n="ui.continue_an_existing_ai_conversation_directly">기존 AI 대화를 직접 이어서 입력</small></span></button>
359
- <button type="button" data-mobile-view="tmux"><i aria-hidden="true">▦</i><span><b data-i18n="app.nav.tmux">여러 명령창</b><small data-i18n="ui.manage_multiple_terminals_together">여러 명령창을 묶어 관리</small></span></button>
358
+ <button type="button" data-mobile-view="runtime"><i aria-hidden="true">↻</i><span><b data-i18n="runtime.title">예약·실행 단계</b><small data-i18n="runtime.description">실제 예약 작업과 현재 AI의 추정 실행 단계를 나눠서 확인합니다.</small></span></button>
359
+ <button type="button" data-mobile-view="terminal"><i aria-hidden="true">›_</i><span><b data-i18n="app.nav.session_terminal">AI 세션 터미널</b><small data-i18n="ui.continue_an_existing_ai_conversation_directly">기존 AI 대화를 직접 이어서 입력</small></span></button>
360
+ <button type="button" data-mobile-view="tmux"><i aria-hidden="true">▦</i><span><b data-i18n="app.nav.tmux">tmux 터미널 관리</b><small data-i18n="ui.manage_multiple_terminals_together">tmux 세션·창·분할 관리</small></span></button>
360
361
  <button type="button" data-mobile-view="settings"><i aria-hidden="true">⚙</i><span><b data-i18n="settings.title">프로그램 설정</b><small data-i18n="ui.check_version_and_updates">버전과 업데이트 확인</small></span></button>
361
362
  </aside>
362
363
 
@@ -393,7 +394,7 @@
393
394
  <div id="runProviderLabel" class="field-label" data-i18n="ui.which_ai_should_handle_it">어떤 AI에게 맡길까요?</div>
394
395
  <div id="runProviderPicker" class="run-provider-picker" role="radiogroup" aria-labelledby="runProviderLabel"></div>
395
396
  <div id="runProviderHelp" class="run-provider-help hidden" role="status"></div>
396
- <div class="run-folder-field"><label class="field-label" for="runCwd" data-i18n="ui.workspaces">작업 폴더</label><div class="path-field"><input id="runCwd" required placeholder="프로젝트 폴더를 선택하세요" data-i18n-placeholder="ui.choose_a_project_folder" /><button type="button" id="pickRunCwdBtn" data-i18n="ui.browse">폴더 찾기</button></div></div>
397
+ <div class="run-folder-field"><label class="field-label" for="runCwd" data-i18n="ui.work_folder">작업 폴더</label><div class="path-field"><input id="runCwd" required placeholder="프로젝트 폴더를 선택하세요" data-i18n-placeholder="ui.choose_a_project_folder" /><button type="button" id="pickRunCwdBtn" data-i18n="ui.browse">폴더 찾기</button></div></div>
397
398
  <div id="runWorkspaceSuggestions" class="run-workspace-suggestions" aria-label="최근 작업 폴더" data-i18n-aria-label="ui.recent_workspaces"></div>
398
399
  <label class="permission-toggle"><input id="allowWrites" type="checkbox" /><span class="toggle-track"></span><div><strong data-i18n="ui.allow_ai_to_edit_files">AI가 파일을 고칠 수 있게 허용</strong><small data-i18n="ui.when_enabled_the_ai_can_directly_edit_files_in_the">켜면 선택한 폴더의 파일을 직접 수정합니다.</small></div></label>
399
400
  <div id="runPermissionHint" class="run-permission-hint hidden" role="status" data-i18n="ui.this_request_appears_to_need_file_changes_without_edit_permission">이 요청은 파일 수정이 필요해 보여요. 위의 수정 허용을 켜지 않으면 AI가 코드 변경 없이 검토만 합니다.</div>
@@ -426,15 +427,15 @@
426
427
  </div>
427
428
  <div id="tmuxCreateModal" class="modal-backdrop hidden" role="dialog" aria-modal="true" aria-labelledby="tmuxCreateTitle" aria-hidden="true" inert>
428
429
  <form id="tmuxCreateForm" class="run-modal terminal-modal">
429
- <div class="modal-head"><div><p class="eyebrow" data-i18n="ui.advanced_work">고급 작업</p><h2 id="tmuxCreateTitle" data-i18n="ui.create_multi_window_workspace">여러 작업 만들기</h2></div><button type="button" id="closeTmuxCreateBtn" class="close-button" aria-label="여러 작업 만들기 닫기" data-i18n-aria-label="ui.close_multi_window_workspace_dialog">×</button></div>
430
+ <div class="modal-head"><div><p class="eyebrow" data-i18n="ui.advanced_work">고급 작업</p><h2 id="tmuxCreateTitle" data-i18n="ui.create_multi_window_workspace">tmux 세션 만들기</h2></div><button type="button" id="closeTmuxCreateBtn" class="close-button" aria-label="tmux 세션 만들기 닫기" data-i18n-aria-label="ui.close_multi_window_workspace_dialog">×</button></div>
430
431
  <div class="form-grid">
431
432
  <label><span id="tmuxEnvironmentLabel" data-i18n="ui.tmux_environment">tmux 환경</span><select id="tmuxCreateDistro" required></select></label>
432
- <label><span data-i18n="ui.workspace_name">작업 묶음 이름</span><input id="tmuxCreateName" required pattern="[A-Za-z0-9_.\-]+" placeholder="my-work" aria-describedby="tmuxCreateNameHelp" /><small id="tmuxCreateNameHelp" data-i18n="tmux.name_requirements">영문, 숫자, 마침표, 밑줄, 하이픈만 사용할 수 있습니다.</small></label>
433
+ <label><span data-i18n="ui.workspace_name">tmux 세션 이름</span><input id="tmuxCreateName" required pattern="[A-Za-z0-9_.\-]+" placeholder="my-work" aria-describedby="tmuxCreateNameHelp" /><small id="tmuxCreateNameHelp" data-i18n="tmux.name_requirements">영문, 숫자, 마침표, 밑줄, 하이픈만 사용할 수 있습니다.</small></label>
433
434
  </div>
434
435
  <label><span><span data-i18n="terminal.start_folder">시작 폴더</span> <small data-i18n="ui.optional">선택 사항</small></span><span class="path-field"><input id="tmuxCreateCwd" placeholder="프로젝트의 절대 경로" data-i18n-placeholder="ui.absolute_project_path" /><button type="button" id="pickTmuxCwdBtn" data-i18n="ui.browse">폴더 찾기</button></span></label>
435
436
  <label><span><span data-i18n="terminal.initial_command">처음 실행할 명령</span> <small data-i18n="ui.optional">선택 사항</small></span><textarea id="tmuxCreateCommand" rows="4" placeholder="예: 실행할 AI 명령" data-i18n-placeholder="ui.example_claude_or_codex"></textarea></label>
436
437
  <div id="tmuxCreateError" class="form-error hidden" role="alert" aria-live="assertive" tabindex="-1"></div>
437
- <div class="modal-actions"><button type="button" id="cancelTmuxCreateBtn" class="ghost-button" data-i18n="common.cancel">취소</button><button type="submit" class="primary-button" data-i18n="ui.create_workspace">작업 묶음 만들기</button></div>
438
+ <div class="modal-actions"><button type="button" id="cancelTmuxCreateBtn" class="ghost-button" data-i18n="common.cancel">취소</button><button type="submit" class="primary-button" data-i18n="ui.create_workspace">tmux 세션 만들기</button></div>
438
439
  </form>
439
440
  </div>
440
441
  <script src="../node_modules/@xterm/xterm/lib/xterm.js"></script>
@@ -178,7 +178,7 @@
178
178
  display: block;
179
179
  margin: 0 0 9px 3px;
180
180
  color: #6f7c8f;
181
- font-size: 10px;
181
+ font-size: 12px;
182
182
  font-weight: 700;
183
183
  letter-spacing: .1em;
184
184
  }
@@ -267,7 +267,7 @@
267
267
  color: #6be0b0;
268
268
  font-weight: 750;
269
269
  letter-spacing: .11em;
270
- font-size: 11px;
270
+ font-size: 12px;
271
271
  }
272
272
 
273
273
  .global-stat span {
@@ -276,14 +276,14 @@
276
276
  font-weight: 700;
277
277
  letter-spacing: .12em;
278
278
  text-transform: uppercase;
279
- font-size: 11px;
279
+ font-size: 12px;
280
280
  }
281
281
 
282
282
  .global-stat em {
283
283
  margin-left: 5px;
284
284
  color: #657186;
285
285
  font-style: normal;
286
- font-size: 11px;
286
+ font-size: 12px;
287
287
  }
288
288
 
289
289
  .provider-overview-card:active {
@@ -363,7 +363,7 @@
363
363
  border-radius: 999px;
364
364
  background: color-mix(in srgb,var(--provider) 16%,#0b1515);
365
365
  color: color-mix(in srgb,var(--provider) 72%,#eafff8);
366
- font-size: 9px;
366
+ font-size: 12px;
367
367
  font-weight: 800;
368
368
  white-space: nowrap;
369
369
  }
@@ -391,7 +391,7 @@
391
391
  display: block;
392
392
  margin-top: 3px;
393
393
  color: #98a6b6;
394
- font-size: 11px;
394
+ font-size: 12px;
395
395
  }
396
396
 
397
397
  .poc-state {
@@ -400,7 +400,7 @@
400
400
  align-items: center;
401
401
  gap: 5px;
402
402
  color: #98a6b6;
403
- font-size: 11px;
403
+ font-size: 12px;
404
404
  }
405
405
 
406
406
  .poc-metrics span {
@@ -409,7 +409,7 @@
409
409
  text-transform: uppercase;
410
410
  letter-spacing: .08em;
411
411
  color: #98a6b6;
412
- font-size: 11px;
412
+ font-size: 12px;
413
413
  }
414
414
 
415
415
  .poc-metrics b {
@@ -425,7 +425,7 @@
425
425
  border-radius: 9px;
426
426
  background: #101722;
427
427
  color: #9ba8ba;
428
- font-size: 11px;
428
+ font-size: 12px;
429
429
  cursor: pointer;
430
430
  white-space: nowrap;
431
431
  transition: transform var(--motion-fast) var(--motion-ease),background-color var(--motion-fast) ease,border-color var(--motion-fast) ease,color var(--motion-fast) ease,box-shadow var(--motion-medium) ease,opacity var(--motion-fast) ease;
@@ -438,7 +438,7 @@
438
438
  border-radius: 9px;
439
439
  background: #101722;
440
440
  color: #9ba8ba;
441
- font-size: 11px;
441
+ font-size: 12px;
442
442
  cursor: pointer;
443
443
  white-space: nowrap;
444
444
  transition: transform var(--motion-fast) var(--motion-ease),background-color var(--motion-fast) ease,border-color var(--motion-fast) ease,color var(--motion-fast) ease,box-shadow var(--motion-medium) ease,opacity var(--motion-fast) ease;
@@ -15,7 +15,7 @@
15
15
  background: color-mix(in srgb,var(--provider) 11%,#111620);
16
16
  border: 1px solid color-mix(in srgb,var(--provider) 32%,#202938);
17
17
  color: var(--provider);
18
- font-size: 9px;
18
+ font-size: 12px;
19
19
  font-weight: 850;
20
20
  letter-spacing: -.03em;
21
21
  }
@@ -123,7 +123,7 @@
123
123
  border-radius: 5px;
124
124
  background: rgba(89,216,255,.06);
125
125
  color: #76c8df;
126
- font-size: 8px;
126
+ font-size: 12px;
127
127
  font-weight: 750;
128
128
  letter-spacing: .02em;
129
129
  }
@@ -155,14 +155,14 @@
155
155
  .token-breakdown span {
156
156
  display: block;
157
157
  color: #566173;
158
- font-size: 7px;
158
+ font-size: 12px;
159
159
  }
160
160
 
161
161
  .token-breakdown b {
162
162
  display: block;
163
163
  margin-top: 2px;
164
164
  color: #aeb9c6;
165
- font-size: 9px;
165
+ font-size: 12px;
166
166
  font-weight: 570;
167
167
  }
168
168
 
@@ -184,7 +184,7 @@
184
184
  border-radius: 7px;
185
185
  background: color-mix(in srgb,var(--provider) 11%,#131822);
186
186
  color: var(--provider);
187
- font-size: 10px;
187
+ font-size: 12px;
188
188
  }
189
189
 
190
190
  .now-strip>div {
@@ -351,7 +351,7 @@
351
351
 
352
352
  .token-hero-head span {
353
353
  color: #6d798d;
354
- font-size: 11px;
354
+ font-size: 12px;
355
355
  }
356
356
 
357
357
  .token-hero-head b {
@@ -361,14 +361,14 @@
361
361
  .token-tile span {
362
362
  display: block;
363
363
  color: #606c7e;
364
- font-size: 10px;
364
+ font-size: 12px;
365
365
  }
366
366
 
367
367
  .token-tile small {
368
368
  display: block;
369
369
  margin-top: 4px;
370
370
  color: #4e596a;
371
- font-size: 9px;
371
+ font-size: 12px;
372
372
  }
373
373
 
374
374
  .token-note {
@@ -378,7 +378,7 @@
378
378
  background: #0d121a;
379
379
  color: #697588;
380
380
  line-height: 1.55;
381
- font-size: 9px;
381
+ font-size: 12px;
382
382
  }
383
383
 
384
384
  .motion-content-in .token-tile {
@@ -491,7 +491,7 @@
491
491
  align-items: center;
492
492
  gap: 7px;
493
493
  color: #6d798c;
494
- font-size: 11px;
494
+ font-size: 12px;
495
495
  }
496
496
 
497
497
  .card-provider-line b {
@@ -512,7 +512,7 @@
512
512
  font-weight: 700;
513
513
  letter-spacing: .06em;
514
514
  text-transform: uppercase;
515
- font-size: 10px;
515
+ font-size: 12px;
516
516
  }
517
517
 
518
518
  .card-title {
@@ -535,7 +535,7 @@
535
535
  white-space: nowrap;
536
536
  overflow: hidden;
537
537
  color: #9ba8b8;
538
- font-size: 11px;
538
+ font-size: 12px;
539
539
  }
540
540
 
541
541
  .now-strip b {
@@ -555,14 +555,14 @@
555
555
  text-overflow: ellipsis;
556
556
  margin-top: 3px;
557
557
  color: #95a3b4;
558
- font-size: 11px;
558
+ font-size: 12px;
559
559
  }
560
560
 
561
561
  .preview-line b {
562
562
  color: #778397;
563
563
  text-transform: uppercase;
564
564
  white-space: nowrap;
565
- font-size: 10px;
565
+ font-size: 12px;
566
566
  }
567
567
 
568
568
  .preview-line span {
@@ -570,7 +570,7 @@
570
570
  text-overflow: ellipsis;
571
571
  white-space: nowrap;
572
572
  color: #a7b3c1;
573
- font-size: 11px;
573
+ font-size: 12px;
574
574
  }
575
575
 
576
576
  .context-meter-head>div span {
@@ -579,7 +579,7 @@
579
579
  letter-spacing: .08em;
580
580
  text-transform: uppercase;
581
581
  color: #909eaf;
582
- font-size: 11px;
582
+ font-size: 12px;
583
583
  }
584
584
 
585
585
  .context-meter-foot {
@@ -588,13 +588,13 @@
588
588
  gap: 10px;
589
589
  margin-top: 6px;
590
590
  color: #909eaf;
591
- font-size: 11px;
591
+ font-size: 12px;
592
592
  }
593
593
 
594
594
  .token-row span {
595
595
  display: block;
596
596
  color: #909eaf;
597
- font-size: 11px;
597
+ font-size: 12px;
598
598
  }
599
599
 
600
600
  .card-footer {
@@ -606,7 +606,7 @@
606
606
  border-top: 1px solid var(--line-soft);
607
607
  background: rgba(7,10,16,.42);
608
608
  color: #909eaf;
609
- font-size: 11px;
609
+ font-size: 12px;
610
610
  }
611
611
 
612
612
  .context-meter-head>div strong {
@@ -15,7 +15,7 @@
15
15
  right: 14px;
16
16
  top: 14px;
17
17
  color: color-mix(in srgb,var(--provider) 66%,#8c98a8);
18
- font-size: 7px;
18
+ font-size: 12px;
19
19
  font-weight: 800;
20
20
  letter-spacing: .15em;
21
21
  }
@@ -61,13 +61,13 @@
61
61
  border-radius: 6px;
62
62
  background: color-mix(in srgb,var(--drawer-provider) 12%,#17212d);
63
63
  color: var(--drawer-provider);
64
- font-size: 10px;
64
+ font-size: 12px;
65
65
  }
66
66
 
67
67
  .memory-target {
68
68
  padding: 3px 7px;
69
69
  border-radius: 6px;
70
- font-size: 10px;
70
+ font-size: 12px;
71
71
  max-width: 220px;
72
72
  overflow: hidden;
73
73
  background: #18222e;
@@ -79,7 +79,7 @@
79
79
  .memory-category {
80
80
  padding: 3px 7px;
81
81
  border-radius: 6px;
82
- font-size: 10px;
82
+ font-size: 12px;
83
83
  margin-left: auto;
84
84
  background: #10241f;
85
85
  color: #74d9ae;
@@ -125,7 +125,7 @@
125
125
  display: block;
126
126
  margin-top: 4px;
127
127
  color: #71868d;
128
- font-size: 9px;
128
+ font-size: 12px;
129
129
  }
130
130
 
131
131
  .agent-communication-panel>header em {
@@ -133,14 +133,14 @@
133
133
  border-radius: 8px;
134
134
  background: rgba(81,213,169,.09);
135
135
  color: #75dfb8;
136
- font-size: 9px;
136
+ font-size: 12px;
137
137
  font-style: normal;
138
138
  }
139
139
 
140
140
  .agent-communication-panel.empty>p {
141
141
  padding: 18px;
142
142
  color: #6f828c;
143
- font-size: 10px;
143
+ font-size: 12px;
144
144
  text-align: center;
145
145
  }
146
146
 
@@ -184,7 +184,7 @@
184
184
  min-width: 0;
185
185
  overflow: hidden;
186
186
  color: #b8c8cf;
187
- font-size: 9px;
187
+ font-size: 12px;
188
188
  text-overflow: ellipsis;
189
189
  white-space: nowrap;
190
190
  }
@@ -202,7 +202,7 @@
202
202
  .communication-copy small {
203
203
  display: block;
204
204
  color: #6edcaf;
205
- font-size: 8px;
205
+ font-size: 12px;
206
206
  }
207
207
 
208
208
  .communication-copy strong {
@@ -210,7 +210,7 @@
210
210
  margin-top: 5px;
211
211
  overflow: hidden;
212
212
  color: #a9b8c0;
213
- font-size: 10px;
213
+ font-size: 12px;
214
214
  font-weight: 500;
215
215
  line-height: 1.4;
216
216
  -webkit-box-orient: vertical;
@@ -223,7 +223,7 @@
223
223
 
224
224
  .agent-communication-event time {
225
225
  color: #596f79;
226
- font-size: 8px;
226
+ font-size: 12px;
227
227
  }
228
228
 
229
229
  .subagent-filterbar {
@@ -262,7 +262,7 @@
262
262
  border-radius: 8px;
263
263
  background: #0d171e;
264
264
  color: #788b97;
265
- font-size: 9px;
265
+ font-size: 12px;
266
266
  font-weight: 700;
267
267
  cursor: pointer;
268
268
  }
@@ -273,7 +273,7 @@
273
273
  border-radius: 6px;
274
274
  background: #15242d;
275
275
  color: #9aadb7;
276
- font-size: 8px;
276
+ font-size: 12px;
277
277
  }
278
278
 
279
279
  .subagent-status-filters button.active {
@@ -294,7 +294,7 @@
294
294
  border-radius: 8px;
295
295
  background: #091219;
296
296
  color: #bac8d0;
297
- font-size: 9px;
297
+ font-size: 12px;
298
298
  outline: none;
299
299
  padding: 0 9px;
300
300
  }
@@ -306,7 +306,7 @@
306
306
  border-radius: 8px;
307
307
  background: #091219;
308
308
  color: #bac8d0;
309
- font-size: 9px;
309
+ font-size: 12px;
310
310
  outline: none;
311
311
  padding: 0 25px 0 8px;
312
312
  }
@@ -327,13 +327,13 @@
327
327
 
328
328
  .subagent-filter-result {
329
329
  color: #617783;
330
- font-size: 8px;
330
+ font-size: 12px;
331
331
  white-space: nowrap;
332
332
  }
333
333
 
334
334
  .subagent-filter-result b {
335
335
  color: #87d9bc;
336
- font-size: 10px;
336
+ font-size: 12px;
337
337
  }
338
338
 
339
339
  .subagent-work-source {
@@ -348,12 +348,12 @@
348
348
 
349
349
  .subagent-work-source b {
350
350
  color: #dbe8e9;
351
- font-size: 11px;
351
+ font-size: 12px;
352
352
  }
353
353
 
354
354
  .subagent-work-source span {
355
355
  color: #78909a;
356
- font-size: 10px;
356
+ font-size: 12px;
357
357
  line-height: 1.55;
358
358
  }
359
359
 
@@ -415,20 +415,20 @@
415
415
  .completed-subagent-disclosure b {
416
416
  display: block;
417
417
  color: #b7c3cd;
418
- font-size: 11px;
418
+ font-size: 12px;
419
419
  }
420
420
 
421
421
  .completed-subagent-disclosure small {
422
422
  display: block;
423
423
  margin-top: 4px;
424
424
  color: #667887;
425
- font-size: 9px;
425
+ font-size: 12px;
426
426
  font-weight: 500;
427
427
  }
428
428
 
429
429
  .completed-subagent-disclosure button>i {
430
430
  color: #7e93a1;
431
- font-size: 9px;
431
+ font-size: 12px;
432
432
  font-style: normal;
433
433
  font-weight: 700;
434
434
  }
@@ -450,7 +450,7 @@
450
450
  content: "완료 기록";
451
451
  grid-column: 1/-1;
452
452
  color: #617482;
453
- font-size: 9px;
453
+ font-size: 12px;
454
454
  font-weight: 750;
455
455
  letter-spacing: .08em;
456
456
  }