Block mutating tool calls in pi extension to surface context before edits#69
Merged
Block mutating tool calls in pi extension to surface context before edits#69
Conversation
gregology
approved these changes
Mar 14, 2026
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.
Closes #68
The pi extension was delivering
when: beforecontext after the edit had already happened — it stored context duringtool_calland then appended it to thetool_result. That completely defeats the purpose ofbeforetiming for mutating tools.Now, when pi calls
editorwrite, the extension checks for matching context and if there is any, blocks the tool call with{ block: true, reason: ... }. The agent sees the context first, then re-applies its change with that knowledge. Non-mutating tools (likeread) still get context appended to the tool result as before.The alternative was to inject context into the tool input rather than blocking, but pi's
blockAPI is the right fit here — it forces the agent to actually process the context before proceeding rather than potentially ignoring injected input. Blocking also gives the agent a chance to revise its edit based on the context, which is the whole point ofbeforetiming.Updated docs in
getting-started.mdandcli-reference.mdto describe the new behavior.Dev Ghost metrics
Total duration: 7m 0s
Turns: 75
Tool calls: 57
Tokens: 389,932 input / 4,954 output
Resolves #68