From dd6614bca31d94fce75a878982ec94a5254c95c0 Mon Sep 17 00:00:00 2001 From: Haileyesus <118998054+blackmammoth@users.noreply.github.com> Date: Thu, 28 May 2026 20:50:46 +0300 Subject: [PATCH] fix: remove the hide cursor on windows logic --- .../modules/providers/services/mcp.service.ts | 13 +----- server/modules/providers/tests/mcp.test.ts | 9 ++--- server/routes/settings.js | 11 +---- .../ProviderSelectionEmptyState.tsx | 18 ++------- .../agents-settings/AgentsSettingsTab.tsx | 19 ++------- src/hooks/useServerPlatform.ts | 40 ------------------- 6 files changed, 12 insertions(+), 98 deletions(-) delete mode 100644 src/hooks/useServerPlatform.ts diff --git a/server/modules/providers/services/mcp.service.ts b/server/modules/providers/services/mcp.service.ts index bffb52de..da7a5665 100644 --- a/server/modules/providers/services/mcp.service.ts +++ b/server/modules/providers/services/mcp.service.ts @@ -1,18 +1,7 @@ -import os from 'node:os'; - import { providerRegistry } from '@/modules/providers/provider.registry.js'; import type { LLMProvider, McpScope, ProviderMcpServer, UpsertProviderMcpServerInput } from '@/shared/types.js'; import { AppError } from '@/shared/utils.js'; -/** Cursor MCP is not supported on Windows hosts (no Cursor CLI integration). */ -function includeProviderInGlobalMcp(providerId: LLMProvider): boolean { - if (providerId === 'cursor' && os.platform() === 'win32') { - return false; - } - - return true; -} - export const providerMcpService = { /** @@ -75,7 +64,7 @@ export const providerMcpService = { const scope = input.scope ?? 'project'; const results: Array<{ provider: LLMProvider; created: boolean; error?: string }> = []; - const providers = providerRegistry.listProviders().filter((p) => includeProviderInGlobalMcp(p.id)); + const providers = providerRegistry.listProviders(); for (const provider of providers) { try { await provider.mcp.upsertServer({ ...input, scope }); diff --git a/server/modules/providers/tests/mcp.test.ts b/server/modules/providers/tests/mcp.test.ts index 494c8122..f10b1354 100644 --- a/server/modules/providers/tests/mcp.test.ts +++ b/server/modules/providers/tests/mcp.test.ts @@ -341,8 +341,7 @@ test('providerMcpService global adder writes to all providers and rejects unsupp workspacePath, }); - const expectCursorGlobal = process.platform !== 'win32'; - assert.equal(globalResult.length, expectCursorGlobal ? 5 : 4); + assert.equal(globalResult.length, 5); assert.ok(globalResult.every((entry) => entry.created === true)); const claudeProject = await readJson(path.join(workspacePath, '.mcp.json')); @@ -357,10 +356,8 @@ test('providerMcpService global adder writes to all providers and rejects unsupp const opencodeProject = await readJson(path.join(workspacePath, 'opencode.json')); assert.ok((opencodeProject.mcp as Record)['global-http']); - if (expectCursorGlobal) { - const cursorProject = await readJson(path.join(workspacePath, '.cursor', 'mcp.json')); - assert.ok((cursorProject.mcpServers as Record)['global-http']); - } + const cursorProject = await readJson(path.join(workspacePath, '.cursor', 'mcp.json')); + assert.ok((cursorProject.mcpServers as Record)['global-http']); await assert.rejects( providerMcpService.addMcpServerToAllProviders({ diff --git a/server/routes/settings.js b/server/routes/settings.js index d467c49c..75406c54 100644 --- a/server/routes/settings.js +++ b/server/routes/settings.js @@ -1,4 +1,5 @@ import express from 'express'; + import { apiKeysDb, credentialsDb, notificationPreferencesDb, pushSubscriptionsDb } from '../modules/database/index.js'; import { getPublicKey } from '../services/vapid-keys.js'; import { createNotificationEvent, notifyUserIfEnabled } from '../services/notification-orchestrator.js'; @@ -273,14 +274,4 @@ router.post('/push/unsubscribe', async (req, res) => { } }); -// Host OS for UI (e.g. hide Cursor agent when the backend runs on Windows). -router.get('/server-env', async (req, res) => { - try { - res.json({ platform: process.platform }); - } catch (error) { - console.error('Error reading server environment:', error); - res.status(500).json({ error: 'Failed to read server environment' }); - } -}); - export default router; diff --git a/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx b/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx index ef9a103e..a336b953 100644 --- a/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx +++ b/src/components/chat/view/subcomponents/ProviderSelectionEmptyState.tsx @@ -1,8 +1,7 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react"; +import React, { useCallback, useMemo, useState } from "react"; import { Check, ChevronDown } from "lucide-react"; import { Trans, useTranslation } from "react-i18next"; -import { useServerPlatform } from "../../../../hooks/useServerPlatform"; import type { ProjectSession, LLMProvider, @@ -120,24 +119,15 @@ export default function ProviderSelectionEmptyState({ setInput, }: ProviderSelectionEmptyStateProps) { const { t } = useTranslation("chat"); - const { isWindowsServer } = useServerPlatform(); const [dialogOpen, setDialogOpen] = useState(false); - const visibleProviderGroups = useMemo(() => { - const groups: ProviderGroup[] = PROVIDER_META.map((p) => ({ + const visibleProviderGroups = useMemo(() => { + return PROVIDER_META.map((p) => ({ id: p.id, name: p.name, models: providerModelCatalog[p.id]?.OPTIONS ?? [], })); - return isWindowsServer ? groups.filter((p) => p.id !== "cursor") : groups; - }, [isWindowsServer, providerModelCatalog]); - - useEffect(() => { - if (isWindowsServer && provider === "cursor") { - setProvider("claude"); - localStorage.setItem("selected-provider", "claude"); - } - }, [isWindowsServer, provider, setProvider]); + }, [providerModelCatalog]); const nextTaskPrompt = t("tasks.nextTaskPrompt", { defaultValue: "Start the next task", diff --git a/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx b/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx index 8b305ca5..ee24239c 100644 --- a/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx +++ b/src/components/settings/view/tabs/agents-settings/AgentsSettingsTab.tsx @@ -1,6 +1,5 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useMemo, useState } from 'react'; -import { useServerPlatform } from '../../../../../hooks/useServerPlatform'; import type { AgentCategory, AgentProvider } from '../../../types/types'; import type { AgentContext, AgentsSettingsTabProps } from './types'; @@ -23,22 +22,10 @@ export default function AgentsSettingsTab({ }: AgentsSettingsTabProps) { const [selectedAgent, setSelectedAgent] = useState('claude'); const [selectedCategory, setSelectedCategory] = useState('account'); - const { isWindowsServer } = useServerPlatform(); const visibleAgents = useMemo(() => { - const all: AgentProvider[] = ['claude', 'cursor', 'codex', 'gemini', 'opencode']; - if (isWindowsServer) { - return all.filter((id) => id !== 'cursor'); - } - - return all; - }, [isWindowsServer]); - - useEffect(() => { - if (isWindowsServer && selectedAgent === 'cursor') { - setSelectedAgent('claude'); - } - }, [isWindowsServer, selectedAgent]); + return ['claude', 'cursor', 'codex', 'gemini', 'opencode']; + }, []); const agentContextById = useMemo>(() => ({ claude: { diff --git a/src/hooks/useServerPlatform.ts b/src/hooks/useServerPlatform.ts deleted file mode 100644 index c8d84f79..00000000 --- a/src/hooks/useServerPlatform.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { useEffect, useState } from 'react'; - -import { authenticatedFetch } from '../utils/api'; - -/** - * Node `process.platform` from the API host (e.g. win32, darwin, linux). - * Null until loaded or if the request fails. - */ -export function useServerPlatform(): { - serverPlatform: string | null; - isWindowsServer: boolean; -} { - const [serverPlatform, setServerPlatform] = useState(null); - - useEffect(() => { - let cancelled = false; - (async () => { - try { - const response = await authenticatedFetch('/api/settings/server-env'); - if (!response.ok) { - return; - } - const body = (await response.json()) as { platform?: string }; - if (!cancelled && typeof body.platform === 'string') { - setServerPlatform(body.platform); - } - } catch { - // Keep null: treat as unknown host. - } - })(); - return () => { - cancelled = true; - }; - }, []); - - return { - serverPlatform, - isWindowsServer: serverPlatform === 'win32', - }; -}