Skip to content

[AI-2956] desktop: Overhaul chrome, status colour, rail footer and work-context pane - #983

Merged
alexeyzimarev merged 23 commits into
mainfrom
norton/desktop-ui-enhancements
Sep 18, 2026
Merged

alexeyzimarev merged 23 commits into
mainfrom
norton/desktop-ui-enhancements

Conversation

@nortonandreev

@nortonandreev nortonandreev commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Closes #1017 — AI-2956

What & why

The desktop app spent its status palette on identity — vendor chips, work-item keys, titles and
"you are here" marks sat in success green or warning orange and read as outcome — and Fluent's
default chrome showed through wherever a control had not opted into a Kcap class. This pass
reserves green/orange/yellow for outcome and attention, moves location to purple and selection
to blue, and puts menus, flyouts, buttons and fields on the Kcap classes. Idle becomes its own
state — a live agent whose turn is over is not Connected — with a waiting dot and a clock badge.
Around that, the rail footer restacks around a coloured status word, the work-context pane
groups sections by hairline and fixes the PR linked to the work item not appearing (the pane and
reader only knew the session's own list), the window remembers its placement,
and the terminal keeps the cursor on its line when the pane grows.

Where to look

App.axaml holds the palette and control classes; the two CLAUDE.md invariants state what a
later change would otherwise undo unnoticed. SessionStatusDots.For takes the row so waiting can
override the process word. XtermTerminalSurface.KeepCursorOnItsLine is pinned to XTerm.NET
1.2.0; its comment says why the version cannot move yet.

Verification

dotnet run --project test/Capacitor.App.Tests.Unit/Capacitor.App.Tests.Unit.csproj —
2527 passed, 0 failed.

Visuals

Before

Screenshot 2026-09-18 at 16 43 18

After

Screenshot 2026-09-18 at 16 42 10

@nortonandreev

nortonandreev commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor Author

Changelog

Theme & colour

  • Green, orange and yellow are status only — shipped/passing, or blocked/stale/needs-you.
    Vendor chips, work-item keys, session titles and "this session" marks no longer borrow them,
    so a Claude chip stops reading as "needs attention" and a work-item key stops reading as "done".
  • Where you are and what is in flight is purple; the selected/open session is blue.
    Markdown links are blue too.
  • Menus, flyouts, buttons, fields and list rows are on the Kcap theme — Fluent's grey hover
    bar and accent no longer show through on the dark canvas. This covers the launcher pickers,
    the rail help flyout, Stop, and the Chat/Terminal switch.

Session rail

  • An agent that is alive but has finished its turn shows as waiting for input with its own
    amber dot, instead of a green "Connected" dot contradicted by a zzz badge.
  • Idle is drawn as a clock rather than a pause glyph, which read as a button you could press.
  • The ! attention badge is reserved for failures and pending prompts; idle no longer competes
    with it.
  • A worktree header shows the badge only while the group is collapsed — expanded, the
    session rows carry it — and collapsing no longer changes the header's height.
  • The footer is restacked around a coloured status word — the word itself is the indicator,
    so there is no misaligned disc beside it.
  • Org, daemon, version and agent count are named on hover instead of repeating the value you
    can already see; the server URL moved onto the org hover, where it no longer crowds the rail.
  • Sign in appears in the footer when your session has signed out, so you can recover without
    going back to the launcher.
  • A daemon waiting to restart onto a new build paints the version in warning colour and
    explains itself on hover.
  • The agent count disappears when the daemon is unreachable rather than showing "—".
  • The vendor chip and the running time sit on one baseline.
  • A truncated session title shows the full string on hover.
  • The open session no longer gets a leading selection edge that pushed its row out of line with
    its siblings.

Chat

  • Body text is larger (15px) and the composer and launcher goal box share its line box.
  • Tool groups that failed open themselves, so the error is visible without a click — and you
    can still collapse them again.
  • Chat bubbles carry kind chips — You, Note, and for a lone tool call the kind of call (Read,
    Edit, Command, Search, Question…) — so you can tell what you are looking at at a glance.
  • Toggling a tool group keeps the header you clicked under the cursor, instead of the list
    jumping as the virtualized rows re-measure.
  • Folded tool groups are tighter, and a lone settled call is shown as its own row.
  • The Chat / Terminal / Pull request switch is a segmented control in the header.
  • The subagent banner names the run — Explore running in background · 25h 42m — instead of
    counting it, and shows only when the turn is over and something is still going; while you are
    waiting on a turn the activity note is the headline and a foreground launch is already its
    Task row. Its dot is purple (in flight), not orange.

Work-context pane

  • Sections are grouped by a left hairline, with the extra rules between them removed.
  • Fix: a PR linked to the work item now shows up. The pane and the in-app reader only knew
    the PRs the session had been credited with, so a PR opened from another checkout, or linked
    on the work item rather than this session, produced "No pull requests linked to this session"
    and nothing to open. The work item's own link-class PRs are now merged in (a bare mention is
    not shown; [DEV-1665] Fix silent LaunchAgent drop + surface SignalR client errors #42 in two repositories stays two PRs), so the Pull request section and the PR
    tab show the PR and open it in the in-app reader. On a server without native reading the
    section opens the PR on GitHub instead of a reader that can only show a notice. "No pull
    request linked" appears only once both the session list and the work item have settled,
    instead of flashing while one is still loading.
  • Open in web sits beside Refresh in the header.
  • Long ids and names are middle-truncated (head…tail) so a 32-character session id stays on
    one line; click the id or a name to copy it — the button says "Copied", then restores the
    original tooltip on the next hover.
  • The pane scrolls without horizontal overflow.
  • "Who's on it" initials are drawn as a centred neutral chip, and the list caps at four with a
    chevron to reveal the rest.
  • A contributor with no display name shows their requester email rather than a raw
    user_… WorkOS id.
  • Subagents sit under SESSION — they are the session's, not the work item's — in the same
    header and hairline body as the other sections. Each row is the PARTS mark (purple ring while
    it runs, green check done, red × failed, hollow ring stopped), the name, what it was asked, and
    a state line: running in background · 25h 42m, failed · 48s, or the duration once done.
    "background" appears only while the run is live, since it only says the chat is not waiting on
    it; elapsed time rolls into hours past sixty minutes instead of 1533m 30s.
  • Section header meta does not repeat the eyebrow: Parts settled progress is 1 of 3;
    Subagents is N running, N of M running, or a bare count when none are running;
    Who's on it names sessions only when every contributor is listed, and adds a people count
    when the list overflows past four.

Terminal

  • Growing the pane keeps the cursor on its line, so the agent's repaint lands where it should
    instead of erasing the rows below a live prompt.
  • Claude Code's mode marker (⏵) is drawn as ▶, so its status line no longer sits a few pixels
    below the other rows.

Window

  • The window remembers its size, position and maximised state between launches, and pulls a
    remembered position back onto a screen if that monitor is gone. The default is wider (1400).

@nortonandreev nortonandreev self-assigned this Sep 18, 2026
@nortonandreev nortonandreev changed the title Restyle desktop chrome and reserve status colour for status Overhaul desktop chrome, status colour, rail footer and work-context pane Sep 18, 2026
Green, orange and yellow are status only — vendor chips, keys, links and
location marks were reading as outcome. Fluent MenuItem and Button hover
paints the presenter, so flyouts, Stop, and the Chat/Terminal switch opt
into kcap classes. The work-context pane groups sections, middle-truncates
copyable ids and names, and scrolls without horizontal overflow.
A live agent whose turn is over is not Connected — green plus zzz
contradicted. The rail footer drops the misaligned middot for two rows,
and truncated titles keep the full string on hover.
A pause glyph reads as a button, and a leading selection edge
insets the open row past its siblings. Hover names org, daemon,
and server instead of echoing the visible value.
The left hairline already groups each section; a second rule between them was extra chrome.
The disc never sat on the word's cap-height, so the word itself is the indicator. The URL belongs on the org hover because at rail width it outweighed its neighbours.
A second danger colour on the group hid the row pills; opening it is how you see the error.
SetTip("Copied") cannot reparent a visual tip, and ClearValue leaves an empty bubble.
WrapPanel Center matches layout boxes, not glyph baselines.
Green is status; Border ignores alignment on a direct child, so the letter lives in a Panel.
DisplayName is null for an owner with no user row; user_ plus a ULID is not a name.
A row that changes height makes the virtualizing panel drop its anchor and re-place every row from the average size.
XTerm.NET 1.2.0 lowers the buffer's YBase to pull scrollback into a taller
viewport without moving Y with it, so the agent's SIGWINCH repaint lands above
the tail and erases what it left behind. Only the grow direction is correctable
from here: the shrink needs YBase, which the buffer alone can move.
A styled run that needs a fallback typeface is laid out on that typeface's
baseline, so the whole run — not just the character missing a glyph — is drawn
below every other row in the pane. A replacement has to stay one cell wide, or
every column after it falls out of step with the layout the agent computed.
A saved position is ignored unless it still sits on a screen. The rail
badge lives on the collapsed header only; the header floor is the badge
so collapse does not jump. A work-item PR has to feed the in-app reader
before the session list admits it.
StatusBadge could only ever be "!" once a finished turn took the clock icon, so
the glyph is a literal in the rail and NeedsYou plus ShowsIdleBadge carry what
the string did. ConnectionTip and HasRelated had no view binding at all.
@nortonandreev
nortonandreev force-pushed the norton/desktop-ui-enhancements branch from c45109e to 6624ef8 Compare September 18, 2026 11:17
… SESSION

The rows come from the session's transcript, not the work item, so they
belong with the session facts. "background" only says the chat is not
waiting on the run, which is true of a live row alone, so it rides the
state line and leaves once the run ends.
SessionSubagents.Changed fires only on a count change, so a summary string
built there misses the detach that adds "in background" and every tick;
the banner binds the row's own name and state line instead.
@nortonandreev
nortonandreev marked this pull request as ready for review September 18, 2026 11:43
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Overhaul desktop chrome, status semantics, and work context

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Standardizes desktop chrome, typography, selection, location, and outcome color semantics.
• Redesigns session rail, chat, and work-context interactions with clearer status and navigation.
• Persists window placement and fixes terminal resizing, glyph rendering, and scroll anchoring.
Diagram

graph TD
  State[("App state")] --> Window["Main window"] --> Workspace["Workspace chrome"] --> Chat["Chat surface"]
  Window --> Rail["Session rail"]
  Workspace --> Context["Work context"] --> PR["PR reader"]
  Workspace --> Terminal["Terminal surface"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Replace local styles with a custom Avalonia theme
  • ➕ Could centralize all control templates and eliminate Fluent presenter overrides.
  • ➕ Would make future controls inherit Kcap chrome automatically.
  • ➖ Much larger migration and regression surface than the targeted style classes.
  • ➖ Could complicate upgrades and third-party control compatibility.
2. Upgrade the terminal dependency instead of correcting resize drift
  • ➕ Would remove the XTerm.NET 1.2.0 cursor workaround.
  • ➕ Could inherit newer emulator fixes and APIs.
  • ➖ Current terminal control binaries are incompatible with XTerm.NET 2.x.
  • ➖ Requires a runtime-target and dependent-control migration outside this PR's scope.

Recommendation: Keep the PR's incremental approach. Shared Kcap classes establish consistent chrome without replacing the theme substrate, while the isolated terminal correction is appropriately documented and tested until the dependency stack can move together.

Files changed (67) +2967 / -750

Enhancement (35) +1544 / -627
App.axamlExpand shared Kcap control styling +97/-2

Expand shared Kcap control styling

• Adds ghost, danger, segmented-control, tooltip, and typography styles used throughout the redesigned desktop UI.

src/Capacitor.App/App.axaml

App.axaml.csWire window placement and rail sign-in +5/-2

Wire window placement and rail sign-in

• Shares the app-state store with window placement memory and routes the sign-in action into the main view model.

src/Capacitor.App/App.axaml.cs

AppStateStore.csPersist window placement fields +6/-1

Persist window placement fields

• Extends application state with window dimensions, coordinates, and maximized state.

src/Capacitor.App/Services/AppStateStore.cs

VendorChipPalette.csMake the Claude chip status-neutral +1/-1

Make the Claude chip status-neutral

• Moves the Claude vendor chip away from warning orange to a neutral dark palette.

src/Capacitor.App/Services/VendorChipPalette.cs

WindowSizeMemory.csAdd resilient window placement memory +115/-0

Add resilient window placement memory

• Restores and debounces persistence of normal window geometry, clamps off-screen positions, and preserves maximized state.

src/Capacitor.App/Services/WindowSizeMemory.cs

StatusColors.csAdd a dedicated waiting status color +8/-5

Add a dedicated waiting status color

• Introduces an amber waiting state and updates documentation for status-word rendering.

src/Capacitor.App/StatusColors.cs

ChatSessionInfo.csExpose waiting-on-user session state +3/-1

Expose waiting-on-user session state

• Adds a waiting projection and consistently derives remote session labels through SessionStatusDots.

src/Capacitor.App/ViewModels/ChatSessionInfo.cs

ChatTabViewModel.csRefine assistant and subagent presentation +40/-6

Refine assistant and subagent presentation

• Adds assistant titles, detailed single-subagent state, background summaries, and waiting-aware status dots.

src/Capacitor.App/ViewModels/ChatTabViewModel.cs

MainWindowViewModel.csReshape rail footer status and sign-in state +67/-29

Reshape rail footer status and sign-in state

• Colors the connection word, hides stale agent counts, exposes descriptive tooltips, and adds contextual sign-in behavior.

src/Capacitor.App/ViewModels/MainWindowViewModel.cs

PullRequestContextViewModel.Projections.csHide empty pull-request identity text +2/-2

Hide empty pull-request identity text

• Removes placeholder titles and notifies consumers when pull-request listing state changes.

src/Capacitor.App/ViewModels/PullRequestContextViewModel.Projections.cs

PullRequestContextViewModel.Reads.csMerge session and fallback pull-request choices +42/-26

Merge session and fallback pull-request choices

• Refactors choice application to combine server-listed PRs with deduplicated work-item fallback links.

src/Capacitor.App/ViewModels/PullRequestContextViewModel.Reads.cs

PullRequestContextViewModel.csAccept work-item fallback pull requests +20/-1

Accept work-item fallback pull requests

• Tracks listing completion, safely opens the reader, and incorporates fallback PR links into available choices.

src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs

RailSessionViewModel.csRepresent idle sessions with a clock badge +7/-6

Represent idle sessions with a clock badge

• Replaces textual idle badges with a boolean clock state and applies waiting-aware status colors.

src/Capacitor.App/ViewModels/RailSessionViewModel.cs

RailWorktreeViewModel.csCoordinate worktree attention badges +22/-9

Coordinate worktree attention badges

• Shows aggregate badges only on collapsed headers and distinguishes all-idle groups from failures or permissions.

src/Capacitor.App/ViewModels/RailWorktreeViewModel.cs

RemoteSessionViewModel.csAlign remote session status and surface switching +3/-2

Align remote session status and surface switching

• Exposes switch visibility and renders remote waiting state through shared status projections.

src/Capacitor.App/ViewModels/RemoteSessionViewModel.cs

SessionStatusDots.csCentralize waiting status labels and brushes +11/-1

Centralize waiting status labels and brushes

• Adds waiting-aware overloads for local and remote rows while preserving process-state fallbacks.

src/Capacitor.App/ViewModels/SessionStatusDots.cs

SubagentRow.csClarify background state and long durations +9/-3

Clarify background state and long durations

• Includes background execution in live state text and formats durations of one hour or longer compactly.

src/Capacitor.App/ViewModels/SubagentRow.cs

WorkContextItems.csAdd copy-safe contributor identities +5/-1

Add copy-safe contributor identities

• Stores contributor IDs and derives middle-truncated display names while retaining full names.

src/Capacitor.App/ViewModels/WorkContextItems.cs

WorkContextViewModel.Projections.csExpand work-context projections and PR linking +188/-22

Expand work-context projections and PR linking

• Adds grouped section state, bounded contributor lists, identity fallbacks, and work-item PR links that can feed the native reader.

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs

WorkContextViewModel.csCoordinate PR state and copyable session IDs +40/-2

Coordinate PR state and copyable session IDs

• Observes pull-request changes, exposes middle-truncated session identifiers, and refreshes related section visibility.

src/Capacitor.App/ViewModels/WorkContextViewModel.cs

WorkspaceViewModel.csExpose workspace surface-switch visibility +7/-1

Expose workspace surface-switch visibility

• Shows the segmented surface switch only when terminal or pull-request alternatives exist.

src/Capacitor.App/ViewModels/WorkspaceViewModel.cs

ChatTabView.axamlRestyle chat messages, tools, and activity +92/-38

Restyle chat messages, tools, and activity

• Adds message-kind labels, refined typography, compact folded tool groups, and richer subagent presentation.

src/Capacitor.App/Views/ChatTabView.axaml

HomeView.axamlImprove home typography and title discovery +6/-6

Improve home typography and title discovery

• Increases supporting text sizes and exposes full truncated session titles through tooltips.

src/Capacitor.App/Views/HomeView.axaml

MainWindow.axamlUse centralized window sizing defaults +5/-1

Use centralized window sizing defaults

• Binds initial and minimum window dimensions to WindowSizeMemory constants.

src/Capacitor.App/Views/MainWindow.axaml

MarkdownStyles.axamlIncrease markdown readability and recolor links +9/-9

Increase markdown readability and recolor links

• Enlarges body, heading, and code typography while moving hyperlinks from status green to info blue.

src/Capacitor.App/Views/MarkdownStyles.axaml

PendingCardTemplates.axamlLabel permission and question cards +2/-0

Label permission and question cards

• Adds explicit kind chips to interactive pending cards in the chat transcript.

src/Capacitor.App/Views/PendingCardTemplates.axaml

PullRequestCard.axamlRefine pull-request card spacing and empty states +7/-5

Refine pull-request card spacing and empty states

• Updates typography and hides absent number or title fields instead of rendering empty placeholders.

src/Capacitor.App/Views/PullRequestCard.axaml

PullRequestStatusLabel.axamlImprove pull-request status alignment +7/-5

Improve pull-request status alignment

• Enlarges status text and centers icons within a consistent layout box.

src/Capacitor.App/Views/PullRequestStatusLabel.axaml

PullRequestStyles.axamlIncrease pull-request reader typography +5/-5

Increase pull-request reader typography

• Raises tab, note, muted-text, and section-title sizes for improved readability.

src/Capacitor.App/Views/PullRequestStyles.axaml

RemoteSessionView.axamlRedesign remote session header controls +36/-63

Redesign remote session header controls

• Moves navigation into a segmented switch, adopts Kcap danger chrome, and simplifies the content layout.

src/Capacitor.App/Views/RemoteSessionView.axaml

SessionRailView.axamlOverhaul session rail rows and footer +224/-81

Overhaul session rail rows and footer

• Introduces clock attention badges, status-colored footer text, structured metadata tooltips, sign-in, and Kcap help flyout controls.

src/Capacitor.App/Views/SessionRailView.axaml

SessionRailView.axaml.csClose the help flyout after selection +3/-0

Close the help flyout after selection

• Hides the custom help flyout when one of its action buttons is clicked.

src/Capacitor.App/Views/SessionRailView.axaml.cs

WorkContextView.axamlRedesign the work-context pane +375/-228

Redesign the work-context pane

• Reorganizes content into hairline-grouped sections with PR access, copyable identities, bounded contributor lists, and no horizontal overflow.

src/Capacitor.App/Views/WorkContextView.axaml

WorkContextView.axaml.csAdd work-context clipboard interactions +43/-0

Add work-context clipboard interactions

• Copies full session or contributor identities and temporarily displays a “Copied” tooltip.

src/Capacitor.App/Views/WorkContextView.axaml.cs

WorkspaceView.axamlConsolidate workspace navigation into the header +32/-63

Consolidate workspace navigation into the header

• Replaces underline tabs with a segmented surface switch and applies shared Kcap action styling.

src/Capacitor.App/Views/WorkspaceView.axaml

Bug fix (5) +179 / -10
TerminalGlyphSubstitution.csSubstitute unsupported terminal mode glyphs +16/-0

Substitute unsupported terminal mode glyphs

• Replaces Claude's unsupported play marker with a single-cell glyph available in the terminal font stack.

src/Capacitor.App/Services/TerminalGlyphSubstitution.cs

XtermTerminalSurface.csPreserve terminal cursor position during resize +33/-3

Preserve terminal cursor position during resize

• Applies glyph substitution and corrects XTerm.NET 1.2.0 cursor-line drift when the viewport grows.

src/Capacitor.App/Services/XtermTerminalSurface.cs

ChatItems.csExpose and automatically reveal failed tool calls +15/-5

Expose and automatically reveal failed tool calls

• Tracks whether grouped calls are visible and expands a group when a failure first appears.

src/Capacitor.App/ViewModels/ChatItems.cs

SessionCardViewModel.csUse waiting-aware session card colors +1/-1

Use waiting-aware session card colors

• Changes session cards to render an idle agent with the dedicated waiting dot.

src/Capacitor.App/ViewModels/SessionCardViewModel.cs

ChatTabView.axaml.csAnchor tool groups during expansion +114/-1

Anchor tool groups during expansion

• Preserves the clicked tool-summary position across virtualized relayout and prevents unintended tail following.

src/Capacitor.App/Views/ChatTabView.axaml.cs

Refactor (1) +1 / -1
LauncherPaneView.axamlAdopt shared composer typography +1/-1

Adopt shared composer typography

• Removes a local font-size override so the launcher goal field uses the shared embedded-input line box.

src/Capacitor.App/Views/LauncherPaneView.axaml

Tests (23) +1220 / -110
AppStartupTests.csVerify startup placement restoration +22/-0

Verify startup placement restoration

• Adds an integration test confirming persisted dimensions and coordinates are applied when the main window opens.

test/Capacitor.App.Tests.Unit/AppStartupTests.cs

AppStateStoreTests.csVerify window placement serialization +17/-0

Verify window placement serialization

• Covers persistence and reload of window size, position, and maximized state.

test/Capacitor.App.Tests.Unit/AppStateStoreTests.cs

ChatComposerTests.csVerify the waiting chat status dot +1/-2

Verify the waiting chat status dot

• Updates composer session assertions for the dedicated waiting-state brush.

test/Capacitor.App.Tests.Unit/ChatComposerTests.cs

ChatTabViewModelTests.csCover failed tools and subagent presentation +32/-2

Cover failed tools and subagent presentation

• Tests automatic failure expansion, single-subagent details, background wording, and activity-note precedence.

test/Capacitor.App.Tests.Unit/ChatTabViewModelTests.cs

ChatTabViewSmokeTests.csExercise redesigned chat layout behavior +132/-18

Exercise redesigned chat layout behavior

• Covers typography, kind chips, tool-group chrome, failure visibility, scroll anchoring, and detailed subagent banners.

test/Capacitor.App.Tests.Unit/ChatTabViewSmokeTests.cs

HomeViewSmokeTests.csVerify shared launcher input metrics +26/-0

Verify shared launcher input metrics

• Ensures the goal field inherits the embedded composer font, line height, and tracking.

test/Capacitor.App.Tests.Unit/HomeViewSmokeTests.cs

MainWindowSmokeTests.csValidate redesigned rail chrome +316/-36

Validate redesigned rail chrome

• Adds broad rendered coverage for footer layout, tooltips, sign-in, badges, chip alignment, help flyout styling, and window defaults.

test/Capacitor.App.Tests.Unit/MainWindowSmokeTests.cs

MainWindowViewModelTests.csCover footer status and sign-in projections +66/-7

Cover footer status and sign-in projections

• Updates status-brush assertions and tests diagnostic detail, semver display, sign-in visibility, and hidden disconnected counts.

test/Capacitor.App.Tests.Unit/MainWindowViewModelTests.cs

MarkdownViewTests.csVerify info-blue markdown links +2/-0

Verify info-blue markdown links

• Asserts that links no longer consume the success-green status color.

test/Capacitor.App.Tests.Unit/MarkdownViewTests.cs

PullRequestViewSmokeTests.csVerify conditional PR section visibility +9/-5

Verify conditional PR section visibility

• Checks that the workspace tab and work-context section appear only when a pull request is available.

test/Capacitor.App.Tests.Unit/PullRequestViewSmokeTests.cs

RailSessionViewModelTests.csCover idle and attention badge precedence +9/-6

Cover idle and attention badge precedence

• Tests waiting dots, clock badges, and permission or failure overrides for session rows.

test/Capacitor.App.Tests.Unit/RailSessionViewModelTests.cs

RailWorktreeViewModelTests.csCover collapsed worktree badges +23/-0

Cover collapsed worktree badges

• Verifies aggregate attention badges appear only when session rows are hidden.

test/Capacitor.App.Tests.Unit/RailWorktreeViewModelTests.cs

RemoteSessionViewModelTests.csUpdate remote subagent expectations +3/-3

Update remote subagent expectations

• Aligns remote-session tests with detailed single background-subagent state text.

test/Capacitor.App.Tests.Unit/RemoteSessionViewModelTests.cs

SessionCardViewModelTests.csVerify waiting session card semantics +6/-3

Verify waiting session card semantics

• Ensures user-waiting agents use a distinct status dot while flow participants remain running.

test/Capacitor.App.Tests.Unit/SessionCardViewModelTests.cs

SessionSubagentsTests.csCover background and multi-hour durations +11/-0

Cover background and multi-hour durations

• Tests explicit background wording and compact hour-based elapsed-time formatting.

test/Capacitor.App.Tests.Unit/SessionSubagentsTests.cs

TerminalGlyphSubstitutionTests.csVerify terminal glyph substitution +15/-0

Verify terminal glyph substitution

• Pins replacement of unsupported play markers without changing terminal cell width.

test/Capacitor.App.Tests.Unit/TerminalGlyphSubstitutionTests.cs

ToolGroupItemTests.csCover failed tool-group expansion +6/-3

Cover failed tool-group expansion

• Verifies failed groups open automatically and correctly report visible calls when toggled.

test/Capacitor.App.Tests.Unit/ToolGroupItemTests.cs

VendorChipPaletteTests.csUpdate Claude chip palette expectations +2/-2

Update Claude chip palette expectations

• Pins the new neutral background and light foreground colors.

test/Capacitor.App.Tests.Unit/VendorChipPaletteTests.cs

WindowSizeMemoryTests.csTest window placement memory +94/-0

Test window placement memory

• Covers defaults, minimums, invalid dimensions, off-screen clamping, restoration, and close-time persistence.

test/Capacitor.App.Tests.Unit/WindowSizeMemoryTests.cs

WorkContextViewModelTests.csCover work-context projections and fallback PRs +166/-3

Cover work-context projections and fallback PRs

• Tests PR fallback merging, empty-state timing, identity handling, contributor caps, copy eligibility, and middle truncation.

test/Capacitor.App.Tests.Unit/WorkContextViewModelTests.cs

WorkContextViewSmokeTests.csValidate work-context visual semantics +201/-12

Validate work-context visual semantics

• Covers neutral identity colors, purple location marks, expandable headers, contributor visibility, subagent layout, and copy feedback.

test/Capacitor.App.Tests.Unit/WorkContextViewSmokeTests.cs

WorkspaceViewSmokeTests.csValidate workspace header and segmented switch +40/-8

Validate workspace header and segmented switch

• Checks new controls, horizontal overflow prevention, conditional switch visibility, title tooltips, and danger hover styling.

test/Capacitor.App.Tests.Unit/WorkspaceViewSmokeTests.cs

XtermTerminalSurfaceTests.csVerify cursor stability after terminal growth +21/-0

Verify cursor stability after terminal growth

• Ensures increasing viewport height preserves the cursor's absolute buffer line and live prompt content.

test/Capacitor.App.Tests.Unit/XtermTerminalSurfaceTests.cs

Documentation (3) +23 / -2
CLAUDE.mdDocument desktop palette and chrome invariants +21/-0

Document desktop palette and chrome invariants

• Defines status-only color semantics and requires Kcap-styled controls instead of exposed Fluent defaults.

CLAUDE.md

Converters.csRefresh status-brush documentation +1/-1

Refresh status-brush documentation

• Updates the thread-affinity reference after renaming the main status brush helper.

src/Capacitor.App/Views/Converters.cs

VendorIcons.csRefresh thread-affinity documentation +1/-1

Refresh thread-affinity documentation

• Updates the referenced status brush helper name in the icon caching guidance.

src/Capacitor.App/Views/VendorIcons.cs

@qodo-code-review

qodo-code-review Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Work-item pull requests stay unreadable ✗ Dismissed 🔗 Cross-repo conflict ≡ Correctness
Description
OfferFallbacks converts work-item links into PullRequestLinkDto choices and sends them to the
session-scoped reader even when the session did not list them. When such a link is selected,
kcap-server admission requires the same repository hash and number in that session's links, so
overview and thread requests return hidden instead of displaying the work-item pull request.
Code

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[R433-435]

+        foreach (var card in _links)
+            if (TryParsePullRequestLink(card) is { } link) links.Add(link);
+        PullRequests.OfferFallbackLinks(links);
Relevance

●●● Strong

The finding identifies a concrete admission mismatch; recent PR-reader availability fixes were
accepted.

PR-#856
PR-#929

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The PR explicitly offers parsed work-item links to the native pull-request context, whose reader
treats them as selectable pull requests. kcap-server's admission logic independently reads the
session links and hides any subject without exactly one matching repository hash and number, so a
work-item-only fallback cannot be read through these endpoints.

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[430-450]
src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[195-205]
External repo: kurrent-io/kcap-server, src/Capacitor.Server.Core/PullRequests/PullRequestAdmission.cs [10-16]
External repo: kurrent-io/kcap-server, src/Capacitor.Api.Public/PullRequests/PullRequestEndpointHandlers.cs [42-45]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Work-item pull requests that are not linked to the current session are added to the native session reader, but kcap-server rejects native reads for subjects absent from that session's pull-request links.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[430-450]
- src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[195-205]
- src/Capacitor.App/ViewModels/PullRequestContextViewModel.Reads.cs[171-200]

## Recommended Fix
Distinguish server-listed pull requests from work-item-only fallbacks. Open an unlisted fallback through its validated external URL, and invoke the native overview and thread APIs only after the server's session list contains that pull-request subject.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Pull request links open an unusable reader ✓ Resolved 🐞 Bug ≡ Correctness
Description
OpenPullRequest calls PullRequests.OpenReader() whenever a fallback link makes HasPullRequest
true, without checking whether native reading is legacy or unsupported. When discovery marks the
reader legacy, the new work-context link opens that disabled reader rather than the fallback URL,
even though the existing PR card prevents native-reader activation in that state.
Code

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[R195-199]

+    void OpenPullRequest() {
+        OfferFallbacks();
+        if (PullRequests is { HasPullRequest: true } prs) prs.OpenReader();
+        else if (_links.FirstOrDefault(l => l.CanOpen) is { } link)
+            LinkPolicy.Open(_opener, link.Url);
Relevance

●●● Strong

Recent pull-request context findings accepted correcting unavailable choices and native-reader
visibility behavior.

PR-#856
PR-#929

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Fallback work-item links are converted to available pull-request choices, and HasPullRequest only
tests their availability. Discovery explicitly flags legacy or unsupported providers, but
OpenReader itself does not reject that condition; the existing card instead disables its native
action when legacy.

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[195-200]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[430-435]
src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[80-84]
src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[195-206]
src/Capacitor.App/ViewModels/PullRequestContextViewModel.Reads.cs[35-49]
src/Capacitor.App/Views/PullRequestCard.axaml[58-58]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The work-context pull-request action sends every available PR choice to the native reader. Legacy and unsupported providers deliberately disable native reading, so fallback work-item links should open their external URL instead.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[195-200]
- src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[80-84]
- src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs[195-206]
- src/Capacitor.App/Views/PullRequestCard.axaml[58-58]

## Recommended Fix
Only invoke `OpenReader()` when the PR context is not legacy and native reading is supported. For legacy or unsupported contexts, select a valid linked work-context URL and open it through `LinkPolicy.Open`, matching the PR card's existing native-reader guard.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Restored windows remain inaccessible ✓ Resolved 🐞 Bug ≡ Correctness
Description
ResolvePosition clamps only the saved top-left point and ignores the restored window dimensions.
After a monitor is removed or its layout changes, the window can be placed with only one pixel
visible or remain larger than the available screen.
Code

src/Capacitor.App/Services/WindowSizeMemory.cs[R26-27]

+        var home = workingAreas[0];
+        return new PixelPoint(ClampOnto(x, home.X, home.Width), ClampOnto(y, home.Y, home.Height));
Relevance

●●● Strong

Recent accepted precedents favor fixing concrete restore-state edge cases and geometry invariants.

PR-#779
PR-#889

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The resolver accepts only coordinates and working areas, while Apply restores width and height
separately. The new test explicitly expects an off-screen X coordinate to become 1919 on a
1920-pixel screen, which leaves a 1400-pixel-wide default window with only one visible pixel.

src/Capacitor.App/Services/WindowSizeMemory.cs[15-38]
test/Capacitor.App.Tests.Unit/WindowSizeMemoryTests.cs[39-52]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Window restoration clamps only the top-left coordinate, so the restored window can remain almost entirely outside the available working area.

## Fix Focus Areas
- src/Capacitor.App/Services/WindowSizeMemory.cs[15-38]
- test/Capacitor.App.Tests.Unit/WindowSizeMemoryTests.cs[39-52]

## Recommended Fix
Pass the resolved width and height into position resolution and clamp the complete window rectangle so a usable portion, preferably the whole window when it fits, remains inside a working area. Add tests for removed monitors, oversized saved windows, and working areas with non-zero origins.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View high (1)
4. Linked pull requests disappear ✓ Resolved 🐞 Bug ≡ Correctness
Description
SameLink treats equal display keys such as #42 as duplicates before considering that their URLs
may identify different repositories. When a work item links pull request number 42 from multiple
repositories, AddUnlessDuplicate retains only the first and removes the others from both the pane
and fallback reader choices.
Code

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[R467-469]

+    static bool SameLink(WorkContextLinkViewModel left, WorkContextLinkViewModel right) =>
+        left.Key == right.Key
+        || left.Url is { Length: > 0 } url && string.Equals(url, right.Url, StringComparison.OrdinalIgnoreCase);
Relevance

●● Moderate

Repository-local pull-request identity is a concrete bug, but no closely matching duplicate-key
precedent appeared.

PR-#779
PR-#856

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The new equality predicate returns true solely from matching keys, even when both links have
distinct URLs. The same file explicitly documents that pull-request numbers are repository-local,
while AddUnlessDuplicate uses this predicate when building the displayed list.

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[416-425]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[467-473]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[500-502]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Pull-request numbers are repository-local, but the new link deduplication collapses equal numbers across different repositories.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[416-473]
- test/Capacitor.App.Tests.Unit/WorkContextViewModelTests.cs[893-958]

## Recommended Fix
Deduplicate parseable PR links by provider, host, owner, repository, and number, or by normalized URL. Use the display key only as a fallback when repository identity is unavailable, and add a test containing the same PR number in two repositories.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

5. Minimized windows reopen unmaximized ✓ Resolved 🐞 Bug ≡ Correctness
Description
WindowSizeMemory.Flush persists WindowMaximized by comparing only the window's current state to
Maximized. A maximized window that is minimized or closed while minimized schedules a flush with
Minimized, so the next startup skips the maximized restore despite the user having left the window
maximized.
Code

src/Capacitor.App/Services/WindowSizeMemory.cs[72]

+                WindowMaximized = window.WindowState == WindowState.Maximized,
Relevance

●●● Strong

This is a concrete persisted-state bug; recent lifecycle and state correctness fixes were accepted.

PR-#766
PR-#889

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
State changes schedule a persistence flush, but only Normal state updates the saved geometry and the
persisted maximization flag is derived from the instantaneous state. Restore applies maximization
solely from that persisted flag.

src/Capacitor.App/Services/WindowSizeMemory.cs[54-57]
src/Capacitor.App/Services/WindowSizeMemory.cs[64-73]
src/Capacitor.App/Services/WindowSizeMemory.cs[84-91]
src/Capacitor.App/Services/WindowSizeMemory.cs[33-40]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Window placement persistence treats a minimized window as non-maximized. A user who minimizes a maximized window before closing the app loses their maximized restore preference.

## Fix Focus Areas
- src/Capacitor.App/Services/WindowSizeMemory.cs[54-73]
- src/Capacitor.App/Services/WindowSizeMemory.cs[84-91]

## Recommended Fix
Track the last non-minimized window state separately, updating it on Normal and Maximized states. Persist that remembered state when the current state is Minimized, while retaining the existing normal restore geometry behavior.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Dependency guidance becomes stale ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
KeepCursorOnItsLine's comment records specific package versions, target frameworks, and a future
upgrade sequence instead of limiting itself to the active binary-compatibility constraint. Any
dependency or framework update can invalidate lines 61–66 while the cursor workaround remains valid,
leaving later maintainers to separate obsolete release guidance from the required
field-versus-property limitation.
Code

src/Capacitor.App/Services/XtermTerminalSurface.cs[R61-64]

+    // XTerm.NET 2.x moves both halves itself, and this whole correction goes when the pane can
+    // take it — but the version cannot be raised on its own. SvcSystems.UI.Terminal 1.1.4 ships
+    // compiled against 1.2.0, where BufferCell.Content is a FIELD and in 2.x is a property: the
+    // build stays clean and every model construction throws MissingFieldException from the
Relevance

●●● Strong

The repository recently accepted removing stale process and dependency metadata from comments.

PR-#653
PR-#666

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Rule 2897915 prohibits time-sensitive dependency and change-process metadata in comments. The added
comment names several package versions and framework targets and describes a future upgrade
sequence, although the behavior-critical compatibility constraint can be stated without those
release coordinates.

Rule 2897915: Avoid time-sensitive or process-reference metadata in code comments
src/Capacitor.App/Services/XtermTerminalSurface.cs[61-66]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The cursor workaround comment includes version-specific upgrade guidance and target-framework metadata that will become stale independently of the behavior it explains.

## Fix Focus Areas
- src/Capacitor.App/Services/XtermTerminalSurface.cs[61-66]

## Recommended Fix
Remove the release and migration narrative. Retain a concise, present-tense explanation that the bundled terminal control expects `BufferCell.Content` to be a field and fails when paired with an incompatible property-based API.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


7. Keyboard toggles make chat jump ✓ Resolved 🐞 Bug ≡ Correctness
Description
OnReaderGesture captures the tool-summary anchor only for PointerPressedEvent, while
OnToolSummaryClick cannot arm restoration unless that anchor already exists. Activating the same
summary with Enter or Space changes the virtualized row height without restoring its viewport
position, so keyboard users are shifted away from the bubble they toggled.
Code

src/Capacitor.App/Views/ChatTabView.axaml.cs[89]

+        if (e.RoutedEvent == PointerPressedEvent) CaptureToggleAnchor(e.Source);
Relevance

●●● Strong

Recent keyboard-accessibility findings in chat and markdown surfaces were accepted by this team.

PR-#915
PR-#985

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Anchor capture is explicitly gated to pointer presses, but the AXAML routes the Button's general
Click event to a handler that only calls ArmToggleRestore. That method immediately returns when
_anchorItem is null, which is the keyboard activation path.

src/Capacitor.App/Views/ChatTabView.axaml.cs[86-106]
src/Capacitor.App/Views/ChatTabView.axaml.cs[114-124]
src/Capacitor.App/Views/ChatTabView.axaml[159-160]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Viewport-anchor restoration is armed for all summary clicks but captures an anchor only for pointer input, leaving keyboard toggles unprotected.

## Fix Focus Areas
- src/Capacitor.App/Views/ChatTabView.axaml.cs[86-124]
- src/Capacitor.App/Views/ChatTabView.axaml[159-160]

## Recommended Fix
In the click handler, capture the summary button from `sender` when no pointer anchor exists before calling `ArmToggleRestore`. Add coverage for Enter or Space activation that verifies the toggled summary retains its viewport Y position.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View medium (2)
8. Other app preferences can be lost ✗ Dismissed 🐞 Bug ☼ Reliability
Description
WindowSizeMemory.Attach receives a different AppStateStore instance from the lifecycle
coordinators, and WindowSizeMemory.Flush uses it to update the whole AppState while
synchronization is limited to each store’s instance-local semaphore. When placement and lifecycle or
shim, consent, harness, or Home preferences are persisted concurrently to app-state.json, both
stores can read the old file and the later full-file serialization can overwrite the other writer’s
fields.
Code

src/Capacitor.App/Services/WindowSizeMemory.cs[R67-70]

+            store.UpdateAsync(s => s with {
+                WindowWidth = lastWidth,
+                WindowHeight = lastHeight,
+                WindowX = lastPos.X,
Relevance

●●● Strong

Recent accepted precedents consistently accept fixes for unsynchronized concurrent state updates and
persistence races.

PR-#831
PR-#474

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
BuildAndShowMainWindow attaches the window to one store, while BuildLifecycleController
constructs another store for the same configured path. The AppStateStore implementation uses an
instance field as its only synchronization gate and performs a complete-state read-modify-write,
proving that operations through separate instances are not serialized and can each write state
derived from an outdated read.

src/Capacitor.App/Services/WindowSizeMemory.cs[64-73]
src/Capacitor.App/App.axaml.cs[1196-1198]
src/Capacitor.App/App.axaml.cs[1227-1228]
src/Capacitor.App/App.axaml.cs[1248-1248]
src/Capacitor.App/Services/AppStateStore.cs[31-56]
src/Capacitor.App/App.axaml.cs[1196-1228]
src/Capacitor.App/App.axaml.cs[1248-1270]
src/Capacitor.App/Services/AppStateStore.cs[34-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Window placement and lifecycle persistence use separate `AppStateStore` instances targeting the same `app-state.json` file. Because locking is instance-local, concurrent complete-file read-modify-write operations can overwrite fields saved by the other writer, including shim, consent, harness, or Home preferences.

## Fix Focus Areas
- src/Capacitor.App/App.axaml.cs[1196-1228]
- src/Capacitor.App/App.axaml.cs[1248-1270]
- src/Capacitor.App/Services/AppStateStore.cs[31-56]

## Recommended Fix
Create one application-scoped `AppStateStore` for `app-state.json` and pass that same instance to Home, window-placement, lifecycle, shim, and consent paths. Alternatively, introduce synchronization shared by canonical file path that covers the entire read-modify-write operation, and use collision-safe temporary files.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


9. PR mentions appear as linked work ✓ Resolved 🐞 Bug ≡ Correctness
Description
ProjectWorkItemPullRequests accepts every pull-request-kind entry without requiring `LinkClass ==
"link". Work-item entries classified as ambient reference` mentions therefore enter the pane and
are offered to the in-app pull-request reader as though they were identity-bearing links.
Code

src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[R453-457]

+    List<WorkContextLinkViewModel> ProjectWorkItemPullRequests(IReadOnlyList<WorkItemLinkDto> links) {
+        var cards = new List<WorkContextLinkViewModel>();
+        foreach (var link in links) {
+            if (!IsPullRequestKind(link.Kind)) continue;
+            AddUnlessDuplicate(cards, Link(PullRequestKey(link.ShortKey), FirstNonBlank(link.Title), link.Url));
Relevance

●●● Strong

Recent work-context projection findings were accepted when filtering or validating user-visible
work-item links.

PR-#779
PR-#884

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The DTO contract distinguishes identity-bearing link entries from ambient reference entries, and
the existing issue projection enforces that distinction. The new PR projection checks only Kind,
after which its output is rebuilt into visible links and fallback reader choices.

src/Capacitor.Cli.Core/WorkItems/WorkItemDtos.cs[42-54]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[317-319]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[453-459]
src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[416-427]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new work-item PR projection treats ambient references as identity-bearing linked pull requests.

## Fix Focus Areas
- src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs[453-459]
- test/Capacitor.App.Tests.Unit/WorkContextViewModelTests.cs[893-958]

## Recommended Fix
Project a work-item pull request only when its kind is supported and `LinkClass` equals `link`, matching the existing issue-link filtering. Add a test proving a `reference` PR is not displayed or offered as a fallback.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 64 rules
✅ Cross-repo context — repo relationships
  Explored: repo: kurrent-io/kcap-server (sha: b6d54cff)
Review mode: 🧠 Deep: This is a broad, logic-dense desktop overhaul spanning 67 files and 208 independent hunks across UI, view models, persistence, terminal behavior, and window state, creating multiple independent paths where subtle regressions could be missed in one pass.

Grey Divider

Tip of the day
💡 Did you know, you can type 'qodo, fix this' on a finding and the fix lands right on your PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/Capacitor.App/Services/XtermTerminalSurface.cs Outdated
Comment thread src/Capacitor.App/Services/WindowSizeMemory.cs Outdated
Comment thread src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs
Comment thread src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs Outdated
Comment thread src/Capacitor.App/Views/ChatTabView.axaml.cs
Comment thread src/Capacitor.App/Services/WindowSizeMemory.cs Outdated
Comment thread src/Capacitor.App/Services/WindowSizeMemory.cs
Comment thread src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs Outdated
Comment thread src/Capacitor.App/ViewModels/WorkContextViewModel.Projections.cs
Off-screen clamp uses window size so the full frame lands on a monitor;
minimized quit no longer clears a prior maximized state. Legacy PR
capability opens the selected PR in the browser; link-class-only cards
dedupe by URL. Chat tool-summary clicks capture a scroll anchor when
the toggle did not come from a pointer press.
@alexeyzimarev

Copy link
Copy Markdown
Member

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-18T12:28:28.424639Z a6ee598 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a6ee5986ab

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/Capacitor.App/ViewModels/ChatItems.cs Outdated
Comment thread src/Capacitor.App/ViewModels/PullRequestContextViewModel.cs
A folded group's VisibleCalls is the live list, so raising HasVisibleCalls before the
add published false for the call's whole run.
Routing stays with the reader registry, which is provider-agnostic and cannot say whether a
local reader will take the host; the notice points at the GitHub button instead.
The eyebrow already names the section; the meta line carries progress or
overflow the body does not show.
Release-facing notes for this pass live on the PR changelog comment.
@nortonandreev nortonandreev changed the title Overhaul desktop chrome, status colour, rail footer and work-context pane [AI-2956] desktop: Overhaul chrome, status colour, rail footer and work-context pane Sep 18, 2026
@linear-code

linear-code Bot commented Sep 18, 2026

Copy link
Copy Markdown

AI-2956

@alexeyzimarev
alexeyzimarev merged commit 6d5dfb5 into main Sep 18, 2026
8 checks passed
@alexeyzimarev
alexeyzimarev deleted the norton/desktop-ui-enhancements branch September 18, 2026 13:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Desktop: overhaul chrome, status colour, rail footer and work-context pane

2 participants