loadtoagent 1.3.10 → 1.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/renderer/app.js CHANGED
@@ -30,6 +30,7 @@ window.LoadToAgentAppFactories.createCore = function createCore(context = {}) {
30
30
  selectedId: null,
31
31
  drawerTab: "chat",
32
32
  drawerMode: "session",
33
+ drawerPresentation: "modal",
33
34
  drawerExecutionId: null,
34
35
  runProvider: "claude",
35
36
  details: new Map(),
@@ -48,6 +49,7 @@ window.LoadToAgentAppFactories.createCore = function createCore(context = {}) {
48
49
  agentCommandDrafts: new Map(),
49
50
  agentCommandTargets: new Map(),
50
51
  agentCommandRoutes: new Map(),
52
+ agentCommandInputModes: new Map(),
51
53
  agentCommandSending: new Set(),
52
54
  pendingConversationMessages: new Map(),
53
55
  stopRequests: new Set(),
@@ -258,6 +260,11 @@ window.LoadToAgentAppFactories.createCore = function createCore(context = {}) {
258
260
  else $("#mobileMoreBtn")?.removeAttribute("aria-current");
259
261
  }
260
262
  function selectView(view, options = {}) {
263
+ if (
264
+ view !== state.view
265
+ && $("#detailDrawer")?.classList.contains("open")
266
+ && $("#detailDrawer")?.dataset.presentation !== "modal"
267
+ ) context.closeDrawer?.(false);
261
268
  state.view = view;
262
269
  state.managementFilter = view === "waiting" ? (options.managementFilter || "all") : "all";
263
270
  state.visibleLimit = 30;
@@ -285,7 +292,10 @@ window.LoadToAgentAppFactories.createCore = function createCore(context = {}) {
285
292
  if (!$("#shortcutHelpModal")?.classList.contains("hidden")) return $("#shortcutHelpModal");
286
293
  if (!$("#runModal").classList.contains("hidden")) return $("#runModal");
287
294
  if (!$("#tmuxCreateModal").classList.contains("hidden")) return $("#tmuxCreateModal");
288
- if ($("#detailDrawer").classList.contains("open")) return $("#detailDrawer");
295
+ if (
296
+ $("#detailDrawer").classList.contains("open")
297
+ && $("#detailDrawer").dataset.presentation === "modal"
298
+ ) return $("#detailDrawer");
289
299
  return null;
290
300
  }
291
301
  function dialogFocusable(dialog) {
@@ -236,6 +236,24 @@
236
236
  "agent.desktop_app": {"ko":"{provider} 데스크톱 앱","en":"{provider} desktop app","zh-CN":"{provider} 桌面应用"},
237
237
  "agent.desktop": {"ko":"데스크톱","en":"desktop","zh-CN":"桌面"},
238
238
  "agent.direct_status": {"ko":"입력 채널 연결됨 · {target}","en":"Input channel connected · {target}","zh-CN":"输入通道已连接 · {target}"},
239
+ "agent.input_mode_label": {"ko":"전송 대상","en":"Send to","zh-CN":"发送到"},
240
+ "agent.input_mode_ai": {"ko":"AI에게 요청","en":"Ask AI","zh-CN":"向 AI 提问"},
241
+ "agent.input_mode_terminal": {"ko":"터미널 명령","en":"Terminal command","zh-CN":"终端命令"},
242
+ "agent.return_to_ai_input": {"ko":"대화 입력으로 돌아가기","en":"Back to conversation input","zh-CN":"返回对话输入"},
243
+ "agent.terminal_direct_input": {"ko":"터미널 직접 입력","en":"Direct terminal input","zh-CN":"终端直接输入"},
244
+ "agent.terminal_input_help": {"ko":"이 입력은 {target} 터미널에 직접 전달됩니다.","en":"This input is sent directly to the {target} terminal.","zh-CN":"此输入将直接发送到 {target} 终端。"},
245
+ "agent.ai_input_help": {"ko":"현재 {provider} 대화로 보냅니다.","en":"Send to the current {provider} conversation.","zh-CN":"发送到当前 {provider} 对话。"},
246
+ "agent.send_terminal": {"ko":"터미널로 보내기 ↵","en":"Send to terminal ↵","zh-CN":"发送到终端 ↵"},
247
+ "agent.send_request": {"ko":"보내기 ↵","en":"Send ↵","zh-CN":"发送 ↵"},
248
+ "agent.terminal_placeholder": {"ko":"실행할 터미널 명령을 입력하세요","en":"Enter a terminal command to run","zh-CN":"输入要执行的终端命令"},
249
+ "agent.delivery_receipt_help": {"ko":"실제 대화 기록과 실행 신호를 계속 확인합니다.","en":"The actual conversation log and execution signals stay under observation.","zh-CN":"将持续检查实际对话记录和执行信号。"},
250
+ "agent.reconnect_terminal": {"ko":"터미널 다시 연결","en":"Reconnect terminal","zh-CN":"重新连接终端"},
251
+ "agent.connected_terminal": {"ko":"연결된 터미널","en":"Connected terminal","zh-CN":"已连接的终端"},
252
+ "agent.terminal_connection": {"ko":"터미널 연결","en":"Terminal connection","zh-CN":"终端连接"},
253
+ "agent.terminal_session_active": {"ko":"{target} · 세션 유지 중","en":"{target} · session active","zh-CN":"{target} · 会话保持中"},
254
+ "agent.terminal_unavailable": {"ko":"연결하거나 재개할 수 있는 터미널이 없습니다.","en":"No terminal is available to connect or resume.","zh-CN":"没有可连接或恢复的终端。"},
255
+ "agent.terminal_command_sent_background": {"ko":"터미널 명령을 백그라운드 세션에 보냈습니다.","en":"Terminal command sent to the background session.","zh-CN":"终端命令已发送到后台会话。"},
256
+ "agent.terminal_command_sent": {"ko":"{target}에 터미널 명령을 보냈습니다.","en":"Terminal command sent to {target}.","zh-CN":"终端命令已发送到 {target}。"},
239
257
  "agent.choose_terminal_count": {"ko":"{count}개 터미널 중 선택","en":"choose from {count} terminals","zh-CN":"从 {count} 个终端中选择"},
240
258
  "agent.handoff_status": {"ko":"외부에서 실행 중 · 관리 터미널로 전환 가능","en":"Running externally · can switch to a managed terminal","zh-CN":"正在外部运行 · 可切换到托管终端"},
241
259
  "agent.resume_status": {"ko":"원래 터미널 종료됨 · 같은 AI 대화를 새 터미널에서 재개 가능","en":"Original terminal ended · the same AI conversation can resume in a new terminal","zh-CN":"原终端已结束 · 可在新终端恢复同一 AI 对话"},
@@ -317,6 +335,13 @@
317
335
  "run.recheck_installation": {"ko":"설치 상태 다시 확인","en":"Check installation again","zh-CN":"重新检查安装状态"},
318
336
  "run.ai_installation_required": {"ko":"AI 설치가 필요합니다","en":"An AI CLI must be installed","zh-CN":"需要安装 AI CLI"},
319
337
  "run.preparing": {"ko":"AI 작업을 준비하는 중…","en":"Preparing the AI task…","zh-CN":"正在准备 AI 任务…"},
338
+ "drawer.resize_panel": {"ko":"대화 패널 너비 조절","en":"Resize conversation panel","zh-CN":"调整对话面板宽度"},
339
+ "drawer.back_to_flow": {"ko":"에이전트 흐름으로 돌아가기","en":"Back to agent flow","zh-CN":"返回智能体流程"},
340
+ "drawer.agent_flow": {"ko":"에이전트 흐름","en":"Agent flow","zh-CN":"智能体流程"},
341
+ "drawer.focus_open": {"ko":"대화 집중 모드 열기","en":"Open conversation focus mode","zh-CN":"打开对话专注模式"},
342
+ "drawer.focus_exit": {"ko":"에이전트 흐름과 나란히 보기","en":"Show beside agent flow","zh-CN":"与智能体流程并排显示"},
343
+ "drawer.focus_mode": {"ko":"집중 모드","en":"Focus mode","zh-CN":"专注模式"},
344
+ "drawer.side_by_side": {"ko":"나란히 보기","en":"Side by side","zh-CN":"并排查看"},
320
345
  "drawer.subagent_title": {"ko":"{name} · 도움 AI 작업 기록","en":"{name} · Helper-AI work history","zh-CN":"{name} · 协助 AI 工作记录"},
321
346
  "drawer.stop_requested": {"ko":"중지 요청 중…","en":"Requesting stop…","zh-CN":"正在请求停止…"},
322
347
  "drawer.stop_run": {"ko":"■ 실행 중지","en":"■ Stop run","zh-CN":"■ 停止运行"},
@@ -799,13 +824,21 @@
799
824
  "terminal.session.confirm_end": {"ko":"{title} 세션과 실행 중인 프로세스를 끝낼까요?\n이 작업은 터미널을 숨기는 것이 아니라 실제 세션을 종료합니다.","en":"End the {title} session and its running process?\nThis ends the actual session rather than merely hiding the terminal.","zh-CN":"要结束 {title} 会话及其正在运行的进程吗?\n此操作会真正结束会话,而不是仅隐藏终端。"},
800
825
  "terminal.session.confirm_end_ai": {"ko":"{title} AI 세션과 실행 중인 작업을 완전히 종료할까요?\n터미널 화면만 닫으려면 ‘터미널 화면 닫기’를 사용하세요.","en":"Completely end the {title} AI session and its running work?\nUse ‘Close terminal view’ to hide only the terminal.","zh-CN":"要完全结束 {title} AI 会话及其正在运行的任务吗?\n若只想隐藏终端,请使用“关闭终端视图”。"},
801
826
  "terminal.session.ended": {"ko":"터미널 세션을 종료했습니다.","en":"Terminal session ended.","zh-CN":"终端会话已结束。"},
827
+ "terminal.session.reconnected": {"ko":"실행 중인 tmux 세션에 다시 연결했습니다.","en":"Reconnected to the running tmux session.","zh-CN":"已重新连接到正在运行的 tmux 会话。"},
802
828
  "terminal.session.restarted": {"ko":"명령창을 다시 시작했습니다.","en":"Terminal restarted.","zh-CN":"终端已重新启动。"},
829
+ "terminal.session.stopped": {"ko":"tmux 작업을 종료하고 세션 기록은 남겼습니다.","en":"Stopped the tmux work and kept the session record.","zh-CN":"已停止 tmux 工作并保留会话记录。"},
803
830
  "terminal.signal.cleared": {"ko":"화면을 정리했습니다.","en":"Screen cleared.","zh-CN":"屏幕已清空。"},
804
831
  "terminal.signal.interrupt_sent": {"ko":"Ctrl+C를 보냈습니다.","en":"Sent Ctrl+C.","zh-CN":"已发送 Ctrl+C。"},
805
832
  "terminal.signal.key_sent": {"ko":"{key}를 보냈습니다.","en":"Sent {key}.","zh-CN":"已发送 {key}。"},
806
833
  "terminal.status.exited": {"ko":"끝남","en":"Ended","zh-CN":"已结束"},
807
834
  "terminal.status.failed": {"ko":"열지 못함","en":"Failed to open","zh-CN":"打开失败"},
808
835
  "terminal.status.running": {"ko":"세션 유지 중","en":"Session active","zh-CN":"会话保持中"},
836
+ "terminal.status.detached": {"ko":"화면 분리됨","en":"View detached","zh-CN":"界面已分离"},
837
+ "terminal.status.stopped": {"ko":"작업 중지됨","en":"Work stopped","zh-CN":"工作已停止"},
838
+ "terminal.detached_work_continues": {"ko":"화면만 분리되었습니다. tmux 작업은 백그라운드에서 계속됩니다.","en":"Only the view is detached. The tmux work continues in the background.","zh-CN":"仅界面已分离,tmux 工作仍在后台继续。"},
839
+ "terminal.stopped_record_kept": {"ko":"작업은 종료됐고 세션 기록은 보존되어 있습니다.","en":"The work has stopped and the session record is preserved.","zh-CN":"工作已停止,会话记录已保留。"},
840
+ "terminal.reconnect": {"ko":"기존 작업 다시 연결","en":"Reconnect existing work","zh-CN":"重新连接现有工作"},
841
+ "terminal.remove_session_record": {"ko":"세션 기록 제거","en":"Remove session record","zh-CN":"移除会话记录"},
809
842
  "terminal.monitor.attention_count": {"ko":"확인 필요 {count}","en":"{count} need attention","zh-CN":"{count} 个需要确认"},
810
843
  "terminal.view.font_size": {"ko":"터미널 글자 크기","en":"Terminal font size","zh-CN":"终端字号"},
811
844
  "terminal.view.font_decrease": {"ko":"터미널 글자 작게","en":"Decrease terminal font","zh-CN":"减小终端字号"},
@@ -1443,6 +1476,8 @@
1443
1476
  "control.project_filter": {"ko":"프로젝트별 실행 세션 필터","en":"Filter live sessions by project","zh-CN":"按项目筛选运行会话"},
1444
1477
  "control.project_live_attention_summary": {"ko":"실행 중 {active} · 확인 필요 {attention}","en":"{active} running · {attention} need attention","zh-CN":"运行中 {active} · 需确认 {attention}"},
1445
1478
  "control.project_live_summary": {"ko":"실행 중 {active}","en":"{active} running","zh-CN":"运行中 {active}"},
1479
+ "control.project_tmux_summary": {"ko":"tmux {count}개","en":"{count} tmux","zh-CN":"tmux {count} 个"},
1480
+ "control.project_tmux_help": {"ko":"이 프로젝트 경로에서 직접 감지한 AI 터미널","en":"AI terminals detected directly from this project path","zh-CN":"从此项目路径直接检测到的 AI 终端"},
1446
1481
  "control.recent_activity": {"ko":"최근 활동순","en":"Recent activity","zh-CN":"最近活动"},
1447
1482
  "control.search_sessions": {"ko":"실행 세션 검색","en":"Search live sessions","zh-CN":"搜索运行会话"},
1448
1483
  "control.sort_sessions": {"ko":"실행 세션 정렬","en":"Sort live sessions","zh-CN":"排序运行会话"},
@@ -389,7 +389,9 @@
389
389
 
390
390
  <div id="drawerBackdrop" class="drawer-backdrop hidden"></div>
391
391
  <aside id="detailDrawer" class="detail-drawer" role="dialog" aria-modal="true" aria-labelledby="drawerTitle" aria-hidden="true" tabindex="-1" inert>
392
+ <div id="drawerResizeHandle" class="drawer-resize-handle hidden" role="separator" aria-orientation="vertical" aria-label="대화 패널 너비 조절" data-i18n-aria-label="drawer.resize_panel" aria-valuemin="560" aria-valuemax="860" aria-valuenow="640" tabindex="0"></div>
392
393
  <div class="drawer-head">
394
+ <button id="drawerBackToFlowBtn" class="drawer-flow-button hidden" type="button" aria-label="에이전트 흐름으로 돌아가기" data-i18n-aria-label="drawer.back_to_flow"><span aria-hidden="true">←</span><b data-i18n="drawer.agent_flow">에이전트 흐름</b></button>
393
395
  <div id="drawerProviderMark" class="provider-mark">AI</div>
394
396
  <div class="drawer-title"><span id="drawerProvider" data-i18n="ui.ai_task">AI 작업</span><h2 id="drawerTitle" data-i18n="drawer.title">작업 자세히 보기</h2></div>
395
397
  <button id="closeDrawerBtn" class="close-button" type="button" aria-label="닫기" data-i18n-aria-label="common.close">×</button>
@@ -1125,6 +1125,9 @@ button[aria-busy="true"] {
1125
1125
 
1126
1126
  .chat-answer-kind.is-live {
1127
1127
  position: relative;
1128
+ display: inline-flex;
1129
+ align-items: center;
1130
+ gap: 6px;
1128
1131
  padding-left: 18px;
1129
1132
  border-color: rgba(71,214,153,.3);
1130
1133
  background: rgba(34,118,83,.12);
@@ -1144,6 +1147,51 @@ button[aria-busy="true"] {
1144
1147
  animation: control-room-pulse 1.35s ease-in-out infinite;
1145
1148
  }
1146
1149
 
1150
+ .chat-working-dots {
1151
+ display: inline-flex;
1152
+ align-items: center;
1153
+ gap: 2px;
1154
+ height: 9px;
1155
+ }
1156
+
1157
+ .chat-working-dots i {
1158
+ width: 3px;
1159
+ height: 3px;
1160
+ border-radius: 50%;
1161
+ background: currentColor;
1162
+ box-shadow: 0 0 5px rgba(89,223,167,.45);
1163
+ animation: chat-working-dot 1.05s ease-in-out infinite;
1164
+ }
1165
+
1166
+ .chat-working-dots i:nth-child(2) {
1167
+ animation-delay: 140ms;
1168
+ }
1169
+
1170
+ .chat-working-dots i:nth-child(3) {
1171
+ animation-delay: 280ms;
1172
+ }
1173
+
1174
+ @keyframes chat-working-dot {
1175
+ 0%,
1176
+ 60%,
1177
+ 100% {
1178
+ opacity: .38;
1179
+ transform: translateY(1px);
1180
+ }
1181
+ 30% {
1182
+ opacity: 1;
1183
+ transform: translateY(-2px);
1184
+ }
1185
+ }
1186
+
1187
+ @media (prefers-reduced-motion: reduce) {
1188
+ .chat-working-dots i {
1189
+ opacity: .72;
1190
+ animation: none;
1191
+ transform: none;
1192
+ }
1193
+ }
1194
+
1147
1195
  .chat-delivery-progress {
1148
1196
  display: grid;
1149
1197
  gap: 11px;
@@ -780,6 +780,51 @@ body details.control-room-project-group > summary.control-project-header {
780
780
  padding: 9px 10px;
781
781
  }
782
782
 
783
+ .control-project-tmux-section {
784
+ padding: 12px 14px 14px;
785
+ border-top: 1px solid rgba(104,130,151,.17);
786
+ background: rgba(8,14,20,.42);
787
+ }
788
+
789
+ .control-project-tmux-section > header {
790
+ min-height: 28px;
791
+ display: flex;
792
+ align-items: center;
793
+ justify-content: space-between;
794
+ gap: 12px;
795
+ padding: 0 2px 8px;
796
+ }
797
+
798
+ .control-project-tmux-section > header > span {
799
+ display: inline-flex;
800
+ align-items: center;
801
+ gap: 7px;
802
+ color: #78dfbd;
803
+ }
804
+
805
+ .control-project-tmux-section > header i {
806
+ font-size: 12px;
807
+ font-style: normal;
808
+ }
809
+
810
+ .control-project-tmux-section > header b {
811
+ color: #c8ddd6;
812
+ font-size: 12px;
813
+ }
814
+
815
+ .control-project-tmux-section > header small {
816
+ overflow: hidden;
817
+ color: #708493;
818
+ font-size: 12px;
819
+ text-overflow: ellipsis;
820
+ white-space: nowrap;
821
+ }
822
+
823
+ .control-project-tmux-section .live-tmux-grid {
824
+ grid-template-columns: repeat(auto-fit,minmax(260px,1fr));
825
+ padding: 0;
826
+ }
827
+
783
828
  .control-room-project-group:not([open]) .control-project-header {
784
829
  min-height: 50px !important;
785
830
  }
@@ -2258,3 +2303,402 @@ body details.control-room-project-group > summary.control-project-header {
2258
2303
  animation: none!important;
2259
2304
  }
2260
2305
  }
2306
+
2307
+ /*
2308
+ * Conversation workspace
2309
+ * ----------------------
2310
+ * Live-flow entries open beside the graph and keep terminal controls secondary
2311
+ * until the user explicitly asks for direct terminal input.
2312
+ */
2313
+
2314
+ :root {
2315
+ --conversation-panel-width: clamp(600px,40vw,680px);
2316
+ }
2317
+
2318
+ .drawer-flow-button {
2319
+ min-height: 36px;
2320
+ display: inline-flex;
2321
+ align-items: center;
2322
+ justify-content: center;
2323
+ gap: 7px;
2324
+ padding: 0 10px;
2325
+ border: 1px solid #304050;
2326
+ border-radius: 9px;
2327
+ background: rgba(17,25,36,.92);
2328
+ color: #b9c7d2;
2329
+ font: inherit;
2330
+ font-size: 12px;
2331
+ white-space: nowrap;
2332
+ flex: 0 0 auto;
2333
+ cursor: pointer;
2334
+ transition: border-color var(--motion-fast) ease,background-color var(--motion-fast) ease,color var(--motion-fast) ease,transform var(--motion-fast) ease;
2335
+ }
2336
+
2337
+ .drawer-flow-button:hover {
2338
+ border-color: color-mix(in srgb,var(--drawer-provider,#79d9f8) 50%,#304050);
2339
+ background: color-mix(in srgb,var(--drawer-provider,#79d9f8) 8%,#111924);
2340
+ color: #f3f7fa;
2341
+ }
2342
+
2343
+ .drawer-flow-button:active {
2344
+ transform: translateY(1px);
2345
+ }
2346
+
2347
+ .drawer-flow-button > span {
2348
+ color: var(--drawer-provider,#79d9f8);
2349
+ font-style: normal;
2350
+ }
2351
+
2352
+ .drawer-flow-button b {
2353
+ font-weight: 720;
2354
+ }
2355
+
2356
+ .drawer-resize-handle {
2357
+ position: absolute;
2358
+ z-index: 4;
2359
+ inset: 0 auto 0 -7px;
2360
+ width: 14px;
2361
+ cursor: col-resize;
2362
+ touch-action: none;
2363
+ }
2364
+
2365
+ .drawer-resize-handle::before {
2366
+ position: absolute;
2367
+ top: 50%;
2368
+ left: 5px;
2369
+ width: 3px;
2370
+ height: 58px;
2371
+ border-radius: 99px;
2372
+ background: #31485b;
2373
+ box-shadow: 0 0 0 1px rgba(8,14,21,.8);
2374
+ content: "";
2375
+ opacity: .62;
2376
+ transform: translateY(-50%);
2377
+ transition: height var(--motion-fast) ease,background-color var(--motion-fast) ease,opacity var(--motion-fast) ease;
2378
+ }
2379
+
2380
+ .drawer-resize-handle:hover::before,
2381
+ .drawer-resize-handle:focus-visible::before,
2382
+ body.conversation-panel-resizing .drawer-resize-handle::before {
2383
+ height: 88px;
2384
+ background: var(--drawer-provider,#79d9f8);
2385
+ opacity: 1;
2386
+ }
2387
+
2388
+ body.conversation-panel-resizing {
2389
+ cursor: col-resize;
2390
+ user-select: none;
2391
+ }
2392
+
2393
+ .conversation-composer-shell {
2394
+ display: grid;
2395
+ gap: 8px;
2396
+ }
2397
+
2398
+ .agent-command-actions .conversation-terminal-toggle {
2399
+ min-width: 0;
2400
+ border-color: #2c3c49;
2401
+ background: transparent;
2402
+ color: #82939f;
2403
+ }
2404
+
2405
+ .agent-command-actions .conversation-terminal-toggle > span {
2406
+ margin-right: 6px;
2407
+ color: #65b9cc;
2408
+ font-family: "Cascadia Code",Consolas,monospace;
2409
+ font-size: 11px;
2410
+ font-weight: 800;
2411
+ }
2412
+
2413
+ .conversation-terminal-expanded > span {
2414
+ min-width: 0;
2415
+ }
2416
+
2417
+ .conversation-terminal-expanded > span b,
2418
+ .conversation-terminal-expanded > span small {
2419
+ display: block;
2420
+ overflow: hidden;
2421
+ text-overflow: ellipsis;
2422
+ white-space: nowrap;
2423
+ }
2424
+
2425
+ .conversation-terminal-expanded > span b {
2426
+ color: #c8d2db;
2427
+ font-size: 12px;
2428
+ }
2429
+
2430
+ .conversation-terminal-expanded > span small {
2431
+ margin-top: 2px;
2432
+ color: #7f8f9d!important;
2433
+ }
2434
+
2435
+ .conversation-terminal-expanded > button,
2436
+ .conversation-terminal-expanded > [data-agent-terminal-open],
2437
+ .conversation-terminal-expanded > [data-resume-agent] {
2438
+ min-height: 32px;
2439
+ padding: 0 10px;
2440
+ border: 1px solid #34495a;
2441
+ border-radius: 8px;
2442
+ background: #121d28;
2443
+ color: #adbecb;
2444
+ font: inherit;
2445
+ font-size: 12px;
2446
+ font-weight: 680;
2447
+ cursor: pointer;
2448
+ }
2449
+
2450
+ .conversation-terminal-expanded > button:hover:not(:disabled) {
2451
+ border-color: #4d7188;
2452
+ color: #eef6fa;
2453
+ }
2454
+
2455
+ .conversation-terminal-expanded button:disabled {
2456
+ opacity: .4;
2457
+ cursor: not-allowed;
2458
+ }
2459
+
2460
+ .conversation-terminal-expanded {
2461
+ min-width: 0;
2462
+ display: grid;
2463
+ grid-template-columns: auto minmax(0,1fr) auto;
2464
+ align-items: center;
2465
+ gap: 10px;
2466
+ padding: 6px;
2467
+ border: 1px solid rgba(91,169,255,.22);
2468
+ border-radius: 10px;
2469
+ background: rgba(91,169,255,.045);
2470
+ }
2471
+
2472
+ .conversation-terminal-expanded > button:first-child {
2473
+ border-color: transparent;
2474
+ background: transparent;
2475
+ }
2476
+
2477
+ .conversation-terminal-expanded > button:first-child > span {
2478
+ margin-right: 6px;
2479
+ color: #79d9f8;
2480
+ }
2481
+
2482
+ @media (min-width:1280px) {
2483
+ body.conversation-context-open #appShell {
2484
+ width: calc(100vw - var(--conversation-panel-width));
2485
+ max-width: calc(100vw - var(--conversation-panel-width));
2486
+ transition: width var(--motion-medium) var(--motion-ease),max-width var(--motion-medium) var(--motion-ease);
2487
+ }
2488
+
2489
+ body.conversation-context-open {
2490
+ --sidebar: clamp(220px,16vw,272px);
2491
+ }
2492
+
2493
+ body.conversation-context-open .main-stage {
2494
+ padding-inline: clamp(18px,1.6vw,28px);
2495
+ }
2496
+
2497
+ body.conversation-context-open[data-current-view="all"] .topbar {
2498
+ display: block;
2499
+ }
2500
+
2501
+ body.conversation-context-open[data-current-view="all"] .topbar .eyebrow,
2502
+ body.conversation-context-open[data-current-view="all"] .topbar .subtitle {
2503
+ display: none;
2504
+ }
2505
+
2506
+ body.conversation-context-open[data-current-view="all"] .topbar h1 {
2507
+ max-width: 640px;
2508
+ font-size: clamp(25px,2.2vw,32px);
2509
+ line-height: 1.18;
2510
+ }
2511
+
2512
+ body.conversation-context-open[data-current-view="all"] .top-actions {
2513
+ width: 100%;
2514
+ flex-wrap: nowrap;
2515
+ justify-content: flex-start;
2516
+ gap: 8px;
2517
+ margin-top: 14px;
2518
+ padding-top: 0;
2519
+ }
2520
+
2521
+ body.conversation-context-open[data-current-view="all"] #guideBtn {
2522
+ width: 44px;
2523
+ min-width: 44px;
2524
+ padding: 0;
2525
+ }
2526
+
2527
+ body.conversation-context-open[data-current-view="all"] #guideBtn > span:nth-child(2),
2528
+ body.conversation-context-open[data-current-view="all"] .new-run-cta-copy {
2529
+ display: none;
2530
+ }
2531
+
2532
+ body.conversation-context-open[data-current-view="all"] .sync-state {
2533
+ max-width: 168px;
2534
+ }
2535
+
2536
+ body.conversation-context-open[data-current-view="all"] .new-run-cta {
2537
+ width: 48px;
2538
+ min-width: 48px;
2539
+ padding-inline: 0;
2540
+ }
2541
+
2542
+ body.conversation-context-open .detail-drawer[data-presentation="context"] {
2543
+ width: var(--conversation-panel-width);
2544
+ border-left-color: #304253;
2545
+ box-shadow: -12px 0 38px rgba(0,0,0,.28);
2546
+ }
2547
+
2548
+ body.conversation-context-open .detail-drawer .drawer-head {
2549
+ min-height: 58px;
2550
+ display: grid;
2551
+ grid-template-columns: auto minmax(0,1fr);
2552
+ padding: 11px 18px 8px;
2553
+ gap: 12px;
2554
+ }
2555
+
2556
+ body.conversation-context-open .detail-drawer .provider-mark,
2557
+ body.conversation-context-open .detail-drawer .close-button {
2558
+ display: none;
2559
+ }
2560
+
2561
+ body.conversation-context-open .detail-drawer .drawer-title h2 {
2562
+ margin-top: 0;
2563
+ font-size: 16px;
2564
+ }
2565
+
2566
+ body.conversation-context-open .detail-drawer .drawer-title > span {
2567
+ display: none;
2568
+ }
2569
+
2570
+ body.conversation-context-open .detail-drawer .drawer-meta {
2571
+ padding: 0 18px 10px;
2572
+ }
2573
+
2574
+ body.conversation-context-open .detail-drawer .drawer-tabs {
2575
+ padding-inline: 18px;
2576
+ }
2577
+
2578
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .drawer-tabs,
2579
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-work-source {
2580
+ display: none;
2581
+ }
2582
+
2583
+ body.conversation-context-open .detail-drawer .drawer-content {
2584
+ padding: 18px 20px 24px;
2585
+ background: #0d141d;
2586
+ }
2587
+
2588
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .drawer-content {
2589
+ padding-top: 14px;
2590
+ }
2591
+
2592
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-assignment-card {
2593
+ grid-template-columns: minmax(0,1fr);
2594
+ gap: 0;
2595
+ margin-bottom: 14px;
2596
+ padding: 0 0 14px;
2597
+ border: 0;
2598
+ border-bottom: 1px solid #22313e;
2599
+ border-radius: 0;
2600
+ background: transparent;
2601
+ }
2602
+
2603
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-assignment-card > span,
2604
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-assignment-card small {
2605
+ display: none;
2606
+ }
2607
+
2608
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-assignment-card b {
2609
+ color: #77c8d6;
2610
+ font-size: 11px;
2611
+ }
2612
+
2613
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-assignment-card p {
2614
+ margin-top: 5px;
2615
+ color: #b8c6d1;
2616
+ font-size: 12px;
2617
+ line-height: 1.5;
2618
+ }
2619
+
2620
+ body.conversation-context-open .detail-drawer[data-mode="subagent"] .subagent-work-source + .chat-history-head {
2621
+ top: -14px;
2622
+ margin: -14px 0 14px;
2623
+ padding-top: 10px;
2624
+ }
2625
+
2626
+ body.conversation-context-open .detail-drawer .chat-list {
2627
+ gap: 22px;
2628
+ }
2629
+
2630
+ body.conversation-context-open .detail-drawer .chat-turn {
2631
+ gap: 16px;
2632
+ padding-bottom: 22px;
2633
+ }
2634
+
2635
+ body.conversation-context-open .detail-drawer .chat-content.markdown {
2636
+ padding: 2px 0;
2637
+ border: 0;
2638
+ border-radius: 0;
2639
+ background: transparent;
2640
+ color: #d1dae2;
2641
+ font-size: 14px;
2642
+ line-height: 1.72;
2643
+ }
2644
+
2645
+ body.conversation-context-open .detail-drawer .chat-row.user .chat-content.markdown {
2646
+ padding: 10px 12px;
2647
+ border-left: 2px solid color-mix(in srgb,var(--drawer-provider,#79d9f8) 65%,#526271);
2648
+ border-radius: 0 8px 8px 0;
2649
+ background: rgba(255,255,255,.025);
2650
+ }
2651
+
2652
+ body.conversation-context-open .detail-drawer .chat-row {
2653
+ grid-template-columns: 31px minmax(0,1fr);
2654
+ gap: 12px;
2655
+ }
2656
+
2657
+ body.conversation-context-open .detail-drawer .chat-avatar {
2658
+ width: 29px;
2659
+ height: 29px;
2660
+ }
2661
+
2662
+ body.conversation-context-open .detail-drawer .chat-history-head {
2663
+ top: -18px;
2664
+ background: linear-gradient(180deg,#0d141d 78%,rgba(13,20,29,.94));
2665
+ }
2666
+
2667
+ body.conversation-context-open .drawer-composer {
2668
+ padding: 8px 14px 12px;
2669
+ border-top-color: #2b3a48;
2670
+ background: #0a1119;
2671
+ box-shadow: 0 -10px 28px rgba(0,0,0,.2);
2672
+ }
2673
+
2674
+ body.conversation-context-open .conversation-composer-shell {
2675
+ gap: 6px;
2676
+ }
2677
+
2678
+ body.conversation-context-open .drawer-composer .agent-command-panel {
2679
+ gap: 7px;
2680
+ padding: 0;
2681
+ border: 0;
2682
+ border-radius: 0;
2683
+ background: transparent;
2684
+ box-shadow: none;
2685
+ }
2686
+
2687
+ body.conversation-context-open .drawer-composer .conversation-composer > header {
2688
+ display: none;
2689
+ }
2690
+
2691
+ body.conversation-context-open .drawer-composer textarea {
2692
+ min-height: 52px;
2693
+ font-size: 13px;
2694
+ }
2695
+
2696
+ body.conversation-context-open .conversation-composer-shell.mode-terminal .agent-command-panel {
2697
+ padding-top: 2px;
2698
+ }
2699
+
2700
+ body.conversation-panel-resizing #appShell,
2701
+ body.conversation-panel-resizing .detail-drawer {
2702
+ transition: none!important;
2703
+ }
2704
+ }
@@ -1472,6 +1472,8 @@ body[data-current-view="terminal"] .topbar h1 {
1472
1472
  }
1473
1473
 
1474
1474
  .terminal-session-item[data-status="running"] { border-left-color: #51dbae; }
1475
+ .terminal-session-item[data-status="detached"] { border-left-color: #7ba9d8; }
1476
+ .terminal-session-item[data-status="stopped"] { border-left-color: #667783; opacity: .88; }
1475
1477
  .terminal-session-item[data-status="attention"] { border-color: #60482f; border-left-color: #f0ad62; background: linear-gradient(100deg,rgba(133,83,31,.18),#0d171e 58%); }
1476
1478
  .terminal-session-item[data-status="failed"] { border-color: #58323c; border-left-color: #ef7d8e; }
1477
1479
  .terminal-session-item[data-status="completed"] { border-left-color: #6cbdd1; }
@@ -1500,6 +1502,10 @@ body[data-current-view="terminal"] .topbar h1 {
1500
1502
  .terminal-session-status i { width: 6px; height: 6px; border-radius: 50%; background: #657581; }
1501
1503
  .terminal-session-status[data-status="running"] { border-color: #2e6958; color: #86e8c5; background: #102921; }
1502
1504
  .terminal-session-status[data-status="running"] i { background: #55e2ad; box-shadow: 0 0 8px rgba(85,226,173,.65); }
1505
+ .terminal-session-status[data-status="detached"] { border-color: #365875; color: #a8d1f2; background: #112333; }
1506
+ .terminal-session-status[data-status="detached"] i { background: #78afe0; }
1507
+ .terminal-session-status[data-status="stopped"] { border-color: #3b4a54; color: #a8b4bc; background: #141d23; }
1508
+ .terminal-session-status[data-status="stopped"] i { background: #71818c; }
1503
1509
  .terminal-session-status[data-status="attention"] { border-color: #725432; color: #f3bb77; background: #2a2014; }
1504
1510
  .terminal-session-status[data-status="attention"] i { background: #ffbd66; box-shadow: 0 0 8px rgba(255,189,102,.5); }
1505
1511
  .terminal-session-status[data-status="failed"] { border-color: #6f3b47; color: #f3a0ad; background: #29161d; }