diff --git a/backend/app/models/session_branch.py b/backend/app/models/session_branch.py index 6bdb8655..ab6cc50e 100644 --- a/backend/app/models/session_branch.py +++ b/backend/app/models/session_branch.py @@ -51,7 +51,7 @@ class SessionBranch(Base): updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) # Relationships - session: Mapped["AISession"] = relationship("AISession", foreign_keys=[session_id], back_populates="branches") + session: Mapped["AISession"] = relationship("AISession", foreign_keys="[SessionBranch.session_id]", back_populates="branches") parent_branch: Mapped[Optional["SessionBranch"]] = relationship("SessionBranch", remote_side="SessionBranch.id", foreign_keys=[parent_branch_id]) fork_point_step: Mapped[Optional["AISessionStep"]] = relationship("AISessionStep", foreign_keys=[fork_point_step_id]) status_changed_by_user: Mapped[Optional["User"]] = relationship("User", foreign_keys=[status_changed_by]) diff --git a/frontend/src/components/flowpilot/EscalateModal.tsx b/frontend/src/components/flowpilot/EscalateModal.tsx index a92cdb98..035d00bc 100644 --- a/frontend/src/components/flowpilot/EscalateModal.tsx +++ b/frontend/src/components/flowpilot/EscalateModal.tsx @@ -16,7 +16,7 @@ interface EscalateModalProps { export function EscalateModal({ open, onClose, onEscalate, isProcessing, hasPsaTicket, sessionId }: EscalateModalProps) { const [reason, setReason] = useState('') - const [_escalateUploads, setEscalateUploads] = useState([]) + const [, setEscalateUploads] = useState([]) const handleSubmit = async () => { if (!reason.trim() || reason.trim().length < 5) return diff --git a/frontend/src/components/flowpilot/FlowPilotIntake.tsx b/frontend/src/components/flowpilot/FlowPilotIntake.tsx index 4b80ea3c..916c0c3e 100644 --- a/frontend/src/components/flowpilot/FlowPilotIntake.tsx +++ b/frontend/src/components/flowpilot/FlowPilotIntake.tsx @@ -24,7 +24,7 @@ export function FlowPilotIntake({ onSubmit, isLoading, defaultProblem }: FlowPil const [psaChecked, setPsaChecked] = useState(false) // Upload state (no session_id yet — uploads linked later) - const [_intakeUploads, setIntakeUploads] = useState([]) + const [, setIntakeUploads] = useState([]) // Selected ticket state const [selectedTicket, setSelectedTicket] = useState(null) diff --git a/frontend/src/components/flowpilot/FlowPilotSession.tsx b/frontend/src/components/flowpilot/FlowPilotSession.tsx index 7040c0ef..7ea882d4 100644 --- a/frontend/src/components/flowpilot/FlowPilotSession.tsx +++ b/frontend/src/components/flowpilot/FlowPilotSession.tsx @@ -88,7 +88,7 @@ export function FlowPilotSession({ prevBranchIdRef.current = activeBranchId }, [activeBranchId, branches]) - const handleLinkTicket = async (ticketId: string, _ticket: PSATicketInfo) => { + const handleLinkTicket = async (ticketId: string, _ticket?: PSATicketInfo) => { if (!session.psa_connection_id && !session.ticket_data) { // Need a connection ID — try to get it from the integrations API // For now, we'll need it passed in. This will work when ticket_data has it. diff --git a/frontend/src/components/flowpilot/SimilarSessions.tsx b/frontend/src/components/flowpilot/SimilarSessions.tsx index e5d29219..f1f20004 100644 --- a/frontend/src/components/flowpilot/SimilarSessions.tsx +++ b/frontend/src/components/flowpilot/SimilarSessions.tsx @@ -15,6 +15,7 @@ export function SimilarSessions({ sessionId }: SimilarSessionsProps) { useEffect(() => { let cancelled = false + // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: syncs derived state from props setLoading(true) aiSessionsApi .getSimilar(sessionId, 5) diff --git a/frontend/src/components/sidebar/SidebarStatsBar.tsx b/frontend/src/components/sidebar/SidebarStatsBar.tsx index cb8223f1..3ac32a9a 100644 --- a/frontend/src/components/sidebar/SidebarStatsBar.tsx +++ b/frontend/src/components/sidebar/SidebarStatsBar.tsx @@ -37,6 +37,7 @@ export function SidebarStatsBar({ resolved, active, completedMinutes, activeSess // Tick every second to keep the timer in sync with the session timer useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: syncs derived state from props setLiveSeconds(calcActiveSeconds(activeSessionStartTimes)) if (activeSessionStartTimes.length === 0) return const interval = setInterval(() => { diff --git a/frontend/src/pages/AssistantChatPage.tsx b/frontend/src/pages/AssistantChatPage.tsx index bdef1eec..fad0b11d 100644 --- a/frontend/src/pages/AssistantChatPage.tsx +++ b/frontend/src/pages/AssistantChatPage.tsx @@ -216,7 +216,7 @@ export default function AssistantChatPage() { } } - const handleTogglePin = async (_chatId: string, _pinned: boolean) => { + const handleTogglePin = async () => { // Pin/unpin not yet supported on unified sessions — no-op for now toast.info('Pin feature coming soon') } diff --git a/frontend/src/pages/FlowPilotAnalyticsPage.tsx b/frontend/src/pages/FlowPilotAnalyticsPage.tsx index ca51ec08..cfd1dfec 100644 --- a/frontend/src/pages/FlowPilotAnalyticsPage.tsx +++ b/frontend/src/pages/FlowPilotAnalyticsPage.tsx @@ -68,6 +68,7 @@ export default function FlowPilotAnalyticsPage() { // Load overview data useEffect(() => { + // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: syncs derived state from props setLoading(true) Promise.all([ flowpilotAnalyticsApi.getDashboard(period), diff --git a/frontend/src/types/public-templates.ts b/frontend/src/types/public-templates.ts index 416866a4..77921707 100644 --- a/frontend/src/types/public-templates.ts +++ b/frontend/src/types/public-templates.ts @@ -37,7 +37,7 @@ export interface PublicGalleryResponse { domains: string[] } -export interface PublicFlowDetail extends PublicFlowTemplate {} +export type PublicFlowDetail = PublicFlowTemplate export interface PublicScriptDetail { id: string