Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
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
df46ea4
Terminal Detection Metadata for Per-Terminal Scroll Scaling (#8252)
joshka-oai Dec 18, 2025
6395430
add a default dacl to restricted token to enable reading of pipes (#8…
iceweasel-oai Dec 18, 2025
87abf06
fix: flaky tests 5 (#8282)
jif-oai Dec 18, 2025
4fb0b54
feat: add `/ps` (#8279)
jif-oai Dec 18, 2025
2f048f2
feat: add support for /etc/codex/requirements.toml on UNIX (#8277)
bolinfest Dec 18, 2025
d7ae342
feat(app-server): add v2 deprecation notice (#8285)
owenlin0 Dec 18, 2025
8f0b383
model list (#8286)
pakrym-oai Dec 18, 2025
9fb9ed6
Set exclude to true by default in app server (#8281)
ambrosino-oai Dec 18, 2025
53f5317
chore: upgrade rmcp crate from 0.10.0 to 0.12.0 (#8288)
bolinfest Dec 18, 2025
1cd1cf1
Update system skills bundled with codex-rs (#8253)
gverma-openai Dec 18, 2025
358a5ba
Support skills shortDescription. (#8278)
xl-openai Dec 18, 2025
46baedd
fix: change codex/sandbox-state/update from a notification to a reque…
bolinfest Dec 18, 2025
2d98260
fix: remove duplicate shell_snapshot FeatureSpec (#8274)
zchee Dec 18, 2025
3d4ced3
chore: migrate from Config::load_from_base_config_with_overrides to C…
bolinfest Dec 19, 2025
3429de2
feat: introduce ExternalSandbox policy (#8290)
apanasenko-oai Dec 19, 2025
6c76d17
feat: collapse "waiting" of `unified_exec` (#8257)
jif-oai Dec 19, 2025
dcc0119
UI tweaks on skills popup. (#8250)
xl-openai Dec 19, 2025
ba835c3
Fix tests (#8299)
xl-openai Dec 19, 2025
d353372
skills feature default on. (#8297)
xl-openai Dec 19, 2025
8120c87
Support admin scope skills. (#8296)
xl-openai Dec 19, 2025
f4371d2
Add short descriptions to system skills (#8301)
gverma-openai Dec 19, 2025
339b052
Fix admin skills. (#8305)
xl-openai Dec 19, 2025
6f94a90
Keep skills feature flag default OFF for windows. (#8308)
xl-openai Dec 19, 2025
eeda6a5
Revert "Keep skills feature flag default OFF for windows." (#8325)
xl-openai Dec 19, 2025
37071e7
Update system skills from OSS repo (#8328)
gverma-openai Dec 19, 2025
b15b508
Fix link to contributing.md in experimental.md (#8311)
jdijk-deventit Dec 19, 2025
014235f
Fix: /undo destructively interacts with git staging (#8214) (#8303)
Galaxy-0 Dec 19, 2025
6427a41
Fix update checks and codex home isolation
Ixe1 Dec 19, 2025
7e5c343
feat: make ConstraintError an enum (#8330)
bolinfest Dec 19, 2025
0a7021d
fix: enable resume_warning that was missing from mod.rs (#8333)
bolinfest Dec 19, 2025
e3d3445
Update models.json (#8168)
github-actions[bot] Dec 19, 2025
1d4463b
feat(tui2): coalesce transcript scroll redraws (#8295)
joshka-oai Dec 19, 2025
ec3738b
feat: move file name derivation into codex-file-search (#8334)
RQfreefly Dec 19, 2025
dc61fc5
feat: support allowed_sandbox_modes in requirements.toml (#8298)
bolinfest Dec 19, 2025
71736d7
chore: update login flow and tui snapshots
Ixe1 Dec 19, 2025
797a68b
bump cargo-deny-action ver (#8345)
sayan-oai Dec 19, 2025
d7b2722
Add spawn_subagent tool
Ixe1 Dec 19, 2025
f0dc6fd
Rename OpenAI models to models manager (#8346)
aibrahim-oai Dec 20, 2025
a697408
chore: enusre the logic that creates ConfigLayerStack has access to c…
bolinfest Dec 20, 2025
1f2f6f2
Show spawn_subagent tool calls in history
Ixe1 Dec 20, 2025
d80cc52
tui: show subagent tool calls in history
Ixe1 Dec 20, 2025
ab97a24
subagent: stream activity and match plan-variants UI
Ixe1 Dec 20, 2025
f124466
subagent: stream token counts
Ixe1 Dec 20, 2025
520d3fd
release: bump workspace version to 0.1.3
Ixe1 Dec 20, 2025
5f72cd2
changelog: cut 0.1.3
Ixe1 Dec 20, 2025
41eb7fd
tui: keep subagent history updating
Ixe1 Dec 20, 2025
fe45ec3
changelog: update unreleased
Ixe1 Dec 20, 2025
ddf5e09
tui: keep subagent cell live during inserts
Ixe1 Dec 20, 2025
c984790
changelog: update
Ixe1 Dec 20, 2025
dfb4824
Persist approved plan and hide .codexel
Ixe1 Dec 20, 2025
5df2107
Require spawn_subagent description and refresh snapshots
Ixe1 Dec 20, 2025
6f457bb
docs: clarify Codexel fork positioning
Ixe1 Dec 20, 2025
b432d87
chore: regenerate changelog
Ixe1 Dec 20, 2025
b7ec612
changelog: fix 0.1.3 release ranges
Ixe1 Dec 20, 2025
ab82ee8
chore: ignore .codexel
Ixe1 Dec 20, 2025
3b20589
Merge upstream/main into v0.1.3
Ixe1 Dec 20, 2025
ebae128
core: fix subagent config constraints
Ixe1 Dec 20, 2025
e174683
tests: keep codexel CLI suites green
Ixe1 Dec 20, 2025
d7fb51f
changelog: filter upstream commits in generator
Ixe1 Dec 20, 2025
d33a1b3
changelog: keep generators in sync
Ixe1 Dec 20, 2025
44f8df1
docs: move What's different up and mention ask_user_question
Ixe1 Dec 20, 2025
503e07b
changelog: update 0.1.3 for upstream merge
Ixe1 Dec 20, 2025
c663564
codex-cli: bump codexel npm version to 0.1.3
Ixe1 Dec 20, 2025
9a6abf8
docs: keep README ASCII-only
Ixe1 Dec 20, 2025
9bbc2cc
docs: prettier
Ixe1 Dec 20, 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
iTerm2
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,*test.ts,*.jsonl,frame*.txt
check-hidden = true
ignore-regex = ^\s*"image/\S+": ".*|\b(afterAll)\b
ignore-words-list = ratatui,ser
ignore-words-list = ratatui,ser,iTerm,iterm2,iterm
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
}
2 changes: 1 addition & 1 deletion .github/workflows/cargo-deny.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
uses: dtolnay/rust-toolchain@stable

- name: Run cargo-deny
uses: EmbarkStudios/cargo-deny-action@v1
uses: EmbarkStudios/cargo-deny-action@v2
with:
rust-version: stable
manifest-path: ./codex-rs/Cargo.toml
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
run: |
set -euo pipefail
# Use a rust-release version that includes all native binaries.
CODEX_VERSION=0.74.0-alpha.3
CODEX_VERSION=0.74.0
OUTPUT_DIR="${RUNNER_TEMP}"
python3 ./scripts/stage_npm_packages.py \
--release-version "$CODEX_VERSION" \
Expand Down
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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ coverage/

# personal files
personal/
.codexel/

# os
.DS_Store
Expand All @@ -85,3 +86,8 @@ CHANGELOG.ignore.md
# nix related
.direnv
.envrc

# Python bytecode files
__pycache__/
*.pyc

Loading