27 lines
1.2 KiB
TypeScript
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"));
|
|
}
|