Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
ae3793e
chore(apply-patch) unicode scenario (#8141)
dylan-hurd-oai Dec 17, 2025
ebd1099
fix the models script (#8163)
aibrahim-oai Dec 17, 2025
2041b72
chore: dedup review result duplication (#8057)
jif-oai Dec 17, 2025
4897efc
Add public skills + improve repo skill discovery and error UX (#8098)
xl-openai Dec 17, 2025
813bdb9
feat: fallback unified_exec to shell_command (#8075)
jif-oai Dec 17, 2025
2bf5767
fix: flaky test 6 (#8175)
jif-oai Dec 17, 2025
0abaf1b
nit: prevent race in event rendering (#8181)
jif-oai Dec 17, 2025
2e7e4f6
nit: drop dead branch with `unified_exec` tool (#8182)
jif-oai Dec 17, 2025
45c164a
nit: doc (#8186)
jif-oai Dec 17, 2025
de3fa03
feat: change ConfigLayerName into a disjoint union rather than a simp…
bolinfest Dec 17, 2025
9352c6b
feat: Constrain values for approval_policy (#7778)
gt-oai Dec 17, 2025
ac6ba28
feat: experimental menu (#8071)
jif-oai Dec 17, 2025
f74e0cd
feat: unified exec footer (#8117)
jif-oai Dec 17, 2025
a2cc003
chore: move back stuff out of beta program (#8199)
jif-oai Dec 17, 2025
3702793
chore: update listMcpServerStatus to be non-blocking (#8151)
shijie-oai Dec 17, 2025
9f28c62
fix: proper skills dir cleanup (#8194)
jif-oai Dec 17, 2025
167553f
fix: session downgrade (#8196)
jif-oai Dec 17, 2025
3d92b44
feat: add config to disable warnings around ghost snapshot (#8178)
jif-oai Dec 17, 2025
1e9babe
fix: PathBuf -> AbsolutePathBuf in ConfigToml struct (#8205)
bolinfest Dec 17, 2025
df35189
feat: make list_models non-blocking (#8198)
shijie-oai Dec 17, 2025
a9a7cf3
download new windows binaries when staging npm package (#8203)
iceweasel-oai Dec 17, 2025
927a6ac
Load models from static file (#8153)
aibrahim-oai Dec 17, 2025
25ecd0c
speed and reliability improvements for setting reads ACLs (#8216)
iceweasel-oai Dec 17, 2025
774bd9e
feat: model picker (#8209)
aibrahim-oai Dec 18, 2025
a879701
chore: cleanup Config instantiation codepaths (#8226)
bolinfest Dec 18, 2025
6f102e1
Show migration link (#8228)
aibrahim-oai Dec 18, 2025
da3869e
Support SYSTEM skills. (#8220)
xl-openai Dec 18, 2025
50dafbc
Make loading malformed skills fail-open (#8243)
gverma-openai Dec 18, 2025
580c59a
fix: introduce ConfigBuilder (#8235)
bolinfest Dec 18, 2025
e1deeef
Change "Team" to "Buisness" and add Education (#8221)
ethantphillips Dec 18, 2025
5c8d221
Reintroduce feature flags for skills. (#8244)
xl-openai Dec 18, 2025
cea76b8
nit: ui background terminals (#8255)
jif-oai Dec 18, 2025
1cfacbf
chore: add beta features (#8201)
jif-oai Dec 18, 2025
9bf41e9
chore: simplify loading of Mac-specific logic in config_loader (#8248)
bolinfest Dec 18, 2025
374d591
chores: clean picker (#8232)
aibrahim-oai Dec 18, 2025
deafead
chore: prefer AsRef<Path> to &Path (#8249)
bolinfest Dec 18, 2025
4c9d589
docs: clarify codex resume --all (CWD column & filtering) (#8264)
magsonleone Dec 18, 2025
f084e52
caribou (#8265)
aibrahim-oai Dec 18, 2025
aea47b6
feat: add name to beta features (#8266)
jif-oai Dec 18, 2025
425c8dc
cloud: default to current branch in cloud exec (#7460)
squinlan-oai Dec 18, 2025
b903285
feat: migrate to new constraint-based loading strategy (#8251)
bolinfest Dec 18, 2025
7157421
splash screen (#8270)
aibrahim-oai Dec 18, 2025
be274cb
tui: improve rendering of search cell (#8273)
nornagon-openai Dec 18, 2025
2e5d52c
[release] Add a dmg target for MacOS (#8207)
celia-oai Dec 18, 2025
ad41182
grant read ACL to exe directory first so we can call the command runn…
iceweasel-oai Dec 18, 2025
e9023d5
use mainline version as baseline in ci (#8271)
iceweasel-oai Dec 18, 2025
a299fc2
Merge upstream/main into update123
ScriptedAlchemy Dec 18, 2025
b704101
Derive Default for SetupMode
ScriptedAlchemy Dec 18, 2025
2b7baaf
Do not add background events to history
ScriptedAlchemy Dec 18, 2025
0ba5584
sdk/native: add programmatic skills (inline)
ScriptedAlchemy Dec 18, 2025
f798184
core: clean up shell snapshot on shutdown
ScriptedAlchemy Dec 18, 2025
12d79ea
test(sdk/native): cover conversation and review APIs
ScriptedAlchemy Dec 19, 2025
d5d6e63
Sync codex-rs with upstream main
ScriptedAlchemy Dec 19, 2025
b1d9c5d
Ignore iterm in codespell
ScriptedAlchemy Dec 19, 2025
3c682c5
fix: add 'iterm' to codespell ignore list
ScriptedAlchemy Dec 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .codespellignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
iTerm
iterm
psuedo
2 changes: 1 addition & 1 deletion .codespellrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
skip = .git*,vendor,*-lock.yaml,*.lock,.codespellrc,.codespellignore,*test.ts,*.jsonl,frame*.txt,**/node_modules/**,**/dist/**,**/target/**,sdk/native/dist-examples_ignored/**,sdk/native/dist-examples/**,sdk/native/package-lock.json,**/.cache/**,**/.venv/**,**/.codex-ci/**,**/.fastembed_cache/**
check-hidden = true
ignore-regex = ^\s*"image/\S+": ".*|\b(afterAll)\b
ignore-words-list = ratatui,ser,iTerm,trys,vEw,ANE,psuedo
ignore-words-list = ratatui,ser,iTerm,iterm,trys,vEw,ANE,psuedo
70 changes: 52 additions & 18 deletions .github/actions/macos-code-sign/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ inputs:
target:
description: Rust compilation target triple (e.g. aarch64-apple-darwin).
required: true
sign-binaries:
description: Whether to sign and notarize the macOS binaries.
required: false
default: "true"
sign-dmg:
description: Whether to sign and notarize the macOS dmg.
required: false
default: "true"
apple-certificate:
description: Base64-encoded Apple signing certificate (P12).
required: true
Expand Down Expand Up @@ -107,6 +115,7 @@ runs:
echo "::add-mask::$APPLE_CODESIGN_IDENTITY"

- name: Sign macOS binaries
if: ${{ inputs.sign-binaries == 'true' }}
shell: bash
run: |
set -euo pipefail
Expand All @@ -127,6 +136,7 @@ runs:
done

- name: Notarize macOS binaries
if: ${{ inputs.sign-binaries == 'true' }}
shell: bash
env:
APPLE_NOTARIZATION_KEY_P8: ${{ inputs.apple-notarization-key-p8 }}
Expand All @@ -149,6 +159,8 @@ runs:
}
trap cleanup_notary EXIT

source "$GITHUB_ACTION_PATH/notary_helpers.sh"

notarize_binary() {
local binary="$1"
local source_path="codex-rs/target/${{ inputs.target }}/release/${binary}"
Expand All @@ -162,31 +174,53 @@ runs:
rm -f "$archive_path"
ditto -c -k --keepParent "$source_path" "$archive_path"

submission_json=$(xcrun notarytool submit "$archive_path" \
--key "$notary_key_path" \
--key-id "$APPLE_NOTARIZATION_KEY_ID" \
--issuer "$APPLE_NOTARIZATION_ISSUER_ID" \
--output-format json \
--wait)

status=$(printf '%s\n' "$submission_json" | jq -r '.status // "Unknown"')
submission_id=$(printf '%s\n' "$submission_json" | jq -r '.id // ""')
notarize_submission "$binary" "$archive_path" "$notary_key_path"
}

if [[ -z "$submission_id" ]]; then
echo "Failed to retrieve submission ID for $binary"
exit 1
fi
notarize_binary "codex"
notarize_binary "codex-responses-api-proxy"

echo "::notice title=Notarization::$binary submission ${submission_id} completed with status ${status}"
- name: Sign and notarize macOS dmg
if: ${{ inputs.sign-dmg == 'true' }}
shell: bash
env:
APPLE_NOTARIZATION_KEY_P8: ${{ inputs.apple-notarization-key-p8 }}
APPLE_NOTARIZATION_KEY_ID: ${{ inputs.apple-notarization-key-id }}
APPLE_NOTARIZATION_ISSUER_ID: ${{ inputs.apple-notarization-issuer-id }}
run: |
set -euo pipefail

if [[ "$status" != "Accepted" ]]; then
echo "Notarization failed for ${binary} (submission ${submission_id}, status ${status})"
for var in APPLE_CODESIGN_IDENTITY APPLE_NOTARIZATION_KEY_P8 APPLE_NOTARIZATION_KEY_ID APPLE_NOTARIZATION_ISSUER_ID; do
if [[ -z "${!var:-}" ]]; then
echo "$var is required"
exit 1
fi
done

notary_key_path="${RUNNER_TEMP}/notarytool.key.p8"
echo "$APPLE_NOTARIZATION_KEY_P8" | base64 -d > "$notary_key_path"
cleanup_notary() {
rm -f "$notary_key_path"
}
trap cleanup_notary EXIT

notarize_binary "codex"
notarize_binary "codex-responses-api-proxy"
source "$GITHUB_ACTION_PATH/notary_helpers.sh"

dmg_path="codex-rs/target/${{ inputs.target }}/release/codex-${{ inputs.target }}.dmg"

if [[ ! -f "$dmg_path" ]]; then
echo "dmg $dmg_path not found"
exit 1
fi

keychain_args=()
if [[ -n "${APPLE_CODESIGN_KEYCHAIN:-}" && -f "${APPLE_CODESIGN_KEYCHAIN}" ]]; then
keychain_args+=(--keychain "${APPLE_CODESIGN_KEYCHAIN}")
fi

codesign --force --timestamp --sign "$APPLE_CODESIGN_IDENTITY" "${keychain_args[@]}" "$dmg_path"
notarize_submission "codex-${{ inputs.target }}.dmg" "$dmg_path" "$notary_key_path"
xcrun stapler staple "$dmg_path"

- name: Remove signing keychain
if: ${{ always() }}
Expand Down
46 changes: 46 additions & 0 deletions .github/actions/macos-code-sign/notary_helpers.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env bash

notarize_submission() {
local label="$1"
local path="$2"
local notary_key_path="$3"

if [[ -z "${APPLE_NOTARIZATION_KEY_ID:-}" || -z "${APPLE_NOTARIZATION_ISSUER_ID:-}" ]]; then
echo "APPLE_NOTARIZATION_KEY_ID and APPLE_NOTARIZATION_ISSUER_ID are required for notarization"
exit 1
fi

if [[ -z "$notary_key_path" || ! -f "$notary_key_path" ]]; then
echo "Notary key file $notary_key_path not found"
exit 1
fi

if [[ ! -f "$path" ]]; then
echo "Notarization payload $path not found"
exit 1
fi

local submission_json
submission_json=$(xcrun notarytool submit "$path" \
--key "$notary_key_path" \
--key-id "$APPLE_NOTARIZATION_KEY_ID" \
--issuer "$APPLE_NOTARIZATION_ISSUER_ID" \
--output-format json \
--wait)

local status submission_id
status=$(printf '%s\n' "$submission_json" | jq -r '.status // "Unknown"')
submission_id=$(printf '%s\n' "$submission_json" | jq -r '.id // ""')

if [[ -z "$submission_id" ]]; then
echo "Failed to retrieve submission ID for $label"
exit 1
fi

echo "::notice title=Notarization::$label submission ${submission_id} completed with status ${status}"

if [[ "$status" != "Accepted" ]]; then
echo "Notarization failed for ${label} (submission ${submission_id}, status ${status})"
exit 1
fi
}
3 changes: 2 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ jobs:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
CODEX_VERSION=0.40.0
# Use a rust-release version that includes all native binaries.
CODEX_VERSION=0.74.0
OUTPUT_DIR="${RUNNER_TEMP}"
python3 ./scripts/stage_npm_packages.py \
--release-version "$CODEX_VERSION" \
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/rust-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@ jobs:

if [[ "${{ github.event_name }}" == "pull_request" ]]; then
BASE_SHA='${{ github.event.pull_request.base.sha }}'
HEAD_SHA='${{ github.event.pull_request.head.sha }}'
echo "Base SHA: $BASE_SHA"
# List files changed between base and current HEAD (merge-base aware)
mapfile -t files < <(git diff --name-only --no-renames "$BASE_SHA"...HEAD)
echo "Head SHA: $HEAD_SHA"
# List files changed between base and PR head
mapfile -t files < <(git diff --name-only --no-renames "$BASE_SHA" "$HEAD_SHA")
else
# On push / manual runs, default to running everything
files=("codex-rs/force" ".github/force")
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/rust-release-prepare.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,3 @@ jobs:
branch: "bot/update-models-json"
reviewers: "pakrym-oai,aibrahim-oai"
delete-branch: true
path: codex-rs
71 changes: 68 additions & 3 deletions .github/workflows/rust-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,72 @@ jobs:
account-name: ${{ secrets.AZURE_TRUSTED_SIGNING_ACCOUNT_NAME }}
certificate-profile-name: ${{ secrets.AZURE_TRUSTED_SIGNING_CERTIFICATE_PROFILE_NAME }}

- if: ${{ matrix.runner == 'macos-15-xlarge' }}
name: MacOS code signing
- if: ${{ runner.os == 'macOS' }}
name: MacOS code signing (binaries)
uses: ./.github/actions/macos-code-sign
with:
target: ${{ matrix.target }}
sign-binaries: "true"
sign-dmg: "false"
apple-certificate: ${{ secrets.APPLE_CERTIFICATE_P12 }}
apple-certificate-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
apple-notarization-key-p8: ${{ secrets.APPLE_NOTARIZATION_KEY_P8 }}
apple-notarization-key-id: ${{ secrets.APPLE_NOTARIZATION_KEY_ID }}
apple-notarization-issuer-id: ${{ secrets.APPLE_NOTARIZATION_ISSUER_ID }}

- if: ${{ runner.os == 'macOS' }}
name: Build macOS dmg
shell: bash
run: |
set -euo pipefail

target="${{ matrix.target }}"
release_dir="target/${target}/release"
dmg_root="${RUNNER_TEMP}/codex-dmg-root"
volname="Codex (${target})"
dmg_path="${release_dir}/codex-${target}.dmg"

# The previous "MacOS code signing (binaries)" step signs + notarizes the
# built artifacts in `${release_dir}`. This step packages *those same*
# signed binaries into a dmg.
codex_binary_path="${release_dir}/codex"
proxy_binary_path="${release_dir}/codex-responses-api-proxy"

rm -rf "$dmg_root"
mkdir -p "$dmg_root"

if [[ ! -f "$codex_binary_path" ]]; then
echo "Binary $codex_binary_path not found"
exit 1
fi
if [[ ! -f "$proxy_binary_path" ]]; then
echo "Binary $proxy_binary_path not found"
exit 1
fi

ditto "$codex_binary_path" "${dmg_root}/codex"
ditto "$proxy_binary_path" "${dmg_root}/codex-responses-api-proxy"

rm -f "$dmg_path"
hdiutil create \
-volname "$volname" \
-srcfolder "$dmg_root" \
-format UDZO \
-ov \
"$dmg_path"

if [[ ! -f "$dmg_path" ]]; then
echo "dmg $dmg_path not found after build"
exit 1
fi

- if: ${{ runner.os == 'macOS' }}
name: MacOS code signing (dmg)
uses: ./.github/actions/macos-code-sign
with:
target: ${{ matrix.target }}
sign-binaries: "false"
sign-dmg: "true"
apple-certificate: ${{ secrets.APPLE_CERTIFICATE_P12 }}
apple-certificate-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
apple-notarization-key-p8: ${{ secrets.APPLE_NOTARIZATION_KEY_P8 }}
Expand Down Expand Up @@ -160,6 +221,10 @@ jobs:
cp target/${{ matrix.target }}/release/codex-responses-api-proxy.sigstore "$dest/codex-responses-api-proxy-${{ matrix.target }}.sigstore"
fi

if [[ "${{ matrix.target }}" == *apple-darwin ]]; then
cp target/${{ matrix.target }}/release/codex-${{ matrix.target }}.dmg "$dest/codex-${{ matrix.target }}.dmg"
fi

- if: ${{ matrix.runner == 'windows-11-arm' }}
name: Install zstd
shell: powershell
Expand Down Expand Up @@ -194,7 +259,7 @@ jobs:
base="$(basename "$f")"
# Skip files that are already archives (shouldn't happen, but be
# safe).
if [[ "$base" == *.tar.gz || "$base" == *.zip ]]; then
if [[ "$base" == *.tar.gz || "$base" == *.zip || "$base" == *.dmg ]]; then
continue
fi

Expand Down
Loading
Loading