From 831bed7a0cc39ab8a7c19a388d06357374fe3c46 Mon Sep 17 00:00:00 2001 From: Alessandro <155005371+3clyp50@users.noreply.github.com> Date: Sun, 12 Jul 2026 17:10:47 +0200 Subject: [PATCH] Polish the update notification action Present Open updater as the existing confirm-style button on its own toast row. Opening the Self Update modal now dismisses the persistent notification so users do not need to close it separately.\n\nKeep external update-instruction links unchanged and extend the persistent-toast regression coverage. --- extensions/python/user_message_ui/AGENTS.md | 2 +- .../python/user_message_ui/_10_update_check.py | 14 +++++++++++++- tests/test_download_toast_regressions.py | 5 +++++ .../notifications/notification-toast-stack.html | 4 ++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/extensions/python/user_message_ui/AGENTS.md b/extensions/python/user_message_ui/AGENTS.md index 5755ea69d..2d9a3b706 100644 --- a/extensions/python/user_message_ui/AGENTS.md +++ b/extensions/python/user_message_ui/AGENTS.md @@ -11,7 +11,7 @@ ## Local Contracts - Keep proactive UI messages relevant, non-spammy, and safe for display. -- Keep update-available notifications visible until the user dismisses them. +- Keep update-available notifications visible until the user dismisses them or opens the updater. - Do not expose local diagnostics or update data that should stay internal. ## Work Guidance diff --git a/extensions/python/user_message_ui/_10_update_check.py b/extensions/python/user_message_ui/_10_update_check.py index 00cf5fa2f..6d26c1d92 100644 --- a/extensions/python/user_message_ui/_10_update_check.py +++ b/extensions/python/user_message_ui/_10_update_check.py @@ -98,10 +98,22 @@ class UpdateCheck(Extension): if not self.agent: return + message = notif.get( + "message", + "A newer version of Agent Zero is available. Please update to the latest version.", + ) + message = message.replace( + 'Open updater.', + '
' + '
", + ) notifs = self.agent.context.get_notification_manager() notifs.send_notification( title=notif.get("title", "Newer version available"), - message=notif.get("message", "A newer version of Agent Zero is available. Please update to the latest version."), + message=message, type=notif.get("type", "info"), detail=notif.get("detail", ""), display_time=0, diff --git a/tests/test_download_toast_regressions.py b/tests/test_download_toast_regressions.py index cdf5db3f1..291050e6e 100644 --- a/tests/test_download_toast_regressions.py +++ b/tests/test_download_toast_regressions.py @@ -88,6 +88,7 @@ def previous_non_space(source: str, index: int) -> str: def test_notification_store_supports_persistent_grouped_toasts(): store = read("webui", "components", "notifications", "notification-store.js") + toast_stack = read("webui", "components", "notifications", "notification-toast-stack.html") api = read("api", "notification_create.py") plugins = read("helpers", "plugins.py") update_check = read("extensions", "python", "user_message_ui", "_10_update_check.py") @@ -103,6 +104,10 @@ def test_notification_store_supports_persistent_grouped_toasts(): assert 'id=notif.get("id", "update_check_available"),' in update_check assert "display_time=0," in plugins assert "display_time=0," in update_check + assert 'class="toast-action-row"' in update_check + assert 'class="button confirm"' in update_check + assert "$store.notificationStore.dismissToast(toast.toastId)" in update_check + assert ".toast-action-row" in toast_stack def test_backup_zip_downloads_emit_grouped_preparing_and_downloading_toasts(): diff --git a/webui/components/notifications/notification-toast-stack.html b/webui/components/notifications/notification-toast-stack.html index 3a9fc29c1..7a002c6fc 100644 --- a/webui/components/notifications/notification-toast-stack.html +++ b/webui/components/notifications/notification-toast-stack.html @@ -150,6 +150,10 @@ margin-bottom: 4px; } + .toast-action-row { + margin-top: 10px; + } + .toast-timestamp { font-size: 0.75rem; color: var(--color-text);