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
diff --git a/surfsense_backend/app/app.py b/surfsense_backend/app/app.py
index 5130aa47e5..8a8c8ee8d9 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,
@@ -819,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
@@ -842,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;
}