fix: drop WSL OpenCode binary support on Windows
This commit is contained in:
@@ -14,7 +14,6 @@ import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||
|
||||
const INSTALL_COMMAND = 'curl -fsSL https://opencode.ai/install | bash';
|
||||
const DOCS_URL = 'https://opencode.ai/docs';
|
||||
const WINDOWS_WSL_DOCS_URL = 'https://opencode.ai/docs/windows-wsl';
|
||||
const POLL_INTERVAL_MS = 2500;
|
||||
|
||||
type OnboardingPlatform = 'macos' | 'linux' | 'windows' | 'unknown';
|
||||
@@ -216,7 +215,7 @@ export function ChooserScreen({ onCliAvailable }: ChooserScreenProps) {
|
||||
}
|
||||
}, []);
|
||||
|
||||
const docsUrl = platform === 'windows' ? WINDOWS_WSL_DOCS_URL : DOCS_URL;
|
||||
const docsUrl = DOCS_URL;
|
||||
const binaryPlaceholder =
|
||||
platform === 'windows'
|
||||
? 'C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd'
|
||||
@@ -286,7 +285,6 @@ export function ChooserScreen({ onCliAvailable }: ChooserScreenProps) {
|
||||
<div className="rounded-lg border border-border bg-background/50 p-4">
|
||||
<div className="text-sm text-foreground">{t('onboarding.localSetup.windows.title')}</div>
|
||||
<ol className="mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground">
|
||||
<li>{t('onboarding.localSetup.windows.stepInstallWsl')} <code className="text-foreground/80">wsl --install</code> {t('onboarding.localSetup.windows.stepInstallWslSuffix')}</li>
|
||||
<li>{t('onboarding.localSetup.windows.stepRunInstallInWsl')}</li>
|
||||
<li>{t('onboarding.localSetup.windows.stepSetBinaryPath')}</li>
|
||||
</ol>
|
||||
@@ -418,7 +416,6 @@ export function ChooserScreen({ onCliAvailable }: ChooserScreenProps) {
|
||||
<ul className="pb-4 space-y-1.5 text-xs text-muted-foreground list-disc pl-4">
|
||||
{platform === 'windows' ? (
|
||||
<>
|
||||
<li>{t('onboarding.localSetup.windows.hintInstallInWsl')}</li>
|
||||
<li>{t('onboarding.localSetup.windows.hintDetectionFailed')}</li>
|
||||
</>
|
||||
) : (
|
||||
|
||||
@@ -11,7 +11,6 @@ import { runtimeFetch } from '@/lib/runtime-fetch';
|
||||
|
||||
const INSTALL_COMMAND = 'curl -fsSL https://opencode.ai/install | bash';
|
||||
const DOCS_URL = 'https://opencode.ai/docs';
|
||||
const WINDOWS_WSL_DOCS_URL = 'https://opencode.ai/docs/windows-wsl';
|
||||
|
||||
type OnboardingPlatform = 'macos' | 'linux' | 'windows' | 'unknown';
|
||||
|
||||
@@ -202,7 +201,7 @@ export function LocalSetupScreen({
|
||||
}
|
||||
}, [checkCliAvailability, onCliAvailable, t]);
|
||||
|
||||
const docsUrl = platform === 'windows' ? WINDOWS_WSL_DOCS_URL : DOCS_URL;
|
||||
const docsUrl = DOCS_URL;
|
||||
const binaryPlaceholder =
|
||||
platform === 'windows'
|
||||
? 'C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd'
|
||||
@@ -239,7 +238,6 @@ export function LocalSetupScreen({
|
||||
<div className="mx-auto max-w-2xl rounded-lg border border-border bg-background/50 p-4 text-left">
|
||||
<div className="text-sm text-foreground">{t('onboarding.localSetup.windows.title')}</div>
|
||||
<ol className="mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground">
|
||||
<li>{t('onboarding.localSetup.windows.stepInstallWsl')} <code className="text-foreground/80">wsl --install</code> {t('onboarding.localSetup.windows.stepInstallWslSuffix')}</li>
|
||||
<li>{t('onboarding.localSetup.windows.stepRunInstallInWsl')}</li>
|
||||
<li>{t('onboarding.localSetup.windows.stepSetBinaryPath')}</li>
|
||||
</ol>
|
||||
@@ -341,9 +339,6 @@ export function LocalSetupScreen({
|
||||
<div className="absolute bottom-8 left-0 right-0 text-center space-y-1">
|
||||
{platform === 'windows' ? (
|
||||
<>
|
||||
<p className="text-sm text-muted-foreground/70">
|
||||
{t('onboarding.localSetup.windows.hintInstallInWsl')}
|
||||
</p>
|
||||
<p className="text-sm text-muted-foreground/70">
|
||||
{t('onboarding.localSetup.windows.hintDetectionFailed')}
|
||||
</p>
|
||||
|
||||
@@ -2334,13 +2334,13 @@ export const dict = {
|
||||
'onboarding.localSetup.dialog.selectOpencodeBinary': 'Select opencode binary',
|
||||
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI is not ready yet. Please confirm installation is complete and try again.',
|
||||
'onboarding.localSetup.errors.detectionFailed': 'Detection failed',
|
||||
'onboarding.localSetup.windows.title': 'Windows setup (WSL recommended)',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': 'Install WSL (if needed) with',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': 'in PowerShell.',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': 'Run the install command below inside your WSL terminal.',
|
||||
'onboarding.localSetup.windows.title': 'Windows setup',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': 'Install OpenCode with the command below.',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': 'Run the install command below in a Windows terminal.',
|
||||
'onboarding.localSetup.windows.stepSetBinaryPath': 'If OpenChamber does not detect OpenCode automatically, set the binary path below.',
|
||||
'onboarding.localSetup.intro': 'OpenCode is the heart of OpenChamber — install it to get started.',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode Windows + WSL docs',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode docs',
|
||||
'onboarding.localSetup.docs.default': 'OpenCode docs',
|
||||
'onboarding.localSetup.actions.checking': 'Checking…',
|
||||
'onboarding.localSetup.actions.checkAndContinue': "I've completed installation, check and continue",
|
||||
@@ -2356,8 +2356,8 @@ export const dict = {
|
||||
'onboarding.localSetup.helper.saveAndReload': 'Saves to OpenChamber settings and reloads OpenCode configuration.',
|
||||
'onboarding.localSetup.remotePreference': 'Prefer to use a remote server?',
|
||||
'onboarding.localSetup.actions.connectRemoteServer': 'Connect to Remote Server →',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'On Windows, install and run OpenCode in WSL for best compatibility.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': 'If detection fails, set a native path (opencode.cmd/opencode.exe), wsl.exe, or wsl:/usr/local/bin/opencode.',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'On Windows, install and run OpenCode natively.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': 'If detection fails, set a native path such as opencode.cmd or opencode.exe.',
|
||||
'onboarding.localSetup.hint.ensurePath': 'Already installed? Make sure opencode is in your PATH.',
|
||||
'onboarding.localSetup.hint.setEnv': 'Or set OPENCODE_BINARY environment variable.',
|
||||
'onboarding.localSetup.hint.missingRuntime': 'If you see "env: node: No such file or directory" or "env: bun: No such file or directory", install that runtime or ensure it is on PATH.',
|
||||
|
||||
@@ -2300,13 +2300,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.dialog.selectOpencodeBinary": "Seleccionar ejecutable de opencode",
|
||||
"onboarding.localSetup.errors.cliNotReady": "La CLI de OpenCode aún no está lista. Confirma que la instalación está completa y intenta de nuevo.",
|
||||
"onboarding.localSetup.errors.detectionFailed": "Error de detección",
|
||||
"onboarding.localSetup.windows.title": "Configuración de Windows (recomendado WSL)",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Instala WSL (si es necesario) con",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "en PowerShell.",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Ejecuta el comando de instalación a continuación dentro de tu terminal de WSL.",
|
||||
"onboarding.localSetup.windows.title": "Configuración de Windows",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Instala OpenCode con el comando siguiente.",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Ejecuta el comando de instalación a continuación en una terminal de Windows.",
|
||||
"onboarding.localSetup.windows.stepSetBinaryPath": "Si OpenChamber no detecta OpenCode automáticamente, establece la ruta del ejecutable a continuación.",
|
||||
"onboarding.localSetup.intro": "OpenCode es el corazón de OpenChamber. Instálalo para empezar.",
|
||||
"onboarding.localSetup.docs.windows": "Documentación de OpenCode para Windows + WSL",
|
||||
"onboarding.localSetup.docs.windows": "Documentación de OpenCode",
|
||||
"onboarding.localSetup.docs.default": "Documentación de OpenCode",
|
||||
"onboarding.localSetup.actions.checking": "Verificando...",
|
||||
"onboarding.localSetup.actions.checkAndContinue": "He completado la instalación, verificar y continuar",
|
||||
@@ -2322,8 +2322,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.helper.saveAndReload": "Guarda en la configuración de OpenChamber y recarga la configuración de OpenCode.",
|
||||
"onboarding.localSetup.remotePreference": "¿Prefieres usar un servidor remoto?",
|
||||
"onboarding.localSetup.actions.connectRemoteServer": "Conectar a un servidor remoto →",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "En Windows, instala y ejecuta OpenCode en WSL para mayor compatibilidad.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Si la detección falla, establece una ruta nativa (opencode.cmd/opencode.exe), wsl.exe, o wsl:/usr/local/bin/opencode.",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "En Windows, instala y ejecuta OpenCode de forma nativa.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Si la detección falla, establece una ruta nativa como opencode.cmd u opencode.exe.",
|
||||
"onboarding.localSetup.hint.ensurePath": "¿Ya está instalado? Asegúrate de que opencode esté en tu PATH.",
|
||||
"onboarding.localSetup.hint.setEnv": "O establece la variable de entorno OPENCODE_BINARY.",
|
||||
"onboarding.localSetup.hint.missingRuntime": "Si ves \"env: node: No such file or directory\" o \"env: bun: No such file or directory\", instala ese runtime o asegúrate de que esté en PATH.",
|
||||
|
||||
@@ -2334,13 +2334,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.dialog.selectOpencodeBinary': 'opencode 바이너리 선택',
|
||||
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI가 아직 준비되지 않았습니다. 설치가 완료되었는지 확인하고 다시 시도하세요.',
|
||||
'onboarding.localSetup.errors.detectionFailed': '감지에 실패했습니다',
|
||||
'onboarding.localSetup.windows.title': 'Windows 설정 (WSL 권장)',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '필요하면 WSL 설치:',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': 'PowerShell에서 실행하세요.',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '아래 설치 명령을 WSL 터미널에서 실행하세요.',
|
||||
'onboarding.localSetup.windows.title': 'Windows 설정',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '아래 명령으로 OpenCode를 설치하세요.',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '아래 설치 명령을 Windows 터미널에서 실행하세요.',
|
||||
'onboarding.localSetup.windows.stepSetBinaryPath': 'OpenChamber가 OpenCode를 자동으로 찾지 못하면 아래에 바이너리 경로를 설정하세요.',
|
||||
'onboarding.localSetup.intro': 'OpenCode는 OpenChamber의 심장입니다. 먼저 설치하고 시작하세요.',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode Windows + WSL 문서',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode 문서',
|
||||
'onboarding.localSetup.docs.default': 'OpenCode 문서',
|
||||
'onboarding.localSetup.actions.checking': '확인 중…',
|
||||
'onboarding.localSetup.actions.checkAndContinue': '설치를 마쳤습니다. 확인 후 계속',
|
||||
@@ -2356,8 +2356,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.helper.saveAndReload': 'OpenChamber 설정에 저장하고 OpenCode 구성을 다시 로드합니다.',
|
||||
'onboarding.localSetup.remotePreference': '원격 서버를 사용하시겠어요?',
|
||||
'onboarding.localSetup.actions.connectRemoteServer': '리모트 서버 연결 →',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'Windows에서는 최상의 호환성을 위해 WSL에서 OpenCode를 설치하고 실행하세요.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '감지에 실패하면 native 경로(opencode.cmd/opencode.exe), wsl.exe 또는 wsl:/usr/local/bin/opencode를 설정하세요.',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'Windows에서는 OpenCode를 네이티브로 설치하고 실행하세요.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '감지에 실패하면 opencode.cmd 또는 opencode.exe 같은 네이티브 경로를 설정하세요.',
|
||||
'onboarding.localSetup.hint.ensurePath': '이미 설치되어 있나요? opencode가 PATH에 있는지 확인하세요.',
|
||||
'onboarding.localSetup.hint.setEnv': '또는 `OPENCODE_BINARY` 환경 변수를 설정하세요.',
|
||||
'onboarding.localSetup.hint.missingRuntime': '"env: node: No such file or directory" 또는 "env: bun: No such file or directory"가 보이면 해당 런타임을 설치하거나 PATH에 있는지 확인하세요.',
|
||||
|
||||
@@ -791,12 +791,12 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.dialog.selectOpencodeBinary': 'Wybierz binarkę opencode',
|
||||
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI nie jest jeszcze gotowy. Potwierdź, że instalacja jest kompletna i spróbuj ponownie.',
|
||||
'onboarding.localSetup.errors.detectionFailed': 'Wykrywanie nie powiodło się',
|
||||
'onboarding.localSetup.windows.title': 'Konfiguracja Windows (zalecane WSL)',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': 'Zainstaluj WSL (jeśli potrzeba) z',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': 'w PowerShell.',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': 'Uruchom polecenie instalacji poniżej wewnątrz terminala WSL.',
|
||||
'onboarding.localSetup.windows.title': 'Konfiguracja Windows',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': 'Zainstaluj OpenCode za pomocą poniższego polecenia.',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': 'Uruchom polecenie instalacji poniżej w terminalu Windows.',
|
||||
'onboarding.localSetup.windows.stepSetBinaryPath': 'Jeśli OpenChamber nie wykryje OpenCode automatycznie, ustaw ścieżkę binarki poniżej.',
|
||||
'onboarding.localSetup.docs.windows': 'Wyświetl dokumentację Windows + WSL',
|
||||
'onboarding.localSetup.docs.windows': 'Dokumentacja OpenCode',
|
||||
'onboarding.localSetup.docs.default': 'Wyświetl dokumentację',
|
||||
'onboarding.localSetup.actions.checking': 'Sprawdzanie...',
|
||||
'onboarding.localSetup.helper.checkAndContinue': 'Kliknij aby sprawdzić czy OpenCode CLI jest dostępny. Jeśli się uda, automatycznie przejdziesz do głównego ekranu.',
|
||||
@@ -806,8 +806,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.helper.saveAndReload': 'Zapisuje do ustawień OpenChamber i przeładowuje konfigurację OpenCode.',
|
||||
'onboarding.localSetup.remotePreference': 'Wolisz używać zdalnego serwera?',
|
||||
'onboarding.localSetup.actions.connectRemoteServer': 'Połącz z serwerem zdalnym →',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'W Windows, zainstaluj i uruchom OpenCode w WSL dla najlepszej kompatybilności.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': 'Jeśli wykrywanie nie powiedzie się, ustaw natywną ścieżkę (opencode.cmd/opencode.exe), wsl.exe, lub wsl:/usr/local/bin/opencode.',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': 'W Windows zainstaluj i uruchom OpenCode natywnie.',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': 'Jeśli wykrywanie nie powiedzie się, ustaw natywną ścieżkę, np. opencode.cmd lub opencode.exe.',
|
||||
'onboarding.localSetup.hint.ensurePath': 'Juz zainstalowane? Upewnij się, że opencode jest w twoim PATH.',
|
||||
'onboarding.localSetup.hint.setEnv': 'Lub ustaw zmienną środowiskową OPENCODE_BINARY.',
|
||||
'onboarding.localSetup.hint.missingRuntime': 'Jeśli widzisz "env: node: No such file or directory" lub "env: bun: No such file or directory", zainstaluj to środowisko lub upewnij się, że jest w PATH.',
|
||||
|
||||
@@ -2300,13 +2300,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.dialog.selectOpencodeBinary": "Selecionar executável de opencode",
|
||||
"onboarding.localSetup.errors.cliNotReady": "A CLI do OpenCode ainda não está pronta. Confirme que a instalação está completa e tente novamente.",
|
||||
"onboarding.localSetup.errors.detectionFailed": "Erro de detecção",
|
||||
"onboarding.localSetup.windows.title": "Configuração no Windows (WSL recomendado)",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Instale WSL (se necessário) com",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "no PowerShell.",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Execute o comando de instalação a seguir dentro de seu terminal de WSL.",
|
||||
"onboarding.localSetup.windows.title": "Configuração no Windows",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Instale o OpenCode com o comando abaixo.",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Execute o comando de instalação abaixo em um terminal do Windows.",
|
||||
"onboarding.localSetup.windows.stepSetBinaryPath": "Se o OpenChamber não detectar o OpenCode automaticamente, defina o caminho do executável a seguir.",
|
||||
"onboarding.localSetup.intro": "OpenCode é o coração do OpenChamber. Instale-o para começar.",
|
||||
"onboarding.localSetup.docs.windows": "Documentação do OpenCode para Windows + WSL",
|
||||
"onboarding.localSetup.docs.windows": "Documentação do OpenCode",
|
||||
"onboarding.localSetup.docs.default": "Documentação do OpenCode",
|
||||
"onboarding.localSetup.actions.checking": "Verificando...",
|
||||
"onboarding.localSetup.actions.checkAndContinue": "Concluí a instalação, verificar e continuar",
|
||||
@@ -2322,8 +2322,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.helper.saveAndReload": "Salve nas configurações do OpenChamber e recarregue configurações do OpenCode.",
|
||||
"onboarding.localSetup.remotePreference": "Prefere usar um servidor remoto?",
|
||||
"onboarding.localSetup.actions.connectRemoteServer": "Conectar a um servidor remoto →",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "No Windows, instale e execute OpenCode no WSL para maior compatibilidade.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Se a detecção falhar, defina um caminho nativo (opencode.cmd/opencode.exe), wsl.exe ou wsl:/usr/local/bin/opencode.",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "No Windows, instale e execute o OpenCode nativamente.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Se a detecção falhar, defina um caminho nativo, como opencode.cmd ou opencode.exe.",
|
||||
"onboarding.localSetup.hint.ensurePath": "Já está instalado? Confira se opencode está no seu PATH.",
|
||||
"onboarding.localSetup.hint.setEnv": "Ou defina a variável de ambiente OPENCODE_BINARY.",
|
||||
"onboarding.localSetup.hint.missingRuntime": "Se você vir \"env: node: No such file or directory\" ou \"env: bun: No such file or directory\", instale esse runtime ou confira se ele está no PATH.",
|
||||
|
||||
@@ -2300,13 +2300,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.dialog.selectOpencodeBinary": "Вибрати виконуваний файл opencode",
|
||||
"onboarding.localSetup.errors.cliNotReady": "OpenCode CLI ще не готовий. Підтвердьте, що встановлення завершено, і повторіть спробу.",
|
||||
"onboarding.localSetup.errors.detectionFailed": "Не вдалося виявити",
|
||||
"onboarding.localSetup.windows.title": "Налаштування Windows (рекомендується WSL)",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Встановіть WSL (за потреби) за допомогою",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "в PowerShell.",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Виконайте наведену нижче команду встановлення всередині терміналу WSL.",
|
||||
"onboarding.localSetup.windows.title": "Налаштування Windows",
|
||||
"onboarding.localSetup.windows.stepInstallWsl": "Встановіть OpenCode за допомогою наведеної нижче команди.",
|
||||
"onboarding.localSetup.windows.stepInstallWslSuffix": "",
|
||||
"onboarding.localSetup.windows.stepRunInstallInWsl": "Виконайте наведену нижче команду встановлення в терміналі Windows.",
|
||||
"onboarding.localSetup.windows.stepSetBinaryPath": "Якщо OpenChamber не визначає OpenCode автоматично, укажіть шлях до виконуваного файла нижче.",
|
||||
"onboarding.localSetup.intro": "OpenCode — серце OpenChamber. Встановіть його, щоб почати.",
|
||||
"onboarding.localSetup.docs.windows": "Документація OpenCode для Windows + WSL",
|
||||
"onboarding.localSetup.docs.windows": "Документація OpenCode",
|
||||
"onboarding.localSetup.docs.default": "Документація OpenCode",
|
||||
"onboarding.localSetup.actions.checking": "Перевірка...",
|
||||
"onboarding.localSetup.actions.checkAndContinue": "Я завершив встановлення, перевірте та продовжуйте",
|
||||
@@ -2322,8 +2322,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
"onboarding.localSetup.helper.saveAndReload": "Зберігає налаштування в OpenChamber і перезавантажує конфігурацію OpenCode.",
|
||||
"onboarding.localSetup.remotePreference": "Бажаєте використовувати віддалений сервер?",
|
||||
"onboarding.localSetup.actions.connectRemoteServer": "Підключитися до віддаленого сервера →",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "У Windows інсталюйте та запустіть OpenCode у WSL для найкращої сумісності.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Якщо виявлення з помилкою, установіть власний шлях (opencode.cmd/opencode.exe), wsl.exe або wsl:/usr/local/bin/opencode.",
|
||||
"onboarding.localSetup.windows.hintInstallInWsl": "У Windows інсталюйте та запускайте OpenCode нативно.",
|
||||
"onboarding.localSetup.windows.hintDetectionFailed": "Якщо виявлення не вдається, укажіть нативний шлях, наприклад opencode.cmd або opencode.exe.",
|
||||
"onboarding.localSetup.hint.ensurePath": "Вже встановлено? Переконайтеся, що opencode знаходиться у вашому PATH.",
|
||||
"onboarding.localSetup.hint.setEnv": "Або встановіть змінну середовища OPENCODE_BINARY.",
|
||||
"onboarding.localSetup.hint.missingRuntime": "Якщо ви бачите \"env: node: Немає такого файлу чи каталогу\" або \"env: bun: Немає такого файлу чи каталогу\", інсталюйте це середовище виконання або переконайтеся, що воно знаходиться на PATH.",
|
||||
|
||||
@@ -2300,13 +2300,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.dialog.selectOpencodeBinary': '选择 OpenCode 可执行文件',
|
||||
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI 尚未就绪。请确认安装完成后重试。',
|
||||
'onboarding.localSetup.errors.detectionFailed': '检测失败',
|
||||
'onboarding.localSetup.windows.title': 'Windows 设置(推荐 WSL)',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '如需,请先在 PowerShell 中运行',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '安装 WSL。',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '在 WSL 终端中运行下方安装命令。',
|
||||
'onboarding.localSetup.windows.title': 'Windows 设置',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '使用下方命令安装 OpenCode。',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '在 Windows 终端中运行下方安装命令。',
|
||||
'onboarding.localSetup.windows.stepSetBinaryPath': '如果 OpenChamber 未自动检测到 OpenCode,请在下方设置可执行文件路径。',
|
||||
'onboarding.localSetup.intro': 'OpenCode 是 OpenChamber 的核心,先安装它即可开始。',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode Windows + WSL 文档',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode 文档',
|
||||
'onboarding.localSetup.docs.default': 'OpenCode 文档',
|
||||
'onboarding.localSetup.actions.checking': '检测中...',
|
||||
'onboarding.localSetup.actions.checkAndContinue': '我已完成安装,检测并继续',
|
||||
@@ -2322,8 +2322,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.helper.saveAndReload': '将保存到 OpenChamber 设置并重新加载 OpenCode 配置。',
|
||||
'onboarding.localSetup.remotePreference': '更希望使用远程服务器?',
|
||||
'onboarding.localSetup.actions.connectRemoteServer': '连接远程服务器 →',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': '在 Windows 上,建议在 WSL 中安装并运行 OpenCode 以获得最佳兼容性。',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '若检测失败,请设置本地路径(opencode.cmd/opencode.exe)、wsl.exe,或 wsl:/usr/local/bin/opencode。',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': '在 Windows 上,请原生安装并运行 OpenCode。',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '若检测失败,请设置原生路径,例如 opencode.cmd 或 opencode.exe。',
|
||||
'onboarding.localSetup.hint.ensurePath': '已安装?请确认 opencode 在你的 PATH 中。',
|
||||
'onboarding.localSetup.hint.setEnv': '或设置 OPENCODE_BINARY 环境变量。',
|
||||
'onboarding.localSetup.hint.missingRuntime': '如果看到 “env: node: No such file or directory” 或 “env: bun: No such file or directory”,请安装对应运行时或确保其在 PATH 中。',
|
||||
|
||||
@@ -2301,13 +2301,13 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.dialog.selectOpencodeBinary': '選擇 OpenCode 執行檔',
|
||||
'onboarding.localSetup.errors.cliNotReady': 'OpenCode CLI 尚未就緒。請確認安裝完成後重試。',
|
||||
'onboarding.localSetup.errors.detectionFailed': '偵測失敗',
|
||||
'onboarding.localSetup.windows.title': 'Windows 設定(推薦 WSL)',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '如需,請先在 PowerShell 中執行',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '安裝 WSL。',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '在 WSL 終端機中執行下方安裝命令。',
|
||||
'onboarding.localSetup.windows.title': 'Windows 設定',
|
||||
'onboarding.localSetup.windows.stepInstallWsl': '使用下方命令安裝 OpenCode。',
|
||||
'onboarding.localSetup.windows.stepInstallWslSuffix': '',
|
||||
'onboarding.localSetup.windows.stepRunInstallInWsl': '在 Windows 終端機中執行下方安裝命令。',
|
||||
'onboarding.localSetup.windows.stepSetBinaryPath': '如果 OpenChamber 未自動偵測到 OpenCode,請在下方設定執行檔路徑。',
|
||||
'onboarding.localSetup.intro': 'OpenCode 是 OpenChamber 的核心,先安裝它即可開始。',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode Windows + WSL 文件',
|
||||
'onboarding.localSetup.docs.windows': 'OpenCode 文件',
|
||||
'onboarding.localSetup.docs.default': 'OpenCode 文件',
|
||||
'onboarding.localSetup.actions.checking': '偵測中...',
|
||||
'onboarding.localSetup.actions.checkAndContinue': '我已完成安裝,偵測並繼續',
|
||||
@@ -2323,8 +2323,8 @@ export const dict: Record<I18nKey, string> = {
|
||||
'onboarding.localSetup.helper.saveAndReload': '將儲存到 OpenChamber 設定並重新載入 OpenCode 設定。',
|
||||
'onboarding.localSetup.remotePreference': '更希望使用遠端伺服器?',
|
||||
'onboarding.localSetup.actions.connectRemoteServer': '連接遠端伺服器 →',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': '在 Windows 上,建議在 WSL 中安裝並執行 OpenCode 以獲得最佳相容性。',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '若偵測失敗,請設定本地路徑(opencode.cmd/opencode.exe)、wsl.exe,或 wsl:/usr/local/bin/opencode。',
|
||||
'onboarding.localSetup.windows.hintInstallInWsl': '在 Windows 上,請原生安裝並執行 OpenCode。',
|
||||
'onboarding.localSetup.windows.hintDetectionFailed': '若偵測失敗,請設定原生路徑,例如 opencode.cmd 或 opencode.exe。',
|
||||
'onboarding.localSetup.hint.ensurePath': '已安裝?請確認 opencode 在你的 PATH 中。',
|
||||
'onboarding.localSetup.hint.setEnv': '或設定 OPENCODE_BINARY 環境變數。',
|
||||
'onboarding.localSetup.hint.missingRuntime': '如果看到「env: node: No such file or directory」或「env: bun: No such file or directory」,請安裝對應執行環境或確保其在 PATH 中。',
|
||||
|
||||
@@ -532,16 +532,6 @@ const ENV_DESKTOP_NOTIFY = (() => {
|
||||
const argv1 = typeof process.argv?.[1] === 'string' ? process.argv[1] : '';
|
||||
return /openchamber-server/i.test(argv0) || /openchamber-server/i.test(argv1);
|
||||
})();
|
||||
const ENV_CONFIGURED_OPENCODE_WSL_DISTRO =
|
||||
typeof process.env.OPENCODE_WSL_DISTRO === 'string' && process.env.OPENCODE_WSL_DISTRO.trim().length > 0
|
||||
? process.env.OPENCODE_WSL_DISTRO.trim()
|
||||
: (
|
||||
typeof process.env.OPENCHAMBER_OPENCODE_WSL_DISTRO === 'string' &&
|
||||
process.env.OPENCHAMBER_OPENCODE_WSL_DISTRO.trim().length > 0
|
||||
? process.env.OPENCHAMBER_OPENCODE_WSL_DISTRO.trim()
|
||||
: null
|
||||
);
|
||||
|
||||
const openCodeAuthStateRuntime = createOpenCodeAuthStateRuntime({
|
||||
crypto,
|
||||
process,
|
||||
@@ -619,7 +609,6 @@ const openCodeEnvRuntime = createOpenCodeEnvRuntime({
|
||||
state: openCodeEnvState,
|
||||
normalizeDirectoryPath,
|
||||
readSettingsFromDiskMigrated,
|
||||
ENV_CONFIGURED_OPENCODE_WSL_DISTRO,
|
||||
});
|
||||
|
||||
const applyLoginShellEnvSnapshot = (...args) => openCodeEnvRuntime.applyLoginShellEnvSnapshot(...args);
|
||||
@@ -630,8 +619,6 @@ const resolveOpencodeCliPath = (...args) => openCodeEnvRuntime.resolveOpencodeCl
|
||||
const isExecutable = (...args) => openCodeEnvRuntime.isExecutable(...args);
|
||||
const searchPathFor = (...args) => openCodeEnvRuntime.searchPathFor(...args);
|
||||
const resolveGitBinaryForSpawn = (...args) => openCodeEnvRuntime.resolveGitBinaryForSpawn(...args);
|
||||
const resolveWslExecutablePath = (...args) => openCodeEnvRuntime.resolveWslExecutablePath(...args);
|
||||
const buildWslExecArgs = (...args) => openCodeEnvRuntime.buildWslExecArgs(...args);
|
||||
const resolveManagedOpenCodeLaunchSpec = (...args) => openCodeEnvRuntime.resolveManagedOpenCodeLaunchSpec(...args);
|
||||
const clearResolvedOpenCodeBinary = (...args) => openCodeEnvRuntime.clearResolvedOpenCodeBinary(...args);
|
||||
const openCodeResolutionRuntime = createOpenCodeResolutionRuntime({
|
||||
@@ -919,8 +906,6 @@ const openCodeLifecycleRuntime = createOpenCodeLifecycleRuntime({
|
||||
applyOpencodeBinaryFromSettings,
|
||||
ensureOpencodeCliEnv,
|
||||
ensureLocalOpenCodeServerPassword,
|
||||
buildWslExecArgs,
|
||||
resolveWslExecutablePath,
|
||||
resolveManagedOpenCodeLaunchSpec,
|
||||
setOpenCodePort,
|
||||
setDetectedOpenCodeApiPrefix,
|
||||
|
||||
@@ -9,7 +9,6 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
||||
state,
|
||||
normalizeDirectoryPath,
|
||||
readSettingsFromDiskMigrated,
|
||||
ENV_CONFIGURED_OPENCODE_WSL_DISTRO,
|
||||
} = deps;
|
||||
const runSpawnSync = typeof deps.spawnSync === 'function' ? deps.spawnSync : spawnSync;
|
||||
|
||||
@@ -268,135 +267,6 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
||||
state.resolvedWslDistro = null;
|
||||
};
|
||||
|
||||
const resolveWslExecutablePath = () => {
|
||||
if (process.platform !== 'win32') {
|
||||
return null;
|
||||
}
|
||||
|
||||
const explicit = [process.env.WSL_BINARY, process.env.OPENCHAMBER_WSL_BINARY]
|
||||
.map((v) => (typeof v === 'string' ? v.trim() : ''))
|
||||
.filter(Boolean);
|
||||
|
||||
for (const candidate of explicit) {
|
||||
if (isExecutable(candidate)) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const result = runSpawnSync('where', ['wsl'], {
|
||||
encoding: 'utf8',
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
windowsHide: true,
|
||||
});
|
||||
if (result.status === 0) {
|
||||
const lines = (result.stdout || '')
|
||||
.split(/\r?\n/)
|
||||
.map((line) => line.trim())
|
||||
.filter(Boolean);
|
||||
const found = lines.find((line) => isExecutable(line));
|
||||
if (found) {
|
||||
return found;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
}
|
||||
|
||||
const systemRoot = process.env.SystemRoot || 'C:\\Windows';
|
||||
const fallback = path.join(systemRoot, 'System32', 'wsl.exe');
|
||||
if (isExecutable(fallback)) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
const buildWslExecArgs = (execArgs, distroOverride = null) => {
|
||||
const distro = typeof distroOverride === 'string' && distroOverride.trim().length > 0
|
||||
? distroOverride.trim()
|
||||
: ENV_CONFIGURED_OPENCODE_WSL_DISTRO;
|
||||
|
||||
const prefix = distro ? ['-d', distro] : [];
|
||||
return [...prefix, '--exec', ...execArgs];
|
||||
};
|
||||
|
||||
const wslOpencodeProbeScript = [
|
||||
'found="$(command -v opencode 2>/dev/null || true)"',
|
||||
'case "$found" in /*) case "$found" in /mnt/[a-zA-Z]/*) ;; *) printf "%s\\n" "$found"; exit 0 ;; esac ;; esac',
|
||||
'for candidate in "$HOME/.opencode/bin/opencode" "$HOME/.bun/bin/opencode" "$HOME/.local/bin/opencode" "$HOME/bin/opencode" /usr/local/bin/opencode /usr/bin/opencode /bin/opencode; do',
|
||||
' if [ -x "$candidate" ]; then printf "%s\\n" "$candidate"; exit 0; fi',
|
||||
'done',
|
||||
'if [ -n "${SHELL:-}" ] && [ -x "$SHELL" ]; then',
|
||||
' found="$("$SHELL" -lic "command -v opencode" 2>/dev/null | sed -n "1p")"',
|
||||
' case "$found" in /*) case "$found" in /mnt/[a-zA-Z]/*) ;; *) printf "%s\\n" "$found"; exit 0 ;; esac ;; esac',
|
||||
'fi',
|
||||
'exit 1',
|
||||
].join('\n');
|
||||
|
||||
const probeWslForOpencode = () => {
|
||||
if (process.platform !== 'win32') {
|
||||
return null;
|
||||
}
|
||||
|
||||
const wslBinary = resolveWslExecutablePath();
|
||||
if (!wslBinary) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const result = runSpawnSync(
|
||||
wslBinary,
|
||||
buildWslExecArgs(['sh', '-lc', wslOpencodeProbeScript]),
|
||||
{
|
||||
encoding: 'utf8',
|
||||
stdio: ['ignore', 'pipe', 'pipe'],
|
||||
timeout: 6000,
|
||||
windowsHide: true,
|
||||
}
|
||||
);
|
||||
|
||||
if (result.status !== 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const lines = (result.stdout || '')
|
||||
.split(/\r?\n/)
|
||||
.map((line) => line.trim())
|
||||
.filter(Boolean);
|
||||
const found = lines[0] || '';
|
||||
if (!found) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
wslBinary,
|
||||
opencodePath: found,
|
||||
distro: ENV_CONFIGURED_OPENCODE_WSL_DISTRO,
|
||||
};
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const applyWslOpencodeResolution = ({ wslBinary, opencodePath, source = 'wsl', distro = null } = {}) => {
|
||||
const resolvedWsl = wslBinary || resolveWslExecutablePath();
|
||||
if (!resolvedWsl) {
|
||||
return null;
|
||||
}
|
||||
|
||||
state.useWslForOpencode = true;
|
||||
state.resolvedWslBinary = resolvedWsl;
|
||||
state.resolvedWslOpencodePath = typeof opencodePath === 'string' && opencodePath.trim().length > 0
|
||||
? opencodePath.trim()
|
||||
: 'opencode';
|
||||
state.resolvedWslDistro = typeof distro === 'string' && distro.trim().length > 0 ? distro.trim() : ENV_CONFIGURED_OPENCODE_WSL_DISTRO;
|
||||
state.resolvedOpencodeBinary = `wsl:${state.resolvedWslOpencodePath}`;
|
||||
state.resolvedOpencodeBinarySource = source;
|
||||
|
||||
delete process.env.OPENCODE_BINARY;
|
||||
return state.resolvedOpencodeBinary;
|
||||
};
|
||||
|
||||
const resolveOpencodeCliPath = () => {
|
||||
const explicit = [
|
||||
process.env.OPENCODE_BINARY,
|
||||
@@ -483,15 +353,9 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
||||
}
|
||||
} catch {
|
||||
}
|
||||
const wsl = probeWslForOpencode();
|
||||
if (wsl) {
|
||||
return applyWslOpencodeResolution({
|
||||
wslBinary: wsl.wslBinary,
|
||||
opencodePath: wsl.opencodePath,
|
||||
source: 'wsl',
|
||||
distro: wsl.distro,
|
||||
});
|
||||
}
|
||||
// Do not auto-detect OpenCode from WSL. OpenCode sessions are keyed by
|
||||
// server-visible directories, and mixing Windows paths with WSL paths
|
||||
// creates duplicate/missing project state in the desktop app.
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -1046,35 +910,21 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
||||
: null;
|
||||
|
||||
if (explicitWslPath && explicitWslPath[1] && explicitWslPath[1].trim().length > 0) {
|
||||
const probe = probeWslForOpencode();
|
||||
const applied = applyWslOpencodeResolution({
|
||||
wslBinary: probe?.wslBinary || resolveWslExecutablePath(),
|
||||
opencodePath: explicitWslPath[1].trim(),
|
||||
source: 'settings-wsl-path',
|
||||
distro: probe?.distro || ENV_CONFIGURED_OPENCODE_WSL_DISTRO,
|
||||
});
|
||||
if (applied) {
|
||||
return applied;
|
||||
}
|
||||
clearWslOpencodeResolution();
|
||||
if (strict) {
|
||||
throw createConfiguredWslOpencodeError(raw);
|
||||
}
|
||||
console.warn(`Configured settings.opencodeBinary uses WSL, which is no longer supported by OpenChamber desktop: ${raw}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (process.platform === 'win32' && (isWslExecutableValue(raw) || isWslExecutableValue(normalized || ''))) {
|
||||
const probe = probeWslForOpencode();
|
||||
const applied = applyWslOpencodeResolution({
|
||||
wslBinary: probe?.wslBinary || normalized || raw || null,
|
||||
opencodePath: probe?.opencodePath || 'opencode',
|
||||
source: 'settings-wsl',
|
||||
distro: probe?.distro || ENV_CONFIGURED_OPENCODE_WSL_DISTRO,
|
||||
});
|
||||
if (applied) {
|
||||
return applied;
|
||||
}
|
||||
clearWslOpencodeResolution();
|
||||
if (strict) {
|
||||
throw createConfiguredWslOpencodeError(raw);
|
||||
}
|
||||
console.warn(`Configured settings.opencodeBinary points to WSL, which is no longer supported by OpenChamber desktop: ${raw}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (normalized && isExecutable(normalized) && !isMacOpenCodeAppBundlePath(normalized)) {
|
||||
@@ -1233,8 +1083,6 @@ export const createOpenCodeEnvRuntime = (deps) => {
|
||||
isExecutable,
|
||||
searchPathFor,
|
||||
resolveGitBinaryForSpawn,
|
||||
resolveWslExecutablePath,
|
||||
buildWslExecArgs,
|
||||
clearResolvedOpenCodeBinary,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -90,7 +90,6 @@ const createRuntime = (settings, options = {}) => {
|
||||
state,
|
||||
normalizeDirectoryPath: (value) => value,
|
||||
readSettingsFromDiskMigrated: async () => settings,
|
||||
ENV_CONFIGURED_OPENCODE_WSL_DISTRO: options.ENV_CONFIGURED_OPENCODE_WSL_DISTRO ?? null,
|
||||
spawnSync: options.spawnSync,
|
||||
});
|
||||
|
||||
@@ -139,7 +138,7 @@ describe('OpenCode env runtime', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('does not classify WSL settings as a native invalid configured binary in strict mode', async () => {
|
||||
it('rejects WSL settings in strict mode', async () => {
|
||||
setPlatform('win32');
|
||||
const dir = createTempDir('openchamber-no-wsl-');
|
||||
process.env.PATH = dir;
|
||||
@@ -148,18 +147,12 @@ describe('OpenCode env runtime', () => {
|
||||
process.env.OPENCHAMBER_WSL_BINARY = path.join(dir, 'missing-openchamber-wsl.exe');
|
||||
const { runtime } = createRuntime({ opencodeBinary: 'wsl:/usr/local/bin/opencode' });
|
||||
|
||||
const rejection = runtime.applyOpencodeBinaryFromSettings({ strict: true });
|
||||
|
||||
try {
|
||||
await rejection;
|
||||
expect(runtime.resolveManagedOpenCodeLaunchSpec('opencode').wrapperType).not.toBe('cmd-wrapper');
|
||||
} catch (error) {
|
||||
expect(error.message).toContain('uses WSL');
|
||||
expect(error.code).toBeUndefined();
|
||||
}
|
||||
await expect(runtime.applyOpencodeBinaryFromSettings({ strict: true })).rejects.toMatchObject({
|
||||
message: expect.stringContaining('uses WSL'),
|
||||
});
|
||||
});
|
||||
|
||||
it('detects OpenCode installed in the default WSL home fallback path', () => {
|
||||
it('does not auto-detect OpenCode from WSL fallback paths', () => {
|
||||
setPlatform('win32');
|
||||
const dir = createTempDir('openchamber-wsl-opencode-');
|
||||
const wslBinary = path.join(dir, 'wsl.exe');
|
||||
@@ -182,15 +175,14 @@ describe('OpenCode env runtime', () => {
|
||||
};
|
||||
const { runtime, state } = createRuntime({}, { spawnSync: spawnSyncMock });
|
||||
|
||||
expect(runtime.resolveOpencodeCliPath()).toBe('wsl:/home/alice/.opencode/bin/opencode');
|
||||
expect(state.useWslForOpencode).toBe(true);
|
||||
expect(state.resolvedWslBinary).toBe(wslBinary);
|
||||
expect(state.resolvedWslOpencodePath).toBe('/home/alice/.opencode/bin/opencode');
|
||||
expect(state.resolvedOpencodeBinarySource).toBe('wsl');
|
||||
expect(runtime.resolveOpencodeCliPath()).toBeNull();
|
||||
expect(state.useWslForOpencode).toBe(false);
|
||||
expect(state.resolvedWslBinary).toBeNull();
|
||||
expect(state.resolvedWslOpencodePath).toBeNull();
|
||||
expect(state.resolvedOpencodeBinarySource).toBeNull();
|
||||
|
||||
const wslCall = calls.find((call) => call.command === wslBinary);
|
||||
expect(wslCall?.args).toEqual(expect.arrayContaining(['sh', '-lc']));
|
||||
expect(wslCall?.args.join('\n')).toContain('$HOME/.opencode/bin/opencode');
|
||||
expect(wslCall).toBeUndefined();
|
||||
});
|
||||
|
||||
it('launches Windows cmd shims through cmd call without embedded quotes', () => {
|
||||
|
||||
@@ -28,8 +28,6 @@ export const createOpenCodeLifecycleRuntime = (deps) => {
|
||||
applyOpencodeBinaryFromSettings,
|
||||
ensureOpencodeCliEnv,
|
||||
ensureLocalOpenCodeServerPassword,
|
||||
buildWslExecArgs,
|
||||
resolveWslExecutablePath,
|
||||
resolveManagedOpenCodeLaunchSpec,
|
||||
setOpenCodePort,
|
||||
setDetectedOpenCodeApiPrefix,
|
||||
@@ -231,25 +229,7 @@ export const createOpenCodeLifecycleRuntime = (deps) => {
|
||||
let launchWrapperType = null;
|
||||
|
||||
if (process.platform === 'win32' && state.useWslForOpencode) {
|
||||
const wslBinary = state.resolvedWslBinary || resolveWslExecutablePath();
|
||||
if (!wslBinary) {
|
||||
throw new Error('WSL executable not found while attempting to launch OpenCode from WSL');
|
||||
}
|
||||
|
||||
const wslOpencode = state.resolvedWslOpencodePath && state.resolvedWslOpencodePath.trim().length > 0
|
||||
? state.resolvedWslOpencodePath.trim()
|
||||
: 'opencode';
|
||||
const serveHost = hostname === '127.0.0.1' ? '0.0.0.0' : hostname;
|
||||
|
||||
binary = wslBinary;
|
||||
args = buildWslExecArgs([
|
||||
wslOpencode,
|
||||
'serve',
|
||||
'--hostname',
|
||||
serveHost,
|
||||
'--port',
|
||||
String(port),
|
||||
], state.resolvedWslDistro);
|
||||
throw new Error('Launching OpenCode through WSL is no longer supported. Install OpenCode natively on Windows and configure opencode.cmd or opencode.exe.');
|
||||
}
|
||||
|
||||
if (process.platform === 'win32' && !state.useWslForOpencode) {
|
||||
|
||||
@@ -85,8 +85,6 @@ const createRuntime = (overrides = {}) => {
|
||||
applyOpencodeBinaryFromSettings: vi.fn(async () => null),
|
||||
ensureOpencodeCliEnv: vi.fn(),
|
||||
ensureLocalOpenCodeServerPassword: vi.fn(async () => 'password'),
|
||||
buildWslExecArgs: vi.fn((args) => args),
|
||||
resolveWslExecutablePath: vi.fn(),
|
||||
resolveManagedOpenCodeLaunchSpec: vi.fn((binary) => ({ binary, args: [], wrapperType: null })),
|
||||
setOpenCodePort: vi.fn((port) => {
|
||||
state.openCodePort = port;
|
||||
|
||||
Reference in New Issue
Block a user