diff --git a/README.md b/README.md index 1d29ea6..b89f845 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,9 @@ Linux/Bash-интерфейс `proxy-client` поддерживает внешн [Установка, выбор режима, WSL и ежедневное использование](proxy-client/README.md) описаны рядом с пакетом. Windows PowerShell и ярлык `Codex Proxy` сохраняют -прежнюю интеграцию с `hproxy.local:12334`. +прежнюю интеграцию с `hproxy.local:12334`. Ярлык запускает упакованное +приложение через системный идентификатор и передаёт ему параметры Chromium +`--proxy-server` и `--proxy-bypass-list`. `Claude Proxy` передаёт переменные прокси и параметры Electron `--proxy-server` и `--proxy-bypass-list`, чтобы прокси применялся ко всему @@ -178,7 +180,7 @@ Linux/Bash-интерфейс `proxy-client` поддерживает внешн | `~/.bash_aliases` | Персональные алиасы bash | | `~/.gitconfig.local` | Персональные Git-настройки (`user.name`, `core.editor` и т.д.) | | `~/.local/bin/start-claude-proxy.ps1` | Скрипт запуска Claude Desktop для Windows с переменными прокси и параметрами Electron | -| `~/.local/bin/start-codex-proxy.ps1` | Windows launcher для Codex GUI с proxy-переменными | +| `~/.local/bin/start-codex-proxy.ps1` | Запуск Codex для Windows через системный идентификатор с параметрами прокси | | `~/.config/powershell/profile.extra.ps1` | Локальные дополнения к pwsh-профилю | | `~/.config/powershell/profile.d/*.ps1` | Фрагменты, загружаемые по алфавиту | | `~/.claude/settings.json` | Управляется Claude Code: `model`, `effortLevel`, «always allow» permissions | diff --git a/chezmoi/dot_local/bin/start-codex-proxy.ps1 b/chezmoi/dot_local/bin/start-codex-proxy.ps1 index 80bacd1..b3be928 100644 --- a/chezmoi/dot_local/bin/start-codex-proxy.ps1 +++ b/chezmoi/dot_local/bin/start-codex-proxy.ps1 @@ -5,6 +5,7 @@ $ProxyPort = 12334 $HttpProxy = "http://${ProxyHostName}:${ProxyPort}" $SocksProxy = "socks5://${ProxyHostName}:${ProxyPort}" $NoProxy = "${ProxyHostName},localhost,127.0.0.1,::1,[::1],.concept-software.ru" +$ProxyBypassList = "${ProxyHostName};localhost;127.0.0.1;[::1];*.concept-software.ru" function Set-ProxyEnvironment { $env:HTTP_PROXY = $HttpProxy @@ -48,7 +49,7 @@ function Add-WslEnvEntries { $env:WSLENV = [string]::Join(':', $Entries) } -function Get-CodexExecutable { +function Get-CodexApplication { $Package = Get-AppxPackage -Name 'OpenAI.Codex' -ErrorAction SilentlyContinue | Select-Object -First 1 @@ -67,11 +68,84 @@ function Get-CodexExecutable { throw "Codex Windows App executable was not found: $Executable" } - return $Executable + [PSCustomObject]@{ + AppUserModelId = "$($Package.PackageFamilyName)!$([string]$Application.Id)" + Executable = $Executable + } +} + +function Start-CodexApplication { + param( + [Parameter(Mandatory)] + [string]$AppUserModelId, + + [Parameter(Mandatory)] + [string]$Arguments + ) + + if (-not ('CodexProxyLauncher.ApplicationActivationManager' -as [type])) { + Add-Type -TypeDefinition @' +using System; +using System.Runtime.InteropServices; + +namespace CodexProxyLauncher +{ + [Flags] + public enum ActivateOptions : uint + { + None = 0 + } + + [ComImport] + [Guid("2e941141-7f97-4756-ba1d-9decde894a3d")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IApplicationActivationManager + { + [PreserveSig] + int ActivateApplication( + [MarshalAs(UnmanagedType.LPWStr)] string appUserModelId, + [MarshalAs(UnmanagedType.LPWStr)] string arguments, + ActivateOptions options, + out uint processId); + } + + [ComImport] + [Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")] + public class ApplicationActivationManager + { + } + + public static class ApplicationActivator + { + public static uint Activate(string appUserModelId, string arguments) + { + IApplicationActivationManager manager = + (IApplicationActivationManager)new ApplicationActivationManager(); + + uint processId; + int hResult = manager.ActivateApplication( + appUserModelId, + arguments, + ActivateOptions.None, + out processId); + + Marshal.ThrowExceptionForHR(hResult); + return processId; + } + } +} +'@ + } + + [void][CodexProxyLauncher.ApplicationActivator]::Activate( + $AppUserModelId, + $Arguments + ) } Set-ProxyEnvironment Add-WslEnvEntries -$CodexExecutable = Get-CodexExecutable -Start-Process -FilePath $CodexExecutable +$CodexApplication = Get-CodexApplication +$CodexArguments = "--proxy-server=${HttpProxy} --proxy-bypass-list=${ProxyBypassList}" +Start-CodexApplication -AppUserModelId $CodexApplication.AppUserModelId -Arguments $CodexArguments