mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-13 04:06:59 +00:00
refactor(sidebar): rebuild footer as priority-driven Ops Pulse strip (#1178)
* refactor(sidebar): rebuild footer as priority-driven Ops Pulse strip Replace the simple notification ticker with a derived activity summary that picks one of six states (active-op, failure, automation, recent-event, quiet-live, disconnected) and routes per-state clicks to logs, schedules, or activity. The hook owns the cascade; the component is pure presentation; EditorLayout owns wiring. Failure detection covers unread errors in the last 24h; recent-event is limited to non-error stack notifications in the last hour; automation reads the next /scheduled-tasks?action=update run and a debounced state-invalidate listener; the deploy-panel composite key is used for elapsed-time tracking so close-then-immediately-reopen counts as a new session. * refactor(sidebar): apply Ops Pulse audit fixes - countEnabledAutoUpdates now defaults missing autoUpdateSettings entries to enabled, matching the backend's getStackAutoUpdateSettingsForNode contract. Previously the automation state could not render even with the documented per-row default-true. - findFailure now requires a stack_name so the sidebar does not select a system-level error whose click would no-op through navigateToNotification. System errors continue to surface via the top-bar NotificationPanel. - DeployPanelState gains a monotonic sessionId sourced from the existing internal counter, and the new usePanelSessionStartedAt hook keys the elapsed-time tracker off it so a same-stack rerun always resets even when isOpen stays true across succeeded then preparing. - buildConfig splits quiet-live out of the default and adds an exhaustiveness guard so future SidebarActivitySummary variants fail to compile. - New unit tests cover the default-true aggregation, the same-stack session reset, the non-stack failure guard, and the useNextAutoUpdateRun debounce and cleanup paths. Frontend suite: 276 / 276 pass.
This commit is contained in:
@@ -20,6 +20,13 @@ export interface DeployPanelState {
|
||||
action: ActionVerb;
|
||||
status: 'preparing' | 'streaming' | 'succeeded' | 'failed';
|
||||
errorMessage?: string;
|
||||
/**
|
||||
* Monotonic id incremented on every runWithLog call. Lets external
|
||||
* consumers (e.g. the sidebar footer elapsed-time tracker) detect a new
|
||||
* deploy of the same stack+action even when isOpen stays true across the
|
||||
* transition.
|
||||
*/
|
||||
sessionId: number;
|
||||
}
|
||||
|
||||
interface RunResult {
|
||||
@@ -44,6 +51,7 @@ const DEFAULT_PANEL_STATE: DeployPanelState = {
|
||||
stackName: '',
|
||||
action: 'deploy',
|
||||
status: 'preparing',
|
||||
sessionId: 0,
|
||||
};
|
||||
|
||||
const DeployFeedbackContext = createContext<DeployFeedbackContextValue | undefined>(undefined);
|
||||
@@ -109,6 +117,7 @@ export function DeployFeedbackProvider({ children }: { children: React.ReactNode
|
||||
stackName: params.stackName,
|
||||
action: params.action,
|
||||
status: 'preparing',
|
||||
sessionId: mySession,
|
||||
});
|
||||
|
||||
const deployStarted = new Promise<void>((resolve) => {
|
||||
|
||||
Reference in New Issue
Block a user