feat(ui): 将权限请求改为内联显示在聊天流中

- 添加 PermissionMessagePart 类型
- 创建 PermissionRequestInline 内联组件
- 修改 useChat 将权限请求作为 Part 处理
- 移除模态对话框,不再阻断 IDE 操作
This commit is contained in:
2025-12-17 22:03:00 +08:00
parent 2ff74e446c
commit 00680b8ed3
6 changed files with 533 additions and 30 deletions
+16 -13
View File
@@ -11,7 +11,6 @@ import {
ChatMessage,
TypingIndicator,
ChatInput,
PermissionDialog,
ContextUsage,
SubagentProgress,
DiagnosticsIndicator,
@@ -78,7 +77,6 @@ export function ChatPage({
streamingMessage,
sendMessage,
cancelProcessing,
permissionRequest,
allowPermission,
denyPermission,
agentMode,
@@ -216,13 +214,27 @@ export function ChatPage({
<AnimatePresence mode="popLayout">
{messages.map((message) => (
<ChatMessage key={message.id} message={message} onAnswerQuestion={answerQuestion} onViewDiff={onViewDiff ?? onFileDiff} />
<ChatMessage
key={message.id}
message={message}
onAnswerQuestion={answerQuestion}
onViewDiff={onViewDiff ?? onFileDiff}
onAllowPermission={allowPermission}
onDenyPermission={denyPermission}
/>
))}
</AnimatePresence>
{/* 流式消息 - 复用 ChatMessage 组件 */}
{streamingMessage && (
<ChatMessage message={streamingMessage} isStreaming onAnswerQuestion={answerQuestion} onViewDiff={onViewDiff ?? onFileDiff} />
<ChatMessage
message={streamingMessage}
isStreaming
onAnswerQuestion={answerQuestion}
onViewDiff={onViewDiff ?? onFileDiff}
onAllowPermission={allowPermission}
onDenyPermission={denyPermission}
/>
)}
{/* 子 Agent 进度显示 */}
@@ -252,15 +264,6 @@ export function ChatPage({
onAutoAttachActiveFileToggle={onAutoAttachActiveFileToggle}
/>
{/* Permission Dialog */}
{permissionRequest && (
<PermissionDialog
request={permissionRequest}
onAllow={(requestId, remember) => allowPermission(requestId, remember)}
onDeny={(requestId, remember) => denyPermission(requestId, remember)}
responsive={responsive}
/>
)}
</div>
);
}