fix(chats): hide repository work status
Prevent managed Chat drafts and sessions from inheriting an active project's repository context in the Work Status panel while retaining directory-independent status sections.
This commit is contained in:
@@ -60,6 +60,7 @@ import { findShellCommandForMessage, isUserShellMarkerMessage } from './lib/shel
|
|||||||
import { resolveChatPromptReadOnly } from './chatPromptReadOnly';
|
import { resolveChatPromptReadOnly } from './chatPromptReadOnly';
|
||||||
import { getRuntimeKey } from '@/lib/runtime-switch';
|
import { getRuntimeKey } from '@/lib/runtime-switch';
|
||||||
import { createFirstVisibleSessionPerformanceTracker } from '@/sync/session-load-performance';
|
import { createFirstVisibleSessionPerformanceTracker } from '@/sync/session-load-performance';
|
||||||
|
import { isChatDirectoryPath } from '@/lib/chatDirectories';
|
||||||
|
|
||||||
const EMPTY_MESSAGES: Array<{ info: Message; parts: Part[] }> = [];
|
const EMPTY_MESSAGES: Array<{ info: Message; parts: Part[] }> = [];
|
||||||
const IDLE_SESSION_STATUS = { type: 'idle' as const };
|
const IDLE_SESSION_STATUS = { type: 'idle' as const };
|
||||||
@@ -738,12 +739,15 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({
|
|||||||
const isVSCode = isVSCodeRuntime();
|
const isVSCode = isVSCodeRuntime();
|
||||||
const chatSurfaceMode = useChatSurfaceMode();
|
const chatSurfaceMode = useChatSurfaceMode();
|
||||||
const draftOpen = Boolean(newSessionDraft?.open);
|
const draftOpen = Boolean(newSessionDraft?.open);
|
||||||
|
const isManagedChatContext = draftOpen
|
||||||
|
? newSessionDraft?.target === 'chat'
|
||||||
|
: isChatDirectoryPath(effectiveSessionDirectory);
|
||||||
// A draft can target another project or a pending worktree before it has a
|
// A draft can target another project or a pending worktree before it has a
|
||||||
// session. Keep the panel on that same directory so its project, MCP, and
|
// session. Keep the panel on that same directory so its project, MCP, and
|
||||||
// usage readouts describe where the draft will run rather than the project
|
// usage readouts describe where the draft will run rather than the project
|
||||||
// the user came from.
|
// the user came from.
|
||||||
const workStatusDirectory = draftOpen
|
const workStatusDirectory = draftOpen
|
||||||
? newSessionDraft?.bootstrapPendingDirectory ?? newSessionDraft?.directoryOverride ?? effectiveSessionDirectory
|
? (isManagedChatContext ? null : newSessionDraft?.bootstrapPendingDirectory ?? newSessionDraft?.directoryOverride ?? effectiveSessionDirectory)
|
||||||
: effectiveSessionDirectory;
|
: effectiveSessionDirectory;
|
||||||
const initError = useGlobalSyncStore((s) => s.error);
|
const initError = useGlobalSyncStore((s) => s.error);
|
||||||
// Despite the historical name, this now covers mobile too: the mobile
|
// Despite the historical name, this now covers mobile too: the mobile
|
||||||
@@ -1320,6 +1324,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({
|
|||||||
visible={showWorkStatusOverlay}
|
visible={showWorkStatusOverlay}
|
||||||
sessionId={currentSessionId ?? null}
|
sessionId={currentSessionId ?? null}
|
||||||
directory={workStatusDirectory ?? null}
|
directory={workStatusDirectory ?? null}
|
||||||
|
repositoryEnabled={!isManagedChatContext}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
@@ -1342,6 +1347,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({
|
|||||||
visible={showWorkStatusPanel}
|
visible={showWorkStatusPanel}
|
||||||
sessionId={currentSessionId ?? null}
|
sessionId={currentSessionId ?? null}
|
||||||
directory={workStatusDirectory ?? null}
|
directory={workStatusDirectory ?? null}
|
||||||
|
repositoryEnabled={!isManagedChatContext}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -54,6 +54,11 @@ mode. It remains available on a new-session draft: when the draft targets a
|
|||||||
project or pending worktree, the panel uses that directory for project, MCP,
|
project or pending worktree, the panel uses that directory for project, MCP,
|
||||||
and usage readouts before a session exists.
|
and usage readouts before a session exists.
|
||||||
|
|
||||||
|
Managed Chats never render or warm the Project repository section. A Chat draft
|
||||||
|
also passes no fallback directory to the panel, so an active project's branch
|
||||||
|
cannot leak into the draft while directory-independent sections remain
|
||||||
|
available.
|
||||||
|
|
||||||
`rowRef` is a **callback ref, not an object ref**. An object ref gives no signal
|
`rowRef` is a **callback ref, not an object ref**. An object ref gives no signal
|
||||||
when the node attaches, so the measuring effect read `.current`, found nothing
|
when the node attaches, so the measuring effect read `.current`, found nothing
|
||||||
whenever the row mounted after the effect first ran, and only recovered on the
|
whenever the row mounted after the effect first ran, and only recovered on the
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ type Props = {
|
|||||||
/** Null on a new-session draft: repository readouts still apply. */
|
/** Null on a new-session draft: repository readouts still apply. */
|
||||||
sessionId: string | null;
|
sessionId: string | null;
|
||||||
directory: string | null;
|
directory: string | null;
|
||||||
|
/** Managed Chats have no project repository, even if another project remains active. */
|
||||||
|
repositoryEnabled?: boolean;
|
||||||
/** Whether the panel should currently occupy space. */
|
/** Whether the panel should currently occupy space. */
|
||||||
visible: boolean;
|
visible: boolean;
|
||||||
/**
|
/**
|
||||||
@@ -63,7 +65,7 @@ const PANEL_TRANSITION_EASING = 'cubic-bezier(0.22, 1, 0.36, 1)';
|
|||||||
* eat a visible slice of every row's trailing value, and the shadows already
|
* eat a visible slice of every row's trailing value, and the shadows already
|
||||||
* say there is more to see.
|
* say there is more to see.
|
||||||
*/
|
*/
|
||||||
export const WorkStatusPanel: React.FC<Props> = ({ sessionId, directory, visible, overlay = false }) => {
|
export const WorkStatusPanel: React.FC<Props> = ({ sessionId, directory, visible, repositoryEnabled = true, overlay = false }) => {
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const setScrollTop = useUIStore((state) => state.setWorkStatusScrollTop);
|
const setScrollTop = useUIStore((state) => state.setWorkStatusScrollTop);
|
||||||
const setOverlayOpen = useUIStore((state) => state.setWorkStatusOverlayOpen);
|
const setOverlayOpen = useUIStore((state) => state.setWorkStatusOverlayOpen);
|
||||||
@@ -248,7 +250,7 @@ export const WorkStatusPanel: React.FC<Props> = ({ sessionId, directory, visible
|
|||||||
sessionId={sessionId}
|
sessionId={sessionId}
|
||||||
directory={directory}
|
directory={directory}
|
||||||
showSession={sectionVisible('session')}
|
showSession={sectionVisible('session')}
|
||||||
showRepository={sectionVisible('repository')}
|
showRepository={repositoryEnabled && sectionVisible('repository')}
|
||||||
goalRow={<WorkStatusGoalRow sessionId={sessionId} directory={directory} />}
|
goalRow={<WorkStatusGoalRow sessionId={sessionId} directory={directory} />}
|
||||||
/>
|
/>
|
||||||
{sectionVisible('usage') ? <WorkStatusUsageSection /> : null}
|
{sectionVisible('usage') ? <WorkStatusUsageSection /> : null}
|
||||||
|
|||||||
Reference in New Issue
Block a user