From 0168703d4fcc4e971139eb25b73ce6e46fdf1d64 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Sun, 3 May 2026 22:00:05 +0100 Subject: [PATCH] fix(ui): make idle session badges transient Keep idle status visible only briefly after active work finishes so the session list and headers emphasize meaningful state changes instead of permanent idle noise. --- packages/ui/src/components/instance-tab.tsx | 41 ++++++++++------ .../components/instance/instance-shell2.tsx | 6 ++- packages/ui/src/components/session-list.tsx | 21 +++++---- packages/ui/src/stores/session-api.ts | 17 ++++--- packages/ui/src/stores/session-events.ts | 9 ++++ packages/ui/src/stores/session-state.ts | 3 +- packages/ui/src/stores/session-status.test.ts | 27 +++++++++++ packages/ui/src/stores/session-status.ts | 47 ++++++++++++++++++- packages/ui/src/types/session.ts | 19 ++++++++ 9 files changed, 156 insertions(+), 34 deletions(-) diff --git a/packages/ui/src/components/instance-tab.tsx b/packages/ui/src/components/instance-tab.tsx index f345f637..a2c80299 100644 --- a/packages/ui/src/components/instance-tab.tsx +++ b/packages/ui/src/components/instance-tab.tsx @@ -1,4 +1,4 @@ -import { Component, createMemo } from "solid-js" +import { Component, Show, createEffect, createMemo, createSignal, onCleanup } from "solid-js" import type { Instance } from "../types/instance" import { getInstanceSessionIndicatorStatus } from "../stores/session-status" import { FolderOpen, ShieldAlert, X } from "lucide-solid" @@ -20,9 +20,18 @@ function getPathBasename(path: string): string { const InstanceTab: Component = (props) => { const { t } = useI18n() - const aggregatedStatus = createMemo(() => getInstanceSessionIndicatorStatus(props.instance.id)) + const [now, setNow] = createSignal(Date.now()) + + createEffect(() => { + if (typeof window === "undefined") return + const timer = window.setInterval(() => setNow(Date.now()), 1000) + onCleanup(() => window.clearInterval(timer)) + }) + + const aggregatedStatus = createMemo(() => getInstanceSessionIndicatorStatus(props.instance.id, now())) const statusClassName = createMemo(() => { const status = aggregatedStatus() + if (!status) return null return status === "permission" ? "session-permission" : `session-${status}` }) const statusTitle = createMemo(() => { @@ -33,8 +42,10 @@ const InstanceTab: Component = (props) => { return t("instanceTab.status.compacting") case "working": return t("instanceTab.status.working") - default: + case "idle": return t("instanceTab.status.idle") + default: + return null } }) @@ -51,17 +62,19 @@ const InstanceTab: Component = (props) => { {getPathBasename(props.instance.folder)} - - {aggregatedStatus() === "permission" ? ( -