mirror of
https://github.com/stablyai/orca.git
synced 2026-10-31 09:07:40 +00:00
* Require Codex 0.136.0 for native chats
* Add host-owned Codex install and update actions
* Bind Codex checks and maintenance to the selected installation
* Resolve Windows updater cleanup through system helpers
* Use one child environment for Codex checks and launch
* Expire Codex readiness and reconcile current host jobs
* Resolve Codex checks against the child command search path
* Restrict global npm repair to the selected Codex install layout
* Pin the host updater directory through Windows supervision
* Synchronize Codex maintenance fixtures on readiness
* Unify Codex notices and recover version-refused chats
* Route Codex recovery to the operation that remains
* Preserve Codex setup execution errors in the job log
* Preserve UTF-8 in Codex setup logs
* Remove unused Codex host installation detector
* Require host administration for Codex maintenance
* Show a missing Codex explanation once
* test(native-chat): give scripted Codex runtimes their installation fact; keep the registry out of the relay
Runtime tests that drive a scripted Codex app-server still ran the new
version check against whatever codex was on the machine's PATH: refused
on CI (no codex), and on a dev machine it ran the real codex --version.
A scripted transport now must state the Codex it stands for
(readCodexInstallation), asserted at install, and the tests get it from
one scriptedCodexTransport fixture.
The relay's Codex maintenance path reached @orca/windows-registry through
resolvePathEnvKey's re-export in windows-environment-path; import it from
its registry-free module instead.
Also update the catalog-probe test for the shared child environment.
* refactor(native-chat): drop the Update Codex action; keep Install for a missing Codex
A too-old Codex now gets only the plain message ("Codex X is too old for
chats. Update to 0.136.0 or newer.") with no button and no job. The
existing rechecks (window focus, the <=30 s expiry of a saved result)
retry the refused chat once the user has updated Codex themselves.
A missing Codex keeps the Install Codex button: `npm install -g
@openai/codex` with the npm on the chat's PATH, as a host-run job with
its log, then a recheck and recovery. A configured Command that is
missing gets the message only, since a global npm install would not
land at that path.
Removed: the `codex update` command and its 0.126 floor, manual
instructions, npm layout and launcher identity detection, the action
descriptor (install|update) and its titles, the legacy capability, and
the SSH relay maintenance path (structured chat never runs over SSH or
WSL), so the relay preflight handler is back to main's.
* refactor(native-chat): keep Install Codex in Settings only
When Codex isn't installed, main already hides Codex from the New tab menu,
so the in-chat Install button was almost never reachable. Settings → Agents
already shows "Codex isn't installed." with Install Codex.
- Chats and the new-workspace composer now only state "Codex isn't
installed." (no button, no install job from the chat).
- The Install action, its busy spinner and the host-busy subscription move
into the Settings Codex row, the only place that starts the job.
- The store no longer re-checks every other workspace context when a job
finishes. A refused chat recovers through the same re-check a too-old
Codex uses (window focus, or the <=30 s expiry of a saved result).
- The chat recovery key no longer includes the install job id.
- Tests: Settings drives the install; a new test proves a chat refused for
a missing Codex recovers through focus after a Settings install, not
through the job; the expiry recovery test covers missing and too old.
* refactor(codex): check chat compatibility when acquiring the child
* Restore workspace submit guard and simplify Codex maintenance
* Keep only the Codex chat minimum version
62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
import { compareAppVersions, isValidAppVersion, parseCliVersion } from './app-version'
|
|
|
|
export const CODEX_MINIMUM_SUPPORTED_VERSION = '0.136.0'
|
|
|
|
export type CodexCliInstallation = {
|
|
status: 'missing' | 'unsupported' | 'ready' | 'unknown'
|
|
version: string | null
|
|
minimumVersion: string
|
|
}
|
|
|
|
export type CodexInstallationProblem = {
|
|
installedVersion: string | null
|
|
minimumVersion: string
|
|
}
|
|
|
|
export function parseCodexCliVersion(output: string | null | undefined): string | null {
|
|
const lines = output?.split(/\r?\n/).map((line) => line.trim()) ?? []
|
|
const identified = lines.filter((line) => /^codex(?:-cli)?\s/i.test(line))
|
|
const candidates = identified.length ? identified : lines.filter(Boolean)
|
|
const versions = candidates.map((line) => {
|
|
const value = line.replace(/^codex(?:-cli)?\s+/i, '').replace(/^v/i, '')
|
|
return isValidAppVersion(value) ? parseCliVersion(value) : null
|
|
})
|
|
return versions.length && versions.every((version) => version !== null && version === versions[0])
|
|
? versions[0]
|
|
: null
|
|
}
|
|
|
|
export function codexCliInstallation(
|
|
installed: boolean,
|
|
output: string | null
|
|
): CodexCliInstallation {
|
|
const version = parseCodexCliVersion(output)
|
|
return {
|
|
status: !installed
|
|
? 'missing'
|
|
: version === null
|
|
? 'unknown'
|
|
: compareAppVersions(version, CODEX_MINIMUM_SUPPORTED_VERSION) < 0
|
|
? 'unsupported'
|
|
: 'ready',
|
|
version,
|
|
minimumVersion: CODEX_MINIMUM_SUPPORTED_VERSION
|
|
}
|
|
}
|
|
|
|
export function readCodexInstallationProblem(value: unknown): CodexInstallationProblem | undefined {
|
|
if (
|
|
typeof value !== 'object' ||
|
|
value === null ||
|
|
!('installedVersion' in value) ||
|
|
!('minimumVersion' in value) ||
|
|
(value.installedVersion !== null &&
|
|
(typeof value.installedVersion !== 'string' || !isValidAppVersion(value.installedVersion))) ||
|
|
typeof value.minimumVersion !== 'string' ||
|
|
!isValidAppVersion(value.minimumVersion)
|
|
) {
|
|
return undefined
|
|
}
|
|
return { installedVersion: value.installedVersion, minimumVersion: value.minimumVersion }
|
|
}
|