diff --git a/docs/plans/2026-03-04-survey-invite-tracking-design.md b/docs/plans/archive/2026-03-04-survey-invite-tracking-design.md similarity index 100% rename from docs/plans/2026-03-04-survey-invite-tracking-design.md rename to docs/plans/archive/2026-03-04-survey-invite-tracking-design.md diff --git a/docs/plans/2026-03-04-survey-invite-tracking.md b/docs/plans/archive/2026-03-04-survey-invite-tracking.md similarity index 100% rename from docs/plans/2026-03-04-survey-invite-tracking.md rename to docs/plans/archive/2026-03-04-survey-invite-tracking.md diff --git a/docs/plans/2026-03-05-admin-survey-responses.md b/docs/plans/archive/2026-03-05-admin-survey-responses.md similarity index 100% rename from docs/plans/2026-03-05-admin-survey-responses.md rename to docs/plans/archive/2026-03-05-admin-survey-responses.md diff --git a/docs/plans/2026-03-06-editor-embedded-flow-assist-design.md b/docs/plans/archive/2026-03-06-editor-embedded-flow-assist-design.md similarity index 100% rename from docs/plans/2026-03-06-editor-embedded-flow-assist-design.md rename to docs/plans/archive/2026-03-06-editor-embedded-flow-assist-design.md diff --git a/docs/plans/2026-03-06-editor-embedded-flow-assist-plan.md b/docs/plans/archive/2026-03-06-editor-embedded-flow-assist-plan.md similarity index 100% rename from docs/plans/2026-03-06-editor-embedded-flow-assist-plan.md rename to docs/plans/archive/2026-03-06-editor-embedded-flow-assist-plan.md diff --git a/docs/plans/2026-03-06-procedural-flow-assist.md b/docs/plans/archive/2026-03-06-procedural-flow-assist.md similarity index 100% rename from docs/plans/2026-03-06-procedural-flow-assist.md rename to docs/plans/archive/2026-03-06-procedural-flow-assist.md diff --git a/docs/plans/2026-03-09-glow-edge-design.md b/docs/plans/archive/2026-03-09-glow-edge-design.md similarity index 100% rename from docs/plans/2026-03-09-glow-edge-design.md rename to docs/plans/archive/2026-03-09-glow-edge-design.md diff --git a/docs/plans/2026-03-10-flexible-intake-design.md b/docs/plans/archive/2026-03-10-flexible-intake-design.md similarity index 100% rename from docs/plans/2026-03-10-flexible-intake-design.md rename to docs/plans/archive/2026-03-10-flexible-intake-design.md diff --git a/docs/plans/2026-03-11-session-closure-design.md b/docs/plans/archive/2026-03-11-session-closure-design.md similarity index 100% rename from docs/plans/2026-03-11-session-closure-design.md rename to docs/plans/archive/2026-03-11-session-closure-design.md diff --git a/docs/plans/2026-03-11-session-closure.md b/docs/plans/archive/2026-03-11-session-closure.md similarity index 100% rename from docs/plans/2026-03-11-session-closure.md rename to docs/plans/archive/2026-03-11-session-closure.md diff --git a/docs/plans/2026-03-13-script-template-editor-design.md b/docs/plans/archive/2026-03-13-script-template-editor-design.md similarity index 100% rename from docs/plans/2026-03-13-script-template-editor-design.md rename to docs/plans/archive/2026-03-13-script-template-editor-design.md diff --git a/docs/plans/2026-03-13-script-template-editor-impl.md b/docs/plans/archive/2026-03-13-script-template-editor-impl.md similarity index 100% rename from docs/plans/2026-03-13-script-template-editor-impl.md rename to docs/plans/archive/2026-03-13-script-template-editor-impl.md diff --git a/docs/plans/2026-03-14-connectwise-psa-integration-plan.md b/docs/plans/archive/2026-03-14-connectwise-psa-integration-plan.md similarity index 100% rename from docs/plans/2026-03-14-connectwise-psa-integration-plan.md rename to docs/plans/archive/2026-03-14-connectwise-psa-integration-plan.md diff --git a/docs/plans/2026-03-14-parameter-detector-design.md b/docs/plans/archive/2026-03-14-parameter-detector-design.md similarity index 100% rename from docs/plans/2026-03-14-parameter-detector-design.md rename to docs/plans/archive/2026-03-14-parameter-detector-design.md diff --git a/docs/plans/2026-03-14-parameter-detector-plan.md b/docs/plans/archive/2026-03-14-parameter-detector-plan.md similarity index 100% rename from docs/plans/2026-03-14-parameter-detector-plan.md rename to docs/plans/archive/2026-03-14-parameter-detector-plan.md diff --git a/docs/plans/2026-03-16-stack-priorities-and-playwright-plan.md b/docs/plans/archive/2026-03-16-stack-priorities-and-playwright-plan.md similarity index 100% rename from docs/plans/2026-03-16-stack-priorities-and-playwright-plan.md rename to docs/plans/archive/2026-03-16-stack-priorities-and-playwright-plan.md diff --git a/docs/plans/2026-03-18-flowpilot-first-pivot-phase1.md b/docs/plans/archive/2026-03-18-flowpilot-first-pivot-phase1.md similarity index 100% rename from docs/plans/2026-03-18-flowpilot-first-pivot-phase1.md rename to docs/plans/archive/2026-03-18-flowpilot-first-pivot-phase1.md diff --git a/docs/plans/2026-03-18-flowpilot-first-pivot-phase2.md b/docs/plans/archive/2026-03-18-flowpilot-first-pivot-phase2.md similarity index 100% rename from docs/plans/2026-03-18-flowpilot-first-pivot-phase2.md rename to docs/plans/archive/2026-03-18-flowpilot-first-pivot-phase2.md diff --git a/docs/plans/2026-03-18-security-coverage-performance-design.md b/docs/plans/archive/2026-03-18-security-coverage-performance-design.md similarity index 100% rename from docs/plans/2026-03-18-security-coverage-performance-design.md rename to docs/plans/archive/2026-03-18-security-coverage-performance-design.md diff --git a/docs/plans/2026-03-18-security-coverage-performance.md b/docs/plans/archive/2026-03-18-security-coverage-performance.md similarity index 100% rename from docs/plans/2026-03-18-security-coverage-performance.md rename to docs/plans/archive/2026-03-18-security-coverage-performance.md diff --git a/docs/plans/2026-03-19-phase4-remaining-slices-impl.md b/docs/plans/archive/2026-03-19-phase4-remaining-slices-impl.md similarity index 100% rename from docs/plans/2026-03-19-phase4-remaining-slices-impl.md rename to docs/plans/archive/2026-03-19-phase4-remaining-slices-impl.md diff --git a/docs/plans/2026-03-19-phase4-slice2-notifications.md b/docs/plans/archive/2026-03-19-phase4-slice2-notifications.md similarity index 100% rename from docs/plans/2026-03-19-phase4-slice2-notifications.md rename to docs/plans/archive/2026-03-19-phase4-slice2-notifications.md diff --git a/docs/plans/2026-03-19-phase5-analytics-enhancement-design.md b/docs/plans/archive/2026-03-19-phase5-analytics-enhancement-design.md similarity index 100% rename from docs/plans/2026-03-19-phase5-analytics-enhancement-design.md rename to docs/plans/archive/2026-03-19-phase5-analytics-enhancement-design.md diff --git a/docs/plans/2026-03-19-phase5-analytics-impl.md b/docs/plans/archive/2026-03-19-phase5-analytics-impl.md similarity index 100% rename from docs/plans/2026-03-19-phase5-analytics-impl.md rename to docs/plans/archive/2026-03-19-phase5-analytics-impl.md diff --git a/docs/plans/2026-03-20-flowpilot-dashboard-sidebar-redesign.md b/docs/plans/archive/2026-03-20-flowpilot-dashboard-sidebar-redesign.md similarity index 100% rename from docs/plans/2026-03-20-flowpilot-dashboard-sidebar-redesign.md rename to docs/plans/archive/2026-03-20-flowpilot-dashboard-sidebar-redesign.md diff --git a/docs/plans/2026-03-20-search-recall-evidence-design.md b/docs/plans/archive/2026-03-20-search-recall-evidence-design.md similarity index 100% rename from docs/plans/2026-03-20-search-recall-evidence-design.md rename to docs/plans/archive/2026-03-20-search-recall-evidence-design.md diff --git a/docs/plans/2026-03-20-search-recall-evidence-impl.md b/docs/plans/archive/2026-03-20-search-recall-evidence-impl.md similarity index 100% rename from docs/plans/2026-03-20-search-recall-evidence-impl.md rename to docs/plans/archive/2026-03-20-search-recall-evidence-impl.md diff --git a/docs/plans/2026-03-23-copilot-first-dashboard.md b/docs/plans/archive/2026-03-23-copilot-first-dashboard.md similarity index 100% rename from docs/plans/2026-03-23-copilot-first-dashboard.md rename to docs/plans/archive/2026-03-23-copilot-first-dashboard.md diff --git a/docs/plans/2026-03-23-mid-session-status-updates.md b/docs/plans/archive/2026-03-23-mid-session-status-updates.md similarity index 100% rename from docs/plans/2026-03-23-mid-session-status-updates.md rename to docs/plans/archive/2026-03-23-mid-session-status-updates.md diff --git a/docs/plans/2026-03-23-solutions-library-design.md b/docs/plans/archive/2026-03-23-solutions-library-design.md similarity index 100% rename from docs/plans/2026-03-23-solutions-library-design.md rename to docs/plans/archive/2026-03-23-solutions-library-design.md diff --git a/docs/plans/2026-03-23-unified-sessions.md b/docs/plans/archive/2026-03-23-unified-sessions.md similarity index 100% rename from docs/plans/2026-03-23-unified-sessions.md rename to docs/plans/archive/2026-03-23-unified-sessions.md diff --git a/docs/plans/2026-04-27-escalation-mode-wedge-design.md b/docs/plans/archive/2026-04-27-escalation-mode-wedge-design.md similarity index 100% rename from docs/plans/2026-04-27-escalation-mode-wedge-design.md rename to docs/plans/archive/2026-04-27-escalation-mode-wedge-design.md diff --git a/docs/plans/2026-04-27-escalation-mode-wedge-test-plan.md b/docs/plans/archive/2026-04-27-escalation-mode-wedge-test-plan.md similarity index 100% rename from docs/plans/2026-04-27-escalation-mode-wedge-test-plan.md rename to docs/plans/archive/2026-04-27-escalation-mode-wedge-test-plan.md diff --git a/frontend/src/hooks/useAuthSessionExpiry.ts b/frontend/src/hooks/useAuthSessionExpiry.ts index f32e4314..935c2c2c 100644 --- a/frontend/src/hooks/useAuthSessionExpiry.ts +++ b/frontend/src/hooks/useAuthSessionExpiry.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useEffect, useReducer } from 'react' import { useAuthStore } from '@/store/authStore' const SOON_MS = 5 * 60 * 1000 // 5 minutes @@ -53,14 +53,17 @@ function computeState(token: ReturnType['token']): */ export function useAuthSessionExpiry(): ExpiryState { const token = useAuthStore((s) => s.token) - const [state, setState] = useState(() => computeState(token)) + // Derived state — computed during render, not synced via setState in an + // effect. The reducer here is only a tick counter that forces re-render on + // the 30s cadence so the relative timestamps stay current. See React 19 + // guidance: https://react.dev/learn/you-might-not-need-an-effect + const [, tick] = useReducer((n: number) => n + 1, 0) useEffect(() => { - setState(computeState(token)) if (!token?.idle_expires_at || !token?.absolute_expires_at) return - const interval = window.setInterval(() => setState(computeState(token)), 30_000) + const interval = window.setInterval(tick, 30_000) return () => window.clearInterval(interval) }, [token]) - return state + return computeState(token) }