Files
dev/third_party/pi/packages/coding-agent/examples/extensions/input-transform-streaming.ts
alexion 4def357d09 chore(vendor): import pi 0.85.1
Imported as a linear vendor commit so forge rebases do not replay the upstream root tree.

git-subtree-dir: third_party/pi

git-subtree-split: d981de1229ef899957bbe968bc8dcda02a21f477
2026-09-14 10:48:47 -04:00

40 lines
1.2 KiB
TypeScript

/**
* Streaming-Aware Input Gate
*
* Demonstrates `event.streamingBehavior` to skip expensive pre-processing
* during mid-stream steering, where low latency matters.
*
* This extension prepends `git diff --stat` output when the user mentions
* file changes, giving the model immediate context. During steering the
* exec call is skipped so the correction reaches the model without delay.
*
* Start pi with this extension:
* pi -e ./examples/extensions/input-transform-streaming.ts
*/
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
const TRIGGER = /\b(changes?|diff|modified)\b/i;
export default function (pi: ExtensionAPI) {
pi.on("input", async (event) => {
// During steering, skip the exec call — corrections should be fast
if (event.streamingBehavior === "steer") {
return { action: "continue" };
}
if (!TRIGGER.test(event.text)) {
return { action: "continue" };
}
const { stdout, code } = await pi.exec("git", ["diff", "--stat"]);
if (code !== 0 || !stdout.trim()) {
return { action: "continue" };
}
return {
action: "transform",
text: `${event.text}\n\nCurrent uncommitted changes:\n\`\`\`\n${stdout.trim()}\n\`\`\``,
};
});
}