Skip to content

codex-plugin-cc v1.2.0

Choose a tag to compare

@CBEPX CBEPX released this 28 Aug 13:43
· 194 commits to main since this release
002a9b6

Synchronous rescue, bounded turns, and a state layer that survives concurrent sessions and killed workers.

Highlights

  • task --await [--await-timeout-ms], --prompt-stdin, and result <id> [--wait --timeout-ms]: /codex:rescue and the rescue agent are a single node … task --await --prompt-stdin <<'CODEX_PROMPT_…' call again, allowed-tools is back to Bash(node:*), and exit codes are documented (0 done, 1 failed, 3 still running with a printed Re-run: line).
  • Session lifecycle: SessionEnd stops only its own foreground jobs, checks for any active job in the workspace, and asks the broker to shut down only when it is idle (newline-framed, id-matched, 5 s-bounded handshake; an unanswered handshake skips teardown). The broker refuses broker/shutdown while another client is connected, self-terminates on idle (openai#457), and its own shutdown is bounded so a peer that never answers the FIN cannot make it ignore SIGTERM.
  • Bounded turns: --turn-timeout-ms / CODEX_TURN_TIMEOUT_MS interrupt the turn, wait for the terminal notification, and record a structured failed; the ack timer is referenced, a transport exit always yields a terminal record, and close() is idempotent and bounded (TERM → KILL).
  • State integrity: a replace-free cross-process ticket lock (Lamport bakery on uniquely named immutable files under state.lock.d/; dead PID → taken over at once, unreadable holder → 2 s, unusable PID → 30 s, live PID → never; listing/stat/read errors fail closed; 5 s bound naming the blocking PID and entry), atomic state writes, a PID sidecar written after spawn, file-first reaper reconciliation, and dead workers reported as failed with their private payload removed.
  • Secrets: every --config value is redacted in job records and every status/result rendering; the raw request lives only in a 0600 payload file; v1.1.1 records are migrated (queued jobs get their payload file before redaction).
  • Releases now ship as GitHub Releases with the npm pack tarball and its SHA-256 attached; release-verify.yml re-runs the gate on the published tag (docs/RELEASING.md).

Compatibility

  • /codex:rescue bodies changed shape (single companion call); custom wrappers that parsed the old status --wait loop should use task --await / result --wait.
  • Job state directory gains state.lock.d/, jobs/<id>.pid and 0600 jobs/<id>.request.json; a legacy state.lock directory from unreleased builds is ignored.
  • SessionEnd is more conservative: with CODEX_COMPANION_BROKER_IDLE_TIMEOUT_MS=0 a lingering client keeps the broker alive until the operator stops it.

Validation

  • Exact tag target: 002a9b643eccd4f156175820037093de3d2f80e4 (merge of #3; branch head ae32d99)
  • Local gate: 239/239 tests, 0 leaked test processes, npm run build, npm run check-version, claude plugin validate . --strict
  • GitHub CI: release branch ae32d99 green on push, pull_request and a re-run (https://github.com/CBEPX/codex-plugin-cc/actions/runs/33175542754, https://github.com/CBEPX/codex-plugin-cc/actions/runs/33175546290); main after merge: https://github.com/CBEPX/codex-plugin-cc/actions/runs/33176478976 (green)
  • Review: Codex adversarial review ×16 (final verdict approve) and Claude (opus) review ×13 (final verdict SHIP) over 17 fix waves; every finding either fixed on the branch or recorded for 1.2.1
  • Runtime dependency audit: npm audit --omit=dev reports 0 vulnerabilities
  • Live verification against Codex CLI 0.150.1: --turn-timeout-ms → structured failed; SIGKILLed background worker → failed, payload removed; task --await round trip; /codex:status and /codex:rescue synchronous in Claude Code 2.1.247 auto mode

Artifact

a77beb45af79a481c8c6ae7d0e57f035e6e5a6ea3d0b65c0581248727870b6d0 cbepx-codex-plugin-cc-1.2.0.tgz