pi-codex-tools
Codex-compatible apply_patch tooling for Pi's grammar-capable OpenAI models.
Package details
Install pi-codex-tools from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-codex-tools- Package
pi-codex-tools- Version
0.2.1- Published
- Aug 8, 2026
- Downloads
- 515/mo · 515/wk
- Author
- mocito
- License
- Apache-2.0
- Types
- extension
- Size
- 156.8 KB
- Dependencies
- 2 dependencies · 4 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-codex-tools
Give grammar-capable OpenAI/Codex models the Codex apply_patch tool in Pi without changing Pi's normal tools for other models.
What it adds
- Raw
apply_patch— sends Codex's Lark grammar as an OpenAI custom tool, so patches are not JSON-wrapped. - Capability-based activation — requires
openai-codex-responsesoropenai-responsesplusmodel.compat.supportsOpenAIGrammarTools === true; model names alone are never enough. - Safe local mutation — patches are limited to 1 MiB, target files to 64 MiB, stay under Pi's current working directory, reject symlink escapes, use descriptor-anchored no-follow operations on Linux and macOS, fail closed elsewhere, preflight all hunks, and serialize writes with Pi's mutation queue.
- Model switching — supported models replace Pi's
editandwritetools withapply_patch; other active tools are preserved. Switching back restores only the file tools that were active before the switch. - Sequential patch calls — the extension marks patch execution sequential and disables provider-side parallel tool calls when the patch tool is active.
- Streaming progress — while a patch is generated, the TUI shows a live, color-coded glimpse of the content being written (new-file content, or
+/-lines for updates) plus a running+added -removedtally and a per-file roster for multi-file patches. It reuses Pi's shared diff rendering and mirrors the built-inwrite/editpreviews; patch execution is unchanged.
Installation
pi install npm:pi-codex-tools
For a one-off run:
pi -e /path/to/pi-mono/packages/pi-codex-tools
Scope decisions
The current Codex source does not define separate read_file or write_file tools: file inspection is normally done through shell commands and file mutation through apply_patch. This package keeps Pi's bounded read and bash tools, and uses apply_patch in place of Pi's edit and write tools for supported models. Because Pi does not provide Codex's OS-level filesystem sandbox, apply_patch performs its own TOCTOU-safe, no-follow directory walk: on Linux it re-opens each component relative to a trusted fd via /proc/self/fd, and on macOS via a tiny bundled openat/mkdirat/unlinkat N-API binding (prebuilt for Apple silicon and Intel). It fails closed on platforms without that support, in which case the native edit/write tools stay active. apply_patch also requires a Pi model runtime that advertises compat.supportsOpenAIGrammarTools; older runtimes leave the tool inactive.
| Codex surface | Decision |
|---|---|
apply_patch |
Included; it is a materially different freeform grammar tool. |
shell_command |
Deferred; Pi already has the bounded shell backend, while a faithful adapter needs Codex's approval and working-directory contract. |
exec_command + write_stdin |
Deferred; persistent PTY sessions need a separate process/session design. |
view_image |
Deferred; Pi's read already sends supported images as attachments. |
update_plan |
Deferred; it is workflow metadata rather than a capability-specific file tool. |
Code Mode exec + wait |
Deferred; it requires a real sandbox for model-authored JavaScript, not Node's ordinary vm wrapper. |
These choices are based on the Codex tool specifications in codex-rs/core/src/tools, the model profiles in codex-rs/models-manager/models.json, and the Code Mode protocol. They intentionally keep this package focused on the one tool with a distinct transport and model-facing contract.
Compatibility notes
apply_patch is line-oriented rather than byte-oriented:
*** Add Filerequires at least one+line and writes a trailing newline. A+-only hunk creates a one-newline file, not a zero-byte file.- Updates produce a trailing newline for non-empty output, so updating a file that lacks one may add it.
- Existing CRLF line endings are preserved when detected.
- Use
bashwhen exact byte-level output or a truly empty file is required.
These behaviors intentionally match Codex apply_patch.
The provider contract is runtime-specific: use Pi 0.83.0 or newer for OpenAI grammar-tool support. For a manual smoke test, start Pi with this extension and a model that advertises supportsOpenAIGrammarTools, then verify that a file change appears as an apply_patch call and not as edit, write, or bash.
Development
npm run -w packages/pi-codex-tools check
npm test -w packages/pi-codex-tools
npm run -w packages/pi-codex-tools pack:dry-run
Install/update telemetry is disabled in CI and can be disabled with PI_OFFLINE=1, PI_TELEMETRY=0 or PI_TELEMETRY=false, or Pi's enableInstallTelemetry: false setting. See SECURITY.md.
License
This package is Apache-2.0 licensed because its grammar/parser behavior is adapted from OpenAI Codex. See NOTICE.