Skip to content

Commit 5eedb5b

Browse files
7418claude
andcommitted
fix: resolve 7 bugs — idle output, permission scroll, file selector, drag area, input reset, markdown tables, panel collapse
- ChatView: consume unconsumed stream snapshots on mount so output appears after idle without needing a conversation switch - PermissionPrompt: extract permission UI from StreamingMessage into a fixed-position component at the bottom of ChatView, preventing permission popups from scrolling off-screen during long responses - StreamingMessage/MessageList: remove ~409 lines of permission UI code now handled by PermissionPrompt - AssistantWorkspaceSection: fix macOS Electron file selector by using the correct IPC API (window.electronAPI.dialog.openFolder) - AppShell: increase title bar drag region from h-5 to h-10 (op7418#152) - ChatView: add key={sessionId} on MessageInput to reset input state when switching conversations (op7418#176) - UpdateDialog: add remark-gfm plugin and table component mappings for proper GFM markdown rendering in release notes (op7418#117) - RightPanel: add border and top margin to collapsed panel toggle for visibility (op7418#116) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a53c605 commit 5eedb5b

File tree

9 files changed

+479
-429
lines changed

9 files changed

+479
-429
lines changed

src/app/chat/page.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation';
55
import type { Message, SSEEvent, SessionResponse, TokenUsage, PermissionRequestEvent } from '@/types';
66
import { MessageList } from '@/components/chat/MessageList';
77
import { MessageInput } from '@/components/chat/MessageInput';
8+
import { PermissionPrompt } from '@/components/chat/PermissionPrompt';
89
import { usePanel } from '@/hooks/usePanel';
910

1011
interface ToolUseInfo {
@@ -358,9 +359,12 @@ export default function NewChatPage() {
358359
toolResults={toolResults}
359360
streamingToolOutput={streamingToolOutput}
360361
statusText={statusText}
362+
/>
363+
<PermissionPrompt
361364
pendingPermission={pendingPermission}
362-
onPermissionResponse={handlePermissionResponse}
363365
permissionResolved={permissionResolved}
366+
onPermissionResponse={handlePermissionResponse}
367+
toolUses={toolUses}
364368
/>
365369
<MessageInput
366370
onSend={sendFirstMessage}

src/components/chat/ChatView.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { MessageList } from './MessageList';
77
import { MessageInput } from './MessageInput';
88
import { usePanel } from '@/hooks/usePanel';
99
import { useTranslation } from '@/hooks/useTranslation';
10+
import { PermissionPrompt } from './PermissionPrompt';
1011
import { BatchExecutionDashboard, BatchContextSync } from './batch-image-gen';
1112
import { setLastGeneratedImages, transferPendingToMessage } from '@/lib/image-ref-store';
1213
import {
@@ -117,6 +118,20 @@ export function ChatView({ sessionId, initialMessages = [], initialHasMore = fal
117118
if (existing.pendingPermission && !existing.permissionResolved) {
118119
setPendingApprovalSessionId(sessionId);
119120
}
121+
// If stream completed while this ChatView was unmounted, consume finalMessageContent now
122+
if (existing.phase !== 'active' && existing.finalMessageContent) {
123+
const assistantMessage: Message = {
124+
id: 'temp-assistant-' + Date.now(),
125+
session_id: sessionId,
126+
role: 'assistant',
127+
content: existing.finalMessageContent,
128+
created_at: new Date().toISOString(),
129+
token_usage: existing.tokenUsage ? JSON.stringify(existing.tokenUsage) : null,
130+
};
131+
transferPendingToMessage(assistantMessage.id);
132+
setMessages((prev) => [...prev, assistantMessage]);
133+
clearSnapshot(sessionId);
134+
}
120135
} else {
121136
setStreamSnapshot(null);
122137
}
@@ -621,19 +636,24 @@ export function ChatView({ sessionId, initialMessages = [], initialHasMore = fal
621636
toolResults={toolResults}
622637
streamingToolOutput={streamingToolOutput}
623638
statusText={statusText}
624-
pendingPermission={pendingPermission}
625-
onPermissionResponse={handlePermissionResponse}
626-
permissionResolved={permissionResolved}
627639
onForceStop={stopStreaming}
628640
hasMore={hasMore}
629641
loadingMore={loadingMore}
630642
onLoadMore={loadEarlierMessages}
631643
/>
644+
{/* Permission prompt — rendered outside MessageList so it's always visible at bottom */}
645+
<PermissionPrompt
646+
pendingPermission={pendingPermission}
647+
permissionResolved={permissionResolved}
648+
onPermissionResponse={handlePermissionResponse}
649+
toolUses={toolUses}
650+
/>
632651
{/* Batch image generation panels — shown above the input area */}
633652
<BatchExecutionDashboard />
634653
<BatchContextSync />
635654

636655
<MessageInput
656+
key={sessionId}
637657
onSend={sendMessage}
638658
onCommand={handleCommand}
639659
onStop={stopStreaming}

src/components/chat/MessageList.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import { useRef, useEffect } from 'react';
44
import { useTranslation } from '@/hooks/useTranslation';
55
import { useStickToBottomContext } from 'use-stick-to-bottom';
6-
import type { Message, PermissionRequestEvent } from '@/types';
6+
import type { Message } from '@/types';
77
import {
88
Conversation,
99
ConversationContent,
@@ -61,9 +61,6 @@ interface MessageListProps {
6161
toolResults?: ToolResultInfo[];
6262
streamingToolOutput?: string;
6363
statusText?: string;
64-
pendingPermission?: PermissionRequestEvent | null;
65-
onPermissionResponse?: (decision: 'allow' | 'allow_session' | 'deny', updatedInput?: Record<string, unknown>, denyMessage?: string) => void;
66-
permissionResolved?: 'allow' | 'deny' | null;
6764
onForceStop?: () => void;
6865
hasMore?: boolean;
6966
loadingMore?: boolean;
@@ -78,9 +75,6 @@ export function MessageList({
7875
toolResults = [],
7976
streamingToolOutput,
8077
statusText,
81-
pendingPermission,
82-
onPermissionResponse,
83-
permissionResolved,
8478
onForceStop,
8579
hasMore,
8680
loadingMore,
@@ -152,9 +146,6 @@ export function MessageList({
152146
toolResults={toolResults}
153147
streamingToolOutput={streamingToolOutput}
154148
statusText={statusText}
155-
pendingPermission={pendingPermission}
156-
onPermissionResponse={onPermissionResponse}
157-
permissionResolved={permissionResolved}
158149
onForceStop={onForceStop}
159150
/>
160151
)}

0 commit comments

Comments
 (0)