Skip to content

Create new queued prompts list UI#11439

Open
harryalbert wants to merge 10 commits into
masterfrom
harry/app-4532-update-queued-prompts-to-use-new-ui
Open

Create new queued prompts list UI#11439
harryalbert wants to merge 10 commits into
masterfrom
harry/app-4532-update-queued-prompts-to-use-new-ui

Conversation

@harryalbert
Copy link
Copy Markdown
Contributor

@harryalbert harryalbert commented May 20, 2026

Description

This PR adds a new queued prompt panel, which allows for multiple queued prompts at a time, queued prompt editing, queued prompt re-arranging, and allows you to collapse your queued prompts when you don't want to look at them.

In this PR, I only update it so that direct prompt queueing uses this new UI, keeping cloud conversation setup using the old queued prompt UI. I think cloud conversation setup should use the new UI, but that's a separate workstream (that should maybe be feature flagged), so I think it deserves its own PR.

As is, the new UI is not feature flagged, as queued prompts as a whole are still in dogfood.

This is a pretty large PR, but I go into solid detail about the architecture and product decisions in the tech and product specs.

Implements APP-4563

Testing

  • I have manually tested my changes locally with ./script/run

Screenshots / Videos

https://www.loom.com/share/2689f5f8e12d4acabd14e6c3fa70c73e

Agent Mode

  • Warp Agent Mode - This PR was created via Warp's AI Agent Mode

@cla-bot cla-bot Bot added the cla-signed label May 20, 2026
Copy link
Copy Markdown
Contributor Author

This stack of pull requests is managed by Graphite. Learn more about stacking.

@harryalbert harryalbert marked this pull request as ready for review May 20, 2026 20:56
@harryalbert harryalbert requested a review from zachbai May 20, 2026 20:56
@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 20, 2026

@harryalbert

I'm starting a first review of this pull request.

You can view the conversation on Warp.

I completed the review and no human review was requested for this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

@harryalbert harryalbert changed the title update queued prompt UI Create new queued prompts list May 20, 2026
@harryalbert harryalbert changed the title Create new queued prompts list Create new queued prompts list UI May 20, 2026
@harryalbert harryalbert force-pushed the harry/app-4532-update-queued-prompts-to-use-new-ui branch from 5428969 to 332c4c9 Compare May 20, 2026 20:58
Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

Overview

This PR adds a terminal-owned queued prompt model and a new queued-prompts panel, then routes /queue and auto-queue submissions through it while leaving Cloud Mode and compact placeholders on the legacy pending-user-query UI.

Concerns

  • Two active-AI-block lookup paths no longer skip legacy pending-user-query rich content, so Cloud Mode/compact placeholders can hide the real active AI block from downstream logic.
  • The new test modules call QueuedQuery::into_text(), but the PR only defines text(), so the test build will fail.

Verdict

Found: 0 critical, 4 important, 0 suggestions

Request changes

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Comment thread app/src/terminal/view.rs
.find(|rc| !rc.is_usage_footer() && !rc.is_pending_user_query());
.find(|rc| !rc.is_usage_footer());

candidate.and_then(|rich_content| {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] This no longer skips legacy pending-user-query rich content, so when Cloud Mode or compact placeholders are trailing, active_ai_block() returns None instead of the prior AI block; keep the pending-query filter while those flows remain on the legacy UI.

Suggested change
candidate.and_then(|rich_content| {
.find(|rc| !rc.is_usage_footer() && !rc.is_pending_user_query());

Comment thread app/src/terminal/view.rs
.find(|rc| !rc.is_usage_footer() && !rc.is_pending_user_query())
.find(|rc| !rc.is_usage_footer())
.and_then(|rich_content| rich_content.ai_block_metadata())
.map(|ai_metadata| ai_metadata.ai_block_handle.clone())
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] Same regression here: this helper stops on a trailing pending-user-query placeholder and fails to return the AI block behind it, which breaks legacy Cloud Mode/compact placeholders this PR intentionally keeps.

Suggested change
.map(|ai_metadata| ai_metadata.ai_block_handle.clone())
.find(|rc| !rc.is_usage_footer() && !rc.is_pending_user_query())

let _id_c = append_user(&model, &mut app, conv, "third");

let removed = model.update(&mut app, |m, ctx| m.remove_by_id(conv, id_a, ctx));
assert_eq!(removed.map(|r| r.into_text()), Some("first".to_owned()));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] QueuedQuery does not define into_text() in this PR, so this new test module will not compile.

Suggested change
assert_eq!(removed.map(|r| r.into_text()), Some("first".to_owned()));
assert_eq!(removed.map(|r| r.text().to_owned()), Some("first".to_owned()));


// Error: input is empty, pop "first" and restore to input.
let popped = model.update(&mut app, |m, ctx| m.pop_front(conv, ctx));
assert_eq!(popped.map(|q| q.into_text()), Some("first".to_owned()));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] This repeats the undefined QueuedQuery::into_text() call, so the new terminal-view queue tests will fail to compile too.

Suggested change
assert_eq!(popped.map(|q| q.into_text()), Some("first".to_owned()));
assert_eq!(popped.map(|q| q.text().to_owned()), Some("first".to_owned()));

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant