perf(ui): format sidebar timestamps on demand (#121819)

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Peter Steinberger
2026-08-10 20:09:52 -07:00
committed by GitHub
parent c87f77185d
commit 4e22cee056
6 changed files with 10 additions and 20 deletions
@@ -14,7 +14,7 @@ function runningRow(key: string): SidebarRecentSession {
return {
key,
label: "Run",
meta: "now",
updatedAt: Date.now(),
href: "#",
active: false,
visuallyActive: false,
@@ -36,7 +36,6 @@ import {
} from "../lib/sessions/session-key.ts";
import { reconcileSidebarZone } from "../lib/sidebar-zone.ts";
import { normalizeOptionalString } from "../lib/string-coerce.ts";
import { formatSidebarTimestamp } from "./app-sidebar-session-catalogs.ts";
import {
limitSidebarSessionRows,
SIDEBAR_SESSION_NO_ATTENTION,
@@ -161,7 +160,6 @@ export function buildSidebarSessionNavigationState(input: {
// The sidebar's zone structure already says what forked from what;
// a "Subagent:" prefix on named threads is noise (other surfaces keep it).
label: resolveSessionDisplayName(row.key, row, { includeSubagentPrefix: false }),
meta: formatSidebarTimestamp(row.updatedAt),
subtitle: resolveSessionWorkSubtitle(row),
href: sessionNavigationTarget({
face: resolveSessionPreferredFace(row),
@@ -18,6 +18,7 @@ import type {
CatalogBackingSessionDisplay,
CatalogSessionMenuRequest,
} from "./app-sidebar-session-catalogs.ts";
import { formatSidebarTimestamp } from "./app-sidebar-session-catalogs.ts";
import {
rowDemandsVisibility,
sidebarSessionMetaId,
@@ -106,11 +107,7 @@ export interface SessionListHost {
handleSessionRowClick(event: MouseEvent, session: SidebarRecentSession): void;
toggleSessionChildren(session: SidebarRecentSession): void;
toggleSessionPin(session: SidebarRecentSession): void;
toggleSessionMenu(
session: SidebarRecentSession,
menuSession: SidebarRecentSession,
trigger: HTMLElement,
): void;
toggleSessionMenu(session: SidebarRecentSession, trigger: HTMLElement): void;
showMoreChildren(sessionKey: string): void;
sectionDragOver(event: DragEvent, sectionId: string, group?: string): void;
sectionDragLeave(event: DragEvent, sectionId: string, group?: string): void;
@@ -192,19 +189,18 @@ export function renderRecentSession(params: {
const trailingDescription = session.isChild
? ""
: describeSessionTrailingState(session, pullRequestState);
const meta = display?.meta ?? session.meta;
const meta = display?.meta ?? formatSidebarTimestamp(session.updatedAt);
const rowMeta = session.pinned ? "" : meta;
const hasTrail = session.isChild && (session.runtimeMs != null || session.startedAt != null);
const metaId = hasTrail ? sidebarSessionMetaId(session.key) : undefined;
const stateId = trailingIndicator === nothing ? undefined : sidebarSessionStateId(session.key);
const menuSession = display ? { ...session, meta } : session;
const openMenuFromEvent = session.isChild
? undefined
: (event: MouseEvent | KeyboardEvent) =>
handleContextMenuEvent(
event,
(event.currentTarget as HTMLElement).querySelector("[data-session-menu]"),
(trigger, x, y) => host.sidebarMenus.openSessionMenu(menuSession, x, y, trigger),
(trigger, x, y) => host.sidebarMenus.openSessionMenu(session, x, y, trigger),
);
const title = [
display?.title ?? [label, narration, rowMeta].filter(Boolean).join(" · "),
@@ -405,7 +401,7 @@ export function renderRecentSession(params: {
@click=${(event: MouseEvent) => {
event.stopPropagation();
const trigger = event.currentTarget as HTMLElement;
host.toggleSessionMenu(session, menuSession, trigger);
host.toggleSessionMenu(session, trigger);
}}
>
${icons.moreHorizontal}
@@ -59,7 +59,6 @@ export type SidebarRecentSession = {
createdActor?: SessionCreatedActor;
archivedBy?: SessionCreatedActor;
label: string;
meta: string;
/** Compact repo/branch/node line for work sessions. */
subtitle?: string;
href: string;
+2 -6
View File
@@ -300,17 +300,13 @@ class AppSidebar extends AppSidebarSessionNavigationElement implements SessionLi
void this.sessionOrganizer.patchSession(session, { pinned: !session.pinned });
}
toggleSessionMenu(
session: SidebarRecentSession,
menuSession: SidebarRecentSession,
trigger: HTMLElement,
): void {
toggleSessionMenu(session: SidebarRecentSession, trigger: HTMLElement): void {
if (this.sidebarMenus.sessionMenu?.session.key === session.key) {
this.sidebarMenus.closeSessionMenu();
return;
}
const rect = trigger.getBoundingClientRect();
this.sidebarMenus.openSessionMenu(menuSession, rect.right, rect.bottom + 4, trigger);
this.sidebarMenus.openSessionMenu(session, rect.right, rect.bottom + 4, trigger);
}
startSidebarSectionDrag(sectionId: string): void {
+2 -1
View File
@@ -15,6 +15,7 @@ import {
} from "../lib/sessions/session-key.ts";
import { renderSidebarAgentMenu, renderSidebarIdentityMenu } from "./app-sidebar-agent-menu.ts";
import { renderSidebarCustomizeMenu, renderSidebarMoreMenu } from "./app-sidebar-nav-menus.ts";
import { formatSidebarTimestamp } from "./app-sidebar-session-catalogs.ts";
import {
renderSidebarCatalogViewMenu,
renderSidebarSessionGroupMenu,
@@ -180,7 +181,7 @@ export function renderSidebarSessionMenuForController(controller: SidebarMenusCo
category: batchRows ? sharedCategory : (session.category ?? null),
}}
.selectionCount=${rows.length}
.lastActive=${batchRows ? "" : session.meta}
.lastActive=${batchRows ? "" : formatSidebarTimestamp(session.updatedAt)}
.anchor=${menu}
.trigger=${controller.sessionMenuTrigger}
.disabled=${!host.connected}