From df08e71067bb93220b3d634d9ae8ca4d92881de3 Mon Sep 17 00:00:00 2001 From: Ahtisahm Shahid Date: Wed, 3 Jun 2026 15:11:14 +0500 Subject: [PATCH 1/3] fix(backend): import SECRET from app.users in app.py Resolves F821 ruff errors on lines 883, 893, 942 where SECRET was used but never imported into app.py (it lives in app.users). --- surfsense_backend/app/app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/surfsense_backend/app/app.py b/surfsense_backend/app/app.py index 5130aa47e5..c074888065 100644 --- a/surfsense_backend/app/app.py +++ b/surfsense_backend/app/app.py @@ -43,6 +43,7 @@ from app.schemas import UserCreate, UserRead, UserUpdate from app.tasks.surfsense_docs_indexer import seed_surfsense_docs from app.users import ( + SECRET, auth_backend, current_active_user, fastapi_users, From 24380f3040e67f0b8748e00ef7c026a1b78065f6 Mon Sep 17 00:00:00 2001 From: Ahtisahm Shahid Date: Wed, 3 Jun 2026 15:49:27 +0500 Subject: [PATCH 2/3] fix(ci): apply ruff-format and biome auto-fixes to clear quality gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ruff-format: reformat surfsense_backend/app/app.py (trailing newline after the new SECRET import) - biome check --write: fix import ordering and formatting violations across 28 files in surfsense_web/ (atoms, components/ui, components/ tool-ui, lib/apis, svgr.d.ts) — these pre-existing issues caused the TypeScript/JavaScript Quality check to fail on every PR --- surfsense_backend/app/app.py | 3 +++ surfsense_web/atoms/user/user-query.atoms.ts | 2 +- surfsense_web/components/TokenHandler.tsx | 1 - .../components/tool-ui/generate-image.tsx | 4 ++-- .../components/tool-ui/sandbox-execute.tsx | 2 +- surfsense_web/components/tool-ui/user-memory.tsx | 4 ++-- surfsense_web/components/tool-ui/write-todos.tsx | 2 +- surfsense_web/components/ui/accordion.tsx | 2 +- surfsense_web/components/ui/alert-dialog.tsx | 14 +++++++------- surfsense_web/components/ui/alert.tsx | 2 +- surfsense_web/components/ui/animated-tabs.tsx | 2 +- surfsense_web/components/ui/avatar.tsx | 2 +- surfsense_web/components/ui/card.tsx | 2 +- surfsense_web/components/ui/collapsible.tsx | 2 +- surfsense_web/components/ui/command.tsx | 6 +++--- surfsense_web/components/ui/context-menu.tsx | 12 ++++++------ surfsense_web/components/ui/dialog.tsx | 10 +++++----- surfsense_web/components/ui/drawer.tsx | 12 ++++++------ surfsense_web/components/ui/dropdown-menu.tsx | 10 +++++----- .../components/ui/expanded-gif-overlay.tsx | 2 +- surfsense_web/components/ui/form.tsx | 8 ++++---- surfsense_web/components/ui/pagination.tsx | 6 +++--- surfsense_web/components/ui/popover.tsx | 2 +- surfsense_web/components/ui/sheet.tsx | 6 +++--- surfsense_web/components/ui/table.tsx | 2 +- surfsense_web/components/ui/tabs.tsx | 2 +- surfsense_web/components/ui/tooltip.tsx | 2 +- surfsense_web/lib/apis/connectors-api.service.ts | 2 +- surfsense_web/svgr.d.ts | 1 + 29 files changed, 65 insertions(+), 62 deletions(-) diff --git a/surfsense_backend/app/app.py b/surfsense_backend/app/app.py index c074888065..8a8c8ee8d9 100644 --- a/surfsense_backend/app/app.py +++ b/surfsense_backend/app/app.py @@ -820,6 +820,7 @@ async def dispatch( tags=["auth"], ) + # Register /users/me BEFORE fastapi_users.get_users_router so our routes take # precedence (FastAPI first-match wins). fastapi-users' internal /users/me only # validates JWT — it does not check request.state.proxy_user set by the proxy @@ -843,6 +844,8 @@ async def update_current_user_me( # JWT-loaded one. user_manager.get() returns the session-attached instance. db_user = await user_manager.get(user.id) return await user_manager.update(user_update, db_user, safe=True, request=request) + + app.include_router( fastapi_users.get_users_router(UserRead, UserUpdate), prefix="/users", diff --git a/surfsense_web/atoms/user/user-query.atoms.ts b/surfsense_web/atoms/user/user-query.atoms.ts index 8792c4a962..4b6717440d 100644 --- a/surfsense_web/atoms/user/user-query.atoms.ts +++ b/surfsense_web/atoms/user/user-query.atoms.ts @@ -1,6 +1,6 @@ import { atomWithQuery } from "jotai-tanstack-query"; -import { getBearerToken } from "@/lib/auth-utils"; import { userApiService } from "@/lib/apis/user-api.service"; +import { getBearerToken } from "@/lib/auth-utils"; export const USER_QUERY_KEY = ["user", "me"] as const; const userQueryFn = () => userApiService.getMe(); diff --git a/surfsense_web/components/TokenHandler.tsx b/surfsense_web/components/TokenHandler.tsx index 88dd66550b..4d160aa402 100644 --- a/surfsense_web/components/TokenHandler.tsx +++ b/surfsense_web/components/TokenHandler.tsx @@ -6,7 +6,6 @@ // To restore native OAuth login, uncomment this file and re-register // the /auth/callback route. - // "use client"; // // import { useEffect } from "react"; diff --git a/surfsense_web/components/tool-ui/generate-image.tsx b/surfsense_web/components/tool-ui/generate-image.tsx index f077dcdadf..7fab2bf402 100644 --- a/surfsense_web/components/tool-ui/generate-image.tsx +++ b/surfsense_web/components/tool-ui/generate-image.tsx @@ -135,8 +135,8 @@ export const GenerateImageToolUI = ({ }; export { - GenerateImageArgsSchema, - GenerateImageResultSchema, type GenerateImageArgs, + GenerateImageArgsSchema, type GenerateImageResult, + GenerateImageResultSchema, }; diff --git a/surfsense_web/components/tool-ui/sandbox-execute.tsx b/surfsense_web/components/tool-ui/sandbox-execute.tsx index 3d309332e6..bf6595d24a 100644 --- a/surfsense_web/components/tool-ui/sandbox-execute.tsx +++ b/surfsense_web/components/tool-ui/sandbox-execute.tsx @@ -419,4 +419,4 @@ export const SandboxExecuteToolUI = ({ return ; }; -export { ExecuteArgsSchema, ExecuteResultSchema, type ExecuteArgs, type ExecuteResult }; +export { type ExecuteArgs, ExecuteArgsSchema, type ExecuteResult, ExecuteResultSchema }; diff --git a/surfsense_web/components/tool-ui/user-memory.tsx b/surfsense_web/components/tool-ui/user-memory.tsx index f7c446806e..0c8a0030db 100644 --- a/surfsense_web/components/tool-ui/user-memory.tsx +++ b/surfsense_web/components/tool-ui/user-memory.tsx @@ -90,8 +90,8 @@ export const UpdateMemoryToolUI = ({ // ============================================================================ export { - UpdateMemoryArgsSchema, - UpdateMemoryResultSchema, type UpdateMemoryArgs, + UpdateMemoryArgsSchema, type UpdateMemoryResult, + UpdateMemoryResultSchema, }; diff --git a/surfsense_web/components/tool-ui/write-todos.tsx b/surfsense_web/components/tool-ui/write-todos.tsx index 104cbcf44c..53c9083d8e 100644 --- a/surfsense_web/components/tool-ui/write-todos.tsx +++ b/surfsense_web/components/tool-ui/write-todos.tsx @@ -157,4 +157,4 @@ export const WriteTodosToolUI = ({ ); }; -export { WriteTodosSchema, type WriteTodosData }; +export { type WriteTodosData, WriteTodosSchema }; diff --git a/surfsense_web/components/ui/accordion.tsx b/surfsense_web/components/ui/accordion.tsx index 51ac3e849d..e4c64ef835 100644 --- a/surfsense_web/components/ui/accordion.tsx +++ b/surfsense_web/components/ui/accordion.tsx @@ -61,4 +61,4 @@ function AccordionContent({ ); } -export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; +export { Accordion, AccordionContent, AccordionItem, AccordionTrigger }; diff --git a/surfsense_web/components/ui/alert-dialog.tsx b/surfsense_web/components/ui/alert-dialog.tsx index 4db90020f5..f3ffc88efb 100644 --- a/surfsense_web/components/ui/alert-dialog.tsx +++ b/surfsense_web/components/ui/alert-dialog.tsx @@ -121,14 +121,14 @@ function AlertDialogCancel({ export { AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, + AlertDialogAction, + AlertDialogCancel, AlertDialogContent, - AlertDialogHeader, + AlertDialogDescription, AlertDialogFooter, + AlertDialogHeader, + AlertDialogOverlay, + AlertDialogPortal, AlertDialogTitle, - AlertDialogDescription, - AlertDialogAction, - AlertDialogCancel, + AlertDialogTrigger, }; diff --git a/surfsense_web/components/ui/alert.tsx b/surfsense_web/components/ui/alert.tsx index 2d777db67b..39123888e2 100644 --- a/surfsense_web/components/ui/alert.tsx +++ b/surfsense_web/components/ui/alert.tsx @@ -59,4 +59,4 @@ function AlertDescription({ className, ...props }: React.ComponentProps<"div">) ); } -export { Alert, AlertTitle, AlertDescription }; +export { Alert, AlertDescription, AlertTitle }; diff --git a/surfsense_web/components/ui/animated-tabs.tsx b/surfsense_web/components/ui/animated-tabs.tsx index 7bc12821f1..333c6d8ce8 100644 --- a/surfsense_web/components/ui/animated-tabs.tsx +++ b/surfsense_web/components/ui/animated-tabs.tsx @@ -556,4 +556,4 @@ const TabsContent = forwardRef< }); TabsContent.displayName = "TabsContent"; -export { Tabs, TabsList, TabsTrigger, TabsContent }; +export { Tabs, TabsContent, TabsList, TabsTrigger }; diff --git a/surfsense_web/components/ui/avatar.tsx b/surfsense_web/components/ui/avatar.tsx index 984a66e8ca..e0314c53d2 100644 --- a/surfsense_web/components/ui/avatar.tsx +++ b/surfsense_web/components/ui/avatar.tsx @@ -55,4 +55,4 @@ function AvatarGroupCount({ className, ...props }: React.ComponentProps<"span">) ); } -export { Avatar, AvatarImage, AvatarFallback, AvatarGroup, AvatarGroupCount }; +export { Avatar, AvatarFallback, AvatarGroup, AvatarGroupCount, AvatarImage }; diff --git a/surfsense_web/components/ui/card.tsx b/surfsense_web/components/ui/card.tsx index babb851b07..408aa5552b 100644 --- a/surfsense_web/components/ui/card.tsx +++ b/surfsense_web/components/ui/card.tsx @@ -52,4 +52,4 @@ const CardFooter = React.forwardRef; } -export { Collapsible, CollapsibleTrigger, CollapsibleContent }; +export { Collapsible, CollapsibleContent, CollapsibleTrigger }; diff --git a/surfsense_web/components/ui/command.tsx b/surfsense_web/components/ui/command.tsx index 034dbab5eb..9cf82113bb 100644 --- a/surfsense_web/components/ui/command.tsx +++ b/surfsense_web/components/ui/command.tsx @@ -150,11 +150,11 @@ function CommandShortcut({ className, ...props }: React.ComponentProps<"span">) export { Command, CommandDialog, - CommandInput, - CommandList, CommandEmpty, CommandGroup, + CommandInput, CommandItem, - CommandShortcut, + CommandList, CommandSeparator, + CommandShortcut, }; diff --git a/surfsense_web/components/ui/context-menu.tsx b/surfsense_web/components/ui/context-menu.tsx index 8fa7c6d1a3..f24e547f57 100644 --- a/surfsense_web/components/ui/context-menu.tsx +++ b/surfsense_web/components/ui/context-menu.tsx @@ -207,18 +207,18 @@ function ContextMenuShortcut({ className, ...props }: React.ComponentProps<"span export { ContextMenu, - ContextMenuTrigger, + ContextMenuCheckboxItem, ContextMenuContent, + ContextMenuGroup, ContextMenuItem, - ContextMenuCheckboxItem, - ContextMenuRadioItem, ContextMenuLabel, + ContextMenuPortal, + ContextMenuRadioGroup, + ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, - ContextMenuGroup, - ContextMenuPortal, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, - ContextMenuRadioGroup, + ContextMenuTrigger, }; diff --git a/surfsense_web/components/ui/dialog.tsx b/surfsense_web/components/ui/dialog.tsx index 90c8bf5383..a897379c3e 100644 --- a/surfsense_web/components/ui/dialog.tsx +++ b/surfsense_web/components/ui/dialog.tsx @@ -92,13 +92,13 @@ DialogDescription.displayName = DialogPrimitive.Description.displayName; export { Dialog, - DialogPortal, - DialogOverlay, DialogClose, - DialogTrigger, DialogContent, - DialogHeader, + DialogDescription, DialogFooter, + DialogHeader, + DialogOverlay, + DialogPortal, DialogTitle, - DialogDescription, + DialogTrigger, }; diff --git a/surfsense_web/components/ui/drawer.tsx b/surfsense_web/components/ui/drawer.tsx index d02996d960..cbb5a471b9 100644 --- a/surfsense_web/components/ui/drawer.tsx +++ b/surfsense_web/components/ui/drawer.tsx @@ -102,14 +102,14 @@ DrawerHandle.displayName = "DrawerHandle"; export { Drawer, - DrawerPortal, - DrawerOverlay, - DrawerTrigger, DrawerClose, DrawerContent, - DrawerHeader, - DrawerFooter, - DrawerTitle, DrawerDescription, + DrawerFooter, DrawerHandle, + DrawerHeader, + DrawerOverlay, + DrawerPortal, + DrawerTitle, + DrawerTrigger, }; diff --git a/surfsense_web/components/ui/dropdown-menu.tsx b/surfsense_web/components/ui/dropdown-menu.tsx index 421bcfcd29..666cda0fc8 100644 --- a/surfsense_web/components/ui/dropdown-menu.tsx +++ b/surfsense_web/components/ui/dropdown-menu.tsx @@ -211,18 +211,18 @@ function DropdownMenuSubContent({ export { DropdownMenu, - DropdownMenuPortal, - DropdownMenuTrigger, + DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, - DropdownMenuLabel, DropdownMenuItem, - DropdownMenuCheckboxItem, + DropdownMenuLabel, + DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, - DropdownMenuSubTrigger, DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, }; diff --git a/surfsense_web/components/ui/expanded-gif-overlay.tsx b/surfsense_web/components/ui/expanded-gif-overlay.tsx index 532ba1d32f..33b40facf7 100644 --- a/surfsense_web/components/ui/expanded-gif-overlay.tsx +++ b/surfsense_web/components/ui/expanded-gif-overlay.tsx @@ -91,4 +91,4 @@ const ExpandedGifOverlay = ExpandedMediaOverlay; /** @deprecated Use useExpandedMedia instead */ const useExpandedGif = useExpandedMedia; -export { ExpandedMediaOverlay, useExpandedMedia, ExpandedGifOverlay, useExpandedGif }; +export { ExpandedGifOverlay, ExpandedMediaOverlay, useExpandedGif, useExpandedMedia }; diff --git a/surfsense_web/components/ui/form.tsx b/surfsense_web/components/ui/form.tsx index 55f0034456..2093a523cc 100644 --- a/surfsense_web/components/ui/form.tsx +++ b/surfsense_web/components/ui/form.tsx @@ -140,12 +140,12 @@ function FormMessage({ className, ...props }: React.ComponentProps<"p">) { } export { - useFormField, Form, - FormItem, - FormLabel, FormControl, FormDescription, - FormMessage, FormField, + FormItem, + FormLabel, + FormMessage, + useFormField, }; diff --git a/surfsense_web/components/ui/pagination.tsx b/surfsense_web/components/ui/pagination.tsx index d8cb16cc1a..613992d370 100644 --- a/surfsense_web/components/ui/pagination.tsx +++ b/surfsense_web/components/ui/pagination.tsx @@ -96,9 +96,9 @@ function PaginationEllipsis({ className, ...props }: React.ComponentProps<"span" export { Pagination, PaginationContent, - PaginationLink, + PaginationEllipsis, PaginationItem, - PaginationPrevious, + PaginationLink, PaginationNext, - PaginationEllipsis, + PaginationPrevious, }; diff --git a/surfsense_web/components/ui/popover.tsx b/surfsense_web/components/ui/popover.tsx index 0d2759543a..b3b92542d0 100644 --- a/surfsense_web/components/ui/popover.tsx +++ b/surfsense_web/components/ui/popover.tsx @@ -39,4 +39,4 @@ function PopoverAnchor({ ...props }: React.ComponentProps; } -export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }; +export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }; diff --git a/surfsense_web/components/ui/sheet.tsx b/surfsense_web/components/ui/sheet.tsx index 6ba22350e4..58eb549652 100644 --- a/surfsense_web/components/ui/sheet.tsx +++ b/surfsense_web/components/ui/sheet.tsx @@ -122,11 +122,11 @@ function SheetDescription({ export { Sheet, - SheetTrigger, SheetClose, SheetContent, - SheetHeader, + SheetDescription, SheetFooter, + SheetHeader, SheetTitle, - SheetDescription, + SheetTrigger, }; diff --git a/surfsense_web/components/ui/table.tsx b/surfsense_web/components/ui/table.tsx index f88d2f5922..fa170ec86b 100644 --- a/surfsense_web/components/ui/table.tsx +++ b/surfsense_web/components/ui/table.tsx @@ -89,4 +89,4 @@ function TableCaption({ className, ...props }: React.ComponentProps<"caption">) ); } -export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }; +export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow }; diff --git a/surfsense_web/components/ui/tabs.tsx b/surfsense_web/components/ui/tabs.tsx index 5dbfc4bc5b..29c95eaf74 100644 --- a/surfsense_web/components/ui/tabs.tsx +++ b/surfsense_web/components/ui/tabs.tsx @@ -52,4 +52,4 @@ const TabsContent = React.forwardRef< )); TabsContent.displayName = TabsPrimitive.Content.displayName; -export { Tabs, TabsList, TabsTrigger, TabsContent }; +export { Tabs, TabsContent, TabsList, TabsTrigger }; diff --git a/surfsense_web/components/ui/tooltip.tsx b/surfsense_web/components/ui/tooltip.tsx index 4253c50d48..b21d5f005c 100644 --- a/surfsense_web/components/ui/tooltip.tsx +++ b/surfsense_web/components/ui/tooltip.tsx @@ -82,4 +82,4 @@ function TooltipContent({ ); } -export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }; +export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }; diff --git a/surfsense_web/lib/apis/connectors-api.service.ts b/surfsense_web/lib/apis/connectors-api.service.ts index 4b6d69883e..7067ee0254 100644 --- a/surfsense_web/lib/apis/connectors-api.service.ts +++ b/surfsense_web/lib/apis/connectors-api.service.ts @@ -426,6 +426,6 @@ export interface ObsidianStats { last_sync_at: string | null; } -export type { SlackChannel, DiscordChannel }; +export type { DiscordChannel, SlackChannel }; export const connectorsApiService = new ConnectorsApiService(); diff --git a/surfsense_web/svgr.d.ts b/surfsense_web/svgr.d.ts index ada7f47c59..2486ffa482 100644 --- a/surfsense_web/svgr.d.ts +++ b/surfsense_web/svgr.d.ts @@ -1,5 +1,6 @@ declare module "*.svg" { import type { FC, SVGProps } from "react"; + const content: FC>; export default content; } From 939e7a0879f09e87d0f2585a399aaff4c5078a4a Mon Sep 17 00:00:00 2001 From: Ahtisahm Shahid Date: Wed, 3 Jun 2026 16:09:11 +0500 Subject: [PATCH 3/3] fix(ci): install libreadline-dev before pnpm install in TS quality job @rocicorp/zero-sqlite3 requires readline/readline.h to compile its native extension. The GitHub Actions Ubuntu runner doesn't include libreadline-dev by default, causing pnpm install to fail with a gyp build error before biome can even run. --- .github/workflows/code-quality.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index b5d80b9a07..a9314ae4e3 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -238,6 +238,10 @@ jobs: extension: - 'surfsense_browser_extension/**' + - name: Install native build dependencies + if: steps.frontend-changes.outputs.web == 'true' + run: sudo apt-get install -y libreadline-dev + - name: Install dependencies for web if: steps.frontend-changes.outputs.web == 'true' working-directory: surfsense_web