Files
dots/common/.pi/agent/extensions/agent-state.ts
T

27 lines
1.2 KiB
TypeScript

/**
* Pi agent-state extension: mirrors Pi's state into the tmux pane it runs in via
* ~/.config/tmux/scripts/agent-state.sh (pi busy|done|input|off), so the tmux status bar
* shows which pane is done or waiting for you. The script is a no-op outside tmux.
*/
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { execFile } from "node:child_process";
import { homedir } from "node:os";
import { join } from "node:path";
const SCRIPT = join(homedir(), ".config", "tmux", "scripts", "agent-state.sh");
function state(s: "busy" | "done" | "input" | "error" | "off"): void {
if (!process.env.TMUX_PANE) return;
execFile(SCRIPT, ["pi", s], () => {});
}
export default function (pi: ExtensionAPI) {
pi.on("agent_start", async () => state("busy"));
// agent_settled, not agent_end: Pi may still retry, compact, or run queued follow-ups.
pi.on("agent_settled", async () => state("done"));
// Blocking confirm/select prompts from extensions (permission-gate, confirm-destructive, questionnaire).
pi.on("ui_prompt_start", async () => state("input"));
pi.on("ui_prompt_end", async () => state("busy"));
pi.on("session_shutdown", async () => state("off"));
}