Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
277 commits
Select commit Hold shift + click to select a range
89f70a6
Motion: Machine group swaps its page by folding, declined devices fol…
Tryanks Oct 26, 2026
1fb7b91
Motion: Traverse chips cross-fade their state and fade with their swi…
Tryanks Oct 26, 2026
bb96767
Motion: ACP panel pages, registry states and install state cross-fade…
Tryanks Oct 26, 2026
0171d9c
Motion: plugins catalog folds when its provider is off; status, loadi…
Tryanks Oct 26, 2026
057e218
Motion: available plugins cross-fade from listing to what was found
Tryanks Oct 26, 2026
2cd664b
Motion: provider status chip recolours and cross-fades its text; the …
Tryanks Oct 26, 2026
859a0bc
Motion: provider dialog accent ring, slug error, hidden chip and mute…
Tryanks Oct 26, 2026
90cca44
Motion: add project recents states and the import outcome cross-fade;…
Tryanks Oct 26, 2026
6cf4368
Motion: change-path working and error lines appear and leave; move-th…
Tryanks Oct 26, 2026
2258158
Motion: a cross-faded leaving state is drawn inert until its fade has…
Tryanks Oct 26, 2026
22af7b3
Motion: E2 surfaces use the shared shown, cross_fade, settle and hove…
Tryanks Oct 26, 2026
162470a
Motion: settings reset buttons fade in and out; a toggle row's failur…
Tryanks Oct 26, 2026
0631baa
Motion: Settings' Advanced subgroup folds open and shut, its chevron …
Tryanks Oct 26, 2026
f0d0629
Motion: Providers, Usage and Archived states fade and fold in place; …
Tryanks Oct 26, 2026
0ce8257
Motion: Control's project grants fold under a turning chevron; thread…
Tryanks Oct 26, 2026
5b9bad6
Motion: Threads' toggle-dependent rows fold with their toggle; a proj…
Tryanks Oct 26, 2026
859214a
Motion: Source control hosts fold their editor away when switched off…
Tryanks Oct 26, 2026
abf2458
Motion: Orchestrate's model lists cross-fade with their empty warning…
Tryanks Oct 26, 2026
33d9151
Motion: host permissions cross-fade between checking, grants and fail…
Tryanks Oct 26, 2026
ddddff0
Button: a caller's opacity holds, dimmed further while disabled or lo…
Tryanks Oct 26, 2026
82ec4a1
Sidebar: flat rows reorder on gpui-base's spring over SETTLE
Tryanks Oct 26, 2026
94d0bc8
Sidebar: the wide headers drop their THREADS and PROJECTS captions
Tryanks Oct 26, 2026
6f0c178
Palette: the desktop palette rises in and leaves over SETTLE, scrim i…
Tryanks Oct 26, 2026
f6a053c
Sidebar rows: hover controls fade, statuses cross-fade, the selected …
Tryanks Oct 26, 2026
fe1387b
Sidebar folds: Settled shelves, projects and Show more open and shut …
Tryanks Oct 26, 2026
4649e88
Sidebar: the loaded thread list fades in under the leaving skeleton
Tryanks Oct 26, 2026
4bde14a
Project icon picker: Loading… fades over the folder it loaded, tiles …
Tryanks Oct 26, 2026
90a2cf7
WindowState: palette_open is whether the palette is open, palette_mou…
Tryanks Oct 26, 2026
244df9c
Motion: status_icon, chevron and Sampled join the shared motion helpers
Tryanks Oct 26, 2026
3609f7a
Motion: pull request rows recolour and their signals come and go; the…
Tryanks Oct 26, 2026
a67edf7
Motion: the pull request page's chips, notices, primary action and ta…
Tryanks Oct 26, 2026
8d4de44
Motion: Files cross-fades from its skeletons; its notices, footer, re…
Tryanks Oct 26, 2026
dc31164
Motion: the conversation cross-fades from its skeleton, rails recolou…
Tryanks Oct 26, 2026
c87ed0e
Motion: a reviewer's verdict recolours; the reviewers and labels pick…
Tryanks Oct 26, 2026
be32174
Motion: the merge dialog's head, methods, notes, options and failure …
Tryanks Oct 26, 2026
6f0a34e
Motion: stack write chips recolour and cross-fade their steps; the ma…
Tryanks Oct 26, 2026
f07f175
Motion: stack dialogs fade in what they read, fold their warnings, an…
Tryanks Oct 26, 2026
be1fc4a
Motion: the diff cross-fades over its Loading line, its notices fold,…
Tryanks Oct 26, 2026
22e2e76
Motion: a diff gap's Loading line fades in where its expand controls …
Tryanks Oct 26, 2026
1b6c9e0
Clippy: Sampled's builder type is named, the map's popover comes from…
Tryanks Oct 26, 2026
131ee6f
Motion: pull request chevrons turn through widgets::Chevron; motion::…
Tryanks Oct 26, 2026
704a46b
Motion: right-panel tab bodies cross-fade in fixed layers through Cro…
Tryanks Oct 26, 2026
4e44815
Motion: a comment's body and editor cross-fade in CrossFade layers; o…
Tryanks Oct 26, 2026
20039b6
Motion: Files/Conversation, skeleton and Loading cross-fades use Cros…
Tryanks Oct 26, 2026
30403cd
Research: plan for splitting the chat column into tiled thread panes …
Tryanks Oct 26, 2026
89c5b3c
Docs: the research directory goes; docker.md no longer links it
Tryanks Oct 26, 2026
8967217
Store: a thread's replicas and paging live on ThreadReplica; events r…
Tryanks Oct 26, 2026
9dc7c80
Shell: the wide chat column is a gpui-base dock holding one thread pane
Tryanks Oct 26, 2026
380a141
Chat: each thread view reads and commands the thread it is bound to
Tryanks Oct 26, 2026
6d12f9e
Panes: the chat column splits right and down, closes, zooms and moves…
Tryanks Oct 26, 2026
3286a8a
Preview: the page yields to a resize handle from the press, inside an…
Tryanks Oct 26, 2026
bea5a5e
Panes: threads drag from the sidebar onto a pane, agents open beside …
Tryanks Oct 26, 2026
ccfe854
Chat: a narrow pane header folds its controls into one menu, so two c…
Tryanks Oct 26, 2026
c9f4ef5
Motion: the panes' ring glides, the waiting hint cross-fades into its…
Tryanks Oct 26, 2026
771c769
Motion: the panes name what the dock's re-parenting resets; the drop …
Tryanks Oct 26, 2026
9392e21
Panes: the refused-split test proves the drop placeholder fades, not …
Tryanks Oct 26, 2026
c9f578a
Panes: split, open-beside and close glide; a waiting pane closes from…
Tryanks Oct 30, 2026
33d5e27
Panes: a closed pane leaves in its landing frame; a handle drag stops…
Tryanks Oct 31, 2026
f267101
Panes: each pane wears a colour, and so does its thread's row in the …
Tryanks Oct 31, 2026
05ee3a0
Panes: every pane command has a key, shown in the palette and the men…
Tryanks Oct 31, 2026
4138456
Panes: zoom grows a pane over the column from its slot; a layout swit…
Tryanks Oct 31, 2026
08179f0
Panes: the zoom traps Tab, move trades places, the pane colours keep …
Tryanks Oct 31, 2026
0701867
Panes: the Hosts page keeps its tinted glass; the key-hint test reads…
Tryanks Oct 31, 2026
3137ff4
Shortcuts: the pane keys and their terminal blanks resolve secondary-…
Tryanks Oct 31, 2026
4685fe6
Scroll: ui-v2's scroll shields and tests use on_scroll and ScrollEvent
Tryanks Oct 31, 2026
f96cabe
Sidebar: a thread row draws its pane outline only when it has one
Tryanks Oct 31, 2026
721aa11
Chat: a press on the transcript's blank space hands the keyboard to t…
Tryanks Oct 31, 2026
4f7f1c7
Chat: the anchor-link test binds its chat view to the thread the link…
Tryanks Oct 31, 2026
b837692
Dialogs: the content takes the height its builder sets
Tryanks Oct 31, 2026
bb9f9ff
Tabs: the glide mark measures with gpui-base's on_prepaint
Tryanks Oct 31, 2026
29b4417
Panes: focus shows in the composer, not as a ring; each pane header c…
Tryanks Oct 31, 2026
a2bf239
Plans: a harness's own plan is a document block in the timeline, deci…
Tryanks Nov 1, 2026
da8e44d
Agent: a tool name parses into its MCP server and tool
Tryanks Nov 1, 2026
df41176
Codex: MCP and dynamic tool results arrive as text and images
Tryanks Nov 1, 2026
43fcabf
Claude: one owner maps a tool call, at the top level and in a subagent
Tryanks Nov 1, 2026
d16b8a6
pi: an edit keeps its diff, a command its exit code, a read its images
Tryanks Nov 1, 2026
520376b
ACP: a tool call is named by its tool, its images are images, Grok hu…
Tryanks Nov 1, 2026
235e7e0
Import: native transcripts import in the live adapters' tool shapes
Tryanks Nov 1, 2026
9e93c1c
Store: tool output recorded in a provider's shape reads back canonical
Tryanks Nov 1, 2026
0dc6603
Runtime: delete an intermittently failing profile-deletion test
Tryanks Nov 1, 2026
bca2378
OpenCode: the adapter speaks OpenCode 2.x's server API; 1.x is refuse…
Tryanks Nov 1, 2026
54427e6
Providers: OpenCode's sign-in is read from `opencode auth list`, not …
Tryanks Nov 1, 2026
b57c6a8
OpenCode: tool results go through ToolOutput, and an MCP call is name…
Tryanks Nov 1, 2026
2884baf
Rewind: a turn offers exactly the scopes its harness restores it in
Tryanks Nov 1, 2026
a453b45
Chat: tests that pinned residency counts, reindex counts and history-…
Tryanks Nov 1, 2026
5e9212e
Chat: geometry tests read the layout once the window stops asking for…
Tryanks Nov 1, 2026
3ea91d8
Chat: Markdown residency tests read what the reader sees, not the cha…
Tryanks Nov 1, 2026
ce17a03
Chat: a command's detail is tested open and folding in a window, on t…
Tryanks Nov 1, 2026
e7a0b5b
Chat: a following reader stays pinned while the last message grows, u…
Tryanks Nov 1, 2026
87d858b
Chat: the header, its git and Open menus, the pane menu and the phone…
Tryanks Nov 1, 2026
8821d6c
Chat: the empty states and the jump-to-latest pill move to chat/empty.rs
Tryanks Nov 1, 2026
6531561
Chat: activity auto-expansion and the expansion toggles move to chat/…
Tryanks Nov 1, 2026
abbcf76
Chat: Markdown residency, background parses and the transcript select…
Tryanks Nov 1, 2026
0ad7cfa
Chat: a timeline row's rendering and its message, plan and work-log c…
Tryanks Nov 1, 2026
e00876b
Chat: the timeline's sync, anchoring, history reservation and scrolli…
Tryanks Nov 1, 2026
69e6cc2
Chat: the timeline's rows, their index cache and the list sync move t…
Tryanks Nov 1, 2026
1916323
Chat: each window test moves to the module that owns what it proves
Tryanks Nov 1, 2026
81023b3
Chat: the working indicator pulses on the app's clock, so it carries …
Tryanks Nov 1, 2026
cff9f4b
Chat: every timeline row carries its identity as its element id
Tryanks Nov 1, 2026
58783fc
Chat: a collapse pending in one thread stays with that thread, under …
Tryanks Nov 1, 2026
cea88da
Markdown: streamed text fades in where it is new
Tryanks Nov 1, 2026
951ec30
Timeline: an entry seen starting keeps when its item finished
Tryanks Nov 1, 2026
bf72027
Chat: tool calls draw as tool windows; a call no family claims gets t…
Tryanks Nov 1, 2026
545d777
Chat: the shell window owns the command panel, and claims shells run …
Tryanks Nov 1, 2026
a4b6418
Chat: an edit is a window per file in the shared grammar, and edits m…
Tryanks Nov 1, 2026
42381a2
Chat: a read is a window on the file and the lines read
Tryanks Nov 1, 2026
91d6cdc
Chat: a search is a window on its pattern and what it found
Tryanks Nov 1, 2026
9a6e39b
Chat: a web fetch and a web search are windows on their URL and query
Tryanks Nov 1, 2026
bc75941
Chat: a plan written as a tool call is a checklist window
Tryanks Nov 1, 2026
47695d0
Chat: a subagent's pill speaks the shared header grammar
Tryanks Nov 1, 2026
4601336
Chat: a family window loads a shortened output whole, as the generic …
Tryanks Nov 1, 2026
36309d4
Chat: a window header's place or line range keeps its width, and the …
Tryanks Nov 1, 2026
2147d96
Chat: the tool views pass clippy -D warnings
Tryanks Nov 1, 2026
669d779
Theme: monospace text uses the platform family gpui-base defaults to
Tryanks Nov 1, 2026
5f1fb1d
Chat: one shell window for every command, a failure told once, runs c…
Tryanks Nov 1, 2026
bd2da1f
Chat: a window header can stand on the call's own title and carry a w…
Tryanks Nov 1, 2026
40fabb1
Chat: computer use, the preview browser, threads and harness calls ge…
Tryanks Nov 1, 2026
8b711c1
Chat: output a window read a structure from is folded behind Show raw…
Tryanks Nov 1, 2026
091429c
Chat: the timeline's list and its row chrome move to chat/timeline/li…
Tryanks Nov 1, 2026
f0d7ba6
Chat: the row index tests prove the cached rows match a full index, n…
Tryanks Nov 1, 2026
6223b31
Store: a thread counts the times its timeline is folded whole
Tryanks Nov 1, 2026
b8927bb
Chat: a row that arrives live rises from below while the reader follo…
Tryanks Nov 1, 2026
bdf8f36
Chat: tests for rows that rise in, and for rows that do not
Tryanks Nov 1, 2026
ac81389
Chat: the followed tail is laid out as it is between its glides
Tryanks Nov 1, 2026
7ce4062
Chat: the end a rising row took over glides too, and a computer run g…
Tryanks Nov 2, 2026
c9a66a6
Motion: a fold open on its first frame is laid out whole, and a contr…
Tryanks Nov 2, 2026
d93bfba
Chat: a disclosure's body folds and its chevron turns; a Work Log's c…
Tryanks Nov 2, 2026
a627c57
Chat: a settled turn's summary folds in, its working status cross-fad…
Tryanks Nov 2, 2026
d274a53
Chat: a row inserted mid-list hands over the rhythm above it as it op…
Tryanks Nov 2, 2026
f1791d8
Plan panel: a step's marker cross-fades and its text fades to muted; …
Tryanks Nov 2, 2026
f492ae7
Image viewer: the image fades in over what stood in for it, the trans…
Tryanks Nov 2, 2026
7753bad
Chat: the skeleton, the empty workspace and the thread cross-fade; a …
Tryanks Nov 2, 2026
f9c274e
Chat tests: the scripted host is one fixture, shared by the glide tes…
Tryanks Nov 2, 2026
b816cdc
Motion: a test that a fold is whole on its first frame, inert while i…
Tryanks Nov 2, 2026
e11d996
Chat: a shortened output's load control cross-fades from its offer to…
Tryanks Nov 2, 2026
05f8261
Chat: a divider whose label changes cross-fades it (compaction runnin…
Tryanks Nov 2, 2026
7214fc7
Store: a jump to a turn of the thread already focused reaches its chat
Tryanks Nov 2, 2026
9e69fbf
Chat: the jumped-to turn's mark fades once the reader presses inside …
Tryanks Nov 2, 2026
4a110a4
Chat: the jumped-to turn's mark stays on its turn as history is read …
Tryanks Nov 2, 2026
3aaf57e
Chat: a key the composer binds to an action lets the jumped-to turn's…
Tryanks Nov 2, 2026
b67f551
Principles: a primitive gpui-base lacks is built in Tcode, never a re…
Tryanks Nov 2, 2026
398ad47
Markdown: a fence knows whether it closed and whether its last line e…
Tryanks Nov 2, 2026
2f3444a
Markdown: a streaming Mermaid diagram grows smoothly instead of flick…
Tryanks Nov 2, 2026
2010a65
Chat: a reply's Markdown knows whether its text is still arriving
Tryanks Nov 2, 2026
a19917f
Markdown: a Mermaid swap stays inside its block
Tryanks Nov 2, 2026
5141702
Motion: a height glide to new content is a general primitive
Tryanks Nov 2, 2026
9f5de8f
Motion: motion.rs becomes motion/mod.rs, so primitives get files of t…
Tryanks Nov 2, 2026
fb2c4e2
Motion: keyed rows arrive, leave and glide to new places
Tryanks Nov 2, 2026
c78c2a0
Settings and Hosts: override rows and saved machines come and go in p…
Tryanks Nov 2, 2026
38d38c6
Theme: a mode change glides every colour to the new palette
Tryanks Nov 2, 2026
f278a09
Shell: a wide route change rises over the route it leaves
Tryanks Nov 2, 2026
cd76c67
Runtime: drop the intermittent project-icon pipe test
Tryanks Nov 2, 2026
6835a6a
Panes: a pane's motion is its own, and one drop placeholder travels a…
Tryanks Nov 2, 2026
b877f05
Tooltips: a tooltip leaves instead of vanishing
Tryanks Nov 2, 2026
51aa07e
Popover: a hover card opens on rest and leaves
Tryanks Nov 2, 2026
b38cb94
Runtime: prove SetProjectIcon in process, without host restarts
Tryanks Nov 2, 2026
aacfd16
Motion: resizable panels glide as they open, close, expand and collapse
Tryanks Nov 2, 2026
86bb7c3
Preview: a page fades in and out where it is
Tryanks Nov 2, 2026
f695717
Preview: a page yielding to a resize handle hides inside the press
Tryanks Nov 2, 2026
96d6154
Motion: module list in rustfmt order
Tryanks Nov 2, 2026
0cfb6c6
Motion: a dragged row lifts off its place and settles where it lands
Tryanks Nov 2, 2026
2dba170
Panes: a thread dropped on a pane goes into the drop's placeholder
Tryanks Nov 2, 2026
70be1bb
Motion: side-by-side keyed rows fold along their width, and a reflowe…
Tryanks Nov 2, 2026
29c23d1
Settings: cards, usage windows, archived threads, grants, activity, h…
Tryanks Nov 2, 2026
2b46e4c
Plugins and dialogs: plugin rows, scopes, actions, errors, marketplac…
Tryanks Nov 2, 2026
568f0be
Hosts and remote: devices, sources, relays, group machines, spaces, p…
Tryanks Nov 2, 2026
2e6dfe5
Motion: a size glide moves in both axes, on its own clock or its owner's
Tryanks Nov 2, 2026
dc33250
Motion: chips and controls widen into their rows, and a wrapping row'…
Tryanks Nov 2, 2026
d0e3cfc
Motion: a picture fades in over its stand-in once it decodes, and its…
Tryanks Nov 2, 2026
e3cc848
Motion: a list's hover reveals fade in and out from one hovered item
Tryanks Nov 2, 2026
61ceb6c
Motion: a list scrolled to a turn or to its end glides there
Tryanks Nov 2, 2026
4ec1618
Motion: picture tests share their decode flag across threads
Tryanks Nov 2, 2026
dd8f142
Motion: a hover move redraws the list rather than notifying its view
Tryanks Nov 2, 2026
17bf570
Theme: the palette glide's clock is web_time's on the web
Tryanks Nov 2, 2026
b0d281d
Motion: an owner's reflow glides its parts, and a resizable glide tur…
Tryanks Nov 2, 2026
dab8f0e
Composer: panels, chips, thumbnails, queue rows, the send control and…
Tryanks Nov 2, 2026
6db4583
Terminal: a split opens and closes gradually, and its toolbar, bell a…
Tryanks Nov 2, 2026
0307692
Agents: rows glide between groups, and the list, badges, status and a…
Tryanks Nov 2, 2026
42e6323
Touch selection: the edit menu fades in and out, and its items close …
Tryanks Nov 2, 2026
0dd30f8
Motion: a virtual list's rows glide to their new places, and a list s…
Tryanks Nov 2, 2026
31c03be
Sidebar: rows glide where they move, layouts cross-fade, and a row's …
Tryanks Nov 2, 2026
66755e9
Palette: moving the selection scrolls it into view gradually
Tryanks Nov 2, 2026
0dd8eb8
Project icon: artwork and picker thumbnails fade in once they decode
Tryanks Nov 2, 2026
0a549ff
Pull requests: chips, notes and list rows come, go and move gradually…
Tryanks Nov 2, 2026
8fd284d
Theme: pane outlines glide between their two modes' colours, and diff…
Tryanks Nov 2, 2026
fc882a4
Motion: a list's rows arrive, leave and glide on one primitive; a Wor…
Tryanks Nov 2, 2026
28088d2
Chat: the oldest live activity folds away into its Work Log's header
Tryanks Nov 2, 2026
3dc30b9
Motion: an element that moves to another row travels there; a taken s…
Tryanks Nov 2, 2026
d9de3f2
Motion: a list replaced whole tells its rows that came and went, besi…
Tryanks Nov 2, 2026
553105d
Panes: a pane whose thread closes fades out showing that thread
Tryanks Nov 2, 2026
3be68ec
Markdown: a theme switch cross-fades a diagram as the palette glides
Tryanks Nov 2, 2026
06c3e0e
Motion: a virtual list's hover reveal is drawn each frame of its fade
Tryanks Nov 2, 2026
fcdd55b
Motion: a list's replacement names what came and what went
Tryanks Nov 2, 2026
794c7c3
Motion: a leaving list row folds from its whole height on its first f…
Tryanks Nov 2, 2026
f912ca5
Header: the pull request badge widens by its chips alone
Tryanks Nov 2, 2026
54b1d91
Shell: a new workspace rises over the one it replaces, the right pane…
Tryanks Nov 2, 2026
c056a95
Shell: the local-host test reads Machines once the workspace left has…
Tryanks Nov 2, 2026
2a6efad
Panes: swapped conversations travel across to each other, and a windo…
Tryanks Nov 2, 2026
4c33878
Motion: tabs fold in and out under a following mark, menu and list ro…
Tryanks Nov 2, 2026
6163155
Traverse: delete the restart test that raced for its port; its replac…
Tryanks Nov 2, 2026
b7690b1
Chat: a tool window's body brings the space above it as it folds
Tryanks Nov 2, 2026
4d0e994
Motion: a list row's fade runs ahead of its fold
Tryanks Nov 2, 2026
91da4c7
Sidebar: threads, captions and hints fold into and out of the lists
Tryanks Nov 2, 2026
0ffe400
Palette: the Messages group folds in under the rows a query listed
Tryanks Nov 2, 2026
033c436
Sidebar: a row with no height at the top of the view counts as in view
Tryanks Nov 2, 2026
d8a6f07
Diff: rows fold in and out of the list and glide to new heights
Tryanks Nov 2, 2026
f90b0bb
Pull requests: conversation rows arrive and glide; the add-reaction c…
Tryanks Nov 2, 2026
8cf509f
Sidebar: a list replaced whole moves row by row; phone rows glide to …
Tryanks Nov 2, 2026
2795a4f
Pull requests: a conversation row that goes folds away as it was drawn
Tryanks Nov 2, 2026
7d8662f
Diff: rows at rest are laid out as themselves; only what is under a l…
Tryanks Nov 2, 2026
1a59d6c
Tabs: a rail's selected fill is a mark that glides, across the settin…
Tryanks Nov 2, 2026
ac686c4
Widgets: tab and segment hover, disabled dims and a field's focus bor…
Tryanks Nov 2, 2026
987af1f
Rows: list, panel and group rows and caption buttons glide their hove…
Tryanks Nov 2, 2026
a3c7e9c
Shell and sidebar: thread page and panel bodies cross-fade, Back to a…
Tryanks Nov 2, 2026
c172438
VirtualList: keyed rows fold in and out and glide on a filter or re-s…
Tryanks Nov 2, 2026
aa9f784
Pickers: settings model options cross-fade per profile and fold on ex…
Tryanks Nov 2, 2026
32d9b3d
Pickers: loading, empty and results cross-fade; restart notes, total,…
Tryanks Nov 2, 2026
4177f19
Composer, terminal, touch: checkout loading and terminal starting cro…
Tryanks Nov 2, 2026
416c3d8
Plugins and ACP: views cross-fade; available and marketplace rows fol…
Tryanks Nov 2, 2026
dcd7434
Plugins: each profile keeps its Available list; profiles cross-fade
Tryanks Nov 2, 2026
e5fc4ad
Add project: recent directories fold per key; the list viewport glide…
Tryanks Nov 2, 2026
deb5438
Remote: a traverse status chip widens into a disclosure; a space's li…
Tryanks Nov 2, 2026
fdc48c1
Pull requests: the agent tools section glides its share of the column…
Tryanks Nov 2, 2026
5f890a1
Diff and PR files: split and unified cross-fade; the scroll-followed …
Tryanks Nov 2, 2026
479db20
Motion: a fold across can keep a minimum width; a list that had no ro…
Tryanks Nov 2, 2026
05df71d
Menu keyboard reveal glides; preview notes cross-fade, load error and…
Tryanks Nov 2, 2026
1ad49e0
Menu test drives frames as the app does: the keyboard's item glides i…
Tryanks Nov 2, 2026
113389d
Chat: timeline headers fill under the pointer from the timeline's one…
Tryanks Nov 2, 2026
27a5f86
Chat: the header's traffic-light clearance glides
Tryanks Nov 2, 2026
e1a5296
Chat: the phone strip rises in and sinks out, and the tail clears it …
Tryanks Nov 2, 2026
73010db
Chat: the start hub's projects fold in and out by project
Tryanks Nov 2, 2026
fc6afc6
Plan: a rewritten plan folds its steps in and out by step
Tryanks Nov 2, 2026
aff7867
Chat: the header's controls carry on coming and going when a pane moves
Tryanks Nov 2, 2026
bc4ed01
Store: a test that replaces a thread's replica tells the chat, as the…
Tryanks Nov 2, 2026
94e0eee
Material: a clickable's keyboard focus ring fades in and out
Tryanks Nov 2, 2026
d0284be
Size-class flips glide: settings rows, fields, forms, diff, PR, palet…
Tryanks Nov 2, 2026
aa54ff4
Focus rings of gpui-base controls fade; flip-driven glides keep the v…
Tryanks Nov 2, 2026
9686960
Chat: motion keeps the view's clock through a compact flip or a zoom;…
Tryanks Nov 2, 2026
fae2ffa
Shell tests: chat motion carries on through a zoom and a compact flip…
Tryanks Nov 2, 2026
1808c57
Motion: an owned keyed list's rows spring to their new places on FOLL…
Tryanks Nov 2, 2026
a10f221
Focus: a control drawn under a new parent keeps the keyboard and its …
Tryanks Nov 2, 2026
2e9e0d4
Shell tests: a travelling steer carries on through a compact flip
Tryanks Nov 2, 2026
407050e
Composer: its motion and its buttons keep their clocks through a comp…
Tryanks Nov 2, 2026
f1aeb24
Material: a gliding selectable row keeps its fills on its view's clock
Tryanks Nov 2, 2026
933bc76
Sidebar, PRs: controls shown on hover fade in under focus too
Tryanks Nov 2, 2026
f132542
Size classes: toasts, preview actions, diff tab labels and the PR fil…
Tryanks Nov 2, 2026
6895fd9
Gap notes: content insets jump with the keyboard; scrollbars restart …
Tryanks Nov 2, 2026
c231958
Chat: a timeline edge on its way back carries on when its pane is zoo…
Tryanks Nov 2, 2026
b66c586
Chat: a start hub project's hover fill carries on when its pane is dr…
Tryanks Nov 2, 2026
f621446
Markdown: a formula's and a diagram's actions glide across a compact …
Tryanks Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches: [main]
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
# Pull requests opened with GITHUB_TOKEN start no pull_request run; the
# agent-version workflow dispatches one instead.
workflow_dispatch:
Expand All @@ -28,6 +29,7 @@ jobs:
# required check must wait for that platform's Clippy and tests alone.
linux-clippy:
name: Linux x64 / clippy
if: !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 60
steps: &clippy-steps
Expand Down Expand Up @@ -123,6 +125,7 @@ jobs:

linux-tests:
name: Linux x64 / tests
if: !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 60
steps: &test-steps
Expand Down Expand Up @@ -178,24 +181,28 @@ jobs:

macos-clippy:
name: macOS arm64 / clippy
if: !github.event.pull_request.draft
runs-on: macos-26
timeout-minutes: 60
steps: *clippy-steps

macos-tests:
name: macOS arm64 / tests
if: !github.event.pull_request.draft
runs-on: macos-26
timeout-minutes: 60
steps: *test-steps

windows-clippy:
name: Windows x64 / clippy
if: !github.event.pull_request.draft
runs-on: windows-2022
timeout-minutes: 60
steps: *clippy-steps

windows-tests:
name: Windows x64 / tests
if: !github.event.pull_request.draft
runs-on: windows-2022
timeout-minutes: 60
steps: *test-steps
Expand All @@ -204,8 +211,9 @@ jobs:
# must not let its platform's check pass.
linux:
name: Linux x64
if: !github.event.pull_request.draft
needs: [linux-clippy, linux-tests]
if: always()
if: always() && !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 5
steps: &require-platform
Expand All @@ -216,22 +224,25 @@ jobs:

macos:
name: macOS arm64
if: !github.event.pull_request.draft
needs: [macos-clippy, macos-tests]
if: always()
if: always() && !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 5
steps: *require-platform

windows:
name: Windows x64
if: !github.event.pull_request.draft
needs: [windows-clippy, windows-tests]
if: always()
if: always() && !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 5
steps: *require-platform

dependencies:
name: Dependency hygiene
if: !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
Expand All @@ -247,6 +258,7 @@ jobs:

ios:
name: iOS
if: !github.event.pull_request.draft
runs-on: macos-26
timeout-minutes: 30
env:
Expand All @@ -270,6 +282,7 @@ jobs:

android:
name: Android
if: !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 30
env:
Expand Down Expand Up @@ -316,6 +329,7 @@ jobs:

web:
name: Web
if: !github.event.pull_request.draft
runs-on: ubuntu-24.04
timeout-minutes: 30
env:
Expand Down
21 changes: 16 additions & 5 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,22 +54,33 @@ is derived from it. **Process** is how to build, check and submit work.

6. **gpui-base is the infrastructure; no house UI principles.** Tcode follows
the recommendations and defaults of gpui-base and gpui-kit, and keeps no
separate design contract in sync with the code. Everything gpui-base
separate design contract in sync with the code: no house-wide UI rules of
its own, such as a single duration for every transition or classes of
change that must stay instant. Everything gpui-base
provides on top of GPUI — selection, scrolling, positioning, dismissal,
focus, theme tokens, motion, virtual lists, form controls — is used as it
is, defaults included, before anything of the kind is written in Tcode.
Tcode's own components are styled compositions of those primitives; they
never re-derive a primitive's rules locally. A primitive is reimplemented,
or a default overridden, only where gpui-base demonstrably cannot meet the
need; the site names that gap, and it is removed once gpui-base closes it.
never re-derive a primitive's rules locally. Where gpui-base demonstrably
cannot meet the need, Tcode builds what is missing — a primitive
reimplemented, a default overridden, or an element gpui-base does not have
— and the site names that gap; it is removed once gpui-base closes it.
This principle decides how something is built, never whether it is built:
what the interface does is the maintainer's call, and a primitive
gpui-base lacks is never a reason to leave an effect out, make it instant,
or settle for less.

7. **Code and tests are the only source of truth.** This section is the only
maintainer-authored text; comments, issues and other documents are derived
from it and are corrected when they disagree with it or with the code. A
comment is kept only when it states a constraint the code cannot express or
the reason an obvious alternative was rejected; narrated steps, history and
"mirrors X" notes are deleted when touched. A constraint drafted by an AI is
not a requirement until it appears here. A test, whatever its form, is
not a requirement until it appears here. Rules and conventions written into
audits, hand-offs, briefs or agent instructions bind no one: they are
notes, never cited as requirements or used to send work back, and where
one would narrow what the maintainer asked for, the maintainer's request
wins. A test, whatever its form, is
truth only for a contract real use needs, and only while it is the test
that proves it by driving the code the way the running app does. The suite
is larger than its contracts: a test met while working on its area is
Expand Down
14 changes: 14 additions & 0 deletions assets/icons/bundled/columns-2.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions assets/icons/bundled/monitor.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions assets/icons/bundled/rows-2.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions clippy.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@
disallowed-methods = [
{ path = "std::process::Command::new", reason = "use services::process::command or agent's process::command so Windows never flashes a console" },
{ path = "smol::process::Command::new", reason = "use services::process::async_command or agent's process::async_command so Windows never flashes a console" },
{ path = "gpui::StatefulInteractiveElement::tooltip", reason = "use tcode_ui::widgets::TooltipTrigger::with_tooltip so the tooltip shows through the window's tooltip layer and can leave" },
{ path = "gpui::InteractiveText::tooltip", reason = "track the text's parts with widgets::tooltip::track_parts so the tooltip shows through the window's tooltip layer and can leave" },
{ path = "smol::unblock", reason = "use Host::unblock or the agent crate's process::unblock so blocking work is scheduled in one place" },
]
3 changes: 1 addition & 2 deletions crates/agent/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ edition = "2024"
default = ["process"]
process = [
"dep:agent-client-protocol",
"dep:base64",
"dep:dirs",
"dep:sha2",
"dep:smol",
Expand All @@ -22,7 +21,7 @@ agent-client-protocol = { version = "2.0", optional = true, features = [
"unstable_end_turn_token_usage",
] }
log = "0.4"
base64 = { version = "0.23", optional = true }
base64 = "0.23"
dirs = { version = "7", optional = true }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand Down
26 changes: 18 additions & 8 deletions crates/agent/examples/probe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
//! Turn mode: `probe <provider> <prompt> [cwd] [acp-command args…] [flags]`.
//! Flags are `--binary <path>`, `--model <id>`, `--option <id>=<value>`, `--effort <value>`,
//! `--resume <cursor-json>`, `--fork`, `--leave-questions` (user-input requests
//! stay unanswered), `--mcp <name> <url> <token>` (an HTTP MCP server registered
//! stay unanswered), `--plan-feedback <words>` (the first plan decision is
//! answered with these words instead of approved), `--mcp <name> <url> <token>` (an HTTP MCP server registered
//! as tcode registers its own), `--linger <seconds>` (stay open until no turn has
//! run for that long, to see turns the agent starts itself), `--follow-up
//! <seconds> <prompt>` (send another turn that long after the first completes,
Expand Down Expand Up @@ -231,6 +232,7 @@ fn main() {
let mut resume = None;
let mut fork = false;
let mut leave_questions = false;
let mut plan_feedback = None;
let mut mcp_servers = Vec::new();
let mut continuation = Continuation::default();
let mut probe_mode = ProbeMode::Standard;
Expand Down Expand Up @@ -261,6 +263,7 @@ fn main() {
"--fork" => fork = true,
"--goal" => set_mode(&mut probe_mode, ProbeMode::Goal),
"--leave-questions" => leave_questions = true,
"--plan-feedback" => plan_feedback = args.next(),
"--linger" => {
let seconds = args.next().and_then(|value| value.parse().ok());
continuation.linger = Some(Duration::from_secs(seconds.unwrap_or_else(|| usage())));
Expand Down Expand Up @@ -350,6 +353,7 @@ fn main() {
resume,
fork,
leave_questions,
plan_feedback,
},
binary,
model,
Expand All @@ -361,6 +365,7 @@ struct Resumption {
resume: Option<ResumeCursor>,
fork: bool,
leave_questions: bool,
plan_feedback: Option<String>,
}

#[derive(Default)]
Expand All @@ -380,7 +385,7 @@ async fn run_probe(
acp: Option<AcpAgent>,
mcp_servers: Vec<McpRegistration>,
continuation: Continuation,
resumption: Resumption,
mut resumption: Resumption,
binary_path: Option<PathBuf>,
model: Option<String>,
) -> i32 {
Expand Down Expand Up @@ -539,16 +544,21 @@ async fn run_probe(
}
match &event {
AgentEvent::ApprovalRequested(request) => {
let feedback = matches!(request.kind, agent::ApprovalKind::Plan { .. })
.then(|| resumption.plan_feedback.take())
.flatten();
handle
.commands
.send(SessionCommand::RespondApproval {
request_id: request.id.clone(),
decision: request
.options
.iter()
.find(|option| option.kind == agent::ApprovalOptionKind::AllowOnce)
.map(|option| ApprovalDecision::Option(option.id.clone()))
.unwrap_or(ApprovalDecision::Cancel),
decision: feedback.map(ApprovalDecision::Feedback).unwrap_or_else(|| {
request
.options
.iter()
.find(|option| option.kind == agent::ApprovalOptionKind::AllowOnce)
.map(|option| ApprovalDecision::Option(option.id.clone()))
.unwrap_or(ApprovalDecision::Cancel)
}),
})
.await
.ok();
Expand Down
Loading