Repository navigation
Conversation
Co-authored-by: Codex <[email protected]>
Added instructions for reloading plugins and setup command.
…#13) On Windows, Node.js `spawnSync` without `shell: true` uses `CreateProcess`, which only resolves `.exe` files. npm installs global tools (like `codex`) as `.cmd` shims, so `spawnSync("codex", ...)` returns ENOENT even when codex is correctly installed and on PATH. Adding `shell: process.platform === "win32"` routes through `cmd.exe` on Windows, which properly resolves `.cmd`, `.bat`, and PATHEXT entries. No behavior change on macOS/Linux since the condition evaluates to false.
* chore: bump plugin version to 1.0.1 * chore: bump plugin metadata version to 1.0.1
Co-authored-by: VOIDXAI <[email protected]>
* fix: add shell and windowsHide options for Windows spawn in app-server
On Windows, spawn("codex", ["app-server"]) fails with ENOENT because
Node.js cannot resolve .cmd shims without shell: true. This adds
platform-gated shell and windowsHide options to the app-server spawn
call, and uses terminateProcessTree for proper process tree cleanup
since shell: true wraps the child in cmd.exe.
Without terminateProcessTree, plain SIGTERM only kills cmd.exe and
leaves the actual codex node process orphaned — verified with 274+
zombie node.exe processes accumulating on Windows.
Fixes #32
Fixes #46
* fix: guard terminateProcessTree against PID reuse after process exit
ChildProcess.killed only reflects whether .kill() was called by this
process — it stays false when the child exits on its own. On Windows,
where PIDs are recycled quickly, the 50 ms timer could fire after
cmd.exe has exited and its PID has been reassigned, causing taskkill
to terminate an unrelated process.
Add an exitCode === null check so the tree-kill path is skipped once
the child has already exited.
---------
* fix: make test suite portable across platforms Replace hardcoded macOS path with fileURLToPath for cross-platform compatibility. Add .cmd wrapper creation and platform-aware PATH separator in test fixtures so the fake codex binary is discoverable on Windows. Add shell and windowsHide options to the test helper run() function to match production behavior. Test results on Windows improve from 12/64 pass to 59/64 pass. * fix: skip shell for absolute-path commands to avoid Windows space-in-path breakage When `process.execPath` resolves to a path with spaces (e.g., `C:\Program Files\nodejs\node.exe`), `shell: true` causes cmd.exe to split the path at the space. Guard with `path.isAbsolute()` so only bare command names (which need `.cmd` shim resolution) use the shell. --------- Co-authored-by: Dominik Kundel <[email protected]>
Co-authored-by: VOIDXAI <[email protected]>
* fix: skip untracked directories in review context * fix: skip broken untracked symlinks in reviews
* Use app-server auth status for Codex readiness * fix: reuse existing app server for auth checks
…provided (#159) `SpawnedCodexAppServerClient.initialize()` passes `this.options.env` to `spawn()`, but no caller ever sets `env` in options. In Node.js, passing `undefined` for `env` gives the child process **no** environment variables, breaking any model provider that relies on env vars (e.g. DATABRICKS_TOKEN). Fall back to `process.env` when `this.options.env` is not set, matching the existing pattern in `broker-lifecycle.mjs` and `codex-companion.mjs`. Co-authored-by: Isaac Co-authored-by: Bhuvanesh Sridharan <[email protected]>
…#126) * fix: gracefully handle unsupported thread/name/set on older Codex CLI Codex CLI v0.118.0 does not recognize the thread/name/set JSON-RPC method, causing startThread() to throw. Thread naming is cosmetic (for job log labels) and should not block thread creation. Wraps the call in try/catch so it fails silently on older CLI versions. Fixes #119 * refactor: only suppress unsupported-method errors for thread/name/set Address Codex review feedback: the bare catch swallowed all errors including auth, network, and server failures. Now only suppresses errors containing 'unknown variant' or 'unknown method' (the specific error older CLI versions return) and rethrows everything else.
…sion (#83) Co-authored-by: VOIDXAI <[email protected]>
) Co-authored-by: VOIDXAI <[email protected]>
* fix: avoid embedding large adversarial review diffs * fix: preserve untracked content in lightweight review * address comments * fix: handle ENOBUFS type check in git diff sizing
* codex: honor --cwd when reporting session runtime * codex: keep session runtime lookup scoped to callers --------- Co-authored-by: VOIDXAI <[email protected]>
* fix: declare model in codex-rescue agent frontmatter The codex-rescue agent had no model field, leaving Claude Code to assign whatever default it chooses. As a thin forwarding wrapper that issues a single Bash call, this agent is well-suited to the haiku tier; declaring it explicitly ensures a predictable cost profile and tier guarantee. * Update codex-rescue.md --------- Co-authored-by: Dominik Kundel <[email protected]>
Closes #77 Updated README to replace unsupported 'xhigh' value with 'high' to prevent configuration errors.
Unquoted \$ARGUMENTS in the ! shell commands allowed shell metacharacters in user-supplied job IDs to be expanded before Node received them (e.g., `task-123; malicious-cmd` would execute the trailing command). This is inconsistent with review.md and adversarial-review.md, which both wrap "$ARGUMENTS" in double quotes.
…on (#234) (#235) * fix: route /codex:rescue through the Agent tool to stop Skill recursion (#234) `/codex:rescue` previously combined two things that together caused a hang: - `context: fork` in the frontmatter, which spawns a `general-purpose` subagent for the command body. - Body prose "Route this request to the `codex:codex-rescue` subagent." without naming the transport. When the main agent called `Skill(codex:rescue)` programmatically, the fork resolved the ambiguous prose by trying `Skill(codex:codex-rescue)` (unknown skill) and then falling back to `Skill(codex:rescue)`, which re-entered this command and hung the session until the user cancelled. No Codex job was ever created. Naming the transport as `Agent(codex:codex-rescue)` alone is not enough: forked general-purpose subagents do not expose the `Agent` tool, so the forked runner cannot reach the subagent that way either. The minimal fix is therefore two coordinated changes: - Drop `context: fork` so the command body runs inline in the calling agent's context, where `Agent` is in scope. - Say explicitly "use the `Agent` tool with `subagent_type: "codex:codex-rescue"`", and call out that `Skill(codex:codex-rescue)` and `Skill(codex:rescue)` are not valid routing paths. Add `Agent` to `allowed-tools` so the call does not prompt for permission. Everything else in rescue.md (resume-candidate check, flag handling, background/foreground semantics, operating rules) is unchanged. The `codex:codex-rescue` subagent itself is unchanged. Tests pin the new allow-list, the explicit `subagent_type`, the ban on `Skill(codex:codex-rescue)`, and the absence of `context: fork`. The existing "run the `codex:codex-rescue` subagent in the background" assertion continues to hold since that sentence still reads correctly with the Agent-tool transport. Fixes #234 * test: match quoted result and cancel command arguments --------- Co-authored-by: Dominik Kundel <[email protected]>
* Remove shell expansion for git commands * Version bump
|
Independently verified this end-to-end against a live app-server on codex-cli 0.144.4 (your probe was 0.144.1, so this doubles as a newer-CLI check). Everything holds:
Two minor observations, neither blocking:
LGTM — this closes the observability half of the #476/#481 invisibility pair, and the mid-run patch means even wedged jobs finally tell you what they ran with. |
axisrow
added a commit
to axisrow/codex-plugin-cc
that referenced
this pull request
Jul 16, 2026
Rebase fork on upstream openai#471 (RPC override) + openai#506/openai#480/openai#490 + shutdown hardening
cubicj
force-pushed
the
capture-resolved-settings
branch
from
August 11, 2026 11:18
86b9a73 to
36793f5
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Job records never capture the model, reasoning effort, or sandbox a job actually ran with (#481). Background task jobs persist the raw CLI request, but those fields are
nullwhen flags are omitted; foreground tasks and review jobs record nothing at all. The only place the resolved values exist today is the Codex rollout file, and joining a job record to its rollout fails in practice: date directories use local time while job timestamps are UTC, and rollout filenames carry a session id that does not match the job'sthreadId(both hit independently in the issue thread).Change
The app-server already reports what it resolved:
thread/startandthread/resumeresponses echomodel,modelProvider,reasoningEffort, and the fullsandboxpolicy with config.toml fallback applied, and the plugin currently discards everything butthread.id. This PR captures that echo instead of adding any new resolution logic, so it stays truthful regardless of how the pending override-mechanism discussions (#471, #408, #476, #482) land.lib/codex.mjs:runAppServerTurnandrunAppServerReviewbuildresolved = { model, modelProvider, reasoningEffort, sandbox }from the thread response, attach it to the existing "Thread ready" progress event, and include it in the returned result.turn/startresponses carry no effort field, so an explicit per-turn--effortis overlaid ontoresolvedonly after theturn/startrequest is accepted — a rejected or failed turn never records a requested effort as if it had run.lib/tracked-jobs.mjs: the job progress updater patchesresolvedinto the job file and state index mid-run, the same way it already handlesthreadId, so failed and cancelled jobs still record what they ran with. The completion write addsresolvedexplicitly because it spreads the in-memory running record.codex-companion.mjs: each execution object liftsresult.resolvednext tothreadId/turnId; all job kinds sharerunTrackedJob, so foreground tasks, background workers, native review, and adversarial review are covered without per-path changes.Job records gain one nested field, next to the existing raw
requestfields, so both layers stay visible — requested versus server-confirmed:Human-readable output is unchanged: renderers read job fields selectively, the progress-event patch rides the same write the
threadIdupdate already performs, and no log line formats change.status --jsonandresult --jsongain the field additively.Verification
npm test: 92/92 passing. New coverage assertsresolvedin the persisted job JSON for native review, adversarial review, resumed tasks, and the detached background worker (checked mid-run, while stillrunning); an explicit--effortoverriding the thread echo on success; and aturn/startfailure case with an explicit--effortproving the failed record keeps the thread echo rather than the never-applied request.npm run build(typecheck viatsconfig.app-server.json): clean.git diff --checkagainst the base commit: clean.thread/start/thread/resumeresponses now mirror the real app-server's resolved echo (shape confirmed against the generatedThreadStartResponse/ThreadResumeResponsetypes and a live JSON-RPC probe against codex-cli 0.144.1).Related Issues
Fixes #481