APP-3595: Show conversation details panel for local conversations#9493
Conversation
The conversation details side panel was previously gated on having an `AmbientAgentTaskId` (cloud Oz runs only). Make the same panel toggle button and side panel available for any active local AI conversation in a `TerminalView` so users can inspect the same metadata for non-cloud Warp Agent runs. - Lift the wasm-only gating on `ConversationDetailsData::from_conversation` and the `UserUid`/`UserProfiles` imports so the helper compiles on native. The function only touches platform-agnostic types. - Add `TerminalView::has_active_local_ai_conversation` and `TerminalView::can_show_conversation_details_ui` helpers. The new visibility predicate returns true for cloud Oz runs (existing behavior) and for any terminal view with an active local AI conversation when AI is enabled. - Generalize `fetch_and_update_cloud_mode_details_panel` to fall back to populating the panel from the active local `AIConversation` when no task ID is present. - Lift the toggle button rendering out of the `FeatureFlag::CloudMode` arm in `render_header_actions`. Cloud-mode-only behavior (the ambient-agent cancel button) stays inside the existing CloudMode flag guard. - Update the pane render gate to use the broader predicate so the side panel renders whenever the toggle is open and the predicate holds. - Refresh the panel data on `BlocklistAIControllerEvent::FinishedReceivingOutput` for any active conversation (not only cloud Oz), and on `BlocklistAIHistoryEvent` updates that affect the panel (`UpdatedConversationStatus`/`UpdatedConversationMetadata`/ `UpdatedConversationArtifacts`/`UpdatedStreamingExchange`/ `AppendedExchange`/`SetActiveConversation`/`RestoredConversations`). - Auto-open behavior on `SessionReady` remains scoped to cloud mode; local conversations only open the panel when the user clicks the pane-header info button. - Add a unit test that builds an `AIConversation` and asserts that `from_conversation` populates the local-conversation fields the details panel renders. Co-Authored-By: Oz <[email protected]>
The conversation details side panel now serves both cloud Oz runs and any active local AI conversation, so the `cloud_mode_*` naming on the `TerminalView` field, state flags, mouse-state handle, action variant, and helper functions is misleading. Rename consistently to `conversation_details_panel` / `ToggleConversationDetailsPanel` / `fetch_and_update_conversation_details_panel` / `maybe_auto_open_conversation_details_panel` / `render_conversation_details_toggle_button`. Refresh the doc comments to reflect the broader scope and call out that auto-open remains a cloud-mode-only behavior. Behavior is unchanged. Co-Authored-By: Oz <[email protected]>
|
I'm starting a first review of this pull request. I completed the review and posted feedback on this pull request. Comment You can view the conversation on Warp. I completed the review and posted feedback on this pull request. Comment Powered by Oz |
There was a problem hiding this comment.
Overview
This PR broadens the existing conversation details side panel so native terminal panes can show details for active local AI conversations, while preserving task-backed cloud Oz behavior. The changes rename the panel/action state, relax the pane-header render predicate, add local-conversation fallback data population, and add a native unit test for conversation-derived fields.
Concerns
- No blocking correctness, security, error-handling, or performance concerns found in the changed diff. The security pass found no new secret exposure, authorization bypass, command execution, or unsafe external-input handling introduced by these changes.
Verdict
Found: 0 critical, 0 important, 0 suggestions
Approve
Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).
Powered by Oz
There was a problem hiding this comment.
Overview
This PR broadens the conversation details side panel so native terminal panes can open it for active local AI conversations, while keeping cloud task-backed details populated from AmbientAgentTask data.
Concerns
- The new visibility predicate no longer preserves the existing
FeatureFlag::CloudModegate for task-backed cloud details. If a terminal has an ambient task id while CloudMode is disabled, the pane header toggle and side panel can now render even though that path was previously feature-gated. - Security pass: no additional security issues found in the reviewed diff.
Verdict
Found: 0 critical, 1 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
| self.ambient_agent_task_id_for_details_panel_from_model(model, app) | ||
| .is_some() | ||
| || self.has_active_local_ai_conversation(app) |
There was a problem hiding this comment.
CloudMode gate for task-backed details; otherwise cloud-mode metadata UI can appear whenever a task id is present even if the feature flag is disabled.
| self.ambient_agent_task_id_for_details_panel_from_model(model, app) | |
| .is_some() | |
| || self.has_active_local_ai_conversation(app) | |
| (FeatureFlag::CloudMode.is_enabled() | |
| && self | |
| .ambient_agent_task_id_for_details_panel_from_model(model, app) | |
| .is_some()) | |
| || self.has_active_local_ai_conversation(app) |
There was a problem hiding this comment.
CloudMode is enabled everywhere, so this is just cleaning up
|
Good call, fixed so empty local conversations don't show up in the details panel |
…rpdotdev#9493) ## Description Closes [APP-3595](https://linear.app/warpdotdev/issue/APP-3595). The conversation details side panel was previously only visible for cloud Oz runs (a `TerminalView` had to expose an `AmbientAgentTaskId`). Local Warp Agent conversations had no way to surface the same metadata even though `ConversationDetailsPanel` and `ConversationDetailsData::from_conversation` already supported that case on web. This PR makes the pane-header info button and the side panel available for **any active AI conversation in a `TerminalView`** (cloud Oz runs continue to work unchanged). Task-only sections (Run ID, Environment details, setup commands, error message, inference/compute credit split) stay hidden when there's no backing `AmbientAgentTask`; everything else (status, working directory, conversation ID when persisted, run time, credits, source prompt, artifacts, harness, creator) renders from the active `AIConversation`. ### Behavior summary - **Cloud Oz runs**: unchanged. Info button in pane header, auto-open on `SessionReady`, all existing fields rendered. - **Cloud non-Oz runs (Claude / Gemini)**: unchanged. Task-mode panel as today. - **Local AI conversations (native)**: a new info-button toggle is visible whenever there's an active conversation and AI is enabled. Clicking opens the panel populated from the active `AIConversation`. Task-only sections are hidden because the data isn't available. - The panel does **not** auto-open for local conversations — it only opens when the user clicks the toggle. Auto-open behavior on `SessionReady` is still scoped to cloud mode. - The panel refreshes on `BlocklistAIControllerEvent::FinishedReceivingOutput` for any active AI conversation (previously: only when the view was an ambient agent), and on relevant `BlocklistAIHistoryEvent` updates so streaming/status/artifact changes flow through while the panel is open. ### Key code changes - `app/src/ai/conversation_details_panel.rs`: lifted the `#[cfg(target_family = "wasm")]` gates on `from_conversation`, `CreatorInfo::from_uid_fallback`, and the `UserUid` / `UserProfiles` imports so the helper compiles on native. - `app/src/terminal/view.rs`: added `TerminalView::has_active_local_ai_conversation` and `TerminalView::can_show_conversation_details_ui`, used the broader predicate in the render gate, and broadened the refresh hooks. - `app/src/terminal/view/ambient_agent/view_impl.rs`: generalized `fetch_and_update_cloud_mode_details_panel` to fall back to the active `AIConversation` when there's no task ID. - `app/src/terminal/view/pane_impl.rs`: lifted the toggle button rendering out from under the `FeatureFlag::CloudMode` arm in `render_header_actions`. - `app/src/ai/conversation_details_panel_tests.rs`: added a unit test asserting that `from_conversation` populates the local-conversation fields the details panel renders (working directory, title, source prompt, `LocalConversation` credits, `Conversation` mode). ## Testing Manually tested: https://www.loom.com/share/1ca886583b3340ea94842ce7202a3c57 - Added `test_from_conversation_populates_local_conversation_fields` in `app/src/ai/conversation_details_panel_tests.rs`. All 5 tests in the `conversation_details_panel` module pass. - `cargo check -p warp --lib` succeeds. - `cargo clippy -p warp --lib --tests --no-deps -- -D warnings` succeeds. - `cargo fmt -p warp` applied. - Manual smoke test (recommended for reviewers): start a local Warp Agent conversation in a terminal pane and verify the info button appears in the pane header, opens the side panel populated with the conversation's title, status, initial query, run time, credits, working directory, and conversation ID (when persisted). Compare to a cloud Oz run for parity. ## Server API dependencies This change is client-only and does not depend on any server API changes. ## Agent Mode - [x] Warp Agent Mode - This PR was created via Warp's AI Agent Mode ## Changelog Entries for Stable CHANGELOG-IMPROVEMENT: Conversation details side panel is now available for local Warp Agent conversations, not just cloud Oz runs. Click the info button in the pane header to open it for any active AI conversation. _Conversation: https://staging.warp.dev/conversation/c79b0062-c933-4c75-956d-b16f461656a9_ _Run: https://oz.staging.warp.dev/runs/019ddaf6-a62a-7ef3-86f7-b80b8ac8b2c8_ _Plans_: - _[APP-3595: Show conversation details panel for local conversations](https://staging.warp.dev/drive/notebook/kId8vzGLitcHOj5IMwH4R8)_ _This PR was generated with [Oz](https://warp.dev/oz)._ --------- Co-authored-by: Oz <[email protected]>

Description
Closes APP-3595.
The conversation details side panel was previously only visible for cloud Oz runs (a
TerminalViewhad to expose anAmbientAgentTaskId). Local Warp Agent conversations had no way to surface the same metadata even thoughConversationDetailsPanelandConversationDetailsData::from_conversationalready supported that case on web.This PR makes the pane-header info button and the side panel available for any active AI conversation in a
TerminalView(cloud Oz runs continue to work unchanged). Task-only sections (Run ID, Environment details, setup commands, error message, inference/compute credit split) stay hidden when there's no backingAmbientAgentTask; everything else (status, working directory, conversation ID when persisted, run time, credits, source prompt, artifacts, harness, creator) renders from the activeAIConversation.Behavior summary
SessionReady, all existing fields rendered.AIConversation. Task-only sections are hidden because the data isn't available.SessionReadyis still scoped to cloud mode.BlocklistAIControllerEvent::FinishedReceivingOutputfor any active AI conversation (previously: only when the view was an ambient agent), and on relevantBlocklistAIHistoryEventupdates so streaming/status/artifact changes flow through while the panel is open.Key code changes
app/src/ai/conversation_details_panel.rs: lifted the#[cfg(target_family = "wasm")]gates onfrom_conversation,CreatorInfo::from_uid_fallback, and theUserUid/UserProfilesimports so the helper compiles on native.app/src/terminal/view.rs: addedTerminalView::has_active_local_ai_conversationandTerminalView::can_show_conversation_details_ui, used the broader predicate in the render gate, and broadened the refresh hooks.app/src/terminal/view/ambient_agent/view_impl.rs: generalizedfetch_and_update_cloud_mode_details_panelto fall back to the activeAIConversationwhen there's no task ID.app/src/terminal/view/pane_impl.rs: lifted the toggle button rendering out from under theFeatureFlag::CloudModearm inrender_header_actions.app/src/ai/conversation_details_panel_tests.rs: added a unit test asserting thatfrom_conversationpopulates the local-conversation fields the details panel renders (working directory, title, source prompt,LocalConversationcredits,Conversationmode).Testing
Manually tested: https://www.loom.com/share/1ca886583b3340ea94842ce7202a3c57
test_from_conversation_populates_local_conversation_fieldsinapp/src/ai/conversation_details_panel_tests.rs. All 5 tests in theconversation_details_panelmodule pass.cargo check -p warp --libsucceeds.cargo clippy -p warp --lib --tests --no-deps -- -D warningssucceeds.cargo fmt -p warpapplied.Server API dependencies
This change is client-only and does not depend on any server API changes.
Agent Mode
Changelog Entries for Stable
CHANGELOG-IMPROVEMENT: Conversation details side panel is now available for local Warp Agent conversations, not just cloud Oz runs. Click the info button in the pane header to open it for any active AI conversation.
Conversation: https://staging.warp.dev/conversation/c79b0062-c933-4c75-956d-b16f461656a9
Run: https://oz.staging.warp.dev/runs/019ddaf6-a62a-7ef3-86f7-b80b8ac8b2c8
Plans:
This PR was generated with Oz.