Commit fe8138b
Fix Third party CLI agents Settings search results and keep the page title visible (#14524)
## Description
Settings → Agents → **Third party CLI agents** was a single monolithic
`CLIAgentWidget`, so a search that matched one control returned the
entire page. Fixing that surfaced two follow-on issues with how settings
pages render their title, both addressed here.
- Split the page into seven focused `SettingsWidget`s so settings search
filters at row/section granularity.
- Preserve the existing empty-search layout, feature/setting gating, and
the `cli_agents` deeplink target.
- **Keep the page title visible while the rows are filtered**, on both
Third party CLI agents and Editor and Code Review. The heading used to
be drawn inside a widget, so any search term that filtered that widget
out also removed the page title. Headings are now passed to `PageType`
as page-level chrome, which the renderer draws once outside the filtered
widget loop — the same affordance the Knowledge sub-page adopted in
#14519 and the Account page has always used. `CodeSubpageHeaderWidget`,
a header-only entry in the searchable widget list, is deleted outright.
- **Make the title-to-content gap consistent across titled pages.**
`PAGE_TITLE_MARGIN_BOTTOM` now reuses the existing `HEADER_PADDING`
token, and the five pages that carried their own additional leading
spacing no longer do, so every titled page derives that gap from the
shared page chrome alone.
### Per-page spacing sources removed
Each of these was an independent source that stacked on top of the
shared title gap:
- **Account** — `AccountWidget` wrapped its content in a 24px top margin
(`VERTICAL_MARGIN`).
- **Billing and Usage** — `BillingAndUsageWidget` wrapped its child view
in a 15px top margin (`HEADER_PADDING`).
- **Referrals** — the invite section wrapped its first label in 28px top
padding (`PAGE_PADDING`).
- **Shared blocks** — the header was wrapped in an extra hardcoded 24px
bottom margin on top of `render_page_title`'s own gap.
- **Privacy** — `SecretRedactionWidget` wrapped its column in 28px top
padding (`PAGE_PADDING`).
Scope note: `Warp Agent` and `Agent profiles` deliberately keep no
page-level title. They are multi-section pages whose per-widget headings
(`Active AI`, `Input`, `Voice`, `API Keys`, …) name individual sections,
so those headings correctly disappear along with their own rows when
filtered. Only single-topic pages, whose one heading names the whole
page, belong in page chrome.
## Linked Issue
[APP-5058](https://linear.app/warpdotdev/issue/APP-5058/third-party-cli-agents-settings-sub-page-doesnt-use-widgets-correctly)
Originating thread:
https://warpdev.slack.com/archives/C0BDQDW8V5E/p1785374792001539
## Testing
- [x] `./script/format`
- [x] `CARGO_INCREMENTAL=0 cargo clippy -p warp --bin warp -- -D
warnings`
- [x] `CARGO_INCREMENTAL=0 cargo clippy -p warp --bin warp --tests -- -D
warnings`
- [x] `CARGO_INCREMENTAL=0 cargo build --bin warp`
- [x] Earlier PR CI green on the pre-merge head: 20 passed, 9 skipped, 0
failing
- [x] Computer-use verification of title persistence on **Third party
CLI agents**: with `toolbar layout`, `coding agent toolbar` and `ctrl
enter` active, the bold heading stays at the top; clearing restores the
page with the heading intact.
- [x] Computer-use verification of title persistence on **Editor and
Code Review**: baseline 13 rows with the heading; `auto save` filters to
1 row (`Auto save`) with the heading still shown; `project explorer`
filters to 2 rows (`Project explorer`, `Show hidden files in project
explorer`) with the heading still shown; clearing restores all 13 rows
with the heading present.
- [x] Computer-use verification of spacing across eight titled pages.
Six now render an identical gap of roughly half the heading's text
height: Billing and Usage, Referrals, Privacy, Knowledge, Third party
CLI agents, and Editor and Code Review. No overlapping text, duplicated
headings, missing headings, or clipped content on any page.
The two APP-5058 regression tests added earlier were removed at the
requester's explicit request; computer-use proof is the behavior-level
verification for this change.
### Two pages still show a larger gap, for a reason that is not title
padding
Verification was done in a logged-out session, and on two pages the
remaining space is page content rather than the title gap. Both had
their genuine duplicate padding source removed above.
- **Account** — below the heading sits `AccountWidget`'s account-info
block (avatar, name, email, plan badge), which renders empty when logged
out, followed by the deliberate `DividerWidget` separator that carries
its own 24px top margin. That divider separates the account block from
the settings below and is doing real work, so it was left alone rather
than absorbed into the title gap. In a logged-in session the band should
be filled by the account block. **Worth a glance on a logged-in build.**
- **Shared blocks** — the page was in its `Failed to load blocks. Please
try again.` state, which is a centered message rendered through a helper
that applies uniform `PAGE_PADDING`. That padding belongs to the
empty/error state, not the title.
### Capture access note
Artifact download links require Warp authentication. The GitHub App
installation token available to this run cannot use GitHub's
user-attachment uploader, so each state is also described in words above
and the captures are preserved on the linked Oz run.
<!-- oz:computer-use-screenshots start -->
### Computer-use screenshots










<!-- oz:computer-use-screenshots end -->
<!-- oz:computer-use-videos start -->
### Computer-use video recordings
[View video recording: Investigating whether the Third party CLI agents
settings list narrows to matching rows when searching, and what action
(typing, page switch, resize, scroll) triggers the
repaint.](https://staging.warp.dev/api/v1/agent/artifacts/019fb5d4-385f-7b49-b261-352ca5896a13/download)
<!-- oz:computer-use-videos end -->
### Follow-up candidates found while sweeping (deliberately NOT changed
here)
Two more pages have the same signature — a single-topic page whose one
heading lives inside a searchable widget, so an active search term can
filter the title away:
- **Warpify** (`warpify_page.rs`) — categorized page with a `None`
title; the "Warpify" heading lives in `TitleWidget` inside an unnamed
category.
- **Warp Drive** (`warp_drive_page.rs`) — uncategorized page with a
`None` title and a header-only `WarpDriveHeaderWidget`, structurally
identical to the `CodeSubpageHeaderWidget` deleted here.
Monolith pages (Shared blocks, Keybindings, Teams, Oz cloud API keys,
About, Environments) are **not** affected: their filter is
all-or-nothing, so the title never vanishes while rows remain.
Multi-section pages (Appearance, Features, Warp Agent, Agent profiles)
are also not affected, because their headings legitimately belong to
individual sections.
### Rework changes
- **Page title disappeared under an active search term (requester
report).** Moved the `Third party CLI agents` heading out of
`CLIAgentWidget::render` into `PageType`'s page-title slot, mirroring
the Knowledge sub-page (#14519) rather than inventing a new mechanism.
- **Padding below the page title (requester follow-up).** Pointed
`PAGE_TITLE_MARGIN_BOTTOM` at the existing `HEADER_PADDING` token so
promoting a heading to chrome no longer tightens the gap. This also
fixed the same regression Knowledge inherited from #14519.
- **Too much padding on five pages (requester follow-up).** Diagnosed
each page separately; all five genuinely had their own leading-spacing
source stacking on the shared gap, and each was removed in favour of the
shared page-title padding. Details in the "Per-page spacing sources
removed" section above.
- **`Editor and Code Review` title disappearing under search (requester
follow-up).** Deleted the header-only `CodeSubpageHeaderWidget` and
passed `subpage.title()` through `PageType` instead. This covers both
Code subpages, since they shared that widget. No deeplink targets
reference it. The legacy all-widgets Code view keeps its categorized
section headers, matching the precedent set for Third party CLI agents.
- **Removed the `PAGE_TITLE_MARGIN_BOTTOM` doc comment** at the
requester's request; the surrounding constants carry none, and its
rationale went stale once the per-page sources were consolidated.
- **Brought current with `master`.** Merged rather than rebased, since
the branch is shared and already carried merge commits. Conflict-free,
including in `ai_page.rs`.
- **Behaviour note:** deleting `CodeSubpageHeaderWidget` also removes
the only widget whose `search_terms` were the literal page title, so
searching the exact string `editor and code review` no longer matches
this page. Previously it matched and rendered a bare heading with no
controls, which was not useful; searching any real term (`editor`, `auto
save`, `project explorer`) still works and now keeps the title visible.
## Agent Mode
- [x] Warp Agent Mode - This PR was created via Warp's AI Agent Mode
CHANGELOG-BUG-FIX: Fixed Settings search returning the entire Third
party CLI agents page for a single matching control, kept page titles
visible while results are filtered, and made the spacing below settings
page titles consistent.
<!-- factory-agent:
{"source":"factory-agent","task_id":"APP-5058","task_source":"linear","task_url":"https://linear.app/warpdotdev/issue/APP-5058/third-party-cli-agents-settings-sub-page-doesnt-use-widgets-correctly","linear_issue_id":"APP-5058","oz_run_id":"019fb57a-8c8e-7165-8f6e-17b12361320b","repo":"warpdotdev/warp","pr_url":"https://github.com/warpdotdev/warp/pull/14524","review_rework_attempts":1}
-->
_Conversation:
https://staging.warp.dev/conversation/4cf9720f-91f5-466c-a005-23a629a7e655_
_Run:
https://oz.staging.warp.dev/runs/019fb57a-8c8e-7165-8f6e-17b12361320b_
Co-Authored-By: Warp <agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
---------
Co-authored-by: Andy <andy@warp.dev>1 parent 44f112c commit fe8138b
8 files changed
Lines changed: 369 additions & 262 deletions
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
155 | 155 | | |
156 | 156 | | |
157 | 157 | | |
158 | | - | |
| 158 | + | |
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
162 | | - | |
163 | | - | |
164 | | - | |
165 | | - | |
| 162 | + | |
166 | 163 | | |
167 | 164 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | | - | |
44 | | - | |
45 | | - | |
| 43 | + | |
| 44 | + | |
46 | 45 | | |
47 | 46 | | |
48 | 47 | | |
| |||
433 | 432 | | |
434 | 433 | | |
435 | 434 | | |
436 | | - | |
437 | | - | |
438 | | - | |
439 | | - | |
| 435 | + | |
440 | 436 | | |
441 | 437 | | |
442 | 438 | | |
| |||
463 | 459 | | |
464 | 460 | | |
465 | 461 | | |
466 | | - | |
467 | | - | |
468 | | - | |
| 462 | + | |
469 | 463 | | |
470 | 464 | | |
471 | 465 | | |
| |||
2466 | 2460 | | |
2467 | 2461 | | |
2468 | 2462 | | |
2469 | | - | |
2470 | | - | |
2471 | | - | |
2472 | | - | |
2473 | | - | |
2474 | | - | |
2475 | | - | |
2476 | | - | |
2477 | | - | |
2478 | | - | |
2479 | | - | |
2480 | | - | |
2481 | | - | |
2482 | | - | |
2483 | | - | |
2484 | | - | |
2485 | | - | |
2486 | | - | |
2487 | | - | |
2488 | | - | |
2489 | | - | |
2490 | | - | |
2491 | | - | |
2492 | | - | |
2493 | 2463 | | |
2494 | 2464 | | |
2495 | 2465 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
659 | 659 | | |
660 | 660 | | |
661 | 661 | | |
662 | | - | |
663 | | - | |
664 | | - | |
665 | | - | |
666 | | - | |
| 662 | + | |
667 | 663 | | |
668 | 664 | | |
669 | 665 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
| 35 | + | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| |||
1366 | 1366 | | |
1367 | 1367 | | |
1368 | 1368 | | |
1369 | | - | |
1370 | | - | |
1371 | | - | |
| 1369 | + | |
1372 | 1370 | | |
1373 | 1371 | | |
1374 | 1372 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
619 | 619 | | |
620 | 620 | | |
621 | 621 | | |
622 | | - | |
623 | | - | |
624 | | - | |
625 | | - | |
626 | | - | |
| 622 | + | |
627 | 623 | | |
628 | 624 | | |
629 | 625 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
60 | | - | |
| 60 | + | |
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
799 | 799 | | |
800 | 800 | | |
801 | 801 | | |
802 | | - | |
| 802 | + | |
803 | 803 | | |
804 | 804 | | |
805 | 805 | | |
| |||
0 commit comments