diff --git a/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx b/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx index 6b098ed0..c01e5242 100644 --- a/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx +++ b/src/features/runtime-provider-management/renderer/ui/RuntimeProviderManagementPanelView.tsx @@ -26,6 +26,7 @@ import { getOpenCodeTeamModelRecommendation, isOpenCodeTeamModelRecommended, } from '@renderer/utils/openCodeModelRecommendations'; +import { isOpenCodeWindowsNodeModulesSymlinkPermissionDiagnostic } from '@shared/utils/openCodeWindowsAccessDenied'; import { AlertTriangle, Check, @@ -785,6 +786,20 @@ function getRuntimeProviderDiagnosticRows( .map(([label, value]) => [label, String(value)]); } +function isOpenCodeWindowsNodeModulesSymlinkPermissionError( + message: string, + diagnostics: RuntimeProviderManagementErrorDiagnosticsDto | null | undefined +): boolean { + const value = [ + message, + diagnostics?.stderrPreview ?? '', + diagnostics?.stdoutPreview ?? '', + diagnostics?.likelyCause ?? '', + ...(diagnostics?.hints ?? []), + ].join('\n'); + return isOpenCodeWindowsNodeModulesSymlinkPermissionDiagnostic(value); +} + async function writeRuntimeProviderDiagnosticsToClipboard(text: string): Promise { if (navigator.clipboard?.writeText) { try { @@ -826,6 +841,10 @@ const RuntimeProviderErrorAlert = ({ const [headline = message, ...detailLines] = message.trim().split(/\r?\n/); const fallbackDetails = detailLines.join('\n').trim(); const hints = diagnostics?.hints ?? []; + const showWindowsSymlinkPermissionHint = isOpenCodeWindowsNodeModulesSymlinkPermissionError( + message, + diagnostics + ); const copyText = useMemo( () => formatRuntimeProviderDiagnosticsCopyText(message, diagnostics), [diagnostics, message] @@ -859,6 +878,11 @@ const RuntimeProviderErrorAlert = ({
{headline || message} + {showWindowsSymlinkPermissionHint ? ( + + {t('runtimeProvider.diagnostics.windowsSymlinkAdminHint')} + + ) : null}