#2 Dismiss / Clear failed: - Per-row [×] (text 'Dismiss', shown on hover) on terminal ops - 'Clear' button in dropdown header when any dismissable rows exist - Dismissed IDs persisted to localStorage (tower_dismissed_ops) - Pruned during the 30s sweep when the underlying op falls out of the recent window — keeps storage from growing forever - badgeCount + failedCount filter dismissed entries so the red pill clears the moment the operator acks the failure #4 Toast popups: - useToast composable + Toaster.vue mounted at App.vue - Triggered from NotificationBell.upsert on terminal transition when the op was running ≥30s AND the bell isn't open - Success: 5s auto-dismiss; Failure: sticky until clicked away - Click-through links to the per-instance Activity timeline (#op_<id>) for any op carrying instanceCode - Stack of 3, oldest drops on overflow - No external dep — hand-rolled to match v3's component style
2.0 KiB
2.0 KiB