feat(omo): quit with :q, :q!, :qa or :wq

A small extension catches Enter while the editor holds :q, :q!, :qa or :wq and shuts omo down, after the running turn if there is one. It reads the key through onTerminalInput rather than the input event, so typing :q never fires UserPromptSubmit hooks, which used to leave the blue working marker behind. setup-mac.sh links it into ~/.omo/agent/extensions.
This commit is contained in:
David Ibia
2026-10-17 16:28:20 +01:00
parent cd0ed704ab
commit dd90b462f5
2 changed files with 28 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
// Enter is caught before the editor submits, where omo handles /quit, so :q never fires prompt hooks
// such as UserPromptSubmit. ctx.shutdown() waits for the agent to go idle, so :q mid-turn quits after it.
import type { ExtensionAPI } from "@code-yeongyu/senpi";
import { Key, matchesKey } from "@earendil-works/pi-tui";
const QUIT_COMMANDS = new Set([":q", ":q!", ":qa", ":wq"]);
export default function (pi: ExtensionAPI) {
let unsubscribe: (() => void) | undefined;
pi.on("session_start", (_event, ctx) => {
unsubscribe?.();
unsubscribe = ctx.ui.onTerminalInput((data) => {
if (!matchesKey(data, Key.enter) || !QUIT_COMMANDS.has(ctx.ui.getEditorText().trim())) {
return undefined;
}
ctx.ui.setEditorText("");
ctx.shutdown();
return { consume: true };
});
});
pi.on("session_shutdown", () => {
unsubscribe?.();
unsubscribe = undefined;
});
}