feat: consolidate conversation filters with distinct inactive/old toggles#773
Draft
rbren wants to merge 1 commit into
Draft
feat: consolidate conversation filters with distinct inactive/old toggles#773rbren wants to merge 1 commit into
rbren wants to merge 1 commit into
Conversation
…gles Addresses issue #675 (and the investigation in @rbren's comment) by implementing two genuinely different filter toggles instead of duplicating the same time-based threshold. Investigation findings: - 'Inactive' and 'old' ARE different concepts when properly defined: - Inactive (execution-status-based): agent stopped working (PAUSED/ERROR/STUCK). Applies equally on cloud and local. A just-errored conversation is inactive but NOT old. - Old (time-based): not updated for 60+ minutes. A still-running conversation can be 'old' but is never 'inactive'. - They are duplicative ONLY if both use the same time threshold (the mistake in the original issue description). Changes: - Add hideInactiveConversations (default: false) to preferences store - Add isConversationInactive() helper in list helpers - Replace 'All/Relevant' radio buttons and separate 'Older' section in the filter menu with two independent checkbox toggles in the 'Show' section: 'Hide inactive conversations' and 'Hide old conversations' - Keep threadScope in store for backward compat with persisted state - Add i18n keys for both new filter labels (15 languages) - Add tests for isConversationInactive, store preferences, and filter behavior Co-authored-by: openhands <openhands@all-hands.dev>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
📸 Snapshot Test ReportWarning Snapshot comparison step crashed (timeout, OOM, or runner error) — diff results below may be incomplete or absent. ❌ 1 snapshot differ from the main branch baseline. Add the
✅ Unchanged snapshots (72)
Generated by the Snapshot Tests workflow. This comment was created by an AI agent (OpenHands) on behalf of the repo maintainers. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Why
Issue #675 proposed adding "Hide inactive" and "Hide old" conversation toggles, but @sjathin's PR #756 observed they used the same 60-minute time threshold, making them identical/duplicative. @rbren asked: "Is the inactive logic different on cloud vs local? Is inactive/old truly duplicative?"
Investigation findings:
execution_statusisPAUSED,ERROR, orSTUCK. This works on both cloud (a paused sandbox will haveexecution_status=PAUSED) and local (user stopped or agent errored). A conversation that just errored 5 minutes ago is inactive but NOT old.RUNNINGconversation could be "old" but is never "inactive".sandbox_status(PAUSED/RUNNING). Local conversations havesandbox_status = null. Butexecution_statusreflects the agent's stopped state on both platforms, so execution-status-based "inactive" applies uniformly.Summary
PAUSED,ERROR, orSTUCKconversations (execution-status-based; different from "old")hideInactiveConversationspreference (default:false) to the storeisConversationInactive()helper functionthreadScopein the store for backward compatibility with persisted stateIssue Number
Fixes #675
How to Test
npm ci && npm run dev(ornpm run dev:mockfor mock mode)Or run the tests:
npm test(all 2599 tests pass).Type
Notes
threadScope("All threads" / "Relevant threads") is removed from the filter menu UI but kept in the store for localStorage backward-compatibility. Existing users who hadthreadScope: "relevant"persisted will still have it applied (the filtering logic is preserved in the panel), but the UI control is gone.This PR was created by an AI agent (OpenHands) on behalf of the team.
@rbren can click here to continue refining the PR
🐳 Docker images for this PR
• GHCR package: https://github.com/OpenHands/agent-canvas/pkgs/container/agent-canvas
ghcr.io/openhands/agent-canvasghcr.io/openhands/agent-server:1.23.0-pythonopenhands-automation==1.0.0a381e00cc489148008ec79053f0fabf9edeee853aaPull (multi-arch manifest)
# Multi-arch manifest — Docker automatically pulls the correct architecture docker pull ghcr.io/openhands/agent-canvas:sha-81e00ccRun
All tags pushed for this build
About Multi-Architecture Support
sha-81e00cc) is a multi-arch manifest supporting both amd64 and arm64sha-81e00cc-amd64) are also available if needed