fix(kimi): скрытый запускатель и запасной путь установки

- Зачем: при повторном запуске через ярлык Kimi цеплялся к консоли pwsh и удерживал окно терминала открытым ради своих логов.
- Что: ярлык переведён на скрытый VBS-запускатель (как у Claude Proxy); добавлен запасной путь %ProgramFiles%\Kimi для установки на всех пользователей.
- Проверка: синтаксис скриптов проверен парсером PowerShell, tests/test_proxy_env_sync.py зелёный.
This commit is contained in:
Dmitriy Dementiev committed 2026-10-23 14:15:46 +03:00
1 parent 5b2eef4881
commit b36ce50e12
4 files changed
+55 -21

No files matched your search

+7 -3
View File
@@ -129,9 +129,12 @@ Codex и Claude Code могут брать прокси из своих наст
Если Claude уже запущен обычным способом, его нужно полностью закрыть перед Если Claude уже запущен обычным способом, его нужно полностью закрыть перед
запуском через `Claude Proxy`. запуском через `Claude Proxy`.
Ярлык `Kimi Proxy` запускает Kimi Desktop (`%LOCALAPPDATA%\Programs\Kimi\Kimi.exe`) Ярлык `Kimi Proxy` запускает Kimi Desktop с теми же параметрами Electron
с теми же параметрами Electron `--proxy-server` и `--proxy-bypass-list`, что и `--proxy-server` и `--proxy-bypass-list`, что и `Codex Proxy`. Исполняемый файл
`Codex Proxy`. Если Kimi уже запущен, его нужно полностью закрыть перед запуском ищется в `%LOCALAPPDATA%\Programs\Kimi` и в `%ProgramFiles%\Kimi` (установка на
всех пользователей). Ярлык использует скрытый промежуточный запускатель, иначе
Kimi цепляется к консоли ярлыка и удерживает окно терминала открытым ради своих
логов. Если Kimi уже запущен, его нужно полностью закрыть перед запуском
через `Kimi Proxy`. через `Kimi Proxy`.
Список хостов, которые идут мимо прокси, продублирован в профилях Codex, Список хостов, которые идут мимо прокси, продублирован в профилях Codex,
@@ -219,6 +222,7 @@ PowerShell и VS Code: одного общего файла у Windows и WSL н
| `~/.local/bin/start-claude-proxy.vbs` | Скрытый запуск PowerShell-скрипта без привязки Claude к видимому окну терминала | | `~/.local/bin/start-claude-proxy.vbs` | Скрытый запуск PowerShell-скрипта без привязки Claude к видимому окну терминала |
| `~/.local/bin/start-codex-proxy.ps1` | Запуск Codex для Windows через системный идентификатор; прокси Electron задается параметрами, а `codex.exe` читает `~/.codex/.env` | | `~/.local/bin/start-codex-proxy.ps1` | Запуск Codex для Windows через системный идентификатор; прокси Electron задается параметрами, а `codex.exe` читает `~/.codex/.env` |
| `~/.local/bin/start-kimi-proxy.ps1` | Запуск Kimi Desktop для Windows с параметрами прокси Electron | | `~/.local/bin/start-kimi-proxy.ps1` | Запуск Kimi Desktop для Windows с параметрами прокси Electron |
| `~/.local/bin/start-kimi-proxy.vbs` | Скрытый запуск PowerShell-скрипта без привязки Kimi к видимому окну терминала |
| `~/.local/bin/start-chatgpt-proxy` | Запуск Linux-приложения ChatGPT через активную настройку `proxy-client` | | `~/.local/bin/start-chatgpt-proxy` | Запуск Linux-приложения ChatGPT через активную настройку `proxy-client` |
| `~/.local/share/applications/chatgpt-proxy.desktop` | Отдельный Linux-ярлык `ChatGPT Proxy`, не подменяющий штатный `ChatGPT` | | `~/.local/share/applications/chatgpt-proxy.desktop` | Отдельный Linux-ярлык `ChatGPT Proxy`, не подменяющий штатный `ChatGPT` |
| `~/.config/powershell/profile.extra.ps1` | Локальные дополнения к pwsh-профилю | | `~/.config/powershell/profile.extra.ps1` | Локальные дополнения к pwsh-профилю |
@@ -5,6 +5,7 @@ if (-not ($IsWindows -or $PSVersionTable.PSEdition -eq 'Desktop')) {
} }
$LauncherPath = Join-Path $HOME '.local\bin\start-kimi-proxy.ps1' $LauncherPath = Join-Path $HOME '.local\bin\start-kimi-proxy.ps1'
$LauncherHostPath = Join-Path $HOME '.local\bin\start-kimi-proxy.vbs'
$ProgramsPath = [Environment]::GetFolderPath('Programs') $ProgramsPath = [Environment]::GetFolderPath('Programs')
if ([string]::IsNullOrWhiteSpace($ProgramsPath)) { if ([string]::IsNullOrWhiteSpace($ProgramsPath)) {
Write-Warning 'Start Menu Programs folder was not found.' Write-Warning 'Start Menu Programs folder was not found.'
@@ -12,23 +13,18 @@ if ([string]::IsNullOrWhiteSpace($ProgramsPath)) {
} }
$ShortcutPath = Join-Path $ProgramsPath 'Kimi Proxy.lnk' $ShortcutPath = Join-Path $ProgramsPath 'Kimi Proxy.lnk'
$PwshAliasPath = Join-Path $env:LOCALAPPDATA 'Microsoft\WindowsApps\pwsh.exe' $TargetPath = Join-Path $env:WINDIR 'System32\wscript.exe'
$PwshCommand = Get-Command pwsh -ErrorAction SilentlyContinue $Arguments = "//NoLogo `"$LauncherHostPath`""
if (Test-Path -LiteralPath $PwshAliasPath) {
$TargetPath = $PwshAliasPath
} elseif ($null -ne $PwshCommand) {
$TargetPath = $PwshCommand.Source
} else {
$TargetPath = 'pwsh.exe'
}
$Arguments = "-NoLogo -NoProfile -ExecutionPolicy Bypass -File `"$LauncherPath`""
$WorkingDirectory = $env:USERPROFILE $WorkingDirectory = $env:USERPROFILE
$IconLocation = "$TargetPath,0"
$KimiExecutable = Join-Path $env:LOCALAPPDATA 'Programs\Kimi\Kimi.exe' $KimiExecutable = @(
if (Test-Path -LiteralPath $KimiExecutable) { (Join-Path $env:LOCALAPPDATA 'Programs\Kimi\Kimi.exe'),
(Join-Path $env:ProgramFiles 'Kimi\Kimi.exe')
) | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1
if ($null -ne $KimiExecutable) {
$IconLocation = "$KimiExecutable,0" $IconLocation = "$KimiExecutable,0"
} else {
$IconLocation = "$LauncherPath,0"
} }
New-Item -ItemType Directory -Path (Split-Path -Parent $ShortcutPath) -Force | Out-Null New-Item -ItemType Directory -Path (Split-Path -Parent $ShortcutPath) -Force | Out-Null
+10 -4
View File
@@ -6,12 +6,18 @@ $HttpProxy = "http://${ProxyHostName}:${ProxyPort}"
$ProxyBypassList = "${ProxyHostName};localhost;127.0.0.1;[::1];*.concept-software.ru;dementev.space;*.dementev.space" $ProxyBypassList = "${ProxyHostName};localhost;127.0.0.1;[::1];*.concept-software.ru;dementev.space;*.dementev.space"
function Get-KimiApplication { function Get-KimiApplication {
$Executable = Join-Path $env:LOCALAPPDATA 'Programs\Kimi\Kimi.exe' $Candidates = @(
if (-not (Test-Path -LiteralPath $Executable)) { (Join-Path $env:LOCALAPPDATA 'Programs\Kimi\Kimi.exe'),
throw "Kimi Desktop не найден: ожидался файл '$Executable'." (Join-Path $env:ProgramFiles 'Kimi\Kimi.exe')
)
foreach ($Executable in $Candidates) {
if (Test-Path -LiteralPath $Executable) {
return $Executable
}
} }
return $Executable throw "Kimi Desktop не найден: проверены пути '$($Candidates -join "', '")'."
} }
function Assert-KimiNotRunning { function Assert-KimiNotRunning {
@@ -0,0 +1,28 @@
Option Explicit
Dim fileSystem
Dim launcherPath
Dim powerShellPath
Dim command
Dim exitCode
Dim shell
Set fileSystem = CreateObject("Scripting.FileSystemObject")
Set shell = CreateObject("WScript.Shell")
launcherPath = shell.ExpandEnvironmentStrings("%USERPROFILE%\.local\bin\start-kimi-proxy.ps1")
powerShellPath = shell.ExpandEnvironmentStrings("%LOCALAPPDATA%\Microsoft\WindowsApps\pwsh.exe")
If Not fileSystem.FileExists(powerShellPath) Then
powerShellPath = "pwsh.exe"
End If
command = """" & powerShellPath & _
""" -NoLogo -NoProfile -ExecutionPolicy Bypass -File """ & _
launcherPath & """"
exitCode = shell.Run(command, 0, True)
If exitCode <> 0 Then
MsgBox "Не удалось запустить Kimi Proxy. Код ошибки: " & exitCode, _
vbCritical, "Kimi Proxy"
End If