Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
472 commits
Select commit Hold shift + click to select a range
7e81ca5
fix(web): the command palette scrolls instead of the overview behind it
flamboh Nov 10, 2026
0262f86
fix(web): sending a workspace's only pane away no longer flashes the …
flamboh Nov 10, 2026
c8b1d4a
fix(web): add consistent settings controls and utility tooltips (#31581)
flamboh Nov 10, 2026
592f3e1
feat(web): switch house colors from one theme card
maria-rcks Nov 10, 2026
0a71c3d
fix(web): chats scrolled off screen no longer mark finished work as read
flamboh Nov 10, 2026
c74eb91
fix(web): use consistent timeline fold disclosures (#31558)
flamboh Nov 10, 2026
bcb5ec9
fix(web): only the focused pane's thread reads as current in the side…
flamboh Nov 10, 2026
7ed5b96
fix(web): sidebar keeps the open thread in view when a new thread sen…
flamboh Nov 10, 2026
df2721b
fix(web): the overview shows readable panes live with the sidebar open
flamboh Nov 10, 2026
4099db8
fix(web): keep the open branch chip highlighted and readable (#31550)
flamboh Nov 10, 2026
c2c396b
fix(web): make settings rows and dialogs consistent (#31583)
flamboh Nov 10, 2026
c7b8d91
fix(web): stop restored focus reopening tooltips and keep nested dial…
flamboh Nov 10, 2026
3bf52e1
fix(web): align Voice setting fields with standard row controls (#31588)
flamboh Nov 10, 2026
2b819bb
fix(web): preserve settings breadcrumb labels and align layout action…
flamboh Nov 10, 2026
99044e1
fix(web): clarify file approvals and superseded attempt rows (#31624)
flamboh Nov 10, 2026
507aac0
fix(web): right-clicking an inactive pane tab opens that tab's own me…
flamboh Nov 10, 2026
1b42105
fix(web): keep Working visible while a sent turn starts (#31625)
flamboh Nov 10, 2026
1ba822e
fix(web): keep settings breadcrumb aligned with loaded content (#31600)
flamboh Nov 10, 2026
6c1337f
perf(web): the sidebar slides instead of resizing the panes every fra…
flamboh Nov 10, 2026
b55b5eb
fix(web): side-by-side drops land beside the pane you drop on (#31836)
flamboh Nov 10, 2026
6e3b72d
fix(web): classic theme's pane header strip matches the lifted pane
maria-rcks Nov 10, 2026
90dec3b
fix(web): a stack cannot be merged through a pull request that confli…
maria-rcks Nov 10, 2026
5dbe9b6
fix(web): let surface styles paint the composer pill
maria-rcks Nov 10, 2026
1486322
fix(web): carry control surfaces into cards and overlays
maria-rcks Nov 10, 2026
13a3e1e
fix(web): keep soft gradient surfaces smooth and edge free
maria-rcks Nov 10, 2026
d0c704c
fix(web): retain aqua gloss across controls and larger surfaces
maria-rcks Nov 10, 2026
50af430
fix(web): keep aqua blue jelly visible with readable labels
maria-rcks Nov 10, 2026
c3fa9b8
fix(web): carry fading rims onto every raised surface
maria-rcks Nov 10, 2026
1e84913
fix(web): align flat control fills with the style card
maria-rcks Nov 10, 2026
2fac976
fix(web): preserve surface styles through theme overrides and pane tabs
maria-rcks Nov 10, 2026
38cd1fb
fix(web): keep styled action labels at aa contrast
maria-rcks Nov 10, 2026
38a408a
fix(web): keep styled labels readable in named palettes
maria-rcks Nov 10, 2026
104c38c
fix(web): swap sidebar status and hover actions together (#31596)
flamboh Nov 10, 2026
453131d
fix(web): suppress sidebar hover cards while scrolling (#31603)
flamboh Nov 10, 2026
3bddd5f
fix(web): pull request header stays on one line in narrow panels (#33…
flamboh Nov 10, 2026
db0ef21
fix(web): the layout introduction and tour work from the keyboard
flamboh Nov 10, 2026
960450d
fix(web): provider updates no longer pop toasts on launch in the rede…
flamboh Nov 10, 2026
82f8828
fix(server): simplify the Connect completion page (#32168)
flamboh Nov 10, 2026
5cd6f61
fix(web): match MCP setup to the redesign (#32166)
flamboh Nov 10, 2026
56a899f
test(web): sidebar terminal-focus test no longer races environment st…
flamboh Nov 10, 2026
41db6ce
refactor(server): archive message counts come from the projection sto…
flamboh Nov 10, 2026
9db334d
fix(web): aqua styles leave tabs, the sidebar search and the composer…
maria-rcks Nov 10, 2026
67e7f05
fix(web): keep rapid thread jumps ahead of chat rendering
maria-rcks Nov 9, 2026
521c58a
fix(web): keep the first typed key after a promoted draft switch
maria-rcks Nov 10, 2026
e2edbe0
fix(client-runtime): preserve idle history identity on warm returns
maria-rcks Nov 10, 2026
d73e7d0
fix(web): render isolated thread switches without deferral
maria-rcks Nov 10, 2026
8335f4e
fix(web): isolate timelines during deferred thread switches
maria-rcks Nov 10, 2026
e38f9b7
revert(web): nightly chrome keeps its sunrise artwork
maria-rcks Nov 10, 2026
92681db
fix(web): chat content scrolls under the pane header again
maria-rcks Nov 10, 2026
78115d5
fix(web): restore the settle word on sidebar rows
maria-rcks Nov 10, 2026
392f8ea
fix(web): balance lineage row spacing and icon alignment
maria-rcks Nov 10, 2026
365c28f
revert(web): lineage rows keep their height and gaps
maria-rcks Nov 10, 2026
05fbc07
fix(web): round and join composer banner surfaces
maria-rcks Nov 10, 2026
c81f863
fix(web): work row icons match the row text and subagent rows keep th…
maria-rcks Nov 10, 2026
b11d223
fix(web): give sidebar header buttons their selected surface style
maria-rcks Nov 10, 2026
5ea4286
fix(web): keep aqua containers quieter than their controls
maria-rcks Nov 10, 2026
1e8956f
fix(web): keep aqua context surfaces calm and readable
maria-rcks Nov 10, 2026
efff264
fix(web): make flat segmented selections visible
maria-rcks Nov 10, 2026
7bbdc39
fix(web): give lineage lists space at their outer edges
maria-rcks Nov 10, 2026
44099f4
fix(web): simplify side chat headers
maria-rcks Nov 10, 2026
dc6f2a9
feat(web): nightly's dark chrome paints the orbital sunrise in color
maria-rcks Nov 10, 2026
20cc115
fix(web): nightly's sunrise sits in the app's chrome with the horizon…
maria-rcks Nov 10, 2026
4e8c8df
fix(web): retain main integrations in the workspace panes
maria-rcks Nov 11, 2026
7ccb3d2
fix(web): keep phone headers and drawers on app chrome
maria-rcks Nov 11, 2026
47c79dc
fix(web): keep phone composer text clear of controls
maria-rcks Nov 11, 2026
c4693b4
fix(web): give subagent titles more room on phones
maria-rcks Nov 11, 2026
4e2c322
fix(web): show more queued message text on phones
maria-rcks Nov 11, 2026
1a4c174
fix(web): keep pull request titles readable on phones
maria-rcks Nov 11, 2026
7d32500
fix(web): keep pull request controls clear in narrow panels
maria-rcks Nov 11, 2026
be373d3
fix(web): keep phone settings labels and controls readable
maria-rcks Nov 11, 2026
c709373
fix(web): keep thread details menus inside phone screens
maria-rcks Nov 11, 2026
a97252a
fix(web): keep phone surface tabs and close controls visible
maria-rcks Nov 11, 2026
c0e403f
fix(mobile): use darker chrome around native content sheets
maria-rcks Nov 11, 2026
2745383
fix(web): keep tab flicks from navigating workspace history
maria-rcks Nov 11, 2026
6141def
test(web): give the turn announcement fixture an attempt start time
maria-rcks Nov 11, 2026
6ee24a0
fix(web): retain main behavior across workspace controls
maria-rcks Nov 11, 2026
a305cd8
fix(web): carry environment editor selection into workspace surfaces
maria-rcks Nov 11, 2026
d58c3cd
feat(web): rename surface styles and describe each one in the picker
maria-rcks Nov 10, 2026
2607417
fix(web): accent gloss keeps the theme accent's hue
maria-rcks Nov 10, 2026
5bfefa5
fix(web): style cards show their name only
maria-rcks Nov 11, 2026
97dbb91
fix(web): restore raised dropdowns in the default surface style
maria-rcks Nov 11, 2026
195f378
fix(web): keep thread details from scrolling sideways
maria-rcks Nov 11, 2026
8b37216
fix(web): keep image reads in the work log
maria-rcks Nov 11, 2026
f1b0784
fix(web): retain the settings size for retention ages
maria-rcks Nov 11, 2026
da52f11
fix(web): preserve primary focus when capturing confirmation openers
maria-rcks Nov 11, 2026
d2a0d31
fix(web): keep the automations card from scrolling sideways
maria-rcks Nov 11, 2026
04111fc
fix(web): match compact toggle to the flat send pill
maria-rcks Nov 11, 2026
0d6c6ce
fix(web): lineage rows sit tight again
maria-rcks Nov 11, 2026
f604774
fix(web): previous agents expand in place in the Lineage card
maria-rcks Nov 11, 2026
8a772b4
fix(web): keep details card headers still when toggled
maria-rcks Nov 11, 2026
693c8d9
fix(web): highlight automation rows and open editing directly
maria-rcks Nov 11, 2026
a55583c
fix(web): make sidebar updates match ghost footer controls
maria-rcks Nov 11, 2026
ba14817
fix(web): a dismissed low usage notice stays dismissed
maria-rcks Nov 11, 2026
f64d659
fix(web): details card headers share one height with a centered title
maria-rcks Nov 11, 2026
b465ae8
fix(web): the details panel scrolls with the pointer over the lineage…
maria-rcks Nov 11, 2026
931515a
fix(web): agent hover cards keep the model and effort on one line
maria-rcks Nov 11, 2026
3c49d7a
fix(web): use pooled model limits for low usage warnings
maria-rcks Nov 11, 2026
00ec394
fix(web): compact context says why it is unavailable and the context …
maria-rcks Nov 11, 2026
f4ca3d7
fix(web): offer side chat from the surface menus
maria-rcks Nov 11, 2026
8d15e7d
fix(web): a queued message still saving can be removed
maria-rcks Nov 11, 2026
c9020fb
fix(web): the low usage notice's x dismisses it until its window resets
maria-rcks Nov 11, 2026
97108ef
fix(web): the stopped square joins the send pill instead of adding a …
maria-rcks Nov 11, 2026
08a9bdc
fix(web): keep timeline row heights stable during zoom
maria-rcks Nov 11, 2026
8d84944
fix(web): environment settings show this machine's overview again
maria-rcks Nov 11, 2026
20af696
fix(web): pull request readiness rows line up their details with the …
maria-rcks Nov 11, 2026
7108414
fix(web): separate dictation finish and cancel controls
maria-rcks Nov 11, 2026
88201d5
fix(web): restore main's palette groups and recent results
maria-rcks Nov 11, 2026
d183144
test(web): drop main's case for the viewed-images row the work log re…
maria-rcks Nov 11, 2026
b1802da
perf(web): switching threads no longer re-renders every open tab's chat
maria-rcks Nov 11, 2026
1229a95
perf(web): leaving a thread no longer forces a style recalc per message
maria-rcks Nov 11, 2026
a867a0a
perf(web): the composer no longer forces a style recalc when its edit…
maria-rcks Nov 11, 2026
c0b6a05
fix(web): label the pull request host filter all forges
maria-rcks Nov 11, 2026
5ee215e
fix(web): keep selected changes visible in thread details
maria-rcks Nov 11, 2026
1a0cee1
fix(web): hidden tabs preserve the visible pane corners
maria-rcks Nov 11, 2026
6985c93
test(server): give main's new Claude query fakes the context-usage stub
maria-rcks Nov 11, 2026
9ca5b88
fix(web): keep pull request rows stable after eager sorting
maria-rcks Nov 11, 2026
02ef6e1
fix(web): fit more stack rows in the pull request popover
maria-rcks Nov 11, 2026
6bf10ed
fix(web): keep git action menus compact
maria-rcks Nov 11, 2026
a6e4c80
fix: group pull request project filters across machines
maria-rcks Nov 11, 2026
5747277
refactor(web): remove the unused composer footer animation
maria-rcks Nov 12, 2026
b0d2dfe
refactor(web): remove unused composer control modes
maria-rcks Nov 12, 2026
06fd35e
refactor(web): remove unused css tokens and duplicate padding utility
maria-rcks Nov 12, 2026
e1a1a47
refactor(web): remove the ignored select indicator prop
maria-rcks Nov 12, 2026
f1c886a
refactor(web): remove duplicate launcher shortcut metadata
maria-rcks Nov 12, 2026
cf30454
fix(web): join compact to the composer action pill
maria-rcks Nov 12, 2026
9d2c2e4
test(web): remove composer tests that restate the markup
maria-rcks Nov 12, 2026
8b17d72
test(web): remove redundant timeline tests
maria-rcks Nov 12, 2026
c435d59
test: remove settings tests that mirror the schema
maria-rcks Nov 12, 2026
aa6d26e
test(web): remove duplicate pull request filtering and paging tests
maria-rcks Nov 12, 2026
a6b4f8a
test(web): remove device mock mirrors and duplicate provider warning …
maria-rcks Nov 12, 2026
4c7c7fe
fix(web): blend markdown tables into message bubbles
maria-rcks Nov 12, 2026
ca92f90
revert(web): restore the previous table look in message bubbles
maria-rcks Nov 12, 2026
64285ad
fix(client-runtime): label saved pi and acp reasoning effort
maria-rcks Nov 12, 2026
6cc1b36
fix(web): resolve lineage model aliases before showing effort
maria-rcks Nov 12, 2026
ca8202c
fix(web): match citation comments to main and keep dictation in place
maria-rcks Nov 12, 2026
7d3e690
fix(web): citation comment mic sits before the buttons with no gap
maria-rcks Nov 12, 2026
418859d
fix(web): keep started thread branch controls in details
maria-rcks Nov 12, 2026
8426c5c
fix(web): keep markdown tables on the user bubble surface
maria-rcks Nov 12, 2026
32d2979
revert(web): restore the boxed table styling in message bubbles
maria-rcks Nov 12, 2026
19347e0
fix(web): show hover on composer and work disclosures
maria-rcks Nov 12, 2026
92fd08e
chore(web): remove redundant details press overrides
maria-rcks Nov 12, 2026
84eaa37
fix(web): keep phone chrome on theme colors
maria-rcks Nov 12, 2026
e96dd91
fix(web): keep locked workspace details passive
maria-rcks Nov 12, 2026
4e624b2
fix(web): align stash with the composer tray chips
maria-rcks Nov 12, 2026
7aa3fb4
feat(web): show model switches beneath their messages
maria-rcks Nov 12, 2026
7eea689
fix(web): match message table colors to their bubbles
maria-rcks Nov 12, 2026
4485a88
fix(mobile): keep ios content below the native header
maria-rcks Nov 12, 2026
3a3b0a8
fix(mobile): show themed chrome around ios content sheets
maria-rcks Nov 12, 2026
3ef1cae
fix(web): keep timeline row spacing current when neighbors change
maria-rcks Nov 12, 2026
3996a35
fix(web): show keyboard focus on reachable controls
maria-rcks Nov 12, 2026
b56ead5
fix(web): match hover states on verified rows
maria-rcks Nov 12, 2026
57baf3b
fix(web): give main's language select the settings row controls
maria-rcks Nov 12, 2026
303fcba
style(web): format the translated settings rows
maria-rcks Nov 12, 2026
0537d56
fix(web): read the worktree-pending check from shared where main move…
maria-rcks Nov 12, 2026
50787d8
test(web): drop the removed shortcut context from main's right panel …
maria-rcks Nov 12, 2026
4c3899b
test(server): give main's new Claude fakes the context-usage stub
maria-rcks Nov 12, 2026
3e6a604
fix(web): match queued automation rows to queued messages
maria-rcks Nov 12, 2026
15c0ae3
fix(web): open pull request details without an update loop
maria-rcks Nov 12, 2026
8c73472
chore(web): temporary dev-only recorder for blank timeline gaps
maria-rcks Nov 12, 2026
2b36c8f
fix(web): the copy link shortcut copies a focused pull request's link
maria-rcks Nov 12, 2026
ccc1b61
fix(mobile): give ios list filters room below the sheet edge and line…
maria-rcks Nov 12, 2026
2ebbf79
feat(web): a pane keeps one tab strip across tab switches
maria-rcks Nov 12, 2026
4ef4167
feat(web): pane tabs sit on a bar and the active one joins its pane
maria-rcks Nov 12, 2026
1a1274a
feat(web): a diff or file tab's breadcrumb sits on the pane bar
maria-rcks Nov 12, 2026
ec7b0f1
feat(web): the joined tab leaves on the press and its label switches …
maria-rcks Nov 12, 2026
7e32b77
feat(web): the diff breadcrumb on the pane bar keeps whole words in a…
maria-rcks Nov 12, 2026
34a4aa8
fix(web): dictating in a comment box keeps its buttons in place
maria-rcks Nov 12, 2026
b9c2643
fix(web): icon-only controls in the details card and pane bar name th…
maria-rcks Nov 12, 2026
8c8e6fa
test(web): the mobile sheet test turns panel animations off under the…
maria-rcks Nov 12, 2026
b35947b
fix(web): the thread details button sits level with the pane tabs
maria-rcks Nov 13, 2026
371d792
fix(web): a hovered pane tab takes the active tab's shape
maria-rcks Nov 13, 2026
2489279
fix(web): an accepted prompt suggestion lands exactly where it was shown
maria-rcks Nov 13, 2026
6c3b804
fix(web): opening and closing the sidebar keeps the details card, its…
maria-rcks Nov 13, 2026
bbb4440
feat(web): worktree setup runs as quiet work rows under one working t…
maria-rcks Nov 14, 2026
652fdb7
refactor(web): share the sidebar slide's tracking helpers with pane m…
maria-rcks Nov 14, 2026
3d8341f
fix(web): panes that open, close or resize move as one 150ms motion
maria-rcks Nov 14, 2026
974526f
feat(web): secret cards show the whole reason with the sign-in link i…
maria-rcks Nov 14, 2026
8724f8a
fix(web): the pane's top right corner holds still while the sidebar o…
maria-rcks Nov 14, 2026
f0a8d14
fix(web): a closing diff, files or terminal panel slides out showing …
maria-rcks Nov 14, 2026
d92304e
fix(web): the window's top right corner stays curved while a panel op…
maria-rcks Nov 14, 2026
5a167cf
fix(web): the thread details card stays under the opening panel inste…
maria-rcks Nov 14, 2026
3c5fa2f
fix(web): diff file counts stay at the panel's right edge while the s…
maria-rcks Nov 14, 2026
a683b89
fix(web): collapsing the working history at the bottom no longer doub…
flamboh Nov 9, 2026
3ce3c48
fix(web): a running turn keeps following its end when the work histor…
flamboh Nov 9, 2026
3f157fd
fix(web): Jump to latest hides when a collapsed row leaves nothing be…
flamboh Nov 10, 2026
1987860
fix(web): a subagent row's elapsed time uses the same font as the res…
flamboh Nov 13, 2026
90fceee
perf(web): resizing the chat no longer restyles every timeline row (#…
flamboh Nov 11, 2026
20d7673
fix(web): tab-strip drops say where the tab lands (#31445)
flamboh Nov 6, 2026
bba0d45
fix(web): New tab and Pull requests panes use the same background as …
flamboh Nov 10, 2026
309a0d8
fix(web): above 620px, the composer footer collapses one item at a ti…
flamboh Nov 5, 2026
2d00471
fix(web): sidebar rows show snooze and Settle on hover, as on main (#…
flamboh Nov 14, 2026
312870c
fix(web): a sidebar thread row shows its full repo name when there is…
flamboh Nov 14, 2026
4b76bb5
fix(web): single-line sidebar rows show more of the title when not ho…
flamboh Nov 14, 2026
97342ad
fix(web): a sidebar click on a thread already open as a tab keeps the…
flamboh Nov 14, 2026
222ac15
fix(web): layout actions load without a browser
maria-rcks Nov 14, 2026
62e61fe
fix(web): layer 6 calls main's renamed draft move and banner dismissal
maria-rcks Nov 14, 2026
5c7c35a
fix(web): cmd+J round trips put every pane back at its height (#31443)
flamboh Nov 5, 2026
711e3b3
fix(web): a closing pane slides away showing its content, not a blank…
flamboh Nov 9, 2026
9661280
perf(web): workspace switches leave off-screen chats alone (#31615)
flamboh Nov 9, 2026
20ee24c
fix(web): the strip camera no longer throws when a move has under a p…
flamboh Nov 11, 2026
b9b492f
test(web): off-screen tab test no longer races a second click (#34268)
flamboh Nov 11, 2026
647b9fe
fix(web): closing a tab without a page no longer throws
maria-rcks Nov 14, 2026
2a36866
fix(web): a tab keeps its hover highlight while the pointer is on its…
flamboh Nov 10, 2026
27d5a18
fix(web): keep the active tab aligned when chrome changes
maria-rcks Nov 14, 2026
fbb10d3
fix: preserve reconnect opens and draft handoff through pane layouts
maria-rcks Nov 14, 2026
c411c39
test(web): return an element from the workspace shell mock
maria-rcks Nov 14, 2026
3c4a3ba
test(web): isolate onboarding panes and exercise panel scrolling
maria-rcks Nov 14, 2026
2984f69
fix(web): truncate palette titles before row metadata
maria-rcks Nov 14, 2026
1b6dde7
fix(web): make the sidebar toggle visible on light chrome
maria-rcks Nov 14, 2026
c158df6
feat(web): a running command in the working window says how long it h…
Entrpi Nov 7, 2026
44491c0
fix(web): thread details show limits for a provider that runs through…
SunkenInTime Nov 15, 2026
73958be
fix(web): Lineage rows sit evenly inside their card (#35992)
SunkenInTime Nov 11, 2026
17d4f66
fix(web): keep unfocused pane tabs joined to their pane
maria-rcks Nov 15, 2026
7a9ef15
retrying a failed run no longer repeats the prompt (#31811)
flamboh Nov 7, 2026
4f1d966
fix(web): file editor comments read the composer draft only when the …
maria-rcks Nov 15, 2026
9136480
fix(web): keep work results outside wake-up folds
maria-rcks Nov 15, 2026
b8fab67
fix(web): work results fold into wake-ups again
maria-rcks Nov 15, 2026
aa57374
fix(web): the T3 Code brand is back at the top of the sidebar
maria-rcks Nov 15, 2026
c17350a
fix(web): provider settings use the same card colors as other setting…
maria-rcks Nov 15, 2026
042cf9d
fix(web): keep scroll fades current when content grows
maria-rcks Nov 15, 2026
2b26a05
fix(web): put the sidebar brand before the history arrows
maria-rcks Nov 15, 2026
a3f8f29
fix(web): collapse wake-ups by clicking their rail
maria-rcks Nov 15, 2026
cd3ad1f
fix(web): usage limit rows share content-sized columns in thread details
maria-rcks Nov 15, 2026
940b1ea
fix(web): name each model's weekly limit after the model in thread de…
maria-rcks Nov 15, 2026
130a32c
fix(web): usage bars fill each row and keep room beside long labels
maria-rcks Nov 15, 2026
79f4cd9
the sidebar toggle resizes the panes again instead of sliding them (#…
flamboh Nov 10, 2026
300fd63
fix(web): keep pull request controls inside the page
maria-rcks Nov 15, 2026
cbf1c15
fix(web): sparse pull request timelines show their content
maria-rcks Nov 15, 2026
00c58de
fix(web): sparse pull request summaries expand the description
maria-rcks Nov 15, 2026
81cd361
fix(web): detect missing timeline slots in gap reports
maria-rcks Nov 15, 2026
718d91c
fix(web): opt in to timeline gap diagnostics in production
maria-rcks Nov 15, 2026
b68dcf4
fix(web): remove terminal actions from pane bars
maria-rcks Nov 15, 2026
6fe119a
fix(web): the working window and background groups stop rescanning th…
Entrpi Nov 8, 2026
edec521
fix(web): open turn folds no longer make each timeline update quadrat…
Entrpi Nov 8, 2026
a97bb7c
fix(web): style reply cards and highlight whole responses
maria-rcks Nov 15, 2026
44e7060
fix(web): keep quoted replies recessed in every style
maria-rcks Nov 15, 2026
4e679db
fix(web): keep diff controls inside the pane
maria-rcks Nov 15, 2026
35e5560
fix(web): keep file controls inside the preview pane
maria-rcks Nov 15, 2026
039e439
fix(web): select providers from their status text
maria-rcks Nov 15, 2026
9e756cf
fix(web): return closing panes to their focus origin
maria-rcks Nov 15, 2026
c8ce868
fix(web): keep light pane labels readable with black chrome
maria-rcks Nov 15, 2026
dcfe34f
fix(web): group pull request diffs into redesign cards
maria-rcks Nov 15, 2026
63ee2d7
fix(web): scroll overflowing tabs across the whole row
maria-rcks Nov 15, 2026
f0ef226
fix(web): carry main's side-chat focus, pending-answer split and with…
maria-rcks Nov 15, 2026
bdb8416
fix(web): pull request toolbar menus look like buttons
maria-rcks Nov 15, 2026
0435193
fix(web): pull request detail drops its extra lines and evens its spa…
maria-rcks Nov 15, 2026
8f618b2
fix(web): say where to link usage for custom endpoint providers
maria-rcks Nov 15, 2026
9df5c7d
fix(web): drop routine success toasts the redesign added
maria-rcks Nov 15, 2026
3a939af
feat(web): split terminals from the command palette
maria-rcks Nov 15, 2026
95bddea
fix(web): shift+f6 leaves a side chat in one press, and its active ta…
maria-rcks Nov 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions apps/desktop/src/electron/ElectronMenu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ function normalizeContextMenuItems(source: readonly ContextMenuItem[]): ContextM
disabled: sourceItem.disabled === true,
...(sourceItem.separatorBefore === true ? { separatorBefore: true } : {}),
...(typeof sourceItem.checked === "boolean" ? { checked: sourceItem.checked } : {}),
...(typeof sourceItem.accelerator === "string"
? { accelerator: sourceItem.accelerator }
: {}),
};

if (sourceItem.children) {
Expand Down Expand Up @@ -171,6 +174,8 @@ export const make = Effect.gen(function* () {
label: item.label,
enabled: !item.disabled,
...(typeof item.checked === "boolean" ? { type: "checkbox", checked: item.checked } : {}),
// Shown beside the label for learning; the app's own handler runs the key.
...(item.accelerator ? { accelerator: item.accelerator, registerAccelerator: false } : {}),
};
if (item.children && item.children.length > 0) {
itemOption.submenu = buildTemplate(item.children, complete);
Expand Down
2 changes: 2 additions & 0 deletions apps/desktop/src/ipc/channels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ export const PREVIEW_RECORDING_STOP_CHANNEL = "desktop:preview-recording-stop";
export const PREVIEW_RECORDING_SAVE_CHANNEL = "desktop:preview-recording-save";
export const PREVIEW_STATE_CHANGE_CHANNEL = "desktop:preview-state-change";
export const PREVIEW_POINTER_EVENT_CHANNEL = "desktop:preview-pointer-event";
export const PREVIEW_SET_FORWARDED_KEY_CHORDS_CHANNEL = "desktop:preview-set-forwarded-key-chords";
export const PREVIEW_FORWARDED_KEY_CHORD_CHANNEL = "desktop:preview-forwarded-key-chord";
export const PREVIEW_OPEN_LINK_CHANNEL = "desktop:preview-open-link";
export const PREVIEW_FIND_RESULT_CHANNEL = "desktop:preview-find-result";

Expand Down
12 changes: 12 additions & 0 deletions apps/desktop/src/ipc/methods/preview.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
DesktopPreviewAnnotationSendEnabledInputSchema,
DesktopPreviewAnnotationThemeInputSchema,
DesktopPreviewForwardedShortcutsInputSchema,
DesktopPreviewAnnotationVoiceStateSchema,
DesktopPreviewPickElementInputSchema,
DesktopPreviewArtifactInputSchema,
Expand Down Expand Up @@ -402,6 +403,16 @@ const setAnnotationTheme = DesktopIpc.makeIpcMethod({
}),
});

const setForwardedKeyChords = DesktopIpc.makeIpcMethod({
channel: IpcChannels.PREVIEW_SET_FORWARDED_KEY_CHORDS_CHANNEL,
payload: DesktopPreviewForwardedShortcutsInputSchema,
result: Schema.Void,
handler: Effect.fn("desktop.ipc.preview.setForwardedKeyChords")(function* ({ shortcuts }) {
const manager = yield* PreviewManager.PreviewManager;
yield* manager.setForwardedKeyChords(shortcuts);
}),
});

const pickElement = DesktopIpc.makeIpcMethod({
channel: IpcChannels.PREVIEW_PICK_ELEMENT_CHANNEL,
payload: DesktopPreviewPickElementInputSchema,
Expand Down Expand Up @@ -504,6 +515,7 @@ export const methods = [
clearCache,
getPreviewConfig,
setAnnotationTheme,
setForwardedKeyChords,
setAnnotationSendEnabled,
pickElement,
cancelPickElement,
Expand Down
14 changes: 14 additions & 0 deletions apps/desktop/src/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,20 @@ contextBridge.exposeInMainWorld("desktopBridge", {
ipcRenderer.invoke(IpcChannels.PREVIEW_CLEAR_CACHE_CHANNEL, { environmentId, profileId }),
getPreviewConfig: (environmentId, profileId) =>
ipcRenderer.invoke(IpcChannels.PREVIEW_GET_CONFIG_CHANNEL, { environmentId, profileId }),
setForwardedKeyChords: (shortcuts) =>
ipcRenderer.invoke(IpcChannels.PREVIEW_SET_FORWARDED_KEY_CHORDS_CHANNEL, { shortcuts }),
onForwardedKeyChord: (listener) => {
const wrappedListener = (_event: Electron.IpcRendererEvent, input: unknown) => {
if (typeof input !== "object" || input === null) return;
listener(input as Parameters<typeof listener>[0]);
};
ipcRenderer.on(IpcChannels.PREVIEW_FORWARDED_KEY_CHORD_CHANNEL, wrappedListener);
return () =>
ipcRenderer.removeListener(
IpcChannels.PREVIEW_FORWARDED_KEY_CHORD_CHANNEL,
wrappedListener,
);
},
setAnnotationTheme: (theme) =>
ipcRenderer.invoke(IpcChannels.PREVIEW_SET_ANNOTATION_THEME_CHANNEL, { theme }),
setAnnotationSendEnabled: (tabId, enabled) =>
Expand Down
16 changes: 16 additions & 0 deletions apps/desktop/src/preview/Manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -992,6 +992,22 @@ describe("PreviewManager", () => {
);
expect(focus).toHaveBeenCalledOnce();
expect(send).toHaveBeenCalledTimes(2);
yield* manager.setForwardedKeyChords([
{ key: "z", metaKey: true, ctrlKey: false, altKey: true, shiftKey: false },
]);
const layoutPreventDefault = vi.fn();
beforeInput(
{ preventDefault: layoutPreventDefault } as never,
{ ...key, key: "z", code: "KeyY", alt: true, shift: false } as never,
);
expect(layoutPreventDefault).toHaveBeenCalledOnce();
layoutPreventDefault.mockClear();
beforeInput(
{ preventDefault: layoutPreventDefault } as never,
{ ...key, key: "y", code: "KeyZ", alt: true, shift: false } as never,
);
expect(layoutPreventDefault).not.toHaveBeenCalled();
yield* manager.setForwardedKeyChords([]);
send.mockClear();
yield* manager.setForwardedShortcuts([{ command: "view.reopenClosed", shortcut }]);

Expand Down
57 changes: 57 additions & 0 deletions apps/desktop/src/preview/Manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
DESKTOP_PREVIEW_RECORDING_CAPTURE_TRIGGER,
} from "@t3tools/contracts";
import type {
DesktopForwardedShortcut,
DesktopPreviewAnnotationTheme,
DesktopPreviewAnnotationVoiceConfig,
DesktopPreviewAnnotationVoiceState,
Expand Down Expand Up @@ -67,6 +68,7 @@ import * as DesktopRendererHistory from "../telemetry/DesktopRendererHistory.ts"
import {
MENU_ACTION_CHANNEL,
PREVIEW_ANNOTATION_VOICE_EVENT_CHANNEL,
PREVIEW_FORWARDED_KEY_CHORD_CHANNEL,
PREVIEW_PICTURE_IN_PICTURE_FRAME_CHANNEL,
} from "../ipc/channels.ts";
import * as DesktopBrowserHost from "./DesktopBrowserHost.ts";
Expand Down Expand Up @@ -506,6 +508,28 @@ export const previewWindowOpenAction = (details: {
: "navigate";
};

const isForwardedShortcut = (
input: Electron.Input,
shortcuts: ReadonlyArray<DesktopForwardedShortcut>,
platform: NodeJS.Platform,
): boolean => {
if (input.type !== "keyDown" || shortcuts.length === 0) return false;
return shortcuts.some((shortcut) =>
matchesKeybindingShortcut(
{
key: input.key,
code: input.code,
metaKey: input.meta,
ctrlKey: input.control,
altKey: input.alt,
shiftKey: input.shift,
},
{ ...shortcut, modKey: false },
platform === "darwin" ? "MacIntel" : platform,
),
);
};

const isPreviewRefreshShortcut = (input: Electron.Input, platform: NodeJS.Platform): boolean =>
input.type === "keyDown" &&
input.key.toLowerCase() === "r" &&
Expand Down Expand Up @@ -589,6 +613,9 @@ const makeNativeOperations = Effect.fn("PreviewManager.makeOperations")(function
new Set(),
);
const pickSessionsRef = yield* Ref.make<ReadonlyMap<string, PickSession>>(new Map());
// Read synchronously in before-input-event, which must decide on the spot
// whether the page sees a key, so a plain variable rather than a Ref.
let forwardedKeyChords: ReadonlyArray<DesktopForwardedShortcut> = [];
const controlSessionsRef = yield* SynchronizedRef.make<
ReadonlyMap<number, BrowserControlSession>
>(new Map());
Expand Down Expand Up @@ -1613,6 +1640,27 @@ const makeNativeOperations = Effect.fn("PreviewManager.makeOperations")(function
}
return;
}
// App chords (the layout map) go to the app window, not the page.
if (isForwardedShortcut(input, forwardedKeyChords, hostPlatform)) {
event.preventDefault();
const forwardedKey = {
key: input.key,
code: input.code,
metaKey: input.meta,
ctrlKey: input.control,
altKey: input.alt,
shiftKey: input.shift,
};
runFork(
Ref.get(mainWindowRef).pipe(
Effect.map((window) => {
if (Option.isNone(window) || window.value.isDestroyed()) return;
window.value.webContents.send(PREVIEW_FORWARDED_KEY_CHORD_CHANNEL, forwardedKey);
}),
),
);
return;
}
if (isPreviewRefreshShortcut(input, hostPlatform)) {
event.preventDefault();
runFork(
Expand Down Expand Up @@ -3730,6 +3778,10 @@ const makeNativeOperations = Effect.fn("PreviewManager.makeOperations")(function
setShown,
setCaptureDrawn,
setColorScheme,
setForwardedKeyChords: (shortcuts: ReadonlyArray<DesktopForwardedShortcut>) =>
Effect.sync(() => {
forwardedKeyChords = shortcuts;
}),
setMainWindow,
setForwardedShortcuts: (shortcuts: ReadonlyArray<PreviewForwardedShortcut>) =>
Effect.sync(() => {
Expand Down Expand Up @@ -3965,6 +4017,10 @@ export class PreviewManager extends Context.Service<
tabId: string,
enabled: boolean,
) => Effect.Effect<void, PreviewManagerError>;
/** Chords a focused preview webview hands back to the app window. */
readonly setForwardedKeyChords: (
shortcuts: ReadonlyArray<DesktopForwardedShortcut>,
) => Effect.Effect<void>;
readonly pickElement: (
tabId: string,
voice?: DesktopPreviewAnnotationVoiceConfig,
Expand Down Expand Up @@ -4138,6 +4194,7 @@ export const make = Effect.gen(function* PreviewManagerMake() {
},
),
setAnnotationTheme: operations.setAnnotationTheme,
setForwardedKeyChords: operations.setForwardedKeyChords,
setAnnotationSendEnabled: operations.setAnnotationSendEnabled,
pickElement: operations.pickElement,
updateAnnotationVoice: operations.updateAnnotationVoice,
Expand Down
6 changes: 4 additions & 2 deletions apps/desktop/src/window/DesktopApplicationMenu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,8 @@ export const make = Effect.gen(function* () {
{ role: "services" },
{ type: "separator" },
{ role: "hide", label: `Hide ${environment.displayName}` },
{ role: "hideOthers" },
// alt+cmd+H focuses the pane on the left; Hide Others keeps its item.
{ role: "hideOthers", accelerator: "" },
{ role: "unhide" },
{ type: "separator" },
{ role: "quit", label: `Quit ${environment.displayName}` },
Expand Down Expand Up @@ -287,9 +288,10 @@ export const make = Effect.gen(function* () {
accelerator: "Shift+CmdOrCtrl+R",
click: mainContentsClick("forceReload"),
},
// alt+cmd+I and J belong to the layout keys on macOS.
{
label: "Toggle Developer Tools",
accelerator: environment.platform === "darwin" ? "Alt+Command+I" : "Ctrl+Shift+I",
accelerator: environment.platform === "darwin" ? "Alt+Shift+Command+I" : "Ctrl+Shift+I",
click: mainContentsClick("toggleDevTools"),
},
{ type: "separator" },
Expand Down
49 changes: 38 additions & 11 deletions apps/desktop/src/window/DesktopWindow.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { assert, describe, it } from "@effect/vitest";
import * as Deferred from "effect/Deferred";
import { DesktopSnapShotId } from "@t3tools/contracts";
import { DEFAULT_CLIENT_SETTINGS, DesktopSnapShotId } from "@t3tools/contracts";
import * as Effect from "effect/Effect";
import * as Exit from "effect/Exit";
import * as Fiber from "effect/Fiber";
Expand Down Expand Up @@ -46,7 +46,7 @@ import * as ElectronMenu from "../electron/ElectronMenu.ts";
import * as ElectronShell from "../electron/ElectronShell.ts";
import * as ElectronTheme from "../electron/ElectronTheme.ts";
import * as ElectronWindow from "../electron/ElectronWindow.ts";
import { SNAP_SHOT_EVENT_CHANNEL } from "../ipc/channels.ts";
import { MENU_ACTION_CHANNEL, SNAP_SHOT_EVENT_CHANNEL } from "../ipc/channels.ts";
import * as DesktopServerExposure from "../backend/DesktopServerExposure.ts";
import * as DesktopWindow from "./DesktopWindow.ts";
import {
Expand Down Expand Up @@ -163,9 +163,7 @@ function makeFakeBrowserWindow() {
};
}

const layerDesktopClientSettings = Layer.mock(DesktopClientSettings.DesktopClientSettings)({
get: Effect.succeedNone,
});
const layerDesktopClientSettings = DesktopClientSettings.layerTest();

const layerElectronApp = Layer.mock(ElectronApp.ElectronApp)({
quit: Effect.void,
Expand Down Expand Up @@ -380,6 +378,7 @@ function layerTest(input: {
),
),
Layer.merge(DesktopState.layer),
Layer.merge(layerDesktopClientSettings),
);
}

Expand Down Expand Up @@ -1340,20 +1339,48 @@ describe("DesktopWindow", () => {
if (!swipe) return;
const history = fakeWindow.navigationHistory;

swipe({}, "left");
yield* Effect.promise(() => Promise.resolve(swipe({}, "left")));
assert.equal(history.goBack.mock.calls.length, 1);
assert.equal(history.goForward.mock.calls.length, 0);
swipe({}, "right");
yield* Effect.promise(() => Promise.resolve(swipe({}, "right")));
assert.equal(history.goForward.mock.calls.length, 1);

swipe({}, "up");
swipe({}, "down");
yield* Effect.promise(() => Promise.resolve(swipe({}, "up")));
yield* Effect.promise(() => Promise.resolve(swipe({}, "down")));
history.canGoBack.mockReturnValue(false);
history.canGoForward.mockReturnValue(false);
swipe({}, "left");
swipe({}, "right");
yield* Effect.promise(() => Promise.resolve(swipe({}, "left")));
yield* Effect.promise(() => Promise.resolve(swipe({}, "right")));
assert.equal(history.goBack.mock.calls.length, 1);
assert.equal(history.goForward.mock.calls.length, 1);
assert.equal(
fakeWindow.send.mock.calls.filter(([channel]) => channel === MENU_ACTION_CHANNEL).length,
0,
);
const settings = yield* DesktopClientSettings.DesktopClientSettings;
yield* settings.set({
...DEFAULT_CLIENT_SETTINGS,
layoutThreeFingerSwipe: true,
scrollingWorkspacesEnabled: true,
});
history.canGoBack.mockReturnValue(true);
history.canGoForward.mockReturnValue(true);
for (const direction of ["left", "right", "up", "down"]) {
yield* Effect.promise(() => Promise.resolve(swipe({}, direction)));
assert.deepEqual(fakeWindow.send.mock.lastCall, [
MENU_ACTION_CHANNEL,
`layout-swipe-${direction}`,
]);
}
assert.equal(history.goBack.mock.calls.length, 1);
assert.equal(history.goForward.mock.calls.length, 1);
yield* settings.set({ ...DEFAULT_CLIENT_SETTINGS, layoutThreeFingerSwipe: true });
fakeWindow.send.mockClear();
yield* Effect.promise(() => Promise.resolve(swipe({}, "left")));
yield* Effect.promise(() => Promise.resolve(swipe({}, "right")));
assert.equal(history.goBack.mock.calls.length, 2);
assert.equal(history.goForward.mock.calls.length, 2);
assert.equal(fakeWindow.send.mock.calls.length, 0);
}).pipe(Effect.provide(layer));
}),
);
Expand Down
25 changes: 20 additions & 5 deletions apps/desktop/src/window/DesktopWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -834,11 +834,26 @@ export const make = Effect.gen(function* () {

if (environment.platform === "darwin") {
// Mouse drivers can deliver Back/Forward as macOS swipe gestures instead of buttons.
window.on("swipe", (_event, direction) => {
const history = window.webContents.navigationHistory;
if (direction === "left" && history.canGoBack()) history.goBack();
else if (direction === "right" && history.canGoForward()) history.goForward();
});
window.on("swipe", (_event, direction) =>
runPromise(
Effect.gen(function* () {
const settings = yield* clientSettings.get.pipe(
Effect.orElseSucceed(() => Option.none()),
);
if (
Option.isSome(settings) &&
settings.value.layoutThreeFingerSwipe &&
settings.value.scrollingWorkspacesEnabled
) {
window.webContents.send(MENU_ACTION_CHANNEL, `layout-swipe-${direction}`);
return;
}
const history = window.webContents.navigationHistory;
if (direction === "left" && history.canGoBack()) history.goBack();
else if (direction === "right" && history.canGoForward()) history.goForward();
}),
),
);
window.on("enter-full-screen", () => {
window.webContents.send(WINDOW_FULLSCREEN_STATE_CHANNEL, true);
});
Expand Down
Loading
Loading