# Claude Code 组件架构文档 > 基于 `/src/components/` 目录的实际代码分析 ## 概览 - **总文件数**: 389 个文件(`.tsx` + `.ts`) - **目录结构**: 40+ 子目录 - **渲染引擎**: [Ink](https://github.com/vadimdemedes/ink)(React 终端渲染器) - **编译器**: React Compiler(`react/compiler-runtime` 自动 memo 化) - **状态管理**: 自定义 `useAppState` / `useSetAppState`(基于 `AppState` context) - **布局模式**: 全屏模式(`FullscreenLayout`)+ 内联模式 --- ## 1. 主应用组件 ### `App.tsx` — 顶层 Provider 嵌套 ``` FpsMetricsProvider └── StatsProvider └── AppStateProvider └── {children} (REPL 内容) ``` 提供三个上下文层:FPS 指标、统计信息、应用状态。本身无 UI,纯 Provider 包装。 ### REPL 与主布局 | 组件 | 职责 | |------|------| | **`FullscreenLayout.tsx`** | 全屏布局:scrollable 区(消息列表)+ bottom 区(输入框)+ overlay/modal 区 | | **`Messages.tsx`** | 消息列表主容器。负责消息过滤、重排、分组、构建 lookups,渲染 LogoHeader + MessageRow 列表 | | **`VirtualMessageList.tsx`** | 虚拟滚动消息列表。管理滚动位置、搜索导航(`JumpHandle`)、sticky header | | **`MessageRow.tsx`** | 单行消息包装。管理消息折叠/展开状态、model 标签、时间戳 | | **`Message.tsx`** | 消息类型分发器。根据消息类型渲染对应的子组件 | | **`MessageResponse.tsx`** | 助手回复渲染(流式输出) | | **`Spinner.tsx`** | 加载动画。显示旋转字符 + 任务列表 + 闪烁文字 | ### 数据流 ``` AppState → Messages → VirtualMessageList → MessageRow → Message → 具体消息类型组件 ↓ (permissions, tool use, etc.) ``` --- ## 2. 消息渲染组件 (`messages/`) ### 助手消息 | 组件 | 职责 | |------|------| | **`AssistantTextMessage.tsx`** | 助手文本回复(Markdown 渲染) | | **`AssistantThinkingMessage.tsx`** | 助手思考过程(可折叠/展开) | | **`AssistantRedactedThinkingMessage.tsx`** | 加密思考块 | | **`AssistantToolUseMessage.tsx`** | 工具调用展示(紧凑/详细模式) | ### 用户消息 | 组件 | 职责 | |------|------| | **`UserTextMessage.tsx`** | 用户文本输入 | | **`UserPromptMessage.tsx`** | 用户 prompt 展示 | | **`UserImageMessage.tsx`** | 用户上传图片 | | **`UserBashInputMessage.tsx`** | 用户 bash 输入 | | **`UserBashOutputMessage.tsx`** | bash 输出结果 | | **`UserChannelMessage.tsx`** | 频道消息 | | **`UserCommandMessage.tsx`** | 用户命令 | | **`UserPlanMessage.tsx`** | 计划模式消息 | | **`UserTeammateMessage.tsx`** | 队友消息 | | **`UserMemoryInputMessage.tsx`** | Memory 输入 | | **`UserResourceUpdateMessage.tsx`** | 资源更新 | | **`UserLocalCommandOutputMessage.tsx`** | 本地命令输出 | | **`UserAgentNotificationMessage.tsx`** | Agent 通知消息 | ### 工具结果消息 (`UserToolResultMessage/`) | 组件 | 职责 | |------|------| | **`UserToolResultMessage.tsx`** | 工具结果主容器(分发器) | | **`UserToolSuccessMessage.tsx`** | 成功结果 | | **`UserToolErrorMessage.tsx`** | 错误结果 | | **`UserToolRejectMessage.tsx`** | 拒绝结果 | | **`UserToolCanceledMessage.tsx`** | 取消结果 | | **`RejectedToolUseMessage.tsx`** | 被拒绝的工具调用 | | **`RejectedPlanMessage.tsx`** | 被拒绝的计划 | ### 系统消息 | 组件 | 职责 | |------|------| | **`SystemTextMessage.tsx`** | 系统文本消息 | | **`SystemAPIErrorMessage.tsx`** | API 错误消息 | | **`ShutdownMessage.tsx`** | 关闭/退出消息 | | **`RateLimitMessage.tsx`** | 速率限制消息 | ### 聚合/折叠消息 | 组件 | 职责 | |------|------| | **`CollapsedReadSearchContent.tsx`** | 折叠的 read/search 组(灰点 + "Reading…") | | **`GroupedToolUseContent.tsx`** | 分组工具调用 | | **`CompactBoundaryMessage.tsx`** | Compact 边界标记 | | **`HookProgressMessage.tsx`** | Hook 进度 | | **`PlanApprovalMessage.tsx`** | 计划审批 | | **`TaskAssignmentMessage.tsx`** | 任务分配 | | **`AdvisorMessage.tsx`** | Advisor 消息 | | **`AttachmentMessage.tsx`** | 附件消息 | | **`HighlightedThinkingText.tsx`** | 高亮思考文本 | ### 辅助文件 | 文件 | 职责 | |------|------| | **`nullRenderingAttachments.ts`** | 标记不渲染的附件 | | **`teamMemCollapsed.tsx`** | 队友消息折叠逻辑 | | **`teamMemSaved.ts`** | 队友消息保存状态 | --- ## 3. 权限对话框组件 (`permissions/`) ### 核心组件 | 组件 | 职责 | |------|------| | **`PermissionRequest.tsx`** | 权限请求分发器。根据工具类型选择对应的权限请求组件 | | **`PermissionDialog.tsx`** | 权限对话框容器(标题 + subtitle + children) | | **`PermissionPrompt.tsx`** | 权限提示(带快捷键操作) | | **`PermissionExplanation.tsx`** | 权限解释说明 | | **`PermissionRequestTitle.tsx`** | 权限请求标题 | | **`PermissionRuleExplanation.tsx`** | 权限规则解释 | | **`PermissionDecisionDebugInfo.tsx`** | 调试信息 | | **`FallbackPermissionRequest.tsx`** | 通用兜底权限请求 | | **`WorkerBadge.tsx`** | Worker 标记 | | **`WorkerPendingPermission.tsx`** | 待处理 Worker 权限 | | **`SandboxPermissionRequest.tsx`** | 沙箱权限 | ### 工具级权限请求 | 子目录/组件 | 工具 | |-------------|------| | **`BashPermissionRequest/`** | Bash 命令执行权限 | | **`PowerShellPermissionRequest/`** | PowerShell 权限 | | **`FileEditPermissionRequest/`** | 文件编辑权限 | | **`FileWritePermissionRequest/`** | 文件写入权限(含 diff) | | **`FilePermissionDialog/`** | 通用文件权限对话框(含 hook、IDE diff 配置) | | **`FilesystemPermissionRequest/`** | 文件系统操作权限 | | **`NotebookEditPermissionRequest/`** | Notebook 编辑权限 | | **`SedEditPermissionRequest/`** | Sed 编辑权限 | | **`WebFetchPermissionRequest/`** | 网络请求权限 | | **`SkillPermissionRequest/`** | Skill 执行权限 | | **`ComputerUseApproval/`** | Computer Use 权限 | | **`AskUserQuestionPermissionRequest/`** | AskUserQuestion 工具权限 | | **`EnterPlanModePermissionRequest/`** | 进入计划模式权限 | | **`ExitPlanModePermissionRequest/`** | 退出计划模式权限 | ### 权限规则管理 (`rules/`) | 组件 | 职责 | |------|------| | **`AddPermissionRules.tsx`** | 添加权限规则 | | **`PermissionRuleInput.tsx`** | 规则输入 | | **`PermissionRuleList.tsx`** | 规则列表 | | **`PermissionRuleDescription.tsx`** | 规则描述 | | **`AddWorkspaceDirectory.tsx`** | 添加工作目录 | | **`RemoveWorkspaceDirectory.tsx`** | 移除工作目录 | | **`RecentDenialsTab.tsx`** | 最近拒绝记录 | | **`WorkspaceTab.tsx`** | 工作目录标签页 | ### 辅助 | 文件 | 职责 | |------|------| | **`hooks.ts`** | 权限相关 hooks | | **`utils.ts`** | 权限工具函数 | | **`shellPermissionHelpers.tsx`** | Shell 权限辅助 | | **`useShellPermissionFeedback.ts`** | Shell 权限反馈 | --- ## 4. 设计系统组件 (`design-system/`) | 组件 | 职责 | |------|------| | **`Dialog.tsx`** | 对话框容器(标题、subtitle、ESC 取消、输入指南) | | **`Pane.tsx`** | 面板容器(边框、内边距) | | **`Tabs.tsx`** | 标签页(Tab 切换) | | **`Divider.tsx`** | 分隔线 | | **`Byline.tsx`** | 副标题/署名 | | **`ListItem.tsx`** | 列表项 | | **`LoadingState.tsx`** | 加载状态 | | **`ProgressBar.tsx`** | 进度条 | | **`StatusIcon.tsx`** | 状态图标(✓ ✗ ⚠ 等) | | **`Ratchet.tsx`** | 步进器(数字递增/递减) | | **`KeyboardShortcutHint.tsx`** | 键盘快捷键提示 | | **`FuzzyPicker.tsx`** | 模糊搜索选择器 | | **`ThemeProvider.tsx`** | 主题提供者 | | **`ThemedBox.tsx`** | 主题化 Box | | **`ThemedText.tsx`** | 主题化 Text | | **`color.ts`** | 颜色工具函数 | --- ## 5. 提示输入组件 (`PromptInput/`) | 组件 | 职责 | |------|------| | **`PromptInput.tsx`** | 主输入组件(~600 行)。处理键盘输入、历史导航、粘贴、快捷键、模式切换 | | **`PromptInputFooter.tsx`** | 输入框底部(模式指示器 + 建议) | | **`PromptInputFooterLeftSide.tsx`** | 底部左侧内容 | | **`PromptInputFooterSuggestions.tsx`** | 输入建议(命令、文件路径) | | **`PromptInputHelpMenu.tsx`** | 帮助菜单 | | **`PromptInputModeIndicator.tsx`** | 模式指示器(编辑/vim/计划等) | | **`PromptInputQueuedCommands.tsx`** | 队列命令显示 | | **`PromptInputStashNotice.tsx`** | Stash 通知 | | **`ShimmeredInput.tsx`** | 闪烁输入效果 | | **`VoiceIndicator.tsx`** | 语音输入指示器 | | **`HistorySearchInput.tsx`** | 历史搜索输入 | | **`IssueFlagBanner.tsx`** | Issue 标记横幅 | | **`Notifications.tsx`** | 通知组件 | | **`SandboxPromptFooterHint.tsx`** | 沙箱模式提示 | ### 工具/辅助 | 文件 | 职责 | |------|------| | **`inputModes.ts`** | 输入模式定义(normal/vim/edit) | | **`inputPaste.ts`** | 粘贴处理逻辑 | | **`utils.ts`** | Vim 模式检测等工具 | | **`useMaybeTruncateInput.ts`** | 输入截断 hook | | **`usePromptInputPlaceholder.ts`** | 占位符 hook | | **`useShowFastIconHint.ts`** | 快速模式图标提示 | | **`useSwarmBanner.ts`** | Swarm 横幅 hook | --- ## 6. 任务管理组件 (`tasks/`) | 组件 | 职责 | |------|------| | **`BackgroundTasksDialog.tsx`** | 后台任务列表对话框(支持多种任务类型) | | **`BackgroundTask.tsx`** | 单个后台任务条目 | | **`BackgroundTaskStatus.tsx`** | 任务状态显示 | | **`AsyncAgentDetailDialog.tsx`** | 异步 Agent 详情对话框 | | **`InProcessTeammateDetailDialog.tsx`** | 进程内队友详情 | | **`RemoteSessionDetailDialog.tsx`** | 远程会话详情 | | **`RemoteSessionProgress.tsx`** | 远程会话进度 | | **`DreamDetailDialog.tsx`** | Dream 任务详情 | | **`ShellDetailDialog.tsx`** | Shell 任务详情 | | **`ShellProgress.tsx`** | Shell 进度 | | **`renderToolActivity.tsx`** | 工具活动渲染 | | **`taskStatusUtils.tsx`** | 任务状态工具函数 | 支持的任务类型: - `local_bash` — 本地 Bash - `local_agent` — 本地 Agent - `remote_agent` — 远程 Agent - `in_process_teammate` — 进程内队友 - `dream` — Dream 任务 - `local_shell` — Shell 任务 - `local_workflow` — Workflow 任务 - `monitor_mcp` — MCP Monitor --- ## 7. Agent 管理组件 (`agents/`) ### 核心 | 组件 | 职责 | |------|------| | **`AgentsMenu.tsx`** | Agent 管理主菜单(列表 → 详情 → 编辑) | | **`AgentsList.tsx`** | Agent 列表(分组:project/global/built-in) | | **`AgentDetail.tsx`** | Agent 详情展示 | | **`AgentEditor.tsx`** | Agent 配置编辑器 | | **`AgentNavigationFooter.tsx`** | 导航底部 | | **`ColorPicker.tsx`** | 颜色选择器 | | **`ModelSelector.tsx`** | 模型选择器 | | **`ToolSelector.tsx`** | 工具选择器 | ### Agent 创建向导 (`new-agent-creation/`) | 组件 | 职责 | |------|------| | **`CreateAgentWizard.tsx`** | 创建 Agent 向导主控 | | **`wizard-steps/MethodStep.tsx`** | 选择方式(手动/AI 生成) | | **`wizard-steps/TypeStep.tsx`** | Agent 类型 | | **`wizard-steps/DescriptionStep.tsx`** | 描述 | | **`wizard-steps/PromptStep.tsx`** | System Prompt | | **`wizard-steps/ToolsStep.tsx`** | 工具选择 | | **`wizard-steps/ModelStep.tsx`** | 模型选择 | | **`wizard-steps/ColorStep.tsx`** | 颜色选择 | | **`wizard-steps/LocationStep.tsx`** | 保存位置 | | **`wizard-steps/MemoryStep.tsx`** | Memory 配置 | | **`wizard-steps/GenerateStep.tsx`** | AI 生成 | | **`wizard-steps/ConfirmStep.tsx`** | 确认 | | **`wizard-steps/ConfirmStepWrapper.tsx`** | 确认包装 | ### 工具 | 文件 | 职责 | |------|------| | **`types.ts`** | Agent 类型定义 | | **`utils.ts`** | Agent 工具函数 | | **`validateAgent.ts`** | Agent 验证 | | **`agentFileUtils.ts`** | Agent 文件操作 | | **`generateAgent.ts`** | AI 生成 Agent | --- ## 8. MCP 相关组件 (`mcp/`) | 组件 | 职责 | |------|------| | **`MCPSettings.tsx`** | MCP 设置主入口(列表 → 详情) | | **`MCPListPanel.tsx`** | MCP 服务器列表 | | **`MCPStdioServerMenu.tsx`** | Stdio 服务器配置菜单 | | **`MCPRemoteServerMenu.tsx`** | 远程服务器配置菜单 | | **`MCPAgentServerMenu.tsx`** | Agent 级 MCP 服务器菜单 | | **`MCPToolListView.tsx`** | MCP 工具列表 | | **`MCPToolDetailView.tsx`** | MCP 工具详情 | | **`CapabilitiesSection.tsx`** | 服务器能力展示 | | **`MCPReconnect.tsx`** | 重连组件 | | **`ElicitationDialog.tsx`** | MCP Elicitation 对话框 | | **`McpParsingWarnings.tsx`** | 解析警告 | --- ## 9. Settings 组件 (`Settings/`) | 组件 | 职责 | |------|------| | **`Settings.tsx`** | 设置主界面(Tab 切换:Status/Config/Usage) | | **`Status.tsx`** | 状态页(诊断信息、连接状态) | | **`Config.tsx`** | 配置页(设置项编辑) | | **`Usage.tsx`** | 使用统计页 | --- ## 10. Spinner 组件 (`Spinner/`) | 组件 | 职责 | |------|------| | **`SpinnerAnimationRow.tsx`** | 动画行(旋转字符 + 文字) | | **`SpinnerGlyph.tsx`** | 旋转字符渲染 | | **`ShimmerChar.tsx`** | 闪烁字符 | | **`FlashingChar.tsx`** | 闪烁字符 | | **`GlimmerMessage.tsx`** | 微光消息 | | **`TeammateSpinnerLine.tsx`** | 队友 Spinner 行 | | **`TeammateSpinnerTree.tsx`** | 队友 Spinner 树(递归任务树) | --- ## 11. Logo 与欢迎组件 (`LogoV2/`) | 组件 | 职责 | |------|------| | **`LogoV2.tsx`** | 主 Logo + 欢迎界面(最近活动、what's new、项目入门) | | **`WelcomeV2.tsx`** | 欢迎消息 | | **`CondensedLogo.tsx`** | 精简 Logo(窄终端) | | **`Clawd.tsx`** | Clawd 角色 | | **`AnimatedClawd.tsx`** | 动画 Clawd | | **`AnimatedAsterisk.tsx`** | 动画星号 | | **`Feed.tsx`** | 信息流容器 | | **`FeedColumn.tsx`** | 信息流列 | | **`feedConfigs.tsx`** | 信息流配置(最近活动、what's new、项目入门) | | **`EmergencyTip.tsx`** | 紧急提示 | | **`VoiceModeNotice.tsx`** | 语音模式通知 | | **`Opus1mMergeNotice.tsx`** | Opus 1M 合并通知 | | **`ChannelsNotice.tsx`** | 频道通知 | | **`GuestPassesUpsell.tsx`** | Guest Pass 推广 | | **`OverageCreditUpsell.tsx`** | 超额信用推广 | --- ## 12. 其他重要组件 ### 对话框/覆盖层 | 组件 | 职责 | |------|------| | **`Onboarding.tsx`** | 首次使用引导(主题、OAuth、API Key、安全) | | **`ExitFlow.tsx`** | 退出流程 | | **`ExportDialog.tsx`** | 导出对话框 | | **`GlobalSearchDialog.tsx`** | 全局搜索(Transcript 搜索) | | **`HistorySearchDialog.tsx`** | 历史搜索 | | **`QuickOpenDialog.tsx`** | 快速打开 | | **`ModelPicker.tsx`** | 模型选择器 | | **`ThemePicker.tsx`** | 主题选择器 | | **`LanguagePicker.tsx`** | 语言选择器 | | **`OutputStylePicker.tsx`** | 输出风格选择器 | | **`BridgeDialog.tsx`** | Bridge 对话框 | | **`CostThresholdDialog.tsx`** | 成本阈值对话框 | | **`BypassPermissionsModeDialog.tsx`** | 绕过权限模式对话框 | | **`ChannelDowngradeDialog.tsx`** | 频道降级对话框 | | **`AutoModeOptInDialog.tsx`** | 自动模式加入对话框 | | **`IdeOnboardingDialog.tsx`** | IDE 入门对话框 | | **`IdeAutoConnectDialog.tsx`** | IDE 自动连接 | | **`InvalidConfigDialog.tsx`** | 无效配置 | | **`InvalidSettingsDialog.tsx`** | 无效设置 | | **`IdleReturnDialog.tsx`** | 空闲返回对话框 | | **`WorktreeExitDialog.tsx`** | Worktree 退出对话框 | | **`TeleportRepoMismatchDialog.tsx`** | 仓库不匹配 | | **`ClaudeMdExternalIncludesDialog.tsx`** | CLAUDE.md 外部引用 | | **`DevChannelsDialog.tsx`** | 开发频道对话框 | | **`WorkflowMultiselectDialog.tsx`** | Workflow 多选对话框 | | **`ManagedSettingsSecurityDialog/`** | 托管设置安全对话框 | | **`TrustDialog/`** | 信任对话框 | | **`MCPServerApprovalDialog.tsx`** | MCP 服务器审批 | | **`MCPServerDesktopImportDialog.tsx`** | MCP 桌面导入 | | **`MCPServerMultiselectDialog.tsx`** | MCP 多选对话框 | | **`MCPServerDialogCopy.tsx`** | MCP 对话框副本 | | **`ClaudeInChromeOnboarding.tsx`** | Chrome 入门 | ### 显示/工具组件 | 组件 | 职责 | |------|------| | **`Markdown.tsx`** | Markdown 渲染(`StreamingMarkdown`) | | **`MarkdownTable.tsx`** | Markdown 表格 | | **`HighlightedCode.tsx`** | 代码高亮 | | **`StructuredDiff.tsx`** | 结构化 Diff | | **`StructuredDiffList.tsx`** | Diff 列表 | | **`FileEditToolDiff.tsx`** | 文件编辑 Diff | | **`FilePathLink.tsx`** | 文件路径链接(可点击) | | **`ClickableImageRef.tsx`** | 可点击图片引用 | | **`Stats.tsx`** | 统计信息(tokens、成本、时长) | | **`StatusLine.tsx`** | 状态栏(模型、权限模式、cwd、context) | | **`StatusNotices.tsx`** | 状态通知 | | **`ThinkingToggle.tsx`** | Thinking 开关 | | **`EffortCallout.tsx`** | Effort 提示 | | **`EffortIndicator.ts`** | Effort 指示器 | | **`TokenWarning.tsx`** | Token 警告 | | **`MemoryUsageIndicator.tsx`** | 内存使用指示器 | | **`ToolUseLoader.tsx`** | 工具使用加载器 | | **`SearchBox.tsx`** | 搜索框 | | **`LogSelector.tsx`** | 日志选择器 | | **`TagTabs.tsx`** | 标签标签页 | | **`PrBadge.tsx`** | PR 标记 | | **`ContextSuggestions.tsx`** | 上下文建议 | | **`ContextVisualization.tsx`** | 上下文可视化 | | **`CompactSummary.tsx`** | Compact 摘要 | | **`ResumeTask.tsx`** | 恢复任务 | | **`SessionPreview.tsx`** | 会话预览 | | **`SessionBackgroundHint.tsx`** | 会话背景提示 | | **`ShowInIDEPrompt.tsx`** | IDE 中显示提示 | | **`TaskListV2.tsx`** | 任务列表 V2 | | **`TeammateViewHeader.tsx`** | 队友视图头部 | | **`CoordinatorAgentStatus.tsx`** | 协调者 Agent 状态 | | **`AgentProgressLine.tsx`** | Agent 进度行 | ### Teleport 相关 | 组件 | 职责 | |------|------| | **`DesktopHandoff.tsx`** | 桌面端交接 | | **`TeleportError.tsx`** | Teleport 错误 | | **`TeleportProgress.tsx`** | Teleport 进度 | | **`TeleportResumeWrapper.tsx`** | Teleport 恢复包装 | | **`TeleportStash.tsx`** | Teleport Stash | | **`RemoteCallout.tsx`** | 远程提示 | | **`RemoteEnvironmentDialog.tsx`** | 远程环境对话框 | ### 自动更新 | 组件 | 职责 | |------|------| | **`AutoUpdater.tsx`** | 自动更新逻辑 | | **`AutoUpdaterWrapper.tsx`** | 自动更新包装 | | **`NativeAutoUpdater.tsx`** | 原生自动更新 | | **`PackageManagerAutoUpdater.tsx`** | 包管理器自动更新 | ### 反馈/调查 | 组件 | 职责 | |------|------| | **`Feedback.tsx`** | 反馈入口 | | **`FeedbackSurvey/`** | 反馈调查(评分、transcript 分享) | | **`SkillImprovementSurvey.tsx`** | Skill 改进调查 | ### 输入/交互 | 组件 | 职责 | |------|------| | **`TextInput.tsx`** | 文本输入组件 | | **`BaseTextInput.tsx`** | 基础文本输入 | | **`VimTextInput.tsx`** | Vim 模式文本输入 | | **`ConfigurableShortcutHint.tsx`** | 可配置快捷键提示 | | **`PressEnterToContinue.tsx`** | "按 Enter 继续" | | **`CtrlOToExpand.tsx`** | Ctrl+O 展开提示 | | **`ScrollKeybindingHandler.tsx`** | 滚动键绑定处理 | | **`KeybindingWarnings.tsx`** | 键绑定警告 | | **`InterruptedByUser.tsx`** | 用户中断显示 | | **`ValidationErrorsList.tsx`** | 验证错误列表 | | **`ApproveApiKey.tsx`** | API Key 审批 | | **`AwsAuthStatusBox.tsx`** | AWS 认证状态 | | **`ConsoleOAuthFlow.tsx`** | Console OAuth 流程 | ### 其他子目录 | 目录 | 组件 | 职责 | |------|------|------| | **`CustomSelect/`** | `select.tsx`, `SelectMulti.tsx`, `select-option.tsx`, `select-input-option.tsx` | 自定义选择器(单选/多选/输入) | | **`HelpV2/`** | `HelpV2.tsx`, `Commands.tsx`, `General.tsx` | 帮助界面 | | **`hooks/`** | `HooksConfigMenu.tsx`, `SelectEventMode.tsx`, `SelectHookMode.tsx` 等 | Hooks 配置管理 | | **`memory/`** | `MemoryFileSelector.tsx`, `MemoryUpdateNotification.tsx` | Memory 管理 | | **`sandbox/`** | `SandboxSettings.tsx`, `SandboxConfigTab.tsx` 等 | 沙箱设置 | | **`shell/`** | `ShellProgressMessage.tsx`, `OutputLine.tsx` 等 | Shell 输出展示 | | **`skills/`** | `SkillsMenu.tsx` | Skills 菜单 | | **`teams/`** | `TeamsDialog.tsx`, `TeamStatus.tsx` | 团队管理 | | **`diff/`** | `DiffDialog.tsx`, `DiffDetailView.tsx`, `DiffFileList.tsx` | Diff 查看器 | | **`grove/`** | `Grove.tsx` | Grove 功能 | | **`passes/`** | `Passes.tsx` | Passes 功能 | | **`wizard/`** | `WizardDialogLayout.tsx`, `WizardProvider.tsx`, `useWizard.ts` | 通用向导框架 | | **`ui/`** | `OrderedList.tsx`, `OrderedListItem.tsx`, `TreeSelect.tsx` | 通用 UI 原语 | | **`ClaudeCodeHint/`** | `PluginHintMenu.tsx` | 插件提示菜单 | | **`DesktopUpsell/`** | `DesktopUpsellStartup.tsx` | 桌面版推广 | | **`LspRecommendation/`** | `LspRecommendationMenu.tsx` | LSP 推荐菜单 | | **`Passes/`** | `Passes.tsx` | Passes | | **`HighlightCode/`** | `Fallback.tsx` | 代码高亮回退 | | **`StructuredDiff/`** | `Fallback.tsx`, `colorDiff.ts` | Diff 回退/颜色 | ### 独立组件 | 组件 | 职责 | |------|------| | **`messageActions.tsx`** | 消息动作状态管理(`MessageActionsState`、导航) | | **`OffscreenFreeze.tsx`** | 离屏冻结(React Compiler 优化) | | **`SentryErrorBoundary.ts`** | Sentry 错误边界 | | **`DevBar.tsx`** | 开发者工具栏 | | **`DiagnosticsDisplay.tsx`** | 诊断信息展示 | | **`FallbackToolUseErrorMessage.tsx`** | 兜底工具错误消息 | | **`FallbackToolUseRejectedMessage.tsx`** | 兜底工具拒绝消息 | | **`FileEditToolUpdatedMessage.tsx`** | 文件编辑更新消息 | | **`FileEditToolUseRejectedMessage.tsx`** | 文件编辑拒绝消息 | | **`NotebookEditToolUseRejectedMessage.tsx`** | Notebook 编辑拒绝消息 | | **`SandboxViolationExpandedView.tsx`** | 沙箱违规展开视图 | | **`FastIcon.tsx`** | 快速模式图标 | | **`MessageModel.tsx`** | 消息模型标签 | | **`MessageTimestamp.tsx`** | 消息时间戳 | | **`MessageSelector.tsx`** | 消息选择器 | --- ## 13. 父子关系与数据流 ### 核心渲染链 ``` App (Provider 嵌套) └── FullscreenLayout ├── scrollable 区 │ └── Messages │ ├── LogoHeader (LogoV2 + StatusNotices) │ └── VirtualMessageList │ └── MessageRow (per message) │ ├── MessageModel │ ├── MessageTimestamp │ └── Message │ ├── AssistantTextMessage → StreamingMarkdown │ ├── AssistantThinkingMessage │ ├── AssistantToolUseMessage │ ├── UserTextMessage │ ├── UserToolResultMessage → 具体结果组件 │ ├── SystemTextMessage │ ├── CollapsedReadSearchContent │ ├── GroupedToolUseContent │ └── ... (30+ 种消息类型) ├── bottom 区 │ ├── Spinner (加载中) │ └── PromptInput │ ├── PromptInputFooter │ │ ├── PromptInputModeIndicator │ │ └── PromptInputFooterSuggestions │ ├── Notifications │ └── VoiceIndicator ├── overlay 区 │ └── PermissionRequest → 具体权限组件 └── modal 区 └── Settings / MCPSettings / AgentsMenu / BackgroundTasksDialog ... ``` ### 权限请求链 ``` PermissionRequest (分发器) ├── BashPermissionRequest ├── FileEditPermissionRequest ├── FileWritePermissionRequest → FileWriteToolDiff ├── NotebookEditPermissionRequest → NotebookEditToolDiff ├── WebFetchPermissionRequest ├── SkillPermissionRequest ├── PowerShellPermissionRequest ├── AskUserQuestionPermissionRequest ├── EnterPlanModePermissionRequest ├── ExitPlanModePermissionRequest ├── FilesystemPermissionRequest ├── SedEditPermissionRequest ├── ComputerUseApproval └── FallbackPermissionRequest 所有权限组件 → PermissionDialog → PermissionRequestTitle ``` ### Agent 创建向导链 ``` AgentsMenu ├── AgentsList ├── AgentDetail ├── AgentEditor └── CreateAgentWizard (WizardProvider) └── WizardDialogLayout → Dialog └── wizard-steps/* (12 步) ``` --- ## 14. 状态管理方式 ### 核心状态 | 状态源 | Hook/Context | 管理内容 | |--------|-------------|----------| | **AppState** | `useAppState()` / `useSetAppState()` | 全局应用状态(消息、工具、MCP、Agent 定义等) | | **AppStateStore** | `useAppStateStore()` | 状态存储(Footer items 等) | | **Settings** | `useSettings()` | 用户设置 | | **Theme** | `useTheme()` | 主题 | | **Modal Context** | `useIsInsideModal()` | 是否在 modal 内 | | **Overlay Context** | `usePromptOverlay()` | Prompt overlay 状态 | | **Notifications** | `useNotifications()` | 通知系统 | | **FPS Metrics** | `useFpsMetrics()` | 性能指标 | | **Stats** | `useStats()` | 统计信息 | | **Terminal Size** | `useTerminalSize()` | 终端尺寸 | ### 状态流向 1. **AppState** 是中央状态容器,包含消息数组、工具列表、MCP 连接、Agent 定义等 2. **PromptInput** 通过 `useSetAppState()` 写入用户输入,触发消息处理 3. **Messages** 从 `useAppState()` 读取消息数组,经过过滤/重排后渲染 4. **PermissionRequest** 从 `useAppState()` 读取当前工具使用,显示对应权限 UI 5. **Settings/MCP/Agents** 等 modal 通过 `useSetAppState()` 修改配置 ### 性能优化 - **React Compiler**: 所有组件使用 `_c()` memo 缓存,自动避免不必要重渲染 - **`OffscreenFreeze`**: 离屏组件冻结,防止不可见区域的渲染开销 - **`VirtualMessageList`**: 虚拟滚动,只渲染可见消息 - **`React.memo`**: 关键子树(如 `LogoHeader`)显式 memo - **`useSyncExternalStore`**: 外部状态(终端尺寸、scroll 位置)订阅 --- ## 15. 组件数量统计 | 分类 | 组件数 | |------|--------| | 主应用/布局 | ~6 | | 消息渲染 | ~40 | | 权限对话框 | ~35 | | 设计系统 | ~16 | | PromptInput | ~20 | | 任务管理 | ~12 | | Agent 管理 | ~20 | | MCP | ~12 | | Settings | 4 | | Spinner | ~10 | | LogoV2 | ~18 | | 其他独立组件 | ~50+ | | 辅助/工具文件 | ~100+ | | **总计** | **389 个文件** |