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.3.0- Published
- Sep 18, 2026
- Downloads
- 471/mo · 263/wk
- Author
- mocito
- License
- Apache-2.0
- Types
- extension
- Size
- 74.7 KB
- Dependencies
- 1 dependency · 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. - Pi-style filesystem access — accepts relative or absolute paths and follows symlinked files and directories, including macOS
/tmp. Uses Node filesystem APIs without a native binding or platform gate. - Validated patches — limits patches to 1 MiB and target-file reads to 64 MiB, preflights all hunks, and serializes 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 while leaving provider-side parallel tool calls enabled.
- 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. Filesystem access uses the local user's permissions, like native Pi tools; it is not a sandbox. apply_patch 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
GPT-6 Astra
Pi 0.85.1's model catalog advertises grammar-tool support for gpt-6-astra on both openai-responses and openai-codex-responses. The extension uses that capability directly, with no model-name allowlist or JSON wrapper. Tests cover the pinned Pi transports, streamed raw calls, execution, and result replay using mocked HTTP responses; they do not certify live account access.
The GPT-6 guide also describes async tool calls, mid-turn steering, and reasoning updates. Those belong to the provider/session runtime and are not enabled by this extension. Patch execution remains sequential; provider-side parallel tool calling remains enabled.
With an updated pi-codex-compaction installed, the package supplies its owned
grammar metadata through Pi's public event bus. This keeps raw apply_patch
calls and results intact in direct Codex compaction requests, including Astra.
No private Pi registry is patched.
Filesystem behavior
- Add and update follow file symlinks and preserve the links. Add can create the target of a dangling symlink.
- Symlinked parents work for add, update, delete, and move, including paths outside the current directory.
- Delete removes the named entry. Deleting a symlink leaves its target unchanged.
- Move writes the updated content to the destination, then removes the source entry. A symlink destination is followed; a symlink source is removed without deleting its target.
- Preflight shares virtual content across symlink aliases and rejects moves onto the same resolved target.
- Symlink loops are rejected.
- Patches operate on regular text files, not directories, devices, sockets, or pipes.
Like native Pi tools, normal path-based I/O does not protect against another process replacing a path during execution. Preflight is not a transaction; an I/O failure can leave earlier files changed. See SECURITY.md.
Text format
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 ask it to create and update a disposable file through a symlinked directory (on macOS, /tmp is suitable). Verify that changes appear as raw apply_patch calls, the referent changes, and the symlink remains. Switch to an unsupported model and verify that the original file tools return.
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.