Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
3164856
feat: centralize package manager version (#14920)
jif-oai Mar 17, 2026
4ed19b0
feat: rename to get more explicit close agent (#14935)
jif-oai Mar 17, 2026
ef36d39
Fix agent jobs finalization race and reduce status polling churn (#14…
daveaitel-openai Mar 17, 2026
e8add54
feat: show effective model in spawn agent event (#14944)
jif-oai Mar 17, 2026
6ea0410
fix(core): prevent hanging turn/start due to websocket warming issues…
owenlin0 Mar 17, 2026
8e258eb
Feat: CXA-1831 Persist latest model and reasoning effort in sqlite (#…
shijie-oai Mar 17, 2026
78e8ee4
fix(tui): restore remote resume and fork history (#14930)
fcoury Mar 17, 2026
f26ad3c
Fix fuzzy search notification buffering in app-server tests (#14955)
aibrahim-oai Mar 17, 2026
d484bb5
feat: add suffix to shell snapshot name (#14938)
jif-oai Mar 17, 2026
0d531c0
Fix code mode yield startup race (#14959)
aibrahim-oai Mar 17, 2026
904dbd4
generate an internal json schema for `RolloutLine` (#14434)
keyz Mar 17, 2026
95bdea9
use framed IPC for elevated command runner (#14846)
iceweasel-oai Mar 17, 2026
49e7dda
Add device-code onboarding and ChatGPT token refresh to app-server TU…
etraut-openai Mar 17, 2026
683c37c
[plugins] Support plugin installation elicitation. (#14896)
mzeng-openai Mar 17, 2026
b023886
Stabilize Windows cmd-based shell test harnesses (#14958)
aibrahim-oai Mar 17, 2026
23a44dd
Stabilize permissions popup selection tests (#14966)
aibrahim-oai Mar 17, 2026
4d9d4b7
Stabilize approval matrix write-file command (#14968)
aibrahim-oai Mar 17, 2026
2cc4ee4
temporarily disable private desktop until it works with elevated IPC …
iceweasel-oai Mar 17, 2026
ee756eb
Rename exec_wait tool to wait (#14983)
pakrym-oai Mar 17, 2026
0d2ff40
Add auth env observability (#14905)
ccy-oai Mar 17, 2026
43ee72a
fix(tui): implement /mcp inventory for tui_app_server (#14931)
fcoury Mar 17, 2026
1a9555e
Cleanup skills/remote/xxx endpoints. (#14977)
xl-openai Mar 17, 2026
c6ab4ee
Gate realtime audio interruption logic to v2 (#14984)
aibrahim-oai Mar 17, 2026
98be562
Unify realtime shutdown in core (#14902)
aibrahim-oai Mar 17, 2026
0d1539e
fix(linux-sandbox): prefer system /usr/bin/bwrap when available (#14963)
viyatb-oai Mar 17, 2026
fc75d07
Add Python SDK public API and examples (#14446)
shaqayeq-oai Mar 17, 2026
a5d3114
feat: Add product-aware plugin policies and clean up manifest naming …
xl-openai Mar 18, 2026
19b8871
app-server: reject websocket requests with Origin headers (#14995)
maxj-oai Mar 18, 2026
83a60fd
Add FS abstraction and use in view_image (#14960)
pakrym-oai Mar 18, 2026
6fe8a05
fix: honor active permission profiles in sandbox debug (#14293)
viyatb-oai Mar 18, 2026
d950543
feat: support restricted ReadOnlyAccess in elevated Windows sandbox (…
viyatb-oai Mar 18, 2026
7706164
Prefer websockets when providers support them (#13592)
pakrym-oai Mar 18, 2026
3ce879c
Handle realtime conversation end in the TUI (#14903)
aibrahim-oai Mar 18, 2026
226241f
Use workspace requirements for guardian prompt override (#14727)
charley-oai Mar 18, 2026
6fef421
[hooks] userpromptsubmit - hook before user's prompt is executed (#14…
eternal-openai Mar 18, 2026
a361303
Pin setup-zig GitHub Action to immutable SHA (#14858)
viyatb-oai Mar 18, 2026
84f4e7b
fix(subagents) share execpolicy by default (#13702)
dylan-hurd-oai Mar 18, 2026
40a7d1d
[plugins] Support configuration tool suggest allowlist. (#15022)
mzeng-openai Mar 18, 2026
0f9484d
feat: adapt artifacts to new packaging and 2.5.6 (#14947)
jif-oai Mar 18, 2026
a265d60
feat: add memory citation to agent message (#14821)
jif-oai Mar 18, 2026
58ac2a8
nit: disable live memory edition (#15058)
jif-oai Mar 18, 2026
347c6b1
Removed remaining core events from tui_app_server (#14942)
etraut-openai Mar 18, 2026
7ae9957
chore: disable memory read path for morpheus (#15059)
jif-oai Mar 18, 2026
606d850
Add notify to code-mode (#14842)
pakrym-oai Mar 18, 2026
580f32a
fix: harden plugin feature gating (#15020)
xl-openai Mar 18, 2026
334164a
feat(tui): restore composer history in app-server tui (#14945)
fcoury Mar 18, 2026
392347d
fix: try to fix "Stage npm package" step in ci.yml (#15092)
bolinfest Mar 18, 2026
88e5382
Propagate tool errors to code mode (#15075)
pakrym-oai Mar 18, 2026
5cada46
Return image URL from view_image tool (#15072)
pakrym-oai Mar 18, 2026
e5de136
Add a startup deprecation warning for custom prompts (#15076)
etraut-openai Mar 18, 2026
86982ca
Revert "fix: harden plugin feature gating" (#15102)
xl-openai Mar 18, 2026
7b37a03
Add final message prefix to realtime handoff output (#15077)
aibrahim-oai Mar 18, 2026
ebbbc52
Align SQLite feedback logs with feedback formatter (#13494)
charley-oai Mar 18, 2026
bb30432
Feat: reuse persisted model and reasoning effort on thread resume (#1…
shijie-oai Mar 18, 2026
b306885
don't add transcript for v2 realtime (#15111)
aibrahim-oai Mar 18, 2026
3590e18
Add update_plan code mode result (#15103)
pakrym-oai Mar 18, 2026
56d0c6b
Add apply_patch code mode result (#15100)
pakrym-oai Mar 18, 2026
dcd5e08
fix: harden plugin feature gating (#15104)
xl-openai Mar 19, 2026
81996fc
Add exec-server stub server and protocol docs (#15089)
starr-openai Mar 19, 2026
825d093
Support featured plugins (#15042)
alexsong-oai Mar 19, 2026
4fd2774
Add Python SDK thread.run convenience methods (#15088)
shaqayeq-oai Mar 19, 2026
903660e
Remove stdio transport from exec server (#15119)
pakrym-oai Mar 19, 2026
20f2a21
feat(core, tracing): create turn spans over websockets (#14632)
owenlin0 Mar 19, 2026
b14689d
Forward session and turn headers to MCP HTTP requests (#15011)
nicholasclark-openai Mar 19, 2026
42e932d
[hooks] turn_id extension for Stop & UserPromptSubmit (#15118)
eternal-openai Mar 19, 2026
10eb3ec
Simple directory mentions (#14970)
canvrno-oai Mar 19, 2026
01df50c
Add thread/shellCommand to app server API surface (#14988)
etraut-openai Mar 19, 2026
db5781a
feat: support product-scoped plugins. (#15041)
xl-openai Mar 19, 2026
70cdb17
feat: add graph representation of agent network (#15056)
jif-oai Mar 19, 2026
32d2df5
fix: case where agent is already closed (#15163)
jif-oai Mar 19, 2026
dee03da
Move environment abstraction into exec server (#15125)
pakrym-oai Mar 19, 2026
2cf4d5e
chore: add metrics for profile (#15180)
jif-oai Mar 19, 2026
859c58f
chore: morpheus does not generate memories (#15175)
jif-oai Mar 19, 2026
5ec121b
Revert "Forward session and turn headers to MCP HTTP requests" (#15185)
nicholasclark-openai Mar 19, 2026
267499b
[hooks] use a user message > developer message for prompt continuatio…
eternal-openai Mar 19, 2026
1837038
Add experimental exec server URL handling (#15196)
pakrym-oai Mar 19, 2026
b87ba0a
Publish runnable DotSlash package for argument-comment lint (#15198)
bolinfest Mar 19, 2026
1d210f6
Add exec-server exec RPC implementation (#15090)
starr-openai Mar 19, 2026
fe287ac
Log automated reviewer approval sources distinctly (#15201)
gabec-openai Mar 19, 2026
60cd0cf
feat(tui): add /title terminal title configuration (#12334)
yvolovich-cyber Mar 19, 2026
668330a
feat(tracing): tag app-server turn spans with turn_id (#15206)
owenlin0 Mar 19, 2026
7eb19e5
Move terminal module to terminal-detection crate (#15216)
aibrahim-oai Mar 19, 2026
69750a0
add specific tool guidance for Windows destructive commands (#15207)
iceweasel-oai Mar 19, 2026
27977d6
adding full imagepath to tui (#15154)
won-openai Mar 19, 2026
2254ec4
feat: expose needs_auth for plugin/read. (#15217)
xl-openai Mar 19, 2026
2bee37f
Plumb MCP turn metadata through _meta (#15190)
nicholasclark-openai Mar 19, 2026
9e695fe
feat(app-server): add mcpServer/startupStatus/updated notification (#…
owenlin0 Mar 19, 2026
6b8175c
changed save directory to codex_home (#15222)
won-openai Mar 19, 2026
403b397
Refactor ExecServer filesystem split between local and remote (#15232)
pakrym-oai Mar 20, 2026
ded7854
V8 Bazel Build (#15021)
cconger Mar 20, 2026
2aa4873
Move auth code into login crate (#15150)
aibrahim-oai Mar 20, 2026
0a344e4
[plugins] Install MCPs when calling plugin/install (#15195)
mzeng-openai Mar 20, 2026
a3e59e9
core: add a full-buffer exec capture policy (#15254)
bolinfest Mar 20, 2026
35f8b87
fix: Distinguish missing and empty plugin products (#15263)
xl-openai Mar 20, 2026
2e22885
Split features into codex-features crate (#15253)
aibrahim-oai Mar 20, 2026
96a8671
Split exec process into local and remote implementations (#15233)
starr-openai Mar 20, 2026
fa2a2f0
Use released DotSlash package for argument-comment lint (#15199)
bolinfest Mar 20, 2026
f7201e5
Initial plugins TUI menu - list and read only. tui + tui_app_server (…
canvrno-oai Mar 20, 2026
cc19276
Disable hooks on windows for now (#15252)
eternal-openai Mar 20, 2026
b1570d6
feat: Add One-Time Startup Remote Plugin Sync (#15264)
xl-openai Mar 20, 2026
b3a4da8
Add guardian follow-up reminder (#15262)
charley-oai Mar 20, 2026
461ba01
Feat/restore image generation history (#15223)
won-openai Mar 20, 2026
e5f4d1f
feat: prefer git for curated plugin sync (#15275)
xl-openai Mar 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
24 changes: 24 additions & 0 deletions .github/dotslash-argument-comment-lint-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"outputs": {
"argument-comment-lint": {
"platforms": {
"macos-aarch64": {
"regex": "^argument-comment-lint-aarch64-apple-darwin\\.tar\\.gz$",
"path": "argument-comment-lint/bin/argument-comment-lint"
},
"linux-x86_64": {
"regex": "^argument-comment-lint-x86_64-unknown-linux-gnu\\.tar\\.gz$",
"path": "argument-comment-lint/bin/argument-comment-lint"
},
"linux-aarch64": {
"regex": "^argument-comment-lint-aarch64-unknown-linux-gnu\\.tar\\.gz$",
"path": "argument-comment-lint/bin/argument-comment-lint"
},
"windows-x86_64": {
"regex": "^argument-comment-lint-x86_64-pc-windows-msvc\\.zip$",
"path": "argument-comment-lint/bin/argument-comment-lint.exe"
}
}
}
}
}
287 changes: 287 additions & 0 deletions .github/scripts/rusty_v8_bazel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@
#!/usr/bin/env python3

from __future__ import annotations

import argparse
import gzip
import re
import shutil
import subprocess
import sys
import tempfile
import tomllib
from pathlib import Path


ROOT = Path(__file__).resolve().parents[2]
MUSL_RUNTIME_ARCHIVE_LABELS = [
"@llvm//runtimes/libcxx:libcxx.static",
"@llvm//runtimes/libcxx:libcxxabi.static",
]
LLVM_AR_LABEL = "@llvm//tools:llvm-ar"
LLVM_RANLIB_LABEL = "@llvm//tools:llvm-ranlib"


def bazel_execroot() -> Path:
result = subprocess.run(
["bazel", "info", "execution_root"],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
return Path(result.stdout.strip())


def bazel_output_base() -> Path:
result = subprocess.run(
["bazel", "info", "output_base"],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
return Path(result.stdout.strip())


def bazel_output_path(path: str) -> Path:
if path.startswith("external/"):
return bazel_output_base() / path
return bazel_execroot() / path


def bazel_output_files(
platform: str,
labels: list[str],
compilation_mode: str = "fastbuild",
) -> list[Path]:
expression = "set(" + " ".join(labels) + ")"
result = subprocess.run(
[
"bazel",
"cquery",
"-c",
compilation_mode,
f"--platforms=@llvm//platforms:{platform}",
"--output=files",
expression,
],
cwd=ROOT,
check=True,
capture_output=True,
text=True,
)
return [bazel_output_path(line.strip()) for line in result.stdout.splitlines() if line.strip()]


def bazel_build(
platform: str,
labels: list[str],
compilation_mode: str = "fastbuild",
) -> None:
subprocess.run(
[
"bazel",
"build",
"-c",
compilation_mode,
f"--platforms=@llvm//platforms:{platform}",
*labels,
],
cwd=ROOT,
check=True,
)


def ensure_bazel_output_files(
platform: str,
labels: list[str],
compilation_mode: str = "fastbuild",
) -> list[Path]:
outputs = bazel_output_files(platform, labels, compilation_mode)
if all(path.exists() for path in outputs):
return outputs

bazel_build(platform, labels, compilation_mode)
outputs = bazel_output_files(platform, labels, compilation_mode)
missing = [str(path) for path in outputs if not path.exists()]
if missing:
raise SystemExit(f"missing built outputs for {labels}: {missing}")
return outputs


def release_pair_label(target: str) -> str:
target_suffix = target.replace("-", "_")
return f"//third_party/v8:rusty_v8_release_pair_{target_suffix}"


def resolved_v8_crate_version() -> str:
cargo_lock = tomllib.loads((ROOT / "codex-rs" / "Cargo.lock").read_text())
versions = sorted(
{
package["version"]
for package in cargo_lock["package"]
if package["name"] == "v8"
}
)
if len(versions) == 1:
return versions[0]
if len(versions) > 1:
raise SystemExit(f"expected exactly one resolved v8 version, found: {versions}")

module_bazel = (ROOT / "MODULE.bazel").read_text()
matches = sorted(
set(
re.findall(
r'https://static\.crates\.io/crates/v8/v8-([0-9]+\.[0-9]+\.[0-9]+)\.crate',
module_bazel,
)
)
)
if len(matches) != 1:
raise SystemExit(
"expected exactly one pinned v8 crate version in MODULE.bazel, "
f"found: {matches}"
)
return matches[0]


def staged_archive_name(target: str, source_path: Path) -> str:
if source_path.suffix == ".lib":
return f"rusty_v8_release_{target}.lib.gz"
return f"librusty_v8_release_{target}.a.gz"


def is_musl_archive_target(target: str, source_path: Path) -> bool:
return target.endswith("-unknown-linux-musl") and source_path.suffix == ".a"


def single_bazel_output_file(
platform: str,
label: str,
compilation_mode: str = "fastbuild",
) -> Path:
outputs = ensure_bazel_output_files(platform, [label], compilation_mode)
if len(outputs) != 1:
raise SystemExit(f"expected exactly one output for {label}, found {outputs}")
return outputs[0]


def merged_musl_archive(
platform: str,
lib_path: Path,
compilation_mode: str = "fastbuild",
) -> Path:
llvm_ar = single_bazel_output_file(platform, LLVM_AR_LABEL, compilation_mode)
llvm_ranlib = single_bazel_output_file(platform, LLVM_RANLIB_LABEL, compilation_mode)
runtime_archives = [
single_bazel_output_file(platform, label, compilation_mode)
for label in MUSL_RUNTIME_ARCHIVE_LABELS
]

temp_dir = Path(tempfile.mkdtemp(prefix="rusty-v8-musl-stage-"))
merged_archive = temp_dir / lib_path.name
merge_commands = "\n".join(
[
f"create {merged_archive}",
f"addlib {lib_path}",
*[f"addlib {archive}" for archive in runtime_archives],
"save",
"end",
]
)
subprocess.run(
[str(llvm_ar), "-M"],
cwd=ROOT,
check=True,
input=merge_commands,
text=True,
)
subprocess.run([str(llvm_ranlib), str(merged_archive)], cwd=ROOT, check=True)
return merged_archive


def stage_release_pair(
platform: str,
target: str,
output_dir: Path,
compilation_mode: str = "fastbuild",
) -> None:
outputs = ensure_bazel_output_files(
platform,
[release_pair_label(target)],
compilation_mode,
)

try:
lib_path = next(path for path in outputs if path.suffix in {".a", ".lib"})
except StopIteration as exc:
raise SystemExit(f"missing static library output for {target}") from exc

try:
binding_path = next(path for path in outputs if path.suffix == ".rs")
except StopIteration as exc:
raise SystemExit(f"missing Rust binding output for {target}") from exc

output_dir.mkdir(parents=True, exist_ok=True)
staged_library = output_dir / staged_archive_name(target, lib_path)
staged_binding = output_dir / f"src_binding_release_{target}.rs"
source_archive = (
merged_musl_archive(platform, lib_path, compilation_mode)
if is_musl_archive_target(target, lib_path)
else lib_path
)

with source_archive.open("rb") as src, staged_library.open("wb") as dst:
with gzip.GzipFile(
filename="",
mode="wb",
fileobj=dst,
compresslevel=6,
mtime=0,
) as gz:
shutil.copyfileobj(src, gz)

shutil.copyfile(binding_path, staged_binding)

print(staged_library)
print(staged_binding)


def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="command", required=True)

stage_release_pair_parser = subparsers.add_parser("stage-release-pair")
stage_release_pair_parser.add_argument("--platform", required=True)
stage_release_pair_parser.add_argument("--target", required=True)
stage_release_pair_parser.add_argument("--output-dir", required=True)
stage_release_pair_parser.add_argument(
"--compilation-mode",
default="fastbuild",
choices=["fastbuild", "opt", "dbg"],
)

subparsers.add_parser("resolved-v8-crate-version")

return parser.parse_args()


def main() -> int:
args = parse_args()
if args.command == "stage-release-pair":
stage_release_pair(
platform=args.platform,
target=args.target,
output_dir=Path(args.output_dir),
compilation_mode=args.compilation_mode,
)
return 0
if args.command == "resolved-v8-crate-version":
print(resolved_v8_crate_version())
return 0
raise SystemExit(f"unsupported command: {args.command}")


if __name__ == "__main__":
sys.exit(main())
12 changes: 11 additions & 1 deletion .github/workflows/bazel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,14 +156,20 @@ jobs:

bazel_args=(
test
//...
--test_verbose_timeout_warnings
--build_metadata=REPO_URL=https://github.com/openai/codex.git
--build_metadata=COMMIT_SHA=$(git rev-parse HEAD)
--build_metadata=ROLE=CI
--build_metadata=VISIBILITY=PUBLIC
)

bazel_targets=(
//...
# Keep V8 out of the ordinary Bazel CI path. Only the dedicated
# canary and release workflows should build `third_party/v8`.
-//third_party/v8:all
)

if [[ "${RUNNER_OS:-}" != "Windows" ]]; then
# Bazel test sandboxes on macOS may resolve an older Homebrew `node`
# before the `actions/setup-node` runtime on PATH.
Expand All @@ -183,6 +189,8 @@ jobs:
--bazelrc=.github/workflows/ci.bazelrc \
"${bazel_args[@]}" \
"--remote_header=x-buildbuddy-api-key=$BUILDBUDDY_API_KEY" \
-- \
"${bazel_targets[@]}" \
2>&1 | tee "$bazel_console_log"
bazel_status=${PIPESTATUS[0]}
set -e
Expand Down Expand Up @@ -210,6 +218,8 @@ jobs:
"${bazel_args[@]}" \
--remote_cache= \
--remote_executor= \
-- \
"${bazel_targets[@]}" \
2>&1 | tee "$bazel_console_log"
bazel_status=${PIPESTATUS[0]}
set -e
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
run: |
set -euo pipefail
# Use a rust-release version that includes all native binaries.
CODEX_VERSION=0.74.0
CODEX_VERSION=0.115.0
OUTPUT_DIR="${RUNNER_TEMP}"
python3 ./scripts/stage_npm_packages.py \
--release-version "$CODEX_VERSION" \
Expand Down
Loading
Loading