# pi-extension-codex-apply-patch

Pi extension that adds Codex-style `apply_patch` with:

- **Remote constraint**: sends `apply_patch` as a **custom freeform tool** with Lark grammar to Codex Responses API
- **Local constraint**: parses and verifies patch format before applying filesystem changes
- **Model gating**: activates only for `gpt-5.2-codex*` and `gpt-5.3-codex*`
- **Hard tool policy**:
  - on codex models, `edit` and `write` are disabled (use `apply_patch`)
  - `apply_patch` is disabled for non-codex models
  - warning is shown when switching from codex to non-codex after `apply_patch` has been used in the session
- **Interrupted-turn recovery**: orphaned custom tool calls are auto-completed with synthetic cancellation outputs so follow-up prompts do not fail with missing `custom_tool_call_output`
- **Codex prompt parity (patch section)**: injects Codex `## apply_patch` instructions for codex 5.2/5.3 turns
- **Live patch counters**: shows streaming `+X -Y path` lines while patch args arrive and while hunks/files are applied
- **Diff UI**: `apply_patch` renders a colored diff using pi's native diff renderer (expand tool output to view full diff)

## Install

```bash
pi install npm:pi-extension-codex-apply-patch
```

Or for local dev in a project:

```bash
pi install ./
```

## How it works

1. Registers an `apply_patch` tool in pi
2. Enforces tool policy:
   - on codex models, removes/blocks `edit` and `write`
   - when switching back to non-codex, restores `edit`/`write` if this extension removed them
   - exposes `apply_patch` only on codex 5.2/5.3 models
3. Overrides the `openai-codex` provider stream path via `registerProvider(... streamSimple ... )`
4. When model is codex 5.2/5.3 family, `apply_patch` is sent as:
   - `type: "custom"`
   - grammar format (`syntax: "lark"`)
5. Parses Codex `custom_tool_call` events and maps them into pi tool calls
6. Sends tool results back as `custom_tool_call_output`

## Local patch format

Expected patch envelope:

```text
*** Begin Patch
*** Add File: hello.txt
+Hello
*** End Patch
```

Supports:

- `*** Add File: <path>`
- `*** Delete File: <path>`
- `*** Update File: <path>` (+ optional `*** Move to: <path>`)
- hunks with `@@` and lines prefixed by ` `, `+`, `-`

Path behavior:

- matches pi `write` semantics for relative/absolute paths
- relative paths resolve against current working directory

## Development

```bash
pnpm install
pnpm typecheck
pnpm test
```
