mirror of
https://github.com/stablyai/orca.git
synced 2026-10-08 00:02:38 +00:00
* fix(terminal): give plain shells and cmd.exe Codex launches --no-daemon Plain bash, zsh and fish tabs were never wrapped, so a typed codex skipped the shell function that adds --no-daemon. Wrap them (bash keeps its prompt and DEBUG trap untouched unless Orca asked for command markers), add --no-daemon host-side where no function can run (cmd.exe, path-named binaries), and move new tabs to a v38 terminal daemon so they get the new wrappers. * fix(terminal): keep plain bash a login shell and give the setup gate the codex function Plain bash and Git Bash tabs launch exactly as before again: the rcfile wrapper would have made every one a non-login shell. Plain tabs on the user's configured shell args stay unwrapped on both transports. The wait-for-setup gate's bash -lc now defines the codex function, so a sequenced Codex launch gets --no-daemon from the binary it actually runs. * fix(terminal): define the setup gate's codex function after setup finishes Setup can be what puts codex on PATH, so defining the function before the marker wait found no binary and skipped --no-daemon. * refactor(terminal): fold the SSH/WSL guard into the Codex launch planner and bound the gate test * fix(terminal): honour the pane's env deletions in the Codex opt-out check Also pin the setup-gate test's fake codex ahead of path_helper's PATH. * revert(terminal): launch plain zsh and fish tabs exactly as on main Drops the always-wrap for plain zsh and fish, the configured-args guard that only served it, and the v38 daemon bump: the daemon's launch configs and generated wrappers are byte-identical to main again. Keeps the host-side --no-daemon for cmd.exe and path-named launches and the setup gate's codex function.
95 lines
4.7 KiB
TypeScript
95 lines
4.7 KiB
TypeScript
// Orca's `codex` shell function for every shell family: runs launch prep and adds
|
|
// --no-daemon. Pure text, so any host that writes a shell script can embed it.
|
|
// Why --no-daemon: Codex 0.156+ otherwise shares one server per CODEX_HOME that runs every tab's
|
|
// hooks with the first tab's Orca env and dies with it (#22873). These args need that server or exit 2.
|
|
export const CODEX_SHARED_SERVER_ARGS = ['agents', 'queue', '--no-daemon', '--remote'] as const
|
|
const CODEX_SHARED_SERVER_ARG_PATTERN = `^(${CODEX_SHARED_SERVER_ARGS.join('|')}|--remote=.*)$`
|
|
|
|
export function getPosixCodexShellLaunchPreflight(): string {
|
|
return `# Why: a typed alias expands inside the shell, after pane launch prep.
|
|
# Why unalias inside the substitution: an alias named codex makes command -v
|
|
# report the alias text, and the subshell leaves the user's own alias intact.
|
|
# Why || : twice — zsh alone aborts inside the substitution, but every shell's
|
|
# assignment adopts its exit status, so an absent codex trips set -e in bash too.
|
|
__orca_codex_binary="$(unalias codex 2>/dev/null || :; command -v codex 2>/dev/null || :)"
|
|
if [[ -n "\${__orca_codex_binary:-}" && -x "\${__orca_codex_binary}" ]]; then
|
|
# Why the function reserved word: it suppresses alias expansion of the name,
|
|
# which otherwise rewrites this header at parse time and aborts the whole file.
|
|
function codex {
|
|
# Why local: zsh's warn_create_global warns for each global a function creates.
|
|
local __orca_codex_arg __orca_codex_isolate="\${ORCA_CODEX_ISOLATE:-1}"
|
|
if [[ -n "\${ORCA_CODEX_LAUNCH_PREFLIGHT:-}" && -x "\${ORCA_CODEX_LAUNCH_PREFLIGHT}" ]]; then
|
|
"\${ORCA_CODEX_LAUNCH_PREFLIGHT}" agent hooks prepare-codex >/dev/null 2>&1 || :
|
|
fi
|
|
for __orca_codex_arg in "$@"; do
|
|
case "$__orca_codex_arg" in ${CODEX_SHARED_SERVER_ARGS.join('|')}|--remote=*) __orca_codex_isolate=0 ;; esac
|
|
done
|
|
# Why probe every launch: a cached answer goes stale across an upgrade, and 0.155 and older exit 2 on the flag.
|
|
if [[ "$__orca_codex_isolate" != 0 ]]; then
|
|
case "$(command codex --help 2>/dev/null </dev/null)" in *--no-daemon*) set -- --no-daemon "$@" ;; esac
|
|
fi
|
|
command codex "$@"
|
|
}
|
|
fi
|
|
unset __orca_codex_binary
|
|
`
|
|
}
|
|
|
|
export function getFishCodexShellLaunchPreflight(): string {
|
|
return `# Why captured: an unquoted (type -t codex) expands to zero words when codex is
|
|
# absent, leaving "test = file" — fish then errors instead of failing closed.
|
|
# Quoting in place is not the fix; fish never substitutes inside double quotes.
|
|
set -l __orca_codex_type (type -t codex 2>/dev/null)
|
|
if test "$__orca_codex_type" = file
|
|
function codex
|
|
if test -x "$ORCA_CODEX_LAUNCH_PREFLIGHT"
|
|
command "$ORCA_CODEX_LAUNCH_PREFLIGHT" agent hooks prepare-codex >/dev/null 2>&1; or true
|
|
end
|
|
if test "$ORCA_CODEX_ISOLATE" != 0; and not string match -qr -- '${CODEX_SHARED_SERVER_ARG_PATTERN}' $argv; and command codex --help 2>/dev/null </dev/null | string match -q -- '*--no-daemon*'
|
|
set argv --no-daemon $argv
|
|
end
|
|
command codex $argv
|
|
end
|
|
end
|
|
set -e __orca_codex_type`
|
|
}
|
|
|
|
export function getPowerShellCodexShellLaunchPreflight(): string {
|
|
return `$orcaCodexCommand = Get-Command codex -ErrorAction SilentlyContinue | Select-Object -First 1
|
|
if ($orcaCodexCommand -and
|
|
$orcaCodexCommand.CommandType -in @("Application", "ExternalScript")) {
|
|
function Global:codex {
|
|
$orcaCodexExecutable = Get-Command codex -CommandType Application,ExternalScript -ErrorAction SilentlyContinue | Select-Object -First 1
|
|
if (-not $orcaCodexExecutable) {
|
|
Write-Error "codex executable not found"
|
|
$global:LASTEXITCODE = 127
|
|
return
|
|
}
|
|
$orcaCodexFlags = @()
|
|
# Why try/catch: under the user's $ErrorActionPreference = 'Stop', a failing prep or probe must not abort the launch.
|
|
if ($env:ORCA_CODEX_LAUNCH_PREFLIGHT) {
|
|
try {
|
|
& $env:ORCA_CODEX_LAUNCH_PREFLIGHT agent hooks prepare-codex *> $null
|
|
} catch {
|
|
}
|
|
}
|
|
if ($env:ORCA_CODEX_ISOLATE -ne '0' -and -not (@($args) -cmatch '${CODEX_SHARED_SERVER_ARG_PATTERN}')) {
|
|
try {
|
|
if ((& $orcaCodexExecutable.Source --help 2>$null) -match '--no-daemon') {
|
|
$orcaCodexFlags = @('--no-daemon')
|
|
}
|
|
} catch {
|
|
}
|
|
}
|
|
# Why: a native command inside a function never sees the function's pipeline input on its own.
|
|
if ($MyInvocation.ExpectingInput) {
|
|
$input | & $orcaCodexExecutable.Source @orcaCodexFlags @args
|
|
} else {
|
|
& $orcaCodexExecutable.Source @orcaCodexFlags @args
|
|
}
|
|
$global:LASTEXITCODE = $LASTEXITCODE
|
|
}
|
|
}
|
|
Remove-Variable orcaCodexCommand -ErrorAction SilentlyContinue`
|
|
}
|