feat(app): redesign Status panel with Git and Artifact sections#1013
feat(app): redesign Status panel with Git and Artifact sections#1013Astro-Han wants to merge 9 commits into
Conversation
Remove "files" from RightPanelStaticTab and its metadata, command palette entry, and keybind. Legacy persisted "files" values map to "status" via coerceLegacySidePanelTab and migrateLegacyRightPanelTab. Register the new "changes" icon (Imagen → Potrace pipeline, portrait 14×18 keyshape, document with +/− marks) for the Git environment section that replaces the standalone Files tab. Add i18n keys for the new Git and Artifact sections in en/zh.
Restructure the Status panel from two sections (Progress + Sources) to four (Progress → Git → Artifact → Sources). Git section shows three interactive rows: - Diff stats (+N/−N from session aggregate, click → Review panel) - Branch name (from sync.data.vcs, chevron for future branch picker) - Worktree indicator (tooltip with name/branch/location, click opens directory) — migrated from the titlebar PawworkWorktreeBadge which is removed from session-header.tsx Artifact section replaces the deleted Files tab with a compact list of session-produced files (filename + open/reveal buttons, hover + focus-within visibility). The Git section is conditionally hidden when not in a git repository. Artifact data flows from session-side-panel via SessionStatusPanel props as Accessor<FilesTabEntry[]>.
Adapt shell-tab, right-panel-tabs, helpers, migrate-session-view, command-palette, side-panel, and use-session-commands tests to the removal of the "files" static tab. Key changes: - Legacy "files" values in normalize/coerce/migrate tests now expect "status" fallback instead of passthrough - planShellTabReorder test uses review→context instead of the removed files→review pair - command-palette default items test drops fileTree.toggle - Type assertion test-d.ts marks "files" as @ts-expect-error - Add normalizeShellTabs legacy-files-to-status regression test
|
Warning Review limit reached
More reviews will be available in 36 minutes and 25 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughPR consolidates the legacy "files" right-panel tab into a new "status" tab, removes the worktree badge from the session header, and enhances the status panel with Git repository information (diff stats, active worktree) and artifact file listings alongside simplified directory opening. ChangesRight-panel tab migration and status panel enhancement
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Suggested priority: P2 (includes user-path files (packages/app/src/components/command-palette/command-palette-default-items.test.ts, packages/app/src/components/command-palette/command-palette-default-items.ts, packages/app/src/components/session/session-header.tsx, packages/app/src/components/session/session-status-panel.tsx, packages/app/src/components/session/session-status-summary.tsx, packages/app/src/context/layout.shell-tabs.test.ts, packages/app/src/context/layout.test.ts, packages/app/src/context/layout.tsx, packages/app/src/i18n/en.ts, packages/app/src/i18n/zh.ts, packages/app/src/pages/session/helpers.test.ts, packages/app/src/pages/session/migrate-session-view.test.ts, packages/app/src/pages/session/right-panel-tab-strip.tsx, packages/app/src/pages/session/right-panel-tabs.test-d.ts, packages/app/src/pages/session/right-panel-tabs.test.ts, packages/app/src/pages/session/right-panel-tabs.ts, packages/app/src/pages/session/session-side-panel.test.tsx, packages/app/src/pages/session/session-side-panel.tsx, packages/app/src/pages/session/use-session-commands.test.ts, packages/app/src/pages/session/use-session-commands.tsx)).
P1/P0 are reserved for maintainer confirmation. Please relabel manually if this is a release blocker, security issue, data-loss risk, or updater/runtime failure.
There was a problem hiding this comment.
Code Review
This pull request refactors the session side panel by merging the legacy "files" tab into the "status" panel, removing the separate files tab, and updating associated commands, tests, and types. Additionally, it integrates Git status (changes, branch, worktree) and artifact file listings directly into the status summary. Feedback on these changes highlights opportunities to improve accessibility by conditionally disabling non-interactive buttons, localizing hardcoded strings in the Git worktree tooltip, and ensuring cross-platform path compatibility for Windows environments when extracting filenames.
| <button | ||
| type="button" | ||
| class="flex w-full items-center gap-2 rounded-sm px-1 py-1 text-left transition-colors hover:bg-surface-raised" | ||
| classList={{ "cursor-default": !props.onClick }} | ||
| onClick={props.onClick} | ||
| title={props.title} | ||
| > | ||
| <Icon name={props.icon as any} class="shrink-0 text-fg-weak" /> | ||
| <div class="min-w-0 flex-1">{props.children}</div> | ||
| <Show when={props.chevron}> | ||
| {(dir) => <Icon name={dir() === "down" ? "chevron-down" : "chevron-right"} class="shrink-0 text-fg-weaker" />} | ||
| </Show> | ||
| </button> |
There was a problem hiding this comment.
When props.onClick is undefined, the row is not interactive but remains focusable and displays a hover background (hover:bg-surface-raised). To improve accessibility and UX, disable the button when not clickable and apply the hover style conditionally.
<button
type="button"
disabled={!props.onClick}
class="flex w-full items-center gap-2 rounded-sm px-1 py-1 text-left transition-colors"
classList={{
"hover:bg-surface-raised cursor-pointer": !!props.onClick,
"cursor-default opacity-100": !props.onClick,
}}
onClick={props.onClick}
title={props.title}
>
<Icon name={props.icon as any} class="shrink-0 text-fg-weak" />
<div class="min-w-0 flex-1">{props.children}</div>
<Show when={props.chevron}>
{(dir) => <Icon name={dir() === "down" ? "chevron-down" : "chevron-right"} class="shrink-0 text-fg-weaker" />}
</Show>
</button>
| const worktreeTooltip = (worktree: ActiveWorktree) => ( | ||
| <div class="grid min-w-0 gap-1.5 py-1 text-left"> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Worktree</span> | ||
| <span class="text-h3 min-w-0 break-all leading-[1.45]">{worktree.name || "Not available"}</span> | ||
| </div> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Branch</span> | ||
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.branch || "Not available"}</span> | ||
| </div> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Location</span> | ||
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.directory || "Not available"}</span> | ||
| </div> | ||
| </div> | ||
| ) |
There was a problem hiding this comment.
The tooltip labels ("Worktree", "Branch", "Location") and fallback text ("Not available") are hardcoded. To support internationalization (i18n), these strings should be localized using language.t with corresponding keys added to the translation dictionaries.
| const worktreeTooltip = (worktree: ActiveWorktree) => ( | |
| <div class="grid min-w-0 gap-1.5 py-1 text-left"> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">Worktree</span> | |
| <span class="text-h3 min-w-0 break-all leading-[1.45]">{worktree.name || "Not available"}</span> | |
| </div> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">Branch</span> | |
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.branch || "Not available"}</span> | |
| </div> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">Location</span> | |
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.directory || "Not available"}</span> | |
| </div> | |
| </div> | |
| ) | |
| const worktreeTooltip = (worktree: ActiveWorktree) => ( | |
| <div class="grid min-w-0 gap-1.5 py-1 text-left"> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">{language.t("status.summary.git.worktree")}</span> | |
| <span class="text-h3 min-w-0 break-all leading-[1.45]">{worktree.name || language.t("status.summary.git.not_available")}</span> | |
| </div> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">{language.t("status.summary.git.branch")}</span> | |
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.branch || language.t("status.summary.git.not_available")}</span> | |
| </div> | |
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | |
| <span class="text-caption">{language.t("status.summary.git.location")}</span> | |
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.directory || language.t("status.summary.git.not_available")}</span> | |
| </div> | |
| </div> | |
| ) |
| }} | ||
| title={language.t("status.summary.git.worktree.open")} | ||
| > | ||
| <span class="text-body text-fg-base">{worktree().name || worktree().branch || "Worktree"}</span> |
There was a problem hiding this comment.
The fallback string "Worktree" is hardcoded. Use the localized string language.t("status.summary.git.worktree") instead.
| <span class="text-body text-fg-base">{worktree().name || worktree().branch || "Worktree"}</span> | |
| <span class="text-body text-fg-base">{worktree().name || worktree().branch || language.t("status.summary.git.worktree")}</span> |
| const filename = createMemo(() => { | ||
| const parts = props.file.path.split("/") | ||
| return parts[parts.length - 1] || props.file.path | ||
| }) |
There was a problem hiding this comment.
Splitting the path only by / will fail to extract the correct filename on Windows platforms where paths use backslashes (\). Use a regular expression or replace backslashes to split by both forward and backward slashes.
| const filename = createMemo(() => { | |
| const parts = props.file.path.split("/") | |
| return parts[parts.length - 1] || props.file.path | |
| }) | |
| const filename = createMemo(() => { | |
| const parts = props.file.path.replace(/\\/g, "/").split("/") | |
| return parts[parts.length - 1] || props.file.path | |
| }) |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
packages/app/src/pages/session/right-panel-tabs.ts (1)
11-14: 💤 Low valueStale comment still references the removed
filesslot.Line 5 was updated to "status / review / context", but this block still describes terminal tabs as "sibling of files/review/context". Worth aligning since
"files"no longer exists.📝 Suggested wording tweak
- * Pre-flatten, "terminal" was a fixed slot containing an internal multi-terminal - * strip. After flatten (Area B, 2026-05-25) each terminal is its own outer tab, - * sibling of files/review/context. Legacy persistence with "terminal" as a fixed - * slot is dropped via migrateLegacyRightPanelTab / coerceLegacySidePanelTab. + * Pre-flatten, "terminal" was a fixed slot containing an internal multi-terminal + * strip. After flatten (Area B, 2026-05-25) each terminal is its own outer tab, + * sibling of status/review/context. Legacy persistence with "terminal" as a fixed + * slot is dropped via migrateLegacyRightPanelTab / coerceLegacySidePanelTab.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/app/src/pages/session/right-panel-tabs.ts` around lines 11 - 14, Update the stale comment that still mentions the removed "files" slot: change the phrase describing terminal tabs as "sibling of files/review/context" to the current naming "sibling of status/review/context" (or whichever current slots are accurate), keeping the rest of the note about legacy persistence and the references to migrateLegacyRightPanelTab and coerceLegacySidePanelTab intact so the comment reflects the current tab layout.packages/app/src/components/session/session-status-summary.tsx (1)
64-86: 💤 Low valueConsider stricter typing for icon names.
Line 79 uses
as anyto bypass icon name type checking. While this may be necessary for the icon system's flexibility, it prevents catching invalid icon names at compile time.If the Icon component supports a union of valid icon names, consider typing
props.iconas that union instead ofstringto eliminate the need for the type assertion.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/app/src/components/session/session-status-summary.tsx` around lines 64 - 86, The GitRow component currently types props.icon as string and uses an unsafe cast (as any) when passing to Icon, which hides invalid icon names; update GitRow's prop type for icon to the Icon component's exact icon-name union/type (e.g., IconName or the IconProps['name'] type exported by the Icon module) and remove the as any cast, importing that type from the Icon file and using it in the props declaration so the compiler enforces valid icon names when calling GitRow.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/app/src/components/session/session-status-summary.tsx`:
- Around line 101-116: The tooltip component function worktreeTooltip (accepting
ActiveWorktree) uses hardcoded English strings; replace the literal labels
("Worktree", "Branch", "Location") and fallback text ("Not available") with i18n
lookups (e.g., t('status.summary.git.worktree.tooltip.worktree') etc.), and add
the corresponding keys to the locale files (en.ts and zh.ts) for those four
entries; ensure you import/use the same translation function used elsewhere in
this file/component so the tooltip text is localized at render time.
---
Nitpick comments:
In `@packages/app/src/components/session/session-status-summary.tsx`:
- Around line 64-86: The GitRow component currently types props.icon as string
and uses an unsafe cast (as any) when passing to Icon, which hides invalid icon
names; update GitRow's prop type for icon to the Icon component's exact
icon-name union/type (e.g., IconName or the IconProps['name'] type exported by
the Icon module) and remove the as any cast, importing that type from the Icon
file and using it in the props declaration so the compiler enforces valid icon
names when calling GitRow.
In `@packages/app/src/pages/session/right-panel-tabs.ts`:
- Around line 11-14: Update the stale comment that still mentions the removed
"files" slot: change the phrase describing terminal tabs as "sibling of
files/review/context" to the current naming "sibling of status/review/context"
(or whichever current slots are accurate), keeping the rest of the note about
legacy persistence and the references to migrateLegacyRightPanelTab and
coerceLegacySidePanelTab intact so the comment reflects the current tab layout.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 831a049e-6cf6-46bc-b5ff-dedf061e823d
📒 Files selected for processing (21)
packages/app/src/components/command-palette/command-palette-default-items.test.tspackages/app/src/components/command-palette/command-palette-default-items.tspackages/app/src/components/session/session-header.tsxpackages/app/src/components/session/session-status-panel.tsxpackages/app/src/components/session/session-status-summary.tsxpackages/app/src/context/layout.shell-tabs.test.tspackages/app/src/context/layout.test.tspackages/app/src/context/layout.tsxpackages/app/src/i18n/en.tspackages/app/src/i18n/zh.tspackages/app/src/pages/session/helpers.test.tspackages/app/src/pages/session/migrate-session-view.test.tspackages/app/src/pages/session/right-panel-tab-strip.tsxpackages/app/src/pages/session/right-panel-tabs.test-d.tspackages/app/src/pages/session/right-panel-tabs.test.tspackages/app/src/pages/session/right-panel-tabs.tspackages/app/src/pages/session/session-side-panel.test.tsxpackages/app/src/pages/session/session-side-panel.tsxpackages/app/src/pages/session/use-session-commands.test.tspackages/app/src/pages/session/use-session-commands.tsxpackages/ui/src/components/icon.tsx
💤 Files with no reviewable changes (4)
- packages/app/src/pages/session/right-panel-tab-strip.tsx
- packages/app/src/pages/session/use-session-commands.tsx
- packages/app/src/components/command-palette/command-palette-default-items.test.ts
- packages/app/src/components/session/session-header.tsx
| const worktreeTooltip = (worktree: ActiveWorktree) => ( | ||
| <div class="grid min-w-0 gap-1.5 py-1 text-left"> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Worktree</span> | ||
| <span class="text-h3 min-w-0 break-all leading-[1.45]">{worktree.name || "Not available"}</span> | ||
| </div> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Branch</span> | ||
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.branch || "Not available"}</span> | ||
| </div> | ||
| <div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3"> | ||
| <span class="text-caption">Location</span> | ||
| <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.directory || "Not available"}</span> | ||
| </div> | ||
| </div> | ||
| ) |
There was a problem hiding this comment.
Internationalize hardcoded tooltip strings.
The worktree tooltip contains hardcoded English strings ("Worktree", "Branch", "Location", "Not available") that should use the i18n system for consistency with the rest of the UI.
🌐 Proposed fix to use i18n
Add keys to en.ts and zh.ts:
"status.summary.git.worktree.tooltip.worktree": "Worktree",
"status.summary.git.worktree.tooltip.branch": "Branch",
"status.summary.git.worktree.tooltip.location": "Location",
"status.summary.git.worktree.tooltip.notAvailable": "Not available",Then update the tooltip:
const worktreeTooltip = (worktree: ActiveWorktree) => (
<div class="grid min-w-0 gap-1.5 py-1 text-left">
<div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3">
- <span class="text-caption">Worktree</span>
- <span class="text-h3 min-w-0 break-all leading-[1.45]">{worktree.name || "Not available"}</span>
+ <span class="text-caption">{language.t("status.summary.git.worktree.tooltip.worktree")}</span>
+ <span class="text-h3 min-w-0 break-all leading-[1.45]">
+ {worktree.name || language.t("status.summary.git.worktree.tooltip.notAvailable")}
+ </span>
</div>
<div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3">
- <span class="text-caption">Branch</span>
- <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.branch || "Not available"}</span>
+ <span class="text-caption">{language.t("status.summary.git.worktree.tooltip.branch")}</span>
+ <span class="text-body min-w-0 break-all leading-[1.45]">
+ {worktree.branch || language.t("status.summary.git.worktree.tooltip.notAvailable")}
+ </span>
</div>
<div class="grid min-w-0 grid-cols-[64px_minmax(0,1fr)] items-start gap-3">
- <span class="text-caption">Location</span>
- <span class="text-body min-w-0 break-all leading-[1.45]">{worktree.directory || "Not available"}</span>
+ <span class="text-caption">{language.t("status.summary.git.worktree.tooltip.location")}</span>
+ <span class="text-body min-w-0 break-all leading-[1.45]">
+ {worktree.directory || language.t("status.summary.git.worktree.tooltip.notAvailable")}
+ </span>
</div>
</div>
)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/app/src/components/session/session-status-summary.tsx` around lines
101 - 116, The tooltip component function worktreeTooltip (accepting
ActiveWorktree) uses hardcoded English strings; replace the literal labels
("Worktree", "Branch", "Location") and fallback text ("Not available") with i18n
lookups (e.g., t('status.summary.git.worktree.tooltip.worktree') etc.), and add
the corresponding keys to the locale files (en.ts and zh.ts) for those four
entries; ensure you import/use the same translation function used elsewhere in
this file/component so the tooltip text is localized at render time.
- Translate section titles to Chinese (环境/产出物) and fix English (Artifacts) - Align GitRow to interactive row sizing (min-h 30px, px-2, conditional hover) - Remove non-functional branch chevron (backend has no branch-switch API yet) - Make changes row always clickable to navigate to review panel
Use grid layout (30px height, 16px icon + 1fr path + actions), IconButton with Tooltip, folder-add-left icon, and row-hover-overlay/row-active-overlay tokens matching session-turn-change-row CSS.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/app/src/components/session/session-status-summary.tsx (1)
287-295:⚠️ Potential issue | 🟠 Major | ⚡ Quick winGate artifact
openFile/revealFileon local-server mode
openWorktreeDirectorygates oncanOpenLocalPath(platform) && server.isLocal(), butArtifactSectioncallsonOpenFile(file.path)/onRevealFile(file.path)andopenFile/revealFileonly check the platform method. Thefile.pathvalues come from the server’ssession.artifactsendpoint (Artifact.fileis returned asfile.path), so in remote-server mode this can pass remote filesystem paths to desktop shell APIs (platform.openPath/platform.showItemInFolder). Add the sameserver.isLocal()gating used for worktree directory.const openFile = (path: string) => { - if (!platform.openPath) return + if (!canOpenLocalPath(platform) || !server.isLocal() || !platform.openPath) return void platform.openPath(path).catch(() => {}) } const revealFile = (path: string) => { - if (!platform.showItemInFolder) return + if (!canOpenLocalPath(platform) || !server.isLocal() || !platform.showItemInFolder) return void platform.showItemInFolder(path).catch(() => {}) }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/app/src/components/session/session-status-summary.tsx` around lines 287 - 295, openFile and revealFile only check platform methods and can be passed remote paths from ArtifactSection via onOpenFile/onRevealFile; mirror the gating used in openWorktreeDirectory by requiring canOpenLocalPath(platform) && server.isLocal() before calling platform.openPath or platform.showItemInFolder. Update the openFile(path: string) and revealFile(path: string) helpers to return early if !canOpenLocalPath(platform) or !server.isLocal(), then call the platform methods and retain the existing .catch(() => {}) behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/app/src/components/session/session-status-summary.tsx`:
- Around line 287-295: openFile and revealFile only check platform methods and
can be passed remote paths from ArtifactSection via onOpenFile/onRevealFile;
mirror the gating used in openWorktreeDirectory by requiring
canOpenLocalPath(platform) && server.isLocal() before calling platform.openPath
or platform.showItemInFolder. Update the openFile(path: string) and
revealFile(path: string) helpers to return early if !canOpenLocalPath(platform)
or !server.isLocal(), then call the platform methods and retain the existing
.catch(() => {}) behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 52688ce0-ea4a-45b4-a942-e278570d0e32
📒 Files selected for processing (3)
packages/app/src/components/session/session-status-summary.tsxpackages/app/src/i18n/en.tspackages/app/src/i18n/zh.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- packages/app/src/i18n/en.ts
- packages/app/src/i18n/zh.ts
zh: 工作区 / 改动文件 (confirmed via DeepSeek + Codex consensus) en: Workspace / Changed files
Unlike turn-change-row which sits inside a bordered container, artifact rows are exposed directly in the status panel section.
Align GitRow and ArtifactRow with sidebar/settings convention: rounded-md border-radius, hover:bg-surface-raised.
Summary
changesicon (Imagen → Potrace pipeline) for the Git diff stats rowChanges
Status panel redesign
sync.data.vcsfor branch,sessionInfo().executionContext.activeWorktreefor worktree,aggregateFiles(turn_change_aggregate)for diff statsFiles tab removal
"files"fromRightPanelStaticTab,RIGHT_PANEL_TAB_META, command palette, and keybind"files"values map to"status"viacoerceLegacySidePanelTabandmigrateLegacyRightPanelTabTitlebar cleanup
PawworkWorktreeBadgefromsession-header.tsx(worktree info now lives in the Status panel Git section)Test plan
"files"tab persistence maps correctly to"status"bun run dev:desktop— walk Status panel with active session in git repoSummary by CodeRabbit
New Features
Refactor
Chores