Skip to content

Extension onPostToolUse modifiedResult is not applied to the model's conversation context #3361

@pacovidal

Description

@pacovidal

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

  1. Place the above in a git repo under .github/extensions/repro/extension.mjs
  2. Run copilot --allow-all from the repo root
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:pluginsPlugin system, marketplace, hooks, skills, extensions, and custom agents

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions