Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/ui/src/components/RunningDots.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
export function RunningDots() {
return (
<div className="flex items-center gap-[2px] shrink-0">
<span className="size-dot rounded-full bg-brand animate-running-dot-1" />
<span className="size-dot rounded-full bg-brand animate-running-dot-2" />
<span className="size-dot rounded-full bg-brand animate-running-dot-3" />
<span className="size-dot rounded-full bg-brand animate-running-dot-1 motion-reduce:animate-none" />
<span className="size-dot rounded-full bg-brand animate-running-dot-2 motion-reduce:animate-none" />
<span className="size-dot rounded-full bg-brand animate-running-dot-3 motion-reduce:animate-none" />
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import {
} from 'react';
import { useQueryClient } from '@tanstack/react-query';
import {
CircleIcon,
SpinnerIcon,
TerminalWindowIcon,
WarningIcon,
Expand Down Expand Up @@ -58,6 +57,7 @@ import { ChatScriptPlaceholder } from '@vibe/ui/components/ChatScriptPlaceholder
import { ScriptFixerDialog } from '@/shared/dialogs/scripts/ScriptFixerDialog';
import { ChatForkBranches } from '@vibe/ui/components/ChatForkBranches';
import { Badge } from '@vibe/ui/components/Badge';
import { RunningDots } from '@vibe/ui/components/RunningDots';
import { UnassignedCliSessions } from './UnassignedCliSessions';
import { shouldShowForeignWriterBanner } from '../model/foreignWriterBanner';
import { sessionsApi } from '@/shared/lib/api';
Expand Down Expand Up @@ -1041,12 +1041,8 @@ export const ConversationList = forwardRef<
variant="outline"
className="pointer-events-none gap-half border-border bg-primary/90 font-normal text-normal shadow-sm backdrop-blur-sm"
>
<CircleIcon
className="size-2 text-brand"
weight="fill"
aria-hidden="true"
/>
{t('conversation.cliSessionActive')}
<RunningDots />
{t('conversation.cliAgentWorking')}
</Badge>
)}
</div>
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "The coding agent is running this task in chat. The terminal will take over with the same conversation as soon as it finishes — no need to repeat the prompt here.",
"agentRunningViewChat": "Watch progress in chat",
"setupRunningTitle": "Preparing the workspace",
"setupRunningBody": "A setup script is running. The terminal will open with your prompt as soon as it finishes."
"setupRunningBody": "A setup script is running. The terminal will open with your prompt as soon as it finishes.",
"working": "Working…",
"idle": "Idle"
},
"loopAutomation": {
"label": "Keep going",
Expand Down Expand Up @@ -74,7 +76,7 @@
"thinking": "Thinking",
"assistant": "Claude",
"viaCli": "via CLI",
"cliSessionActive": "CLI session active",
"cliAgentWorking": "Agent working…",
"foreignWriter": {
"message": "This conversation is being edited outside the app.",
"dismiss": "Dismiss outside-editor notice"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/es/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "El agente de código está ejecutando esta tarea en el chat. La terminal continuará con la misma conversación en cuanto termine — no hace falta repetir el prompt aquí.",
"agentRunningViewChat": "Ver progreso en el chat",
"setupRunningTitle": "Preparando el workspace",
"setupRunningBody": "Se está ejecutando un script de configuración. La terminal se abrirá con tu prompt en cuanto termine."
"setupRunningBody": "Se está ejecutando un script de configuración. La terminal se abrirá con tu prompt en cuanto termine.",
"working": "Trabajando…",
"idle": "Inactivo"
},
"loopAutomation": {
"label": "Continuar",
Expand Down Expand Up @@ -82,7 +84,7 @@
"thinking": "Pensando",
"assistant": "Claude",
"viaCli": "vía CLI",
"cliSessionActive": "Sesión CLI activa",
"cliAgentWorking": "Agente trabajando…",
"foreignWriter": {
"message": "Esta conversación se está editando fuera de la aplicación.",
"dismiss": "Cerrar aviso de edición externa"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/fr/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "L'agent de code exécute cette tâche dans le chat. Le terminal reprendra la même conversation dès qu'il aura terminé — inutile de répéter le prompt ici.",
"agentRunningViewChat": "Suivre la progression dans le chat",
"setupRunningTitle": "Préparation de l'espace de travail",
"setupRunningBody": "Un script d'installation est en cours d'exécution. Le terminal s'ouvrira avec votre prompt dès qu'il sera terminé."
"setupRunningBody": "Un script d'installation est en cours d'exécution. Le terminal s'ouvrira avec votre prompt dès qu'il sera terminé.",
"working": "En cours…",
"idle": "Inactif"
},
"loopAutomation": {
"label": "Continuer",
Expand Down Expand Up @@ -69,7 +71,7 @@
"thinking": "Réflexion",
"assistant": "Claude",
"viaCli": "via la CLI",
"cliSessionActive": "Session CLI active",
"cliAgentWorking": "L’agent travaille…",
"foreignWriter": {
"message": "Cette conversation est en cours de modification en dehors de l'application.",
"dismiss": "Fermer l'avis de modification externe"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/ja/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "コーディングエージェントがチャットでこのタスクを実行中です。完了するとターミナルが同じ会話を引き継ぎます — ここでプロンプトを繰り返す必要はありません。",
"agentRunningViewChat": "チャットで進捗を見る",
"setupRunningTitle": "ワークスペースを準備しています",
"setupRunningBody": "セットアップスクリプトを実行中です。完了するとターミナルがプロンプトとともに開きます。"
"setupRunningBody": "セットアップスクリプトを実行中です。完了するとターミナルがプロンプトとともに開きます。",
"working": "作業中…",
"idle": "待機中"
},
"loopAutomation": {
"label": "継続",
Expand Down Expand Up @@ -82,7 +84,7 @@
"thinking": "思考中",
"assistant": "Claude",
"viaCli": "CLI 経由",
"cliSessionActive": "CLI セッションがアクティブ",
"cliAgentWorking": "エージェントが作業中…",
"foreignWriter": {
"message": "この会話はアプリの外部で編集されています。",
"dismiss": "外部編集の通知を閉じる"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/ko/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "코딩 에이전트가 채팅에서 이 작업을 실행 중입니다. 완료되면 터미널이 같은 대화를 이어받습니다 — 여기서 프롬프트를 반복할 필요가 없습니다.",
"agentRunningViewChat": "채팅에서 진행 상황 보기",
"setupRunningTitle": "워크스페이스를 준비하는 중",
"setupRunningBody": "설정 스크립트가 실행 중입니다. 완료되면 터미널이 프롬프트와 함께 열립니다."
"setupRunningBody": "설정 스크립트가 실행 중입니다. 완료되면 터미널이 프롬프트와 함께 열립니다.",
"working": "작업 중…",
"idle": "대기 중"
},
"loopAutomation": {
"label": "계속하기",
Expand Down Expand Up @@ -82,7 +84,7 @@
"thinking": "생각 중",
"assistant": "Claude",
"viaCli": "CLI를 통해",
"cliSessionActive": "CLI 세션 활성",
"cliAgentWorking": "에이전트가 작업 중…",
"foreignWriter": {
"message": "이 대화는 앱 외부에서 편집 중입니다.",
"dismiss": "외부 편집 알림 닫기"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/zh-Hans/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "编码代理正在聊天中执行此任务。完成后终端将接管同一会话 — 无需在此重复提示。",
"agentRunningViewChat": "在聊天中查看进度",
"setupRunningTitle": "正在准备工作区",
"setupRunningBody": "安装脚本正在运行。完成后终端将带着你的提示打开。"
"setupRunningBody": "安装脚本正在运行。完成后终端将带着你的提示打开。",
"working": "工作中…",
"idle": "空闲"
},
"loopAutomation": {
"label": "继续运行",
Expand Down Expand Up @@ -69,7 +71,7 @@
"thinking": "思考中",
"assistant": "Claude",
"viaCli": "通过 CLI",
"cliSessionActive": "CLI 会话活跃",
"cliAgentWorking": "代理正在工作…",
"foreignWriter": {
"message": "此对话正在应用外进行编辑。",
"dismiss": "关闭外部编辑提示"
Expand Down
6 changes: 4 additions & 2 deletions packages/web-core/src/i18n/locales/zh-Hant/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
"agentRunningBody": "編碼代理正在聊天中執行此任務。完成後終端將接管同一會話 — 無需在此重複提示。",
"agentRunningViewChat": "在聊天中查看進度",
"setupRunningTitle": "正在準備工作區",
"setupRunningBody": "安裝腳本正在執行。完成後終端將帶著你的提示開啟。"
"setupRunningBody": "安裝腳本正在執行。完成後終端將帶著你的提示開啟。",
"working": "工作中…",
"idle": "閒置"
},
"loopAutomation": {
"label": "繼續執行",
Expand Down Expand Up @@ -69,7 +71,7 @@
"thinking": "思考中",
"assistant": "Claude",
"viaCli": "透過 CLI",
"cliSessionActive": "CLI 工作階段使用中",
"cliAgentWorking": "代理正在工作…",
"foreignWriter": {
"message": "此對話正在應用程式外進行編輯。",
"dismiss": "關閉外部編輯提示"
Expand Down
44 changes: 43 additions & 1 deletion packages/web-core/src/pages/workspaces/CliMainPane.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { ChatsTeardropIcon, CircleNotchIcon } from '@phosphor-icons/react';
import {
ChatsTeardropIcon,
CircleIcon,
CircleNotchIcon,
} from '@phosphor-icons/react';

import { XTermInstance } from '@/shared/components/XTermInstance';
import { LoopAutomationControl } from '@/shared/components/LoopAutomationControl';
Expand Down Expand Up @@ -37,6 +41,13 @@ interface CliMainPaneProps {
* "claude is working in chat" and "preparing the workspace".
*/
codingAgentRunning?: boolean;
/**
* The CLI tmux `claude` pane is actively producing output right now (live
* `is_running`, executor excluded). Drives the header working/idle indicator
* — NOT the full-screen executor notice, so the live terminal stays visible
* while the agent works.
*/
cliRunning?: boolean;
}

/**
Expand All @@ -55,6 +66,7 @@ export function CliMainPane({
sessionsReady = true,
executorRunning = false,
codingAgentRunning = false,
cliRunning = false,
}: CliMainPaneProps) {
const { t } = useTranslation('common');
const { closeTab } = useTerminal();
Expand All @@ -76,6 +88,36 @@ export function CliMainPane({
</span>
</span>
<div className="flex items-center gap-2 md:gap-3 shrink-0">
{sessionsReady && !executorRunning && (
<span
aria-hidden="true"
className="flex items-center gap-1 shrink-0"
>
{cliRunning ? (
<>
<CircleNotchIcon
className="size-icon-sm animate-spin motion-reduce:animate-none text-brand shrink-0"
weight="bold"
aria-hidden="true"
/>
<span className="text-xs text-normal hidden md:inline">
{t('cliMode.working')}
</span>
</>
) : (
<>
<CircleIcon
className="size-2 text-low shrink-0"
weight="fill"
aria-hidden="true"
/>
<span className="text-xs text-low hidden md:inline">
{t('cliMode.idle')}
</span>
</>
)}
</span>
)}
<LoopAutomationControl workspaceId={workspaceId} />
<button
type="button"
Expand Down
2 changes: 2 additions & 0 deletions packages/web-core/src/pages/workspaces/WorkspacesLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,7 @@ export function WorkspacesLayout() {
activeWorkspaces.find((w) => w.id === selectedWorkspace.id)
?.isCodingAgentRunning ?? false
}
cliRunning={cliSessionActive}
/>
) : (
<WorkspacesMainContainer
Expand Down Expand Up @@ -446,6 +447,7 @@ export function WorkspacesLayout() {
(w) => w.id === selectedWorkspace.id
)?.isCodingAgentRunning ?? false
}
cliRunning={cliSessionActive}
/>
) : (
<WorkspacesMainContainer
Expand Down
Loading