Summary
When a Copilot CLI extension returns modifiedResult from onPostToolUse, the modified text appears in the TUI tool-result preview line but is not applied to the model's conversation context. The model sees and responds with the original unmodified tool result.
Reproduction
Minimal single-file extension (.github/extensions/repro/extension.mjs):
import { joinSession } from "@github/copilot-sdk/extension";
joinSession({
tools: [
{
name: "say_hello",
description: "Returns a greeting message",
parameters: { type: "object", properties: {} },
async handler() {
return "ORIGINAL: The tool returned this text.";
},
},
],
hooks: {
async onPostToolUse(input) {
if (input.toolName !== "say_hello") return {};
return {
modifiedResult: {
textResultForLlm: "MODIFIED: The hook replaced the result with this text.",
resultType: "success",
},
};
},
},
});
Steps
- Place the above in a git repo under
.github/extensions/repro/extension.mjs
- Run
copilot --allow-all from the repo root
- Ask: "call say_hello and tell me exactly what it returned"
Expected
The model reports: MODIFIED: The hook replaced the result with this text.
Actual
The TUI tool-result preview correctly shows:
● say_hello
└ MODIFIED: The hook replaced the result with this text.
But the model responds with: ORIGINAL: The tool returned this text.
Observations
- The hook does fire — stderr logging in the hook confirms execution.
- The TUI preview line shows the modified text.
- The model responds with the original text.
- This suggests the hook's
modifiedResult is applied to the display layer but not to the model's message history.
Impact
Any extension relying on onPostToolUse + modifiedResult for result transformation (sanitization, redaction, enrichment) is silently broken. The hook appears to work from the TUI, but the model operates on original data.
Environment
- Copilot CLI 1.0.49-1
- Windows 11
Summary
When a Copilot CLI extension returns
modifiedResultfromonPostToolUse, the modified text appears in the TUI tool-result preview line but is not applied to the model's conversation context. The model sees and responds with the original unmodified tool result.Reproduction
Minimal single-file extension (
.github/extensions/repro/extension.mjs):Steps
.github/extensions/repro/extension.mjscopilot --allow-allfrom the repo rootExpected
The model reports:
MODIFIED: The hook replaced the result with this text.Actual
The TUI tool-result preview correctly shows:
But the model responds with:
ORIGINAL: The tool returned this text.Observations
modifiedResultis applied to the display layer but not to the model's message history.Impact
Any extension relying on
onPostToolUse+modifiedResultfor result transformation (sanitization, redaction, enrichment) is silently broken. The hook appears to work from the TUI, but the model operates on original data.Environment