diff --git a/apps/desktop/components.json b/apps/desktop/components.json
index 2c03417c4..d2f03505b 100644
--- a/apps/desktop/components.json
+++ b/apps/desktop/components.json
@@ -14,7 +14,7 @@
"rtl": false,
"aliases": {
"components": "@/components",
- "utils": "@/lib/utils",
+ "utils": "@/lib/common/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"composables": "@/composables"
diff --git a/apps/desktop/src/App.vue b/apps/desktop/src/App.vue
index 4befc2418..5f3e60272 100644
--- a/apps/desktop/src/App.vue
+++ b/apps/desktop/src/App.vue
@@ -33,20 +33,20 @@ import { useVisibilityChange } from "@/composables/useVisibilityChange";
import { useWebDavAutoUpload } from "@/composables/useWebDavAutoUpload";
import "@/i18n";
import { translateBackendError } from "@/i18n/backend-errors";
-import * as api from "@/lib/api";
-import { connectionRedactedNameLabel } from "@/lib/connectionPresentation";
-import { quickConnectionOpenTarget } from "@/lib/connectionOpenTarget";
-import { resolveDefaultDatabase } from "@/lib/defaultDatabase";
-import { findTreeNodeById, resolveNewQueryTarget } from "@/lib/newQueryContext";
-import { buildExecutableObjectSourceStatements, objectSourceSaveExecutionMode } from "@/lib/objectSourceEditor";
-import { resolveExecutableSql, resolveExecutableSqlWithBackend, type SqlExecutionSnapshot } from "@/lib/sqlExecutionTarget";
-import { uuid } from "@/lib/utils";
-import { isMacOS } from "@/lib/platform";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
-import { openQueryResultArchiveFile } from "@/lib/queryResultArchiveFile";
-import { sqlFileTitleFromPath } from "@/lib/sqlFileOpen";
+import * as api from "@/lib/backend/api";
+import { connectionRedactedNameLabel } from "@/lib/connection/connectionPresentation";
+import { quickConnectionOpenTarget } from "@/lib/connection/connectionOpenTarget";
+import { resolveDefaultDatabase } from "@/lib/database/defaultDatabase";
+import { findTreeNodeById, resolveNewQueryTarget } from "@/lib/sql/newQueryContext";
+import { buildExecutableObjectSourceStatements, objectSourceSaveExecutionMode } from "@/lib/table/objectSourceEditor";
+import { resolveExecutableSql, resolveExecutableSqlWithBackend, type SqlExecutionSnapshot } from "@/lib/sql/sqlExecutionTarget";
+import { uuid } from "@/lib/common/utils";
+import { isMacOS } from "@/lib/backend/platform";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
+import { openQueryResultArchiveFile } from "@/lib/query/queryResultArchiveFile";
+import { sqlFileTitleFromPath } from "@/lib/sql/sqlFileOpen";
import type { ConnectionConfig, ObjectSourceKind, QueryTab } from "@/types/database";
-import { parseConnectionDeepLink, type ConnectionDeepLinkDraft } from "@/lib/connectionDeepLink";
+import { parseConnectionDeepLink, type ConnectionDeepLinkDraft } from "@/lib/connection/connectionDeepLink";
import {
isBrowserReloadShortcut,
isCloseTabShortcut,
@@ -66,25 +66,25 @@ import {
isZoomInShortcut,
isZoomOutShortcut,
switchToTabIndexFromShortcut,
-} from "@/lib/keyboardShortcuts";
-import { isPreviewTab } from "@/lib/tabPresentation";
-import { supportsSqlFileExecution } from "@/lib/databaseCapabilities";
-import { classifyAiSqlExecution } from "@/lib/aiSqlExecutionPolicy";
-import { buildHistoryAiAnalysisPrompt } from "@/lib/historyAiAnalysis";
-import { countAvailableAgentDriverUpdates, type AgentDriverUpdateBadgeState } from "@/lib/agentDriverUpdateBadge";
-import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage";
-import { apiUrl, webPath } from "@/lib/webPath";
-import { APP_FONT_SANS_CSS_VAR, DEFAULT_UI_FONT_FAMILY } from "@/lib/appFonts";
-import { rankSavedSqlHistory } from "@/lib/savedSqlHistory";
-import { isSchemaAware, isSingleDatabase, usesTreeSchemaMode } from "@/lib/databaseFeatureSupport";
-import { codeMirrorSqlDialect, connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect";
-import { detectDatabaseFileType } from "@/lib/databaseFileDetection";
+} from "@/lib/editor/keyboardShortcuts";
+import { isPreviewTab } from "@/lib/tabs/tabPresentation";
+import { supportsSqlFileExecution } from "@/lib/database/databaseCapabilities";
+import { classifyAiSqlExecution } from "@/lib/ai/aiSqlExecutionPolicy";
+import { buildHistoryAiAnalysisPrompt } from "@/lib/history/historyAiAnalysis";
+import { countAvailableAgentDriverUpdates, type AgentDriverUpdateBadgeState } from "@/lib/connection/agentDriverUpdateBadge";
+import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/backend/safeStorage";
+import { apiUrl, webPath } from "@/lib/common/webPath";
+import { APP_FONT_SANS_CSS_VAR, DEFAULT_UI_FONT_FAMILY } from "@/lib/app/appFonts";
+import { rankSavedSqlHistory } from "@/lib/savedSql/savedSqlHistory";
+import { isSchemaAware, isSingleDatabase, usesTreeSchemaMode } from "@/lib/database/databaseFeatureSupport";
+import { codeMirrorSqlDialect, connectionUsesDatabaseObjectTreeMode, effectiveDatabaseTypeForConnection } from "@/lib/database/jdbcDialect";
+import { detectDatabaseFileType } from "@/lib/database/databaseFileDetection";
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
-import type { HistoryEntry } from "@/lib/tauri";
-import type { AiAction } from "@/lib/ai";
+import type { HistoryEntry } from "@/lib/backend/tauri";
+import type { AiAction } from "@/lib/ai/ai";
const AiAssistant = defineAsyncComponent(() => import("@/components/editor/AiAssistant.vue"));
const QueryHistory = defineAsyncComponent(() => import("@/components/editor/QueryHistory.vue"));
diff --git a/apps/desktop/src/components/admin/DatabaseUserAdmin.vue b/apps/desktop/src/components/admin/DatabaseUserAdmin.vue
index ceb223898..ee0ebddf4 100644
--- a/apps/desktop/src/components/admin/DatabaseUserAdmin.vue
+++ b/apps/desktop/src/components/admin/DatabaseUserAdmin.vue
@@ -12,8 +12,8 @@ import { useConnectionStore } from "@/stores/connectionStore";
import { useToast } from "@/composables/useToast";
import { useSqlHighlighter } from "@/composables/useSqlHighlighter";
import type { ConnectionConfig } from "@/types/database";
-import * as api from "@/lib/api";
-import { grantsFromQueryResult, getDatabaseUserAdminProvider, supportsDatabaseUserAdmin, type DatabaseUserIdentity, type PrivilegeScope } from "@/lib/databaseUserAdmin";
+import * as api from "@/lib/backend/api";
+import { grantsFromQueryResult, getDatabaseUserAdminProvider, supportsDatabaseUserAdmin, type DatabaseUserIdentity, type PrivilegeScope } from "@/lib/database/databaseUserAdmin";
const props = defineProps<{
connection: ConnectionConfig;
diff --git a/apps/desktop/src/components/auth/LoginPage.vue b/apps/desktop/src/components/auth/LoginPage.vue
index 54e2850af..a081d71c0 100644
--- a/apps/desktop/src/components/auth/LoginPage.vue
+++ b/apps/desktop/src/components/auth/LoginPage.vue
@@ -5,7 +5,7 @@ import { Button } from "@/components/ui/button";
import PasswordInput from "@/components/ui/PasswordInput.vue";
import { Lock, Loader2, ShieldCheck } from "@lucide/vue";
import AppLogo from "@/components/icons/AppLogo.vue";
-import { apiUrl } from "@/lib/webPath";
+import { apiUrl } from "@/lib/common/webPath";
const props = withDefaults(
defineProps<{
diff --git a/apps/desktop/src/components/chart/QueryChart.vue b/apps/desktop/src/components/chart/QueryChart.vue
index c10d4c942..a31f9503d 100644
--- a/apps/desktop/src/components/chart/QueryChart.vue
+++ b/apps/desktop/src/components/chart/QueryChart.vue
@@ -12,7 +12,7 @@ import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMe
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import type { QueryResult } from "@/types/database";
import { useTheme } from "@/composables/useTheme";
-import { axisColumnLabel, chartableColumnIndexes, toChartNumber } from "@/lib/chartData";
+import { axisColumnLabel, chartableColumnIndexes, toChartNumber } from "@/lib/dataGrid/chartData";
use([CanvasRenderer, LineChart, BarChart, PieChart, GridComponent, TooltipComponent, LegendComponent]);
diff --git a/apps/desktop/src/components/config/DriverStoreDialog.vue b/apps/desktop/src/components/config/DriverStoreDialog.vue
index d529fc1ca..8fd7b573b 100644
--- a/apps/desktop/src/components/config/DriverStoreDialog.vue
+++ b/apps/desktop/src/components/config/DriverStoreDialog.vue
@@ -12,14 +12,14 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import DriverInstallProgressCircle from "@/components/config/DriverInstallProgressCircle.vue";
import DatabaseIcon from "@/components/icons/DatabaseIcon.vue";
import { useToast } from "@/composables/useToast";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
-import { countAvailableDriverUpdates } from "@/lib/agentDriverUpdateBadge";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
+import { countAvailableDriverUpdates } from "@/lib/connection/agentDriverUpdateBadge";
import type { JdbcDriverInfo, JdbcMavenBundleInfo, JdbcPluginStatus } from "@/types/database";
-import * as api from "@/lib/api";
-import type { AgentDriverInfo, DriverRuntimeInfo, DriverRuntimeSummary, DriverStoreUsage, JavaRuntimeConfig } from "@/lib/api";
-import { formatRuntimeBytes, formatRuntimeCpu, formatRuntimeUptime, runtimeHealthClass, runtimeStatusClass, runtimeStatusDotClass } from "@/lib/driverRuntimePresentation";
-import { addDriverInstallQueue, driverInstallProgressPercent, isDriverInstallProgressTarget, removeDriverInstallQueue, takeNextDriverInstallQueue, type DriverInstallProgress } from "@/lib/driverInstallProgressUi";
-import { PRESTOSQL_DRIVER_DB_TYPE, prestoSqlBuiltinDriverRow, prestoSqlMavenBundle } from "@/lib/prestoSqlBuiltinDriver";
+import * as api from "@/lib/backend/api";
+import type { AgentDriverInfo, DriverRuntimeInfo, DriverRuntimeSummary, DriverStoreUsage, JavaRuntimeConfig } from "@/lib/backend/api";
+import { formatRuntimeBytes, formatRuntimeCpu, formatRuntimeUptime, runtimeHealthClass, runtimeStatusClass, runtimeStatusDotClass } from "@/lib/connection/driverRuntimePresentation";
+import { addDriverInstallQueue, driverInstallProgressPercent, isDriverInstallProgressTarget, removeDriverInstallQueue, takeNextDriverInstallQueue, type DriverInstallProgress } from "@/lib/connection/driverInstallProgressUi";
+import { PRESTOSQL_DRIVER_DB_TYPE, prestoSqlBuiltinDriverRow, prestoSqlMavenBundle } from "@/lib/database/prestoSqlBuiltinDriver";
const { t } = useI18n();
const { toast } = useToast();
@@ -43,7 +43,7 @@ const driverStoreTab = ref("agent");
// ──────────── Driver store path ────────────
import { useSettingsStore } from "@/stores/settingsStore";
-import type { DriverStorePathInfo } from "@/lib/api";
+import type { DriverStorePathInfo } from "@/lib/backend/api";
const settingsStore = useSettingsStore();
type DriverStoreDirKind = "plugin" | "agent";
diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue
index 8b4f415b6..1c5fa6678 100644
--- a/apps/desktop/src/components/connection/ConnectionDialog.vue
+++ b/apps/desktop/src/components/connection/ConnectionDialog.vue
@@ -1,6 +1,6 @@
diff --git a/apps/desktop/src/components/ui/select/SelectScrollDownButton.vue b/apps/desktop/src/components/ui/select/SelectScrollDownButton.vue
index e0a140535..90073960c 100644
--- a/apps/desktop/src/components/ui/select/SelectScrollDownButton.vue
+++ b/apps/desktop/src/components/ui/select/SelectScrollDownButton.vue
@@ -5,7 +5,7 @@ import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { ChevronDownIcon } from "@lucide/vue";
import { SelectScrollDownButton, useForwardProps } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/select/SelectScrollUpButton.vue b/apps/desktop/src/components/ui/select/SelectScrollUpButton.vue
index 9ef499b72..924813ced 100644
--- a/apps/desktop/src/components/ui/select/SelectScrollUpButton.vue
+++ b/apps/desktop/src/components/ui/select/SelectScrollUpButton.vue
@@ -5,7 +5,7 @@ import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { ChevronUpIcon } from "@lucide/vue";
import { SelectScrollUpButton, useForwardProps } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/select/SelectSeparator.vue b/apps/desktop/src/components/ui/select/SelectSeparator.vue
index 314812266..bb9f086ed 100644
--- a/apps/desktop/src/components/ui/select/SelectSeparator.vue
+++ b/apps/desktop/src/components/ui/select/SelectSeparator.vue
@@ -3,7 +3,7 @@ import type { SelectSeparatorProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { SelectSeparator } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/select/SelectTrigger.vue b/apps/desktop/src/components/ui/select/SelectTrigger.vue
index 4324f8bd1..5922ad6ef 100644
--- a/apps/desktop/src/components/ui/select/SelectTrigger.vue
+++ b/apps/desktop/src/components/ui/select/SelectTrigger.vue
@@ -5,7 +5,7 @@ import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { ChevronDownIcon } from "@lucide/vue";
import { SelectIcon, SelectTrigger, useForwardProps } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = withDefaults(defineProps(), { size: "default" });
diff --git a/apps/desktop/src/components/ui/separator/Separator.vue b/apps/desktop/src/components/ui/separator/Separator.vue
index 1c61a3161..63ebc04d6 100644
--- a/apps/desktop/src/components/ui/separator/Separator.vue
+++ b/apps/desktop/src/components/ui/separator/Separator.vue
@@ -3,7 +3,7 @@ import type { SeparatorProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { Separator } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = withDefaults(defineProps(), {
orientation: "horizontal",
diff --git a/apps/desktop/src/components/ui/sheet/SheetContent.vue b/apps/desktop/src/components/ui/sheet/SheetContent.vue
index bbfe1777b..2488dbeea 100644
--- a/apps/desktop/src/components/ui/sheet/SheetContent.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetContent.vue
@@ -5,7 +5,7 @@ import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { XIcon } from "@lucide/vue";
import { DialogClose, DialogContent, DialogPortal, useForwardPropsEmits } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
import { Button } from "@/components/ui/button";
import SheetOverlay from "./SheetOverlay.vue";
diff --git a/apps/desktop/src/components/ui/sheet/SheetDescription.vue b/apps/desktop/src/components/ui/sheet/SheetDescription.vue
index f19883a34..dc96cc1ea 100644
--- a/apps/desktop/src/components/ui/sheet/SheetDescription.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetDescription.vue
@@ -3,7 +3,7 @@ import type { DialogDescriptionProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { DialogDescription } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/sheet/SheetFooter.vue b/apps/desktop/src/components/ui/sheet/SheetFooter.vue
index 7ac7948ab..1467f3c3c 100644
--- a/apps/desktop/src/components/ui/sheet/SheetFooter.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetFooter.vue
@@ -1,6 +1,6 @@
diff --git a/apps/desktop/src/components/ui/sheet/SheetHeader.vue b/apps/desktop/src/components/ui/sheet/SheetHeader.vue
index bad371dd5..fd7868a94 100644
--- a/apps/desktop/src/components/ui/sheet/SheetHeader.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetHeader.vue
@@ -1,6 +1,6 @@
diff --git a/apps/desktop/src/components/ui/sheet/SheetOverlay.vue b/apps/desktop/src/components/ui/sheet/SheetOverlay.vue
index 01b044b2c..272f8baa7 100644
--- a/apps/desktop/src/components/ui/sheet/SheetOverlay.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetOverlay.vue
@@ -3,7 +3,7 @@ import type { DialogOverlayProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { DialogOverlay } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/sheet/SheetTitle.vue b/apps/desktop/src/components/ui/sheet/SheetTitle.vue
index 37e4d6a47..95863287b 100644
--- a/apps/desktop/src/components/ui/sheet/SheetTitle.vue
+++ b/apps/desktop/src/components/ui/sheet/SheetTitle.vue
@@ -3,7 +3,7 @@ import type { DialogTitleProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { DialogTitle } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/switch/Switch.vue b/apps/desktop/src/components/ui/switch/Switch.vue
index 7f7760dd9..050a4b9d6 100644
--- a/apps/desktop/src/components/ui/switch/Switch.vue
+++ b/apps/desktop/src/components/ui/switch/Switch.vue
@@ -3,7 +3,7 @@ import type { SwitchRootEmits, SwitchRootProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { SwitchRoot, SwitchThumb, useForwardPropsEmits } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = withDefaults(
defineProps<
diff --git a/apps/desktop/src/components/ui/tabs/Tabs.vue b/apps/desktop/src/components/ui/tabs/Tabs.vue
index 3814fc23f..85dbe7782 100644
--- a/apps/desktop/src/components/ui/tabs/Tabs.vue
+++ b/apps/desktop/src/components/ui/tabs/Tabs.vue
@@ -3,7 +3,7 @@ import type { TabsRootEmits, TabsRootProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { TabsRoot, useForwardPropsEmits } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
const emits = defineEmits();
diff --git a/apps/desktop/src/components/ui/tabs/TabsContent.vue b/apps/desktop/src/components/ui/tabs/TabsContent.vue
index 5b9e6b2cc..40910591c 100644
--- a/apps/desktop/src/components/ui/tabs/TabsContent.vue
+++ b/apps/desktop/src/components/ui/tabs/TabsContent.vue
@@ -3,7 +3,7 @@ import type { TabsContentProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { TabsContent } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/tabs/TabsList.vue b/apps/desktop/src/components/ui/tabs/TabsList.vue
index ceac23d35..0c122f7ca 100644
--- a/apps/desktop/src/components/ui/tabs/TabsList.vue
+++ b/apps/desktop/src/components/ui/tabs/TabsList.vue
@@ -4,7 +4,7 @@ import type { HTMLAttributes } from "vue";
import type { TabsListVariants } from ".";
import { reactiveOmit } from "@vueuse/core";
import { TabsList } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
import { tabsListVariants } from ".";
const props = withDefaults(
diff --git a/apps/desktop/src/components/ui/tabs/TabsTrigger.vue b/apps/desktop/src/components/ui/tabs/TabsTrigger.vue
index 3fc64444b..20d1f8a4a 100644
--- a/apps/desktop/src/components/ui/tabs/TabsTrigger.vue
+++ b/apps/desktop/src/components/ui/tabs/TabsTrigger.vue
@@ -3,7 +3,7 @@ import type { TabsTriggerProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { TabsTrigger, useForwardProps } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
const props = defineProps();
diff --git a/apps/desktop/src/components/ui/tooltip/TooltipContent.vue b/apps/desktop/src/components/ui/tooltip/TooltipContent.vue
index 167da296d..74725676f 100644
--- a/apps/desktop/src/components/ui/tooltip/TooltipContent.vue
+++ b/apps/desktop/src/components/ui/tooltip/TooltipContent.vue
@@ -3,7 +3,7 @@ import type { TooltipContentEmits, TooltipContentProps } from "reka-ui";
import type { HTMLAttributes } from "vue";
import { reactiveOmit } from "@vueuse/core";
import { TooltipArrow, TooltipContent, TooltipPortal, useForwardPropsEmits } from "reka-ui";
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/common/utils";
defineOptions({
inheritAttrs: false,
diff --git a/apps/desktop/src/components/vector/VectorBrowser.vue b/apps/desktop/src/components/vector/VectorBrowser.vue
index 5da498d91..c4c897ba1 100644
--- a/apps/desktop/src/components/vector/VectorBrowser.vue
+++ b/apps/desktop/src/components/vector/VectorBrowser.vue
@@ -5,8 +5,8 @@ import { useI18n } from "vue-i18n";
import { Button } from "@/components/ui/button";
import ErrorBanner from "@/components/ui/ErrorBanner.vue";
import QueryLoadingState from "@/components/common/QueryLoadingState.vue";
-import * as api from "@/lib/api";
-import { uuid } from "@/lib/utils";
+import * as api from "@/lib/backend/api";
+import { uuid } from "@/lib/common/utils";
import type { DatabaseType, QueryResult } from "@/types/database";
const DataGrid = defineAsyncComponent(() => import("@/components/grid/DataGrid.vue"));
diff --git a/apps/desktop/src/components/zookeeper/ZooKeeperKeyBrowser.vue b/apps/desktop/src/components/zookeeper/ZooKeeperKeyBrowser.vue
index a3a9d6468..0707b233b 100644
--- a/apps/desktop/src/components/zookeeper/ZooKeeperKeyBrowser.vue
+++ b/apps/desktop/src/components/zookeeper/ZooKeeperKeyBrowser.vue
@@ -2,8 +2,8 @@
import { computed, ref } from "vue";
import { useI18n } from "vue-i18n";
import KvKeyBrowser from "@/components/kv/KvKeyBrowser.vue";
-import * as api from "@/lib/api";
-import type { KvCreateMode } from "@/lib/api";
+import * as api from "@/lib/backend/api";
+import type { KvCreateMode } from "@/lib/backend/api";
const props = defineProps<{ connectionId: string }>();
diff --git a/apps/desktop/src/composables/useAppUpdater.ts b/apps/desktop/src/composables/useAppUpdater.ts
index 941d39c77..1e3a89193 100644
--- a/apps/desktop/src/composables/useAppUpdater.ts
+++ b/apps/desktop/src/composables/useAppUpdater.ts
@@ -1,11 +1,11 @@
import { computed, ref } from "vue";
import { useI18n } from "vue-i18n";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
import { useToast } from "@/composables/useToast";
-import * as api from "@/lib/api";
+import * as api from "@/lib/backend/api";
import { useSettingsStore } from "@/stores/settingsStore";
import type { UpdateDownloadSource as SettingsUpdateDownloadSource } from "@/stores/settingsStore";
-import type { UpdateDownloadProgress } from "@/lib/tauri";
+import type { UpdateDownloadProgress } from "@/lib/backend/tauri";
export function shouldOpenUpdateDialog(options: { silent?: boolean }) {
return options.silent !== true;
diff --git a/apps/desktop/src/composables/useCellDetailEditor.ts b/apps/desktop/src/composables/useCellDetailEditor.ts
index e3eb749b7..36357754e 100644
--- a/apps/desktop/src/composables/useCellDetailEditor.ts
+++ b/apps/desktop/src/composables/useCellDetailEditor.ts
@@ -5,16 +5,16 @@ import { json } from "@codemirror/lang-json";
import { search as cmSearch } from "@codemirror/search";
import { defaultKeymap, history, historyKeymap } from "@codemirror/commands";
import { bracketMatching } from "@codemirror/language";
-import { trimmedSelectionLayer } from "@/lib/codemirrorTrimmedSelectionLayer";
-import { EDITOR_FONT_FAMILY_CSS_VAR, EDITOR_FONT_SIZE_CSS_VAR, cellDetailActiveLineColor, loadEditorTheme, editorFontTheme } from "@/lib/editorThemes";
-import { shortcutToCodeMirrorKey } from "@/lib/shortcutRegistry";
+import { trimmedSelectionLayer } from "@/lib/editor/codemirrorTrimmedSelectionLayer";
+import { EDITOR_FONT_FAMILY_CSS_VAR, EDITOR_FONT_SIZE_CSS_VAR, cellDetailActiveLineColor, loadEditorTheme, editorFontTheme } from "@/lib/editor/editorThemes";
+import { shortcutToCodeMirrorKey } from "@/lib/editor/shortcutRegistry";
import { useSettingsStore } from "@/stores/settingsStore";
-import { CELL_DETAIL_JSON_FORMAT_MAX_LENGTH, isJsonColumnType } from "@/lib/cellDetailPresentation";
-import { clampEditorFontSize, createEditorZoomCommitScheduler, fontSizeFromGestureScale, fontSizeFromWheelDelta } from "@/lib/editorZoom";
+import { CELL_DETAIL_JSON_FORMAT_MAX_LENGTH, isJsonColumnType } from "@/lib/dataGrid/cellDetailPresentation";
+import { clampEditorFontSize, createEditorZoomCommitScheduler, fontSizeFromGestureScale, fontSizeFromWheelDelta } from "@/lib/editor/editorZoom";
import i18n from "@/i18n";
import EditorSearchPanel from "@/components/editor/EditorSearchPanel.vue";
import type { EditorTheme } from "@/stores/settingsStore";
-import type { AppThemeAppearance } from "@/lib/appTheme";
+import type { AppThemeAppearance } from "@/lib/app/appTheme";
export interface UseCellDetailEditorOptions {
onChange?: (value: string) => void;
diff --git a/apps/desktop/src/composables/useCloseActionPrompt.ts b/apps/desktop/src/composables/useCloseActionPrompt.ts
index f48389749..f128f7ce9 100644
--- a/apps/desktop/src/composables/useCloseActionPrompt.ts
+++ b/apps/desktop/src/composables/useCloseActionPrompt.ts
@@ -1,7 +1,7 @@
import { ref } from "vue";
import { useSettingsStore } from "@/stores/settingsStore";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
-import * as api from "@/lib/api";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
+import * as api from "@/lib/backend/api";
export type AppCloseAction = "quit" | "hide";
type AppCloseRequestTarget = "settings" | "quit";
diff --git a/apps/desktop/src/composables/useDataGridActions.ts b/apps/desktop/src/composables/useDataGridActions.ts
index 05b41af04..697d72850 100644
--- a/apps/desktop/src/composables/useDataGridActions.ts
+++ b/apps/desktop/src/composables/useDataGridActions.ts
@@ -3,16 +3,16 @@ import { useI18n } from "vue-i18n";
import { useConnectionStore } from "@/stores/connectionStore";
import { useQueryStore } from "@/stores/queryStore";
import { useSettingsStore } from "@/stores/settingsStore";
-import { buildTableSelectSql, quoteTableIdentifier } from "@/lib/tableSelectSql";
-import { editableRowIdentifierColumns, usesSyntheticRowIdKey } from "@/lib/tableEditing";
-import { tableMetaForDataTab } from "@/lib/tableDataTabMeta";
-import * as api from "@/lib/api";
+import { buildTableSelectSql, quoteTableIdentifier } from "@/lib/table/tableSelectSql";
+import { editableRowIdentifierColumns, usesSyntheticRowIdKey } from "@/lib/table/tableEditing";
+import { tableMetaForDataTab } from "@/lib/table/tableDataTabMeta";
+import * as api from "@/lib/backend/api";
import type { QueryTab } from "@/types/database";
import { useToast } from "@/composables/useToast";
-import { effectiveDatabaseTypeForConnection, metadataSchemaForConnection } from "@/lib/jdbcDialect";
-import { applyMongoFindSort } from "@/lib/mongoShellCommand";
-import { uuid } from "@/lib/utils";
-import type { DataGridSortMode } from "@/lib/dataGridSort";
+import { effectiveDatabaseTypeForConnection, metadataSchemaForConnection } from "@/lib/database/jdbcDialect";
+import { applyMongoFindSort } from "@/lib/mongo/mongoShellCommand";
+import { uuid } from "@/lib/common/utils";
+import type { DataGridSortMode } from "@/lib/dataGrid/dataGridSort";
const DATA_TAB_METADATA_TTL_MS = 30_000;
diff --git a/apps/desktop/src/composables/useDataGridColumnResize.ts b/apps/desktop/src/composables/useDataGridColumnResize.ts
index c6c151732..784db2ba6 100644
--- a/apps/desktop/src/composables/useDataGridColumnResize.ts
+++ b/apps/desktop/src/composables/useDataGridColumnResize.ts
@@ -1,6 +1,6 @@
import { ref, computed, watch, type ComputedRef, type Ref } from "vue";
import { useElementSize } from "@vueuse/core";
-import { calculateDataGridColumnWidth, DATA_GRID_AUTO_FIT_VALUE_TEXT_LIMIT, DATA_GRID_COL_AUTO_FIT_MAX_WIDTH, DATA_GRID_COL_MIN_WIDTH, DATA_GRID_SAMPLE_ROWS } from "@/lib/dataGridColumnWidth";
+import { calculateDataGridColumnWidth, DATA_GRID_AUTO_FIT_VALUE_TEXT_LIMIT, DATA_GRID_COL_AUTO_FIT_MAX_WIDTH, DATA_GRID_COL_MIN_WIDTH, DATA_GRID_SAMPLE_ROWS } from "@/lib/dataGrid/dataGridColumnWidth";
type CellValue = string | number | boolean | null;
diff --git a/apps/desktop/src/composables/useDataGridEditor.ts b/apps/desktop/src/composables/useDataGridEditor.ts
index edaf39df5..d85e03110 100644
--- a/apps/desktop/src/composables/useDataGridEditor.ts
+++ b/apps/desktop/src/composables/useDataGridEditor.ts
@@ -1,15 +1,15 @@
import { ref, computed, nextTick, watch, getCurrentInstance, onActivated, onBeforeUnmount, onDeactivated, onMounted, type ComputedRef, type Ref } from "vue";
-import * as api from "@/lib/api";
-import type { CellValue } from "@/lib/cellValue";
-import { coerceDataGridCellValue, dataGridCellEditorText } from "@/lib/dataGridCellCoercion";
-import { normalizeDataGridSaveError } from "@/lib/dataGridSql";
-import { rowStatusFilterAfterAddingRow, type RowStatusFilter } from "@/lib/gridRowStatus";
-import { supportsDataGridTransaction } from "@/lib/tableEditing";
+import * as api from "@/lib/backend/api";
+import type { CellValue } from "@/lib/dataGrid/cellValue";
+import { coerceDataGridCellValue, dataGridCellEditorText } from "@/lib/dataGrid/dataGridCellCoercion";
+import { normalizeDataGridSaveError } from "@/lib/dataGrid/dataGridSql";
+import { rowStatusFilterAfterAddingRow, type RowStatusFilter } from "@/lib/dataGrid/gridRowStatus";
+import { supportsDataGridTransaction } from "@/lib/table/tableEditing";
import { useConnectionStore } from "@/stores/connectionStore";
import { useHistoryStore } from "@/stores/historyStore";
import type { ColumnInfo, DatabaseType } from "@/types/database";
-import { DBX_NEO4J_ELEMENT_ID_COLUMN, DBX_ROWID_COLUMN } from "@/lib/tableEditing";
-import { effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect";
+import { DBX_NEO4J_ELEMENT_ID_COLUMN, DBX_ROWID_COLUMN } from "@/lib/table/tableEditing";
+import { effectiveDatabaseTypeForConnection } from "@/lib/database/jdbcDialect";
interface RowItem {
id: number;
diff --git a/apps/desktop/src/composables/useDataGridExport.ts b/apps/desktop/src/composables/useDataGridExport.ts
index 662284f55..a354c9fe8 100644
--- a/apps/desktop/src/composables/useDataGridExport.ts
+++ b/apps/desktop/src/composables/useDataGridExport.ts
@@ -1,20 +1,20 @@
import { computed, ref, type ComputedRef, type Ref } from "vue";
import { useI18n } from "vue-i18n";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
-import * as api from "@/lib/api";
-import { formatSelectionAsCsv, formatSelectionAsJson, formatSelectionAsSqlInList, formatSelectionAsTsv, type CellSelectionRange, type SelectionData } from "@/lib/gridSelection";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
+import * as api from "@/lib/backend/api";
+import { formatSelectionAsCsv, formatSelectionAsJson, formatSelectionAsSqlInList, formatSelectionAsTsv, type CellSelectionRange, type SelectionData } from "@/lib/dataGrid/gridSelection";
import { useToast } from "@/composables/useToast";
-import { displayCellValue, type CellValue } from "@/lib/cellValue";
-import { tryStartExclusiveActivation, type ActionActivationGuard } from "@/lib/actionActivation";
-import { copyToClipboard } from "@/lib/clipboard";
-import { buildDataGridCopyInsertStatement, buildDataGridCopyUpdateStatements, type DataGridTableMeta } from "@/lib/dataGridSql";
-import { formatSqlInsert } from "@/lib/exportFormats";
-import { uuid } from "@/lib/utils";
+import { displayCellValue, type CellValue } from "@/lib/dataGrid/cellValue";
+import { tryStartExclusiveActivation, type ActionActivationGuard } from "@/lib/connection/actionActivation";
+import { copyToClipboard } from "@/lib/common/clipboard";
+import { buildDataGridCopyInsertStatement, buildDataGridCopyUpdateStatements, type DataGridTableMeta } from "@/lib/dataGrid/dataGridSql";
+import { formatSqlInsert } from "@/lib/export/exportFormats";
+import { uuid } from "@/lib/common/utils";
import { useSettingsStore } from "@/stores/settingsStore";
-import { expandNestedJsonStringsForCopy } from "@/lib/jsonCopyValue";
-import { buildMongoCopyInsertDocument, formatMongoShellLiteral, type MongoInputValue } from "@/lib/mongoDocumentValues";
+import { expandNestedJsonStringsForCopy } from "@/lib/common/jsonCopyValue";
+import { buildMongoCopyInsertDocument, formatMongoShellLiteral, type MongoInputValue } from "@/lib/mongo/mongoDocumentValues";
import type { DatabaseType, QueryResult } from "@/types/database";
-import type { QueryResultExportRequest } from "@/lib/api";
+import type { QueryResultExportRequest } from "@/lib/backend/api";
interface RowItem {
id: number;
diff --git a/apps/desktop/src/composables/useDataGridSelection.ts b/apps/desktop/src/composables/useDataGridSelection.ts
index dc7ff8da3..7fac596dd 100644
--- a/apps/desktop/src/composables/useDataGridSelection.ts
+++ b/apps/desktop/src/composables/useDataGridSelection.ts
@@ -1,5 +1,5 @@
import { ref, computed, type ComputedRef, type Ref } from "vue";
-import { allCellsSelectionRange, extractColumnsSelection, extractSelection, isCellInSelection, normalizeSelectionRange, normalizeSelectedColumnIndexes, rowSelectionRange, type CellPosition, type CellSelectionRange, type SelectionData } from "@/lib/gridSelection";
+import { allCellsSelectionRange, extractColumnsSelection, extractSelection, isCellInSelection, normalizeSelectionRange, normalizeSelectedColumnIndexes, rowSelectionRange, type CellPosition, type CellSelectionRange, type SelectionData } from "@/lib/dataGrid/gridSelection";
type CellValue = string | number | boolean | null;
diff --git a/apps/desktop/src/composables/useDatabaseOptions.ts b/apps/desktop/src/composables/useDatabaseOptions.ts
index 1497bba44..409295a19 100644
--- a/apps/desktop/src/composables/useDatabaseOptions.ts
+++ b/apps/desktop/src/composables/useDatabaseOptions.ts
@@ -1,9 +1,9 @@
import { ref } from "vue";
import { useConnectionStore } from "@/stores/connectionStore";
-import { filterDatabaseNamesForConnection } from "@/lib/visibleDatabases";
-import { usesTreeSchemaMode } from "@/lib/databaseCapabilities";
+import { filterDatabaseNamesForConnection } from "@/lib/database/visibleDatabases";
+import { usesTreeSchemaMode } from "@/lib/database/databaseCapabilities";
import type { ConnectionConfig } from "@/types/database";
-import * as api from "@/lib/api";
+import * as api from "@/lib/backend/api";
export function databaseOptionsForConnection(databaseNames: string[], connection: Pick | undefined): string[] {
const names = filterDatabaseNamesForConnection(databaseNames, connection);
diff --git a/apps/desktop/src/composables/useEditorFontFamilyStyle.ts b/apps/desktop/src/composables/useEditorFontFamilyStyle.ts
index d455d4ef4..5be142359 100644
--- a/apps/desktop/src/composables/useEditorFontFamilyStyle.ts
+++ b/apps/desktop/src/composables/useEditorFontFamilyStyle.ts
@@ -1,5 +1,5 @@
import { computed } from "vue";
-import { EDITOR_FONT_FAMILY_CSS_VAR } from "@/lib/editorThemes";
+import { EDITOR_FONT_FAMILY_CSS_VAR } from "@/lib/editor/editorThemes";
import { useSettingsStore } from "@/stores/settingsStore";
export function useEditorFontFamilyStyle() {
diff --git a/apps/desktop/src/composables/useExportTracker.ts b/apps/desktop/src/composables/useExportTracker.ts
index 323f371b2..d41a91f69 100644
--- a/apps/desktop/src/composables/useExportTracker.ts
+++ b/apps/desktop/src/composables/useExportTracker.ts
@@ -1,5 +1,5 @@
import { reactive, computed } from "vue";
-import * as api from "@/lib/api";
+import * as api from "@/lib/backend/api";
export type BackgroundTaskKind = "table-export" | "database-export" | "sql-file" | "data-transfer";
export type BackgroundTaskStatus = "Running" | "Writing" | "Done" | "Error" | "Cancelled";
diff --git a/apps/desktop/src/composables/useFileDrop.ts b/apps/desktop/src/composables/useFileDrop.ts
index 564f4e44b..c3039a28d 100644
--- a/apps/desktop/src/composables/useFileDrop.ts
+++ b/apps/desktop/src/composables/useFileDrop.ts
@@ -1,12 +1,12 @@
import { useI18n } from "vue-i18n";
-import { uuid } from "@/lib/utils";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
+import { uuid } from "@/lib/common/utils";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
import { useConnectionStore } from "@/stores/connectionStore";
import { useQueryStore } from "@/stores/queryStore";
import { useToast } from "@/composables/useToast";
-import * as api from "@/lib/api";
+import * as api from "@/lib/backend/api";
import type { ConnectionConfig } from "@/types/database";
-import { detectDatabaseFileType } from "@/lib/databaseFileDetection";
+import { detectDatabaseFileType } from "@/lib/database/databaseFileDetection";
function isSqlFilePath(path: string): boolean {
return /\.sql$/i.test(path);
diff --git a/apps/desktop/src/composables/useNavigationTargets.ts b/apps/desktop/src/composables/useNavigationTargets.ts
index d75e4570d..52a1b0b92 100644
--- a/apps/desktop/src/composables/useNavigationTargets.ts
+++ b/apps/desktop/src/composables/useNavigationTargets.ts
@@ -1,9 +1,9 @@
-import * as api from "@/lib/api";
-import { effectiveDatabaseTypeForConnection, metadataSchemaForConnection } from "@/lib/jdbcDialect";
-import { isNoSnapshotErrorResult } from "@/lib/queryResultError";
-import { buildTableSelectSql } from "@/lib/tableSelectSql";
-import { editableRowIdentifierColumns, usesSyntheticRowIdKey } from "@/lib/tableEditing";
-import { tableOpenPageLimit } from "@/lib/tableOpenPageLimit";
+import * as api from "@/lib/backend/api";
+import { effectiveDatabaseTypeForConnection, metadataSchemaForConnection } from "@/lib/database/jdbcDialect";
+import { isNoSnapshotErrorResult } from "@/lib/query/queryResultError";
+import { buildTableSelectSql } from "@/lib/table/tableSelectSql";
+import { editableRowIdentifierColumns, usesSyntheticRowIdKey } from "@/lib/table/tableEditing";
+import { tableOpenPageLimit } from "@/lib/table/tableOpenPageLimit";
import { useConnectionStore } from "@/stores/connectionStore";
import { useQueryStore } from "@/stores/queryStore";
import { useSettingsStore } from "@/stores/settingsStore";
diff --git a/apps/desktop/src/composables/usePanelResize.ts b/apps/desktop/src/composables/usePanelResize.ts
index 15c5063a4..b9465b060 100644
--- a/apps/desktop/src/composables/usePanelResize.ts
+++ b/apps/desktop/src/composables/usePanelResize.ts
@@ -1,5 +1,5 @@
import { ref, type Ref } from "vue";
-import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage";
+import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/backend/safeStorage";
export function usePanelResize() {
const sidebarWidth = ref(Number(safeLocalStorageGet("dbx-sidebar-width")) || 260);
diff --git a/apps/desktop/src/composables/useSchemaDiffConfig.ts b/apps/desktop/src/composables/useSchemaDiffConfig.ts
index 2a84eee83..23f27b61b 100644
--- a/apps/desktop/src/composables/useSchemaDiffConfig.ts
+++ b/apps/desktop/src/composables/useSchemaDiffConfig.ts
@@ -1,5 +1,5 @@
import { ref, computed, watch } from "vue";
-import { uuid } from "@/lib/utils";
+import { uuid } from "@/lib/common/utils";
import type { SchemaDiffConfig, SchemaDiffCompareOptions } from "@/types/schemaDiff";
import { createEmptyConfig, getDefaultOptionsForDbType } from "@/types/schemaDiff";
diff --git a/apps/desktop/src/composables/useSchemaOptions.ts b/apps/desktop/src/composables/useSchemaOptions.ts
index 394d7de8c..cc204ddfd 100644
--- a/apps/desktop/src/composables/useSchemaOptions.ts
+++ b/apps/desktop/src/composables/useSchemaOptions.ts
@@ -1,9 +1,9 @@
import { ref } from "vue";
import { useConnectionStore } from "@/stores/connectionStore";
-import { isSchemaAware as isSchemaAwareType, isSingleDatabase, usesTreeSchemaMode } from "@/lib/databaseCapabilities";
-import { filterSchemaNamesForConnection } from "@/lib/visibleDatabases";
+import { isSchemaAware as isSchemaAwareType, isSingleDatabase, usesTreeSchemaMode } from "@/lib/database/databaseCapabilities";
+import { filterSchemaNamesForConnection } from "@/lib/database/visibleDatabases";
import type { ConnectionConfig } from "@/types/database";
-import * as api from "@/lib/api";
+import * as api from "@/lib/backend/api";
export function hasSchemaOptionsCacheEntry(options: Record, key: string): boolean {
return Object.prototype.hasOwnProperty.call(options, key);
diff --git a/apps/desktop/src/composables/useSqlExecution.ts b/apps/desktop/src/composables/useSqlExecution.ts
index 1535e55cb..5bac5e381 100644
--- a/apps/desktop/src/composables/useSqlExecution.ts
+++ b/apps/desktop/src/composables/useSqlExecution.ts
@@ -5,13 +5,13 @@ import { useHistoryStore } from "@/stores/historyStore";
import { useConnectionStore } from "@/stores/connectionStore";
import { useSettingsStore } from "@/stores/settingsStore";
import { useToast } from "@/composables/useToast";
-import { isSingleDatabase } from "@/lib/databaseCapabilities";
-import { canExecuteWithoutSelectedDatabase } from "@/lib/connectionLevelDatabaseBootstrap";
-import { classifySqlActivityKind } from "@/lib/historyActivityKind";
-import { sqlMetadataRefreshTarget } from "@/lib/sqlMetadataRefresh";
-import { classifyRedisCommandSafety, firstRedisCommandToken } from "@/lib/redisCommandSafety";
-import { isSqlExecutionSnapshot, resolveExecutableSql, type SqlExecutionOverride, type SqlExecutionSnapshot } from "@/lib/sqlExecutionTarget";
-import { extractSqlParameters } from "@/lib/sqlParameters";
+import { isSingleDatabase } from "@/lib/database/databaseCapabilities";
+import { canExecuteWithoutSelectedDatabase } from "@/lib/connection/connectionLevelDatabaseBootstrap";
+import { classifySqlActivityKind } from "@/lib/history/historyActivityKind";
+import { sqlMetadataRefreshTarget } from "@/lib/sql/sqlMetadataRefresh";
+import { classifyRedisCommandSafety, firstRedisCommandToken } from "@/lib/redis/redisCommandSafety";
+import { isSqlExecutionSnapshot, resolveExecutableSql, type SqlExecutionOverride, type SqlExecutionSnapshot } from "@/lib/sql/sqlExecutionTarget";
+import { extractSqlParameters } from "@/lib/sql/sqlParameters";
import type { ConnectionConfig, QueryTab } from "@/types/database";
const DANGER_RE = /^\s*(DROP|DELETE|TRUNCATE|ALTER|UPDATE|MERGE|REPLACE)\b/i;
diff --git a/apps/desktop/src/composables/useSqlHighlighter.ts b/apps/desktop/src/composables/useSqlHighlighter.ts
index 7ad5b248f..454a8e84f 100644
--- a/apps/desktop/src/composables/useSqlHighlighter.ts
+++ b/apps/desktop/src/composables/useSqlHighlighter.ts
@@ -1,6 +1,6 @@
import { onMounted, ref } from "vue";
import { useTheme } from "@/composables/useTheme";
-import { type SqlHighlighter, createShikiSqlHighlighter } from "@/lib/sqlHighlighter";
+import { type SqlHighlighter, createShikiSqlHighlighter } from "@/lib/sql/sqlHighlighter";
export function useSqlHighlighter() {
const { isDark } = useTheme();
diff --git a/apps/desktop/src/composables/useTheme.ts b/apps/desktop/src/composables/useTheme.ts
index 903308a1c..ca973a01e 100644
--- a/apps/desktop/src/composables/useTheme.ts
+++ b/apps/desktop/src/composables/useTheme.ts
@@ -1,7 +1,7 @@
import { computed, ref } from "vue";
-import { APP_THEME_STORAGE_KEY, getTauriThemeForMode, normalizeAppThemeMode, resolveAppThemeAppearance, type AppThemeMode } from "@/lib/appTheme";
-import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
+import { APP_THEME_STORAGE_KEY, getTauriThemeForMode, normalizeAppThemeMode, resolveAppThemeAppearance, type AppThemeMode } from "@/lib/app/appTheme";
+import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/backend/safeStorage";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
const themeMode = ref(normalizeAppThemeMode(safeLocalStorageGet(APP_THEME_STORAGE_KEY)));
const systemPrefersDark = ref(readSystemPrefersDark());
diff --git a/apps/desktop/src/composables/useVisibilityChange.ts b/apps/desktop/src/composables/useVisibilityChange.ts
index 7bb8603d7..801aa790d 100644
--- a/apps/desktop/src/composables/useVisibilityChange.ts
+++ b/apps/desktop/src/composables/useVisibilityChange.ts
@@ -1,5 +1,5 @@
import { onMounted, onUnmounted } from "vue";
-import { refreshConnections } from "@/lib/api";
+import { refreshConnections } from "@/lib/backend/api";
import { useQueryStore } from "@/stores/queryStore";
let hiddenAt: number | null = null;
diff --git a/apps/desktop/src/composables/useWebDavAutoUpload.ts b/apps/desktop/src/composables/useWebDavAutoUpload.ts
index 2de8b1c56..b31893858 100644
--- a/apps/desktop/src/composables/useWebDavAutoUpload.ts
+++ b/apps/desktop/src/composables/useWebDavAutoUpload.ts
@@ -1,8 +1,8 @@
import { onMounted, onUnmounted } from "vue";
import { useSettingsStore } from "@/stores/settingsStore";
-import { appendDebugLog } from "@/lib/debugLog";
-import { webdavSyncUpload } from "@/lib/api";
-import { readWebDavAutoUploadConfig, WEB_DAV_AUTO_UPLOAD_STORAGE_KEYS } from "@/lib/webdavAutoUploadConfig";
+import { appendDebugLog } from "@/lib/backend/debugLog";
+import { webdavSyncUpload } from "@/lib/backend/api";
+import { readWebDavAutoUploadConfig, WEB_DAV_AUTO_UPLOAD_STORAGE_KEYS } from "@/lib/webdav/webdavAutoUploadConfig";
export function useWebDavAutoUpload() {
const settingsStore = useSettingsStore();
diff --git a/apps/desktop/src/composables/useWindowControls.ts b/apps/desktop/src/composables/useWindowControls.ts
index 447257815..0917d94d7 100644
--- a/apps/desktop/src/composables/useWindowControls.ts
+++ b/apps/desktop/src/composables/useWindowControls.ts
@@ -1,7 +1,7 @@
import { ref, onMounted, onUnmounted } from "vue";
-import { isTauriRuntime } from "@/lib/tauriRuntime";
-import { isMacOS } from "@/lib/platform";
-import * as api from "@/lib/api";
+import { isTauriRuntime } from "@/lib/backend/tauriRuntime";
+import { isMacOS } from "@/lib/backend/platform";
+import * as api from "@/lib/backend/api";
export function shouldReserveMacTrafficLightInset(isMac: boolean, isFullscreen: boolean, isDesktop = true): boolean {
return isDesktop && isMac && !isFullscreen;
diff --git a/apps/desktop/src/i18n/index.ts b/apps/desktop/src/i18n/index.ts
index 8471cb642..896cf78f4 100644
--- a/apps/desktop/src/i18n/index.ts
+++ b/apps/desktop/src/i18n/index.ts
@@ -1,6 +1,6 @@
import { createI18n } from "vue-i18n";
import en from "./locales/en";
-import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/safeStorage";
+import { safeLocalStorageGet, safeLocalStorageSet } from "@/lib/backend/safeStorage";
export type Locale = "en" | "es" | "it" | "ja" | "pt-BR" | "zh-CN" | "zh-TW";
type LocaleMessages = Record;
diff --git a/apps/desktop/src/lib/README.md b/apps/desktop/src/lib/README.md
new file mode 100644
index 000000000..2796f0d09
--- /dev/null
+++ b/apps/desktop/src/lib/README.md
@@ -0,0 +1,15 @@
+# Desktop Library Layout
+
+`src/lib` is organized by product/runtime domain. Keep implementation modules inside a domain folder instead of adding new files at the root.
+
+- `backend`: Tauri, HTTP, platform, storage, and transport bridges.
+- `common`: generic helpers with no DBX feature ownership.
+- `app`, `tabs`, `sidebar`, `connection`: shell, navigation, and connection UI state helpers.
+- `database`, `metadata`, `schema`, `table`: relational database metadata, capabilities, DDL, and table-object helpers.
+- `sql`, `sql/semantic`, `editor`, `query`, `history`, `savedSql`: SQL editing, execution, diagnostics, history, and saved SQL behavior.
+- `dataGrid`: result/grid rendering, editing, previews, pagination, and export helpers tied to the grid.
+- `ai`, `mcp`: AI assistant and MCP configuration helpers.
+- `redis`, `mongo`, `elasticsearch`, `etcd`, `kv`, `mq`, `nacos`, `zookeeper`, `webdav`: non-relational or service-specific helpers.
+- `diagram`, `document`, `export`, `imports`: feature-specific utilities that are shared by more than one component.
+
+Tests under `src/lib/__tests__` mirror the same domain folders. When moving a module, update both runtime imports and colocated tests so stale root-level aliases do not return.
diff --git a/apps/desktop/src/lib/__tests__/ai.spec.ts b/apps/desktop/src/lib/__tests__/ai/ai.spec.ts
similarity index 92%
rename from apps/desktop/src/lib/__tests__/ai.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/ai.spec.ts
index d91590a33..233552216 100644
--- a/apps/desktop/src/lib/__tests__/ai.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/ai.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { buildSystemPrompt, type AiContext } from "@/lib/ai";
+import { buildSystemPrompt, type AiContext } from "@/lib/ai/ai";
function context(overrides: Partial = {}): AiContext {
return {
diff --git a/apps/desktop/src/lib/__tests__/aiMarkdown.spec.ts b/apps/desktop/src/lib/__tests__/ai/aiMarkdown.spec.ts
similarity index 99%
rename from apps/desktop/src/lib/__tests__/aiMarkdown.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/aiMarkdown.spec.ts
index 2dc77a5c2..212cf10fe 100644
--- a/apps/desktop/src/lib/__tests__/aiMarkdown.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/aiMarkdown.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { aiMarkdownLinkUrlFromClick, formatAiInlineMarkdown, handleAiMarkdownLinkClick, normalizeAiMarkdownLink } from "@/lib/aiMarkdown";
+import { aiMarkdownLinkUrlFromClick, formatAiInlineMarkdown, handleAiMarkdownLinkClick, normalizeAiMarkdownLink } from "@/lib/ai/aiMarkdown";
describe("formatAiInlineMarkdown", () => {
it("renders http links for external browser handling", () => {
diff --git a/apps/desktop/src/lib/__tests__/aiMessageEdit.spec.ts b/apps/desktop/src/lib/__tests__/ai/aiMessageEdit.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/aiMessageEdit.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/aiMessageEdit.spec.ts
index 8f90553e3..859044e72 100644
--- a/apps/desktop/src/lib/__tests__/aiMessageEdit.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/aiMessageEdit.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { visibleToActualIndex } from "@/lib/aiMessageEdit";
+import { visibleToActualIndex } from "@/lib/ai/aiMessageEdit";
describe("visibleToActualIndex", () => {
it("maps visible index 0 to first non-summary message", () => {
diff --git a/apps/desktop/src/lib/__tests__/aiModelPresentation.spec.ts b/apps/desktop/src/lib/__tests__/ai/aiModelPresentation.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/aiModelPresentation.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/aiModelPresentation.spec.ts
index b0b337c93..9fd61744b 100644
--- a/apps/desktop/src/lib/__tests__/aiModelPresentation.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/aiModelPresentation.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { formatAiModelOption, shouldShowAiModelSecondaryLabel } from "@/lib/aiModelPresentation";
+import { formatAiModelOption, shouldShowAiModelSecondaryLabel } from "@/lib/ai/aiModelPresentation";
describe("shouldShowAiModelSecondaryLabel", () => {
it("hides secondary text when display name only changes case", () => {
diff --git a/apps/desktop/src/lib/__tests__/aiProposalDetect.spec.ts b/apps/desktop/src/lib/__tests__/ai/aiProposalDetect.spec.ts
similarity index 99%
rename from apps/desktop/src/lib/__tests__/aiProposalDetect.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/aiProposalDetect.spec.ts
index a9804b5eb..cfe5b021f 100644
--- a/apps/desktop/src/lib/__tests__/aiProposalDetect.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/aiProposalDetect.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { containsChinese, isShortAffirmative, isShortNegative, looksLikeActionProposal } from "@/lib/aiProposalDetect";
+import { containsChinese, isShortAffirmative, isShortNegative, looksLikeActionProposal } from "@/lib/ai/aiProposalDetect";
describe("looksLikeActionProposal", () => {
// ---- zh-CN proposals ----
diff --git a/apps/desktop/src/lib/__tests__/aiTableMentions.spec.ts b/apps/desktop/src/lib/__tests__/ai/aiTableMentions.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/aiTableMentions.spec.ts
rename to apps/desktop/src/lib/__tests__/ai/aiTableMentions.spec.ts
index 173ce4c35..51da0a8f5 100644
--- a/apps/desktop/src/lib/__tests__/aiTableMentions.spec.ts
+++ b/apps/desktop/src/lib/__tests__/ai/aiTableMentions.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { AI_TABLE_MENTION_CANDIDATE_LIMIT, filterAiTableMentionCandidates, formatAiTableMention, parseAiTableMentions } from "@/lib/aiTableMentions";
+import { AI_TABLE_MENTION_CANDIDATE_LIMIT, filterAiTableMentionCandidates, formatAiTableMention, parseAiTableMentions } from "@/lib/ai/aiTableMentions";
describe("AI table mention parsing", () => {
it("parses plain and schema-qualified table mentions", () => {
diff --git a/apps/desktop/src/lib/__tests__/pinnedItems.spec.ts b/apps/desktop/src/lib/__tests__/app/pinnedItems.spec.ts
similarity index 92%
rename from apps/desktop/src/lib/__tests__/pinnedItems.spec.ts
rename to apps/desktop/src/lib/__tests__/app/pinnedItems.spec.ts
index 7ce3b5751..b7ba65ca2 100644
--- a/apps/desktop/src/lib/__tests__/pinnedItems.spec.ts
+++ b/apps/desktop/src/lib/__tests__/app/pinnedItems.spec.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
-import { updatePinnedTreeNodeInPlace } from "@/lib/pinnedItems";
-import { buildTreeNodesFromLayout } from "@/lib/sidebarLayout";
+import { updatePinnedTreeNodeInPlace } from "@/lib/app/pinnedItems";
+import { buildTreeNodesFromLayout } from "@/lib/sidebar/sidebarLayout";
import type { ConnectionConfig, SidebarLayout, TreeNode } from "@/types/database";
describe("sidebar pinned tree nodes", () => {
diff --git a/apps/desktop/src/lib/__tests__/ttlFormat.spec.ts b/apps/desktop/src/lib/__tests__/common/ttlFormat.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/ttlFormat.spec.ts
rename to apps/desktop/src/lib/__tests__/common/ttlFormat.spec.ts
index 7284accd7..25f2faee7 100644
--- a/apps/desktop/src/lib/__tests__/ttlFormat.spec.ts
+++ b/apps/desktop/src/lib/__tests__/common/ttlFormat.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { formatTtl } from "@/lib/ttlFormat";
+import { formatTtl } from "@/lib/common/ttlFormat";
// ---------------------------------------------------------------------------
// Mock `t()` helpers — only the day unit needs localization
diff --git a/apps/desktop/src/lib/__tests__/webPath.spec.ts b/apps/desktop/src/lib/__tests__/common/webPath.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/webPath.spec.ts
rename to apps/desktop/src/lib/__tests__/common/webPath.spec.ts
index 41854e6b5..e6ea717a5 100644
--- a/apps/desktop/src/lib/__tests__/webPath.spec.ts
+++ b/apps/desktop/src/lib/__tests__/common/webPath.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { apiUrl, apiWebSocketUrl, dbxWebBasePath, webPath } from "@/lib/webPath";
+import { apiUrl, apiWebSocketUrl, dbxWebBasePath, webPath } from "@/lib/common/webPath";
describe("webPath", () => {
it("keeps root deployments on root-relative API paths", () => {
diff --git a/apps/desktop/src/lib/__tests__/connectionAttemptTimeout.spec.ts b/apps/desktop/src/lib/__tests__/connection/connectionAttemptTimeout.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/connectionAttemptTimeout.spec.ts
rename to apps/desktop/src/lib/__tests__/connection/connectionAttemptTimeout.spec.ts
index 2cda2f5ee..a447b52b3 100644
--- a/apps/desktop/src/lib/__tests__/connectionAttemptTimeout.spec.ts
+++ b/apps/desktop/src/lib/__tests__/connection/connectionAttemptTimeout.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { ACCESS_AGENT_MIN_CONNECT_TIMEOUT_SECS, AGENT_DRIVER_MIN_CONNECT_TIMEOUT_SECS, connectionAttemptOriginalErrorMessage, connectionAttemptTimeoutMessage, connectionAttemptTimeoutMs, CONNECTION_ATTEMPT_TIMEOUT_BUFFER_MS } from "@/lib/connectionAttemptTimeout";
+import { ACCESS_AGENT_MIN_CONNECT_TIMEOUT_SECS, AGENT_DRIVER_MIN_CONNECT_TIMEOUT_SECS, connectionAttemptOriginalErrorMessage, connectionAttemptTimeoutMessage, connectionAttemptTimeoutMs, CONNECTION_ATTEMPT_TIMEOUT_BUFFER_MS } from "@/lib/connection/connectionAttemptTimeout";
describe("connectionAttemptTimeout", () => {
it("uses a 10s default for regular database connections", () => {
diff --git a/apps/desktop/src/lib/__tests__/connectionOpenTarget.spec.ts b/apps/desktop/src/lib/__tests__/connection/connectionOpenTarget.spec.ts
similarity index 92%
rename from apps/desktop/src/lib/__tests__/connectionOpenTarget.spec.ts
rename to apps/desktop/src/lib/__tests__/connection/connectionOpenTarget.spec.ts
index a9c9e0692..50ebcf6cb 100644
--- a/apps/desktop/src/lib/__tests__/connectionOpenTarget.spec.ts
+++ b/apps/desktop/src/lib/__tests__/connection/connectionOpenTarget.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { quickConnectionOpenTarget } from "@/lib/connectionOpenTarget";
+import { quickConnectionOpenTarget } from "@/lib/connection/connectionOpenTarget";
import type { ConnectionConfig } from "@/types/database";
function connection(dbType: ConnectionConfig["db_type"]): ConnectionConfig {
diff --git a/apps/desktop/src/lib/__tests__/connectionUrl.dremio.spec.ts b/apps/desktop/src/lib/__tests__/connection/connectionUrl.dremio.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/connectionUrl.dremio.spec.ts
rename to apps/desktop/src/lib/__tests__/connection/connectionUrl.dremio.spec.ts
index af5315e57..7cf7da37e 100644
--- a/apps/desktop/src/lib/__tests__/connectionUrl.dremio.spec.ts
+++ b/apps/desktop/src/lib/__tests__/connection/connectionUrl.dremio.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { parseConnectionUrl } from "../connectionUrl";
+import { parseConnectionUrl } from "@/lib/connection/connectionUrl";
describe("Dremio JDBC connection URLs", () => {
it("parses legacy direct JDBC URLs into a Dremio JDBC profile", () => {
diff --git a/apps/desktop/src/lib/__tests__/connectionUrl.zookeeper.spec.ts b/apps/desktop/src/lib/__tests__/connection/connectionUrl.zookeeper.spec.ts
similarity index 80%
rename from apps/desktop/src/lib/__tests__/connectionUrl.zookeeper.spec.ts
rename to apps/desktop/src/lib/__tests__/connection/connectionUrl.zookeeper.spec.ts
index 30231aa0e..efd1c0683 100644
--- a/apps/desktop/src/lib/__tests__/connectionUrl.zookeeper.spec.ts
+++ b/apps/desktop/src/lib/__tests__/connection/connectionUrl.zookeeper.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { parseConnectionUrl } from "../connectionUrl";
+import { parseConnectionUrl } from "@/lib/connection/connectionUrl";
describe("ZooKeeper connection URLs", () => {
it("preserves the host:port chroot path as a ZooKeeper connect string", () => {
diff --git a/apps/desktop/src/lib/__tests__/chartData.spec.ts b/apps/desktop/src/lib/__tests__/dataGrid/chartData.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/chartData.spec.ts
rename to apps/desktop/src/lib/__tests__/dataGrid/chartData.spec.ts
index a6b21cdd6..825e46274 100644
--- a/apps/desktop/src/lib/__tests__/chartData.spec.ts
+++ b/apps/desktop/src/lib/__tests__/dataGrid/chartData.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { axisColumnLabel, chartableColumnIndexes, toChartNumber } from "@/lib/chartData";
+import { axisColumnLabel, chartableColumnIndexes, toChartNumber } from "@/lib/dataGrid/chartData";
import type { QueryResult } from "@/types/database";
function result(columns: string[], rows: QueryResult["rows"]): QueryResult {
diff --git a/apps/desktop/src/lib/__tests__/dataGridConditionSuggestionPosition.spec.ts b/apps/desktop/src/lib/__tests__/dataGrid/dataGridConditionSuggestionPosition.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/dataGridConditionSuggestionPosition.spec.ts
rename to apps/desktop/src/lib/__tests__/dataGrid/dataGridConditionSuggestionPosition.spec.ts
index f4ebf3204..26b6f0b64 100644
--- a/apps/desktop/src/lib/__tests__/dataGridConditionSuggestionPosition.spec.ts
+++ b/apps/desktop/src/lib/__tests__/dataGrid/dataGridConditionSuggestionPosition.spec.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from "vitest";
-import { getDataGridConditionSuggestionPosition } from "@/lib/dataGridConditionSuggestionPosition";
+import { getDataGridConditionSuggestionPosition } from "@/lib/dataGrid/dataGridConditionSuggestionPosition";
describe("getDataGridConditionSuggestionPosition", () => {
test("anchors the dropdown to the input instead of the caret", () => {
diff --git a/apps/desktop/src/lib/__tests__/geometryPreview.spec.ts b/apps/desktop/src/lib/__tests__/dataGrid/geometryPreview.spec.ts
similarity index 94%
rename from apps/desktop/src/lib/__tests__/geometryPreview.spec.ts
rename to apps/desktop/src/lib/__tests__/dataGrid/geometryPreview.spec.ts
index 3fc45f471..974146979 100644
--- a/apps/desktop/src/lib/__tests__/geometryPreview.spec.ts
+++ b/apps/desktop/src/lib/__tests__/dataGrid/geometryPreview.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { wktToGeoJson } from "@/lib/geometryPreview";
+import { wktToGeoJson } from "@/lib/dataGrid/geometryPreview";
describe("wktToGeoJson", () => {
it("preserves polygon interior rings", () => {
diff --git a/apps/desktop/src/lib/__tests__/gridSelection.spec.ts b/apps/desktop/src/lib/__tests__/dataGrid/gridSelection.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/gridSelection.spec.ts
rename to apps/desktop/src/lib/__tests__/dataGrid/gridSelection.spec.ts
index 3b536c4fb..eafc1a0fa 100644
--- a/apps/desktop/src/lib/__tests__/gridSelection.spec.ts
+++ b/apps/desktop/src/lib/__tests__/dataGrid/gridSelection.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { formatSelectionAsTsv, summarizeSelection } from "@/lib/gridSelection";
+import { formatSelectionAsTsv, summarizeSelection } from "@/lib/dataGrid/gridSelection";
describe("gridSelection", () => {
it("formats TSV selections without headers by default", () => {
diff --git a/apps/desktop/src/lib/__tests__/createDatabaseCharsetOptions.spec.ts b/apps/desktop/src/lib/__tests__/database/createDatabaseCharsetOptions.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/createDatabaseCharsetOptions.spec.ts
rename to apps/desktop/src/lib/__tests__/database/createDatabaseCharsetOptions.spec.ts
index 27230c06f..932719695 100644
--- a/apps/desktop/src/lib/__tests__/createDatabaseCharsetOptions.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/createDatabaseCharsetOptions.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { CREATE_DATABASE_CHARSET_OPTIONS, createDatabaseCollationOptionsForCharset, defaultCreateDatabaseCollationForCharset, normalizeCreateDatabaseCharset, parseCreateDatabaseCharsetMetadata, nextCreateDatabaseCollation } from "@/lib/createDatabaseCharsetOptions";
+import { CREATE_DATABASE_CHARSET_OPTIONS, createDatabaseCollationOptionsForCharset, defaultCreateDatabaseCollationForCharset, normalizeCreateDatabaseCharset, parseCreateDatabaseCharsetMetadata, nextCreateDatabaseCollation } from "@/lib/database/createDatabaseCharsetOptions";
describe("createDatabaseCharsetOptions", () => {
it("offers common MySQL character sets with utf8mb4 first", () => {
diff --git a/apps/desktop/src/lib/__tests__/databaseDriverManifest.spec.ts b/apps/desktop/src/lib/__tests__/database/databaseDriverManifest.spec.ts
similarity index 93%
rename from apps/desktop/src/lib/__tests__/databaseDriverManifest.spec.ts
rename to apps/desktop/src/lib/__tests__/database/databaseDriverManifest.spec.ts
index 0b0df42d1..946e2628f 100644
--- a/apps/desktop/src/lib/__tests__/databaseDriverManifest.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/databaseDriverManifest.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { databaseRuntimeMode, usesAgentCursorForQuery } from "@/lib/databaseDriverManifest";
+import { databaseRuntimeMode, usesAgentCursorForQuery } from "@/lib/database/databaseDriverManifest";
describe("databaseDriverManifest", () => {
it("uses agent cursor only for agent or external runtimes", () => {
diff --git a/apps/desktop/src/lib/__tests__/databaseFeatureSupport.spec.ts b/apps/desktop/src/lib/__tests__/database/databaseFeatureSupport.spec.ts
similarity index 93%
rename from apps/desktop/src/lib/__tests__/databaseFeatureSupport.spec.ts
rename to apps/desktop/src/lib/__tests__/database/databaseFeatureSupport.spec.ts
index d60c20d37..72eb19741 100644
--- a/apps/desktop/src/lib/__tests__/databaseFeatureSupport.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/databaseFeatureSupport.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { supportsTransaction } from "@/lib/databaseFeatureSupport";
+import { supportsTransaction } from "@/lib/database/databaseFeatureSupport";
describe("supportsTransaction", () => {
it("returns true for supported database types", () => {
diff --git a/apps/desktop/src/lib/__tests__/databaseObjectCapabilities.spec.ts b/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts
similarity index 89%
rename from apps/desktop/src/lib/__tests__/databaseObjectCapabilities.spec.ts
rename to apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts
index 1c397dd93..097f767b2 100644
--- a/apps/desktop/src/lib/__tests__/databaseObjectCapabilities.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/databaseObjectCapabilities.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { normalizeSidebarObjectKind, sidebarObjectKindsForDatabase } from "@/lib/databaseObjectCapabilities";
+import { normalizeSidebarObjectKind, sidebarObjectKindsForDatabase } from "@/lib/database/databaseObjectCapabilities";
describe("databaseObjectCapabilities", () => {
it("exposes materialized views for Dameng", () => {
diff --git a/apps/desktop/src/lib/__tests__/defaultDatabase.spec.ts b/apps/desktop/src/lib/__tests__/database/defaultDatabase.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/defaultDatabase.spec.ts
rename to apps/desktop/src/lib/__tests__/database/defaultDatabase.spec.ts
index c0c1784cb..de584c582 100644
--- a/apps/desktop/src/lib/__tests__/defaultDatabase.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/defaultDatabase.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { decodeSelectableDatabaseValue, EMPTY_DATABASE_SELECT_VALUE, encodeSelectableDatabaseValue, TREE_SCHEMA_DEFAULT_DATABASE_SELECT_VALUE } from "@/lib/defaultDatabase";
+import { decodeSelectableDatabaseValue, EMPTY_DATABASE_SELECT_VALUE, encodeSelectableDatabaseValue, TREE_SCHEMA_DEFAULT_DATABASE_SELECT_VALUE } from "@/lib/database/defaultDatabase";
describe("defaultDatabase selectable values", () => {
it("encodes empty tree-schema databases with the default database sentinel", () => {
diff --git a/apps/desktop/src/lib/__tests__/jdbcDialect.spec.ts b/apps/desktop/src/lib/__tests__/database/jdbcDialect.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/jdbcDialect.spec.ts
rename to apps/desktop/src/lib/__tests__/database/jdbcDialect.spec.ts
index 8d3047e9f..2240ffc28 100644
--- a/apps/desktop/src/lib/__tests__/jdbcDialect.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/jdbcDialect.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { effectiveDatabaseTypeForConnection, inferJdbcDialect } from "@/lib/jdbcDialect";
+import { effectiveDatabaseTypeForConnection, inferJdbcDialect } from "@/lib/database/jdbcDialect";
describe("jdbc dialect inference", () => {
it("detects InterSystems IRIS and Caché JDBC connections", () => {
diff --git a/apps/desktop/src/lib/__tests__/mysqlConnectionOptions.spec.ts b/apps/desktop/src/lib/__tests__/database/mysqlConnectionOptions.spec.ts
similarity index 94%
rename from apps/desktop/src/lib/__tests__/mysqlConnectionOptions.spec.ts
rename to apps/desktop/src/lib/__tests__/database/mysqlConnectionOptions.spec.ts
index c6117d464..69b087db5 100644
--- a/apps/desktop/src/lib/__tests__/mysqlConnectionOptions.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/mysqlConnectionOptions.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { mysqlCleartextPasswordAuthEnabled, setMysqlCleartextPasswordAuthEnabled } from "../mysqlConnectionOptions";
+import { mysqlCleartextPasswordAuthEnabled, setMysqlCleartextPasswordAuthEnabled } from "@/lib/database/mysqlConnectionOptions";
describe("mysqlConnectionOptions", () => {
it("detects cleartext password auth aliases", () => {
diff --git a/apps/desktop/src/lib/__tests__/prestoSqlBuiltinDriver.spec.ts b/apps/desktop/src/lib/__tests__/database/prestoSqlBuiltinDriver.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/prestoSqlBuiltinDriver.spec.ts
rename to apps/desktop/src/lib/__tests__/database/prestoSqlBuiltinDriver.spec.ts
index 14f8b3234..e3dab8776 100644
--- a/apps/desktop/src/lib/__tests__/prestoSqlBuiltinDriver.spec.ts
+++ b/apps/desktop/src/lib/__tests__/database/prestoSqlBuiltinDriver.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { PRESTOSQL_JDBC_DRIVER_COORDINATE, prestoSqlBuiltinDriverPaths, prestoSqlBuiltinDriverRow, prestoSqlMavenBundle } from "@/lib/prestoSqlBuiltinDriver";
+import { PRESTOSQL_JDBC_DRIVER_COORDINATE, prestoSqlBuiltinDriverPaths, prestoSqlBuiltinDriverRow, prestoSqlMavenBundle } from "@/lib/database/prestoSqlBuiltinDriver";
import type { JdbcMavenBundleInfo } from "@/types/database";
function bundle(coordinate: string, version = "350"): JdbcMavenBundleInfo {
diff --git a/apps/desktop/src/lib/__tests__/codemirrorSqlDialect.spec.ts b/apps/desktop/src/lib/__tests__/editor/codemirrorSqlDialect.spec.ts
similarity index 89%
rename from apps/desktop/src/lib/__tests__/codemirrorSqlDialect.spec.ts
rename to apps/desktop/src/lib/__tests__/editor/codemirrorSqlDialect.spec.ts
index 36cef6652..f728d2d2d 100644
--- a/apps/desktop/src/lib/__tests__/codemirrorSqlDialect.spec.ts
+++ b/apps/desktop/src/lib/__tests__/editor/codemirrorSqlDialect.spec.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
import { PostgreSQL } from "@codemirror/lang-sql";
-import { postgresKeywordSyntaxTerms } from "@/lib/codemirrorSqlDialect";
+import { postgresKeywordSyntaxTerms } from "@/lib/editor/codemirrorSqlDialect";
describe("codemirrorSqlDialect", () => {
it("keeps common PostgreSQL identifier names out of keyword highlighting", () => {
diff --git a/apps/desktop/src/lib/__tests__/shortcutRegistry.spec.ts b/apps/desktop/src/lib/__tests__/editor/shortcutRegistry.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/shortcutRegistry.spec.ts
rename to apps/desktop/src/lib/__tests__/editor/shortcutRegistry.spec.ts
index efb84cdde..ac3bf544d 100644
--- a/apps/desktop/src/lib/__tests__/shortcutRegistry.spec.ts
+++ b/apps/desktop/src/lib/__tests__/editor/shortcutRegistry.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { DEFAULT_SHORTCUT_SETTINGS, SHORTCUT_DEFINITIONS, findShortcutConflict, normalizeShortcutSettings, type ShortcutActionId } from "@/lib/shortcutRegistry";
+import { DEFAULT_SHORTCUT_SETTINGS, SHORTCUT_DEFINITIONS, findShortcutConflict, normalizeShortcutSettings, type ShortcutActionId } from "@/lib/editor/shortcutRegistry";
describe("shortcutRegistry editor actions", () => {
const formatterEditorActionIds: ShortcutActionId[] = ["formatSql", "indentMore", "indentLess", "duplicateLine", "deleteLine", "moveLineUp", "moveLineDown", "copyLineUp", "copyLineDown", "undo", "redo", "selectAll"];
diff --git a/apps/desktop/src/lib/__tests__/etcdKeyTree.spec.ts b/apps/desktop/src/lib/__tests__/etcd/etcdKeyTree.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/etcdKeyTree.spec.ts
rename to apps/desktop/src/lib/__tests__/etcd/etcdKeyTree.spec.ts
index c6dd7232b..6abe025e9 100644
--- a/apps/desktop/src/lib/__tests__/etcdKeyTree.spec.ts
+++ b/apps/desktop/src/lib/__tests__/etcd/etcdKeyTree.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { buildEtcdKeyTree, flattenVisibleEtcdKeyTree } from "@/lib/etcdKeyTree";
+import { buildEtcdKeyTree, flattenVisibleEtcdKeyTree } from "@/lib/etcd/etcdKeyTree";
describe("etcd key tree", () => {
it("groups slash-delimited keys", () => {
diff --git a/apps/desktop/src/lib/__tests__/navicatImport.spec.ts b/apps/desktop/src/lib/__tests__/imports/navicatImport.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/navicatImport.spec.ts
rename to apps/desktop/src/lib/__tests__/imports/navicatImport.spec.ts
index 950003c70..64b04a6b5 100644
--- a/apps/desktop/src/lib/__tests__/navicatImport.spec.ts
+++ b/apps/desktop/src/lib/__tests__/imports/navicatImport.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { parseNavicatConnections } from "../navicatImport";
+import { parseNavicatConnections } from "@/lib/imports/navicatImport";
class TestElement {
readonly tagName: string;
diff --git a/apps/desktop/src/lib/__tests__/kvKeyTree.spec.ts b/apps/desktop/src/lib/__tests__/kv/kvKeyTree.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/kvKeyTree.spec.ts
rename to apps/desktop/src/lib/__tests__/kv/kvKeyTree.spec.ts
index 50bb6a1e2..c0e6b0897 100644
--- a/apps/desktop/src/lib/__tests__/kvKeyTree.spec.ts
+++ b/apps/desktop/src/lib/__tests__/kv/kvKeyTree.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { buildKvKeyTree, collectKvGroupIds, flattenVisibleKvKeyTree, preserveKvExpandedGroupIds } from "@/lib/kvKeyTree";
+import { buildKvKeyTree, collectKvGroupIds, flattenVisibleKvKeyTree, preserveKvExpandedGroupIds } from "@/lib/kv/kvKeyTree";
describe("kv key tree", () => {
it("keeps root keys as leaf nodes", () => {
diff --git a/apps/desktop/src/lib/__tests__/kvRefreshSelection.spec.ts b/apps/desktop/src/lib/__tests__/kv/kvRefreshSelection.spec.ts
similarity index 79%
rename from apps/desktop/src/lib/__tests__/kvRefreshSelection.spec.ts
rename to apps/desktop/src/lib/__tests__/kv/kvRefreshSelection.spec.ts
index 8e116bd8c..7945512de 100644
--- a/apps/desktop/src/lib/__tests__/kvRefreshSelection.spec.ts
+++ b/apps/desktop/src/lib/__tests__/kv/kvRefreshSelection.spec.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
-import { refreshedKvSelectionKey } from "@/lib/kvRefreshSelection";
-import type { KvKeySummary } from "@/lib/api";
+import { refreshedKvSelectionKey } from "@/lib/kv/kvRefreshSelection";
+import type { KvKeySummary } from "@/lib/backend/api";
describe("kv refresh selection", () => {
const keys: KvKeySummary[] = [{ key: "/app/config" }, { key: "/app/feature" }];
diff --git a/apps/desktop/src/lib/__tests__/kvRootPresentation.spec.ts b/apps/desktop/src/lib/__tests__/kv/kvRootPresentation.spec.ts
similarity index 81%
rename from apps/desktop/src/lib/__tests__/kvRootPresentation.spec.ts
rename to apps/desktop/src/lib/__tests__/kv/kvRootPresentation.spec.ts
index 98697a7b0..6436a08f8 100644
--- a/apps/desktop/src/lib/__tests__/kvRootPresentation.spec.ts
+++ b/apps/desktop/src/lib/__tests__/kv/kvRootPresentation.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { kvRootNodeLabel } from "@/lib/kvRootPresentation";
+import { kvRootNodeLabel } from "@/lib/kv/kvRootPresentation";
describe("kv root presentation", () => {
it("keeps etcd under Keys but shows ZooKeeper as root path", () => {
diff --git a/apps/desktop/src/lib/__tests__/kvValueDisplay.spec.ts b/apps/desktop/src/lib/__tests__/kv/kvValueDisplay.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/kvValueDisplay.spec.ts
rename to apps/desktop/src/lib/__tests__/kv/kvValueDisplay.spec.ts
index 50f035b45..90b2e843a 100644
--- a/apps/desktop/src/lib/__tests__/kvValueDisplay.spec.ts
+++ b/apps/desktop/src/lib/__tests__/kv/kvValueDisplay.spec.ts
@@ -1,6 +1,6 @@
import { describe, expect, it } from "vitest";
-import { formatZooKeeperMetadataRows, formatZooKeeperSummaryBadges, prettyPrintJsonText } from "@/lib/kvValueDisplay";
-import type { KvKeyMetadata } from "@/lib/api";
+import { formatZooKeeperMetadataRows, formatZooKeeperSummaryBadges, prettyPrintJsonText } from "@/lib/kv/kvValueDisplay";
+import type { KvKeyMetadata } from "@/lib/backend/api";
describe("kv value display helpers", () => {
it("pretty prints valid JSON text", () => {
diff --git a/apps/desktop/src/lib/__tests__/mcpConfigTemplates.spec.ts b/apps/desktop/src/lib/__tests__/mcp/mcpConfigTemplates.spec.ts
similarity index 99%
rename from apps/desktop/src/lib/__tests__/mcpConfigTemplates.spec.ts
rename to apps/desktop/src/lib/__tests__/mcp/mcpConfigTemplates.spec.ts
index 36ad21f1b..d425280bb 100644
--- a/apps/desktop/src/lib/__tests__/mcpConfigTemplates.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mcp/mcpConfigTemplates.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { buildMcpCodexConfig, buildMcpJsonConfig, buildMcpOpenCodeConfig, buildMcpVsCodeConfig, type McpEnvEntry } from "@/lib/mcpConfigTemplates";
+import { buildMcpCodexConfig, buildMcpJsonConfig, buildMcpOpenCodeConfig, buildMcpVsCodeConfig, type McpEnvEntry } from "@/lib/mcp/mcpConfigTemplates";
describe("MCP config templates", () => {
it("builds the standard mcpServers JSON used by Claude, Cursor, TRAE, and Windsurf", () => {
diff --git a/apps/desktop/src/lib/__tests__/completionMetadataPolicy.spec.ts b/apps/desktop/src/lib/__tests__/metadata/completionMetadataPolicy.spec.ts
similarity index 94%
rename from apps/desktop/src/lib/__tests__/completionMetadataPolicy.spec.ts
rename to apps/desktop/src/lib/__tests__/metadata/completionMetadataPolicy.spec.ts
index d9909c569..a6528ee45 100644
--- a/apps/desktop/src/lib/__tests__/completionMetadataPolicy.spec.ts
+++ b/apps/desktop/src/lib/__tests__/metadata/completionMetadataPolicy.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { usesLocalOnlyEditorCompletionMetadata, usesOnDemandOnlyEditorColumnMetadata } from "@/lib/completionMetadataPolicy";
+import { usesLocalOnlyEditorCompletionMetadata, usesOnDemandOnlyEditorColumnMetadata } from "@/lib/metadata/completionMetadataPolicy";
describe("completionMetadataPolicy", () => {
it("keeps Presto-like editor completion on local metadata", () => {
diff --git a/apps/desktop/src/lib/__tests__/completionTreeIndex.spec.ts b/apps/desktop/src/lib/__tests__/metadata/completionTreeIndex.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/completionTreeIndex.spec.ts
rename to apps/desktop/src/lib/__tests__/metadata/completionTreeIndex.spec.ts
index 5458eac9b..a006a4fd3 100644
--- a/apps/desktop/src/lib/__tests__/completionTreeIndex.spec.ts
+++ b/apps/desktop/src/lib/__tests__/metadata/completionTreeIndex.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { completionSchemasFromTree, completionTablesFromTree } from "@/lib/completionTreeIndex";
+import { completionSchemasFromTree, completionTablesFromTree } from "@/lib/metadata/completionTreeIndex";
import type { TreeNode } from "@/types/database";
describe("completionTreeIndex", () => {
diff --git a/apps/desktop/src/lib/__tests__/mqListPanels.spec.ts b/apps/desktop/src/lib/__tests__/mq/mqListPanels.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/mqListPanels.spec.ts
rename to apps/desktop/src/lib/__tests__/mq/mqListPanels.spec.ts
index 5f80520f4..4536bc6bf 100644
--- a/apps/desktop/src/lib/__tests__/mqListPanels.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mq/mqListPanels.spec.ts
@@ -2,7 +2,7 @@ import { readFileSync } from "node:fs";
import { describe, expect, it } from "vitest";
function componentSource(name: string): string {
- return readFileSync(new URL(`../../components/mq/${name}`, import.meta.url), "utf8");
+ return readFileSync(new URL(`../../../components/mq/${name}`, import.meta.url), "utf8");
}
describe("MQ list panels", () => {
diff --git a/apps/desktop/src/lib/__tests__/mqPinnedVersionOptions.spec.ts b/apps/desktop/src/lib/__tests__/mq/mqPinnedVersionOptions.spec.ts
similarity index 92%
rename from apps/desktop/src/lib/__tests__/mqPinnedVersionOptions.spec.ts
rename to apps/desktop/src/lib/__tests__/mq/mqPinnedVersionOptions.spec.ts
index 7d9bf835e..c8c4e645b 100644
--- a/apps/desktop/src/lib/__tests__/mqPinnedVersionOptions.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mq/mqPinnedVersionOptions.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { MQ_PINNED_VERSION_AUTO, MQ_PINNED_VERSION_OPTIONS, pinnedVersionToSelection, selectionToPinnedVersion } from "@/lib/mqPinnedVersionOptions";
+import { MQ_PINNED_VERSION_AUTO, MQ_PINNED_VERSION_OPTIONS, pinnedVersionToSelection, selectionToPinnedVersion } from "@/lib/mq/mqPinnedVersionOptions";
describe("mqPinnedVersionOptions", () => {
it("offers auto-detection and the supported Pulsar 3.x profile", () => {
diff --git a/apps/desktop/src/lib/__tests__/mqPolicyForms.spec.ts b/apps/desktop/src/lib/__tests__/mq/mqPolicyForms.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/mqPolicyForms.spec.ts
rename to apps/desktop/src/lib/__tests__/mq/mqPolicyForms.spec.ts
index c38c3b5e4..82a1c406f 100644
--- a/apps/desktop/src/lib/__tests__/mqPolicyForms.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mq/mqPolicyForms.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { defaultMqPolicyForms, policyFormsFromEffectivePolicies } from "@/lib/mqPolicyForms";
+import { defaultMqPolicyForms, policyFormsFromEffectivePolicies } from "@/lib/mq/mqPolicyForms";
describe("mqPolicyForms", () => {
it("hydrates forms from topic effective policies", () => {
diff --git a/apps/desktop/src/lib/__tests__/mqTenantForm.spec.ts b/apps/desktop/src/lib/__tests__/mq/mqTenantForm.spec.ts
similarity index 96%
rename from apps/desktop/src/lib/__tests__/mqTenantForm.spec.ts
rename to apps/desktop/src/lib/__tests__/mq/mqTenantForm.spec.ts
index cb120d3d9..c8377ff1f 100644
--- a/apps/desktop/src/lib/__tests__/mqTenantForm.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mq/mqTenantForm.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { defaultTenantConfig, mqClusterOptionsFromExtra, validateTenantForm } from "@/lib/mqTenantForm";
+import { defaultTenantConfig, mqClusterOptionsFromExtra, validateTenantForm } from "@/lib/mq/mqTenantForm";
describe("mqTenantForm", () => {
it("extracts selectable cluster names from Pulsar cluster info extras", () => {
diff --git a/apps/desktop/src/lib/__tests__/mqTokenErrors.spec.ts b/apps/desktop/src/lib/__tests__/mq/mqTokenErrors.spec.ts
similarity index 92%
rename from apps/desktop/src/lib/__tests__/mqTokenErrors.spec.ts
rename to apps/desktop/src/lib/__tests__/mq/mqTokenErrors.spec.ts
index 546eaafb2..25f9e6c82 100644
--- a/apps/desktop/src/lib/__tests__/mqTokenErrors.spec.ts
+++ b/apps/desktop/src/lib/__tests__/mq/mqTokenErrors.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { formatMqTokenIssueError } from "../mqTokenErrors";
+import { formatMqTokenIssueError } from "@/lib/mq/mqTokenErrors";
describe("MQ token errors", () => {
it("turns missing signing configuration backend errors into actionable Chinese copy", () => {
diff --git a/apps/desktop/src/lib/__tests__/nacosAdmin.spec.ts b/apps/desktop/src/lib/__tests__/nacos/nacosAdmin.spec.ts
similarity index 99%
rename from apps/desktop/src/lib/__tests__/nacosAdmin.spec.ts
rename to apps/desktop/src/lib/__tests__/nacos/nacosAdmin.spec.ts
index 36edee39d..ba9e922f4 100644
--- a/apps/desktop/src/lib/__tests__/nacosAdmin.spec.ts
+++ b/apps/desktop/src/lib/__tests__/nacos/nacosAdmin.spec.ts
@@ -13,7 +13,7 @@ import {
resolveNacosConfigCopyText,
sanitizeNacosConfigFileNameSegment,
summarizeNacosConfigDiff,
-} from "../nacosAdmin";
+} from "@/lib/nacos/nacosAdmin";
describe("nacosAdmin helpers", () => {
it("parses raw query and body text", () => {
diff --git a/apps/desktop/src/lib/__tests__/queryResultError.spec.ts b/apps/desktop/src/lib/__tests__/query/queryResultError.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/queryResultError.spec.ts
rename to apps/desktop/src/lib/__tests__/query/queryResultError.spec.ts
index 43263f479..de64be64a 100644
--- a/apps/desktop/src/lib/__tests__/queryResultError.spec.ts
+++ b/apps/desktop/src/lib/__tests__/query/queryResultError.spec.ts
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
import type { QueryResult } from "@/types/database";
-import { isNoSnapshotErrorResult } from "@/lib/queryResultError";
+import { isNoSnapshotErrorResult } from "@/lib/query/queryResultError";
function errorResult(message: string): QueryResult {
return { columns: ["Error"], rows: [[message]], affected_rows: 0, execution_time_ms: 0 };
diff --git a/apps/desktop/src/lib/__tests__/savedSqlFolderCounts.spec.ts b/apps/desktop/src/lib/__tests__/savedSql/savedSqlFolderCounts.spec.ts
similarity index 96%
rename from apps/desktop/src/lib/__tests__/savedSqlFolderCounts.spec.ts
rename to apps/desktop/src/lib/__tests__/savedSql/savedSqlFolderCounts.spec.ts
index 4c810abf4..ead33aca9 100644
--- a/apps/desktop/src/lib/__tests__/savedSqlFolderCounts.spec.ts
+++ b/apps/desktop/src/lib/__tests__/savedSql/savedSqlFolderCounts.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { savedSqlFolderBranchFileCount, type SavedSqlFolderCountNode } from "../savedSqlFolderCounts";
+import { savedSqlFolderBranchFileCount, type SavedSqlFolderCountNode } from "@/lib/savedSql/savedSqlFolderCounts";
describe("savedSqlFolderBranchFileCount", () => {
const folders: SavedSqlFolderCountNode[] = [{ id: "root" }, { id: "child", parentFolderId: "root" }, { id: "grandchild", parentFolderId: "child" }, { id: "sibling", parentFolderId: "root" }, { id: "other" }];
diff --git a/apps/desktop/src/lib/__tests__/schemaDiffMetadataLoad.spec.ts b/apps/desktop/src/lib/__tests__/schema/schemaDiffMetadataLoad.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/schemaDiffMetadataLoad.spec.ts
rename to apps/desktop/src/lib/__tests__/schema/schemaDiffMetadataLoad.spec.ts
index 7dcde6ae8..24e0a2447 100644
--- a/apps/desktop/src/lib/__tests__/schemaDiffMetadataLoad.spec.ts
+++ b/apps/desktop/src/lib/__tests__/schema/schemaDiffMetadataLoad.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { createConcurrencyLimiter, mapWithConcurrency, schemaDiffMetadataConcurrency } from "@/lib/schemaDiffMetadataLoad";
+import { createConcurrencyLimiter, mapWithConcurrency, schemaDiffMetadataConcurrency } from "@/lib/schema/schemaDiffMetadataLoad";
function wait(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
diff --git a/apps/desktop/src/lib/__tests__/sidebarConnectionSelection.spec.ts b/apps/desktop/src/lib/__tests__/sidebar/sidebarConnectionSelection.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/sidebarConnectionSelection.spec.ts
rename to apps/desktop/src/lib/__tests__/sidebar/sidebarConnectionSelection.spec.ts
index eb2aace8a..7c1068f00 100644
--- a/apps/desktop/src/lib/__tests__/sidebarConnectionSelection.spec.ts
+++ b/apps/desktop/src/lib/__tests__/sidebar/sidebarConnectionSelection.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { selectedConnectionDeleteTargets, selectedConnectionDuplicateTargets } from "@/lib/sidebarConnectionSelection";
+import { selectedConnectionDeleteTargets, selectedConnectionDuplicateTargets } from "@/lib/sidebar/sidebarConnectionSelection";
import type { TreeNode } from "@/types/database";
function node(id: string, type: TreeNode["type"] = "connection"): TreeNode {
diff --git a/apps/desktop/src/lib/__tests__/sidebarLabelTooltip.spec.ts b/apps/desktop/src/lib/__tests__/sidebar/sidebarLabelTooltip.spec.ts
similarity index 97%
rename from apps/desktop/src/lib/__tests__/sidebarLabelTooltip.spec.ts
rename to apps/desktop/src/lib/__tests__/sidebar/sidebarLabelTooltip.spec.ts
index 7857db51f..546e4da99 100644
--- a/apps/desktop/src/lib/__tests__/sidebarLabelTooltip.spec.ts
+++ b/apps/desktop/src/lib/__tests__/sidebar/sidebarLabelTooltip.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
-import { shouldMeasureSidebarLabelOverflow } from "@/lib/sidebarLabelTooltip";
+import { shouldMeasureSidebarLabelOverflow } from "@/lib/sidebar/sidebarLabelTooltip";
describe("shouldMeasureSidebarLabelOverflow", () => {
it("measures only plain truncated-label tooltip candidates", () => {
diff --git a/apps/desktop/src/lib/__tests__/executableStatementRangeCache.spec.ts b/apps/desktop/src/lib/__tests__/sql/executableStatementRangeCache.spec.ts
similarity index 98%
rename from apps/desktop/src/lib/__tests__/executableStatementRangeCache.spec.ts
rename to apps/desktop/src/lib/__tests__/sql/executableStatementRangeCache.spec.ts
index 6eca9447e..c55be0d0d 100644
--- a/apps/desktop/src/lib/__tests__/executableStatementRangeCache.spec.ts
+++ b/apps/desktop/src/lib/__tests__/sql/executableStatementRangeCache.spec.ts
@@ -1,6 +1,6 @@
import { Text } from "@codemirror/state";
import { describe, expect, it, vi } from "vitest";
-import { executableStatementRangeCacheForDoc, executableStatementRangeStartingAt, type ExecutableStatementRangeParser } from "@/lib/executableStatementRangeCache";
+import { executableStatementRangeCacheForDoc, executableStatementRangeStartingAt, type ExecutableStatementRangeParser } from "@/lib/sql/executableStatementRangeCache";
describe("executableStatementRangeCacheForDoc", () => {
it("reuses parsed executable statement ranges for the same document and database type", () => {
diff --git a/apps/desktop/src/lib/__tests__/sqlSemanticCompletion.spec.ts b/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts
similarity index 95%
rename from apps/desktop/src/lib/__tests__/sqlSemanticCompletion.spec.ts
rename to apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts
index 8b88c5415..63b1aa641 100644
--- a/apps/desktop/src/lib/__tests__/sqlSemanticCompletion.spec.ts
+++ b/apps/desktop/src/lib/__tests__/sql/semantic/completion.spec.ts
@@ -1,8 +1,8 @@
import { describe, expect, it } from "vitest";
-import { buildSqlCompletionItemsFromContext, getSqlCompletionContext, type SqlCompletionColumn, type SqlCompletionProviderInput } from "@/lib/sqlCompletion";
-import { sqlCompletionContextFromSemantic, sqlSemanticLocalColumnsByTable } from "@/lib/sqlSemanticCompletion";
-import { buildSqlSemanticModel } from "@/lib/sqlSemanticModel";
-import { sqlFixtureCursor } from "@/lib/sqlSemanticFixtures";
+import { buildSqlCompletionItemsFromContext, getSqlCompletionContext, type SqlCompletionColumn, type SqlCompletionProviderInput } from "@/lib/sql/sqlCompletion";
+import { sqlCompletionContextFromSemantic, sqlSemanticLocalColumnsByTable } from "@/lib/sql/semantic/completion";
+import { buildSqlSemanticModel } from "@/lib/sql/semantic/model";
+import { sqlFixtureCursor } from "@/lib/sql/semantic/fixtures";
import type { DatabaseType } from "@/types/database";
function mergeColumns(...maps: Array