loadtoagent 1.3.2 → 1.3.4

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 (37) hide show
  1. package/main.js +53 -8
  2. package/package.json +2 -1
  3. package/renderer/app-agent-actions.js +172 -66
  4. package/renderer/app-bootstrap.js +3 -1
  5. package/renderer/app-dashboard.js +36 -7
  6. package/renderer/app-drawer-content.js +177 -59
  7. package/renderer/app-drawer-data.js +7 -3
  8. package/renderer/app-drawer.js +72 -33
  9. package/renderer/app-events-dialogs.js +8 -1
  10. package/renderer/app-events-navigation.js +7 -0
  11. package/renderer/app-events-sessions.js +136 -13
  12. package/renderer/app-graph-model.js +2 -5
  13. package/renderer/app-graph-orchestration.js +7 -18
  14. package/renderer/app-graph-view.js +194 -48
  15. package/renderer/app-management.js +330 -35
  16. package/renderer/app-quality.js +5 -0
  17. package/renderer/app-session-render.js +20 -83
  18. package/renderer/app.js +5 -1
  19. package/renderer/i18n-messages.js +232 -21
  20. package/renderer/index.html +9 -6
  21. package/renderer/styles-components.css +140 -0
  22. package/renderer/styles-control-room.css +1439 -0
  23. package/renderer/styles-management.css +390 -3
  24. package/renderer/styles-responsive-shell.css +5 -0
  25. package/renderer/styles-runtime-overview.css +20 -0
  26. package/renderer/terminal-agent.js +31 -7
  27. package/renderer/terminal.js +4 -1
  28. package/src/agentMonitor/claudeParser.js +8 -4
  29. package/src/agentMonitor/codexParser.js +5 -4
  30. package/src/agentMonitor/genericParser.js +7 -6
  31. package/src/agentMonitor.js +44 -4
  32. package/src/attentionNotifier.js +3 -0
  33. package/src/ipc/registerTerminalIpc.js +2 -2
  34. package/src/monitorWorker.js +1 -1
  35. package/src/processMonitor.js +68 -7
  36. package/src/terminalHost.js +6 -4
  37. package/src/terminalManager.js +16 -2
@@ -28,6 +28,7 @@
28
28
  <link rel="stylesheet" href="styles-responsive-product.css" />
29
29
  <link rel="stylesheet" href="../node_modules/@xterm/xterm/css/xterm.css" />
30
30
  <link rel="stylesheet" href="styles-readability.css" />
31
+ <link rel="stylesheet" href="styles-control-room.css" />
31
32
  </head>
32
33
  <body>
33
34
  <div id="appShell" class="app-shell">
@@ -75,9 +76,9 @@
75
76
  <main id="mainContent" class="main-stage" tabindex="-1">
76
77
  <header class="topbar">
77
78
  <div>
78
- <p id="pageEyebrow" class="eyebrow" data-i18n="ui.ai_work_overview">AI 작업 현황</p>
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>
79
+ <p id="pageEyebrow" class="eyebrow" data-i18n="ui.ai_work_overview">세션 관제</p>
80
+ <h1 id="pageTitle" data-i18n="ui.see_all_ai_work_at_a_glance">에이전트가 일하는 흐름을 실시간으로 확인하세요.</h1>
81
+ <p id="pageSubtitle" class="subtitle" data-i18n="ui.active_work_and_items_needing_your_review_appear_first_find">실행 구조는 항상 보이고, 세션을 누르면 대화를 확인하거나 바로 참여할 수 있습니다.</p>
81
82
  </div>
82
83
  <div class="top-actions">
83
84
  <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>
@@ -299,9 +300,9 @@
299
300
 
300
301
  <section id="liveSection" class="live-section hidden" aria-label="현재 진행 중인 AI 작업" data-i18n-aria-label="ui.ai_work_currently_in_progress">
301
302
  <div class="live-section-head">
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>
303
+ <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">전체 에이전트 작동 지도</h2></div></div>
303
304
  <div class="live-section-tools">
304
- <p class="live-section-description" data-i18n="ui.open_a_task_to_see_who_started_it_and_what">일을 누르면 누가 시작했고, 다른 AI에게 어떤 도움을 맡겼는지 쉽게 볼 수 있습니다.</p>
305
+ <p class="live-section-description" data-i18n="ui.open_a_task_to_see_who_started_it_and_what">관제 콘솔에서 고른 에이전트의 부모·도움 AI·실행 명령 흐름을 여기서 끝까지 추적합니다.</p>
305
306
  <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">
306
307
  <span class="live-tmux-shortcut-icon" aria-hidden="true">▦</span>
307
308
  <span data-i18n="graph.open_tmux_workspace">tmux 터미널 관리</span>
@@ -331,7 +332,7 @@
331
332
  <label class="search-box"><span aria-hidden="true">⌕</span><input id="searchInput" type="search" maxlength="240" aria-label="작업 검색" data-i18n-aria-label="ui.search_tasks" aria-keyshortcuts="/" placeholder="작업 이름, AI, 폴더 찾기" data-i18n-placeholder="ui.find_task_ai_or_folder" autocomplete="off" /><button id="searchClearBtn" class="search-clear hidden" type="button" aria-label="검색어 지우기" data-i18n-aria-label="filter.clear_search" title="검색어 지우기" data-i18n-title="filter.clear_search">×</button></label>
332
333
  <div id="providerFilter" class="provider-filter" role="toolbar" aria-label="AI 제공사 필터" data-i18n-aria-label="ui.ai_provider_filter"></div>
333
334
  <p id="providerFilterStatus" class="sr-only" role="status" aria-live="polite"></p>
334
- <select id="sortSelect" aria-label="정렬" data-i18n-aria-label="ui.sort"><option value="recent" data-i18n="ui.most_recently_active">최근에 움직인 순서</option><option value="tokens" data-i18n="ui.highest_usage">많이 사용한 순서</option><option value="context" data-i18n="ui.highest_context_usage">기억 공간을 많이 쓴 순서</option></select>
335
+ <select id="sortSelect" aria-label="정렬" data-i18n-aria-label="ui.sort"><option value="recent" data-i18n="ui.most_recently_active">고정 순서 · 직접 변경</option><option value="tokens" data-i18n="ui.highest_usage">많이 사용한 순서</option><option value="context" data-i18n="ui.highest_context_usage">기억 공간을 많이 쓴 순서</option></select>
335
336
  <button id="resetFiltersBtn" class="filter-reset hidden" type="button" data-i18n="filter.reset_all">필터 초기화</button>
336
337
  </div>
337
338
  </div>
@@ -355,6 +356,7 @@
355
356
  <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
357
  <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>
357
358
  </details>
359
+ <button type="button" data-mobile-guide data-guide-action="mobile"><i aria-hidden="true">?</i><span><b data-i18n="ui.10_minute_quick_start">10분 시작 가이드</b><small data-i18n="ui.try_each_step_to_explore_the_app">하나씩 눌러 직접 둘러보세요.</small></span></button>
358
360
  <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
361
  <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
362
  <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>
@@ -376,6 +378,7 @@
376
378
  <button id="drawerTabTokens" class="drawer-tab" type="button" role="tab" aria-selected="false" aria-controls="drawerContent" tabindex="-1" data-tab="tokens" data-i18n="ui.usage">사용량</button>
377
379
  </div>
378
380
  <div id="drawerContent" class="drawer-content" role="tabpanel" aria-labelledby="drawerTabChat" tabindex="0"></div>
381
+ <div id="drawerComposer" class="drawer-composer hidden" aria-label="대화 참여"></div>
379
382
  </aside>
380
383
 
381
384
  <div id="runModal" class="modal-backdrop hidden" role="dialog" aria-modal="true" aria-labelledby="runModalTitle" aria-describedby="runModalDescription" aria-hidden="true" inert>
@@ -999,6 +999,146 @@ button[aria-busy="true"] {
999
999
  gap: 18px;
1000
1000
  }
1001
1001
 
1002
+ .chat-turn {
1003
+ display: grid;
1004
+ gap: 14px;
1005
+ padding-bottom: 18px;
1006
+ border-bottom: 1px solid #1d2835;
1007
+ }
1008
+
1009
+ .chat-turn:last-of-type {
1010
+ padding-bottom: 0;
1011
+ border-bottom: 0;
1012
+ }
1013
+
1014
+ .chat-answer-kind {
1015
+ margin-left: auto;
1016
+ padding: 2px 7px;
1017
+ border: 1px solid color-mix(in srgb,var(--drawer-provider) 25%,#263344);
1018
+ border-radius: 999px;
1019
+ background: color-mix(in srgb,var(--drawer-provider) 7%,#101720);
1020
+ color: color-mix(in srgb,var(--drawer-provider) 75%,#d9e3ec);
1021
+ font-size: 11px !important;
1022
+ font-weight: 700;
1023
+ }
1024
+
1025
+ .chat-answer-kind.is-live {
1026
+ position: relative;
1027
+ padding-left: 18px;
1028
+ border-color: rgba(71,214,153,.3);
1029
+ background: rgba(34,118,83,.12);
1030
+ color: #78e1b3;
1031
+ }
1032
+
1033
+ .chat-answer-kind.is-live:before {
1034
+ content: "";
1035
+ position: absolute;
1036
+ left: 8px;
1037
+ top: 50%;
1038
+ width: 5px;
1039
+ height: 5px;
1040
+ border-radius: 50%;
1041
+ background: #59dfa7;
1042
+ transform: translateY(-50%);
1043
+ animation: control-room-pulse 1.35s ease-in-out infinite;
1044
+ }
1045
+
1046
+ .chat-progress-updates {
1047
+ margin-left: 43px;
1048
+ border: 1px solid #263342;
1049
+ border-radius: 11px;
1050
+ background: #0a1017;
1051
+ overflow: hidden;
1052
+ }
1053
+
1054
+ .chat-progress-updates > summary {
1055
+ display: flex;
1056
+ align-items: center;
1057
+ justify-content: space-between;
1058
+ gap: 12px;
1059
+ padding: 11px 13px;
1060
+ cursor: pointer;
1061
+ list-style: none;
1062
+ }
1063
+
1064
+ .chat-progress-updates > summary::-webkit-details-marker {
1065
+ display: none;
1066
+ }
1067
+
1068
+ .chat-progress-updates > summary span,
1069
+ .chat-progress-updates > summary small {
1070
+ display: block;
1071
+ }
1072
+
1073
+ .chat-progress-updates > summary b {
1074
+ color: #aebbc9;
1075
+ font-size: 12px;
1076
+ }
1077
+
1078
+ .chat-progress-updates > summary small {
1079
+ margin-top: 3px;
1080
+ color: #68778a;
1081
+ font-size: 11px;
1082
+ }
1083
+
1084
+ .chat-progress-updates > summary i {
1085
+ color: #718196;
1086
+ font-size: 12px;
1087
+ font-style: normal;
1088
+ transition: transform var(--motion-fast) ease;
1089
+ }
1090
+
1091
+ .chat-progress-updates[open] > summary i {
1092
+ transform: rotate(180deg);
1093
+ }
1094
+
1095
+ .chat-progress-list {
1096
+ display: grid;
1097
+ gap: 8px;
1098
+ padding: 0 10px 10px;
1099
+ }
1100
+
1101
+ .chat-progress-list article {
1102
+ padding: 10px;
1103
+ border: 1px solid #202b38;
1104
+ border-radius: 9px;
1105
+ background: #0d141d;
1106
+ }
1107
+
1108
+ .chat-progress-list article > header {
1109
+ display: flex;
1110
+ justify-content: space-between;
1111
+ gap: 10px;
1112
+ margin-bottom: 7px;
1113
+ color: #7e8da0;
1114
+ font-size: 11px;
1115
+ }
1116
+
1117
+ .chat-progress-list .chat-content {
1118
+ font-size: 12px;
1119
+ }
1120
+
1121
+ .chat-turn-waiting {
1122
+ display: flex;
1123
+ align-items: center;
1124
+ gap: 8px;
1125
+ margin-left: 43px;
1126
+ padding: 11px 13px;
1127
+ border: 1px solid rgba(71,214,153,.22);
1128
+ border-radius: 10px;
1129
+ background: rgba(34,118,83,.08);
1130
+ color: #91bca9;
1131
+ font-size: 12px;
1132
+ }
1133
+
1134
+ .chat-turn-waiting span {
1135
+ width: 6px;
1136
+ height: 6px;
1137
+ border-radius: 50%;
1138
+ background: #59dfa7;
1139
+ animation: control-room-pulse 1.35s ease-in-out infinite;
1140
+ }
1141
+
1002
1142
  .chat-row.system .chat-avatar {
1003
1143
  color: #67d6b0;
1004
1144
  }