feat: add React Error Boundary to prevent UI white-screen crashes - #49
Merged
Conversation
op7418
approved these changes
Feb 13, 2026
op7418
left a comment
Owner
There was a problem hiding this comment.
LGTM! Clean error boundary implementation, good isolation strategy.
Please rebase onto current main before we merge — AppShell.tsx has changed significantly (added ResizeHandle, DocPreview, width prop to ChatListPanel). After rebasing, also wrap the newer RightPanel and DocPreview components with ErrorBoundary for consistent crash isolation.
op7418
commented
Feb 23, 2026
Owner
你好 @cyxer000,感谢你提交这个 Error Boundary 方案! 经过检查,主分支目前还没有 Error Boundary 的实现,这个功能对防止白屏崩溃确实很有价值。 不过这个 PR 目前存在合并冲突,需要 rebase 到最新的 main 分支来解决冲突。如果你有时间的话,麻烦 rebase 一下,我们会在后续评估合并。 再次感谢你的贡献! |
Wrap main content area and chat list panel with ErrorBoundary components to gracefully handle runtime errors instead of showing a blank white screen. Closesop7418#32
cyxer000force-pushed
the
feat/error-boundary
branch
from
February 24, 2026 03:14
afc3e0a to
11ece8dComparecyxer000
commented
Feb 24, 2026
ContributorAuthor
Rebased onto current
Ready to merge. |
op7418 pushed a commit
that referenced
this pull request
Feb 26, 2026
ErrorBoundary (PR #49 follow-up): - Replace inline SVG with lucide-react CircleAlert icon for consistency - Add i18n support: extract fallback UI into functional ErrorFallback component so it can use useTranslation hook - Remove unused withErrorBoundary HOC - Add error.* translation keys to en.ts and zh.ts ProviderManager: - Add Claude Code default config entry in connected providers section with cc switch hint explaining configurations may not be readable - Update GLM preset descriptions: "GLM" → "GLM Code Plan / 编程套餐" - Update MiniMax preset descriptions: "MiniMax API" → "MiniMax Code Plan / 编程套餐" - Add provider.ccSwitchHint translation key to en.ts and zh.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
op7418 added a commit
that referenced
this pull request
Jul 4, 2026
op7418 added a commit
that referenced
this pull request
Jul 4, 2026
- docs/research/ai-sdk-7-toolloop-parity-gaps.md: 新增「Phase 5 处置」节,全部 gap 收口——P1×3 关闭(#1/#2 补偿由 parity 8/8 复跑锁定;#3 降级论证:Phase 4 已证 approval HMAC 不需要 SDK toolApproval 停机语义,维持 in-execute 路线), P2/P3 关闭或 backlog(#4/#5 列为替换路线前置条件,#7 归档 tech-debt #49, #8 有 Phase 5 新实证) - scripts/smoke-ai-sdk7-phase5-decision.ts: 新增决策门对照 smoke——prod runAgentLoop 与 POC runToolLoopAgentPoc 用同一 AgentLoopOptions 逐场景对照(长文本 / approval 批准 / approval 拒绝 / abort→continue),机械比较归一化事件序列 + 尾部契约 + usage 存在性;DB 只读、数据目录隔离、输出全 scrub。探针注意:approval 批准分支 用 printf(echo 命中 permission-checker 自动放行规则不会触发 ask) - docs/exec-plans/active/_smoke-evidence/ai-sdk7-phase5-decision-smoke.json: OpenRouter 真实渠道 4/4 场景 contractMatch=true(input_tokens 逐场景完全相同, tool_result 逐字相同,中断轮双侧 done 收尾、同 session 续发一次通过); 凭据形态 grep=0 - docs/research/ai-sdk-7-adoption-decision.md: 新增采用决策文档——结论 partial (依赖升级 go / provider 能力 capability-gated go / Phase 4 外围能力 go / @ai-sdk/mcp 与默认 loop 替换 no-go-现在),四层 rollback plan(能力开关→ wrapper→runtime switch→known-good version),每项结论标注 Phase 1-5 证据来源; 默认 Runtime 切换留人类闸门 - docs/exec-plans/tech-debt-tracker.md: 新增 #49(tool-error part 被两条 loop 一致吞掉的既有 UX 债,独立于采用决策) - docs/exec-plans/active/ai-sdk-7-runtime-loop-adoption.md: Phase 5 状态回写 + 决策日志 + Smoke Ledger / Loop Ledger 各一行 - docs/research/README.md: 索引新增决策文档条目 验证: npm run test 3598/3598 全绿;smoke 4/4 contractMatch(1 个 fix cycle 收敛, 两处均为脚本层问题非 loop 差异);src/ 零改动(默认 Runtime/聊天路径零变化) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
youcho2 pushed a commit
to youcho2/CodePilot
that referenced
this pull request
Aug 11, 2026
Error Boundary for crash isolation. Minor fixes (i18n, icon, h-5 conflict) will follow.
youcho2 pushed a commit
to youcho2/CodePilot
that referenced
this pull request
Aug 11, 2026
ErrorBoundary (PR op7418#49 follow-up): - Replace inline SVG with lucide-react CircleAlert icon for consistency - Add i18n support: extract fallback UI into functional ErrorFallback component so it can use useTranslation hook - Remove unused withErrorBoundary HOC - Add error.* translation keys to en.ts and zh.ts ProviderManager: - Add Claude Code default config entry in connected providers section with cc switch hint explaining configurations may not be readable - Update GLM preset descriptions: "GLM" → "GLM Code Plan / 编程套餐" - Update MiniMax preset descriptions: "MiniMax API" → "MiniMax Code Plan / 编程套餐" - Add provider.ccSwitchHint translation key to en.ts and zh.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
youcho2 pushed a commit
to youcho2/CodePilot
that referenced
this pull request
Aug 11, 2026
youcho2 pushed a commit
to youcho2/CodePilot
that referenced
this pull request
Aug 11, 2026
- docs/research/ai-sdk-7-toolloop-parity-gaps.md: 新增「Phase 5 处置」节,全部 gap 收口——P1×3 关闭(op7418#1/op7418#2 补偿由 parity 8/8 复跑锁定;op7418#3 降级论证:Phase 4 已证 approval HMAC 不需要 SDK toolApproval 停机语义,维持 in-execute 路线), P2/P3 关闭或 backlog(op7418#4/op7418#5 列为替换路线前置条件,op7418#7 归档 tech-debt op7418#49, op7418#8 有 Phase 5 新实证) - scripts/smoke-ai-sdk7-phase5-decision.ts: 新增决策门对照 smoke——prod runAgentLoop 与 POC runToolLoopAgentPoc 用同一 AgentLoopOptions 逐场景对照(长文本 / approval 批准 / approval 拒绝 / abort→continue),机械比较归一化事件序列 + 尾部契约 + usage 存在性;DB 只读、数据目录隔离、输出全 scrub。探针注意:approval 批准分支 用 printf(echo 命中 permission-checker 自动放行规则不会触发 ask) - docs/exec-plans/active/_smoke-evidence/ai-sdk7-phase5-decision-smoke.json: OpenRouter 真实渠道 4/4 场景 contractMatch=true(input_tokens 逐场景完全相同, tool_result 逐字相同,中断轮双侧 done 收尾、同 session 续发一次通过); 凭据形态 grep=0 - docs/research/ai-sdk-7-adoption-decision.md: 新增采用决策文档——结论 partial (依赖升级 go / provider 能力 capability-gated go / Phase 4 外围能力 go / @ai-sdk/mcp 与默认 loop 替换 no-go-现在),四层 rollback plan(能力开关→ wrapper→runtime switch→known-good version),每项结论标注 Phase 1-5 证据来源; 默认 Runtime 切换留人类闸门 - docs/exec-plans/tech-debt-tracker.md: 新增 op7418#49(tool-error part 被两条 loop 一致吞掉的既有 UX 债,独立于采用决策) - docs/exec-plans/active/ai-sdk-7-runtime-loop-adoption.md: Phase 5 状态回写 + 决策日志 + Smoke Ledger / Loop Ledger 各一行 - docs/research/README.md: 索引新增决策文档条目 验证: npm run test 3598/3598 全绿;smoke 4/4 contractMatch(1 个 fix cycle 收敛, 两处均为脚本层问题非 loop 差异);src/ 零改动(默认 Runtime/聊天路径零变化) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
ErrorBoundaryclass component that catches runtime errors in the React component treeErrorBoundaryinstancesMotivation
Multiple users have reported the app becoming unresponsive or showing a blank screen (e.g. #32). A single uncaught error in any component can take down the entire UI. Error boundaries isolate failures so that a crash in the chat list doesn't affect the main content area, and vice versa.
Changes
src/components/layout/ErrorBoundary.tsxsrc/components/layout/AppShell.tsx<ChatListPanel>,{children},<DocPreview>, and<RightPanel>with<ErrorBoundary>Review feedback addressed
main(resolved conflicts withResizeHandle,DocPreview,widthprop changes)RightPanelandDocPreviewcomponents withErrorBoundaryfor consistent crash isolationTest plan
Closes#32