From c18f67d278c6efb39af06c7441cf767cc1a99fa1 Mon Sep 17 00:00:00 2001 From: ace-pm Date: Wed, 15 Apr 2026 16:17:04 +0200 Subject: [PATCH] Add working message vibes for TUI. Provides context-aware working status messages based on prompt keywords and tool names, with random emoji for visual interest. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/resources/extensions/sf-tui/vibes.ts | 67 ++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/resources/extensions/sf-tui/vibes.ts diff --git a/src/resources/extensions/sf-tui/vibes.ts b/src/resources/extensions/sf-tui/vibes.ts new file mode 100644 index 000000000..571f221e2 --- /dev/null +++ b/src/resources/extensions/sf-tui/vibes.ts @@ -0,0 +1,67 @@ +import type { ExtensionContext } from "@sf-run/pi-coding-agent"; + +const EMOJIS = ["โœจ", "๐Ÿ”ฅ", "๐Ÿš€", "โšก", "๐Ÿง ", "๐Ÿ”", "๐Ÿ› ๏ธ", "๐ŸŽจ", "๐Ÿงช", "๐Ÿ“ฆ", "๐Ÿ”ฎ", "๐ŸŒŠ", "๐Ÿ’ซ", "๐ŸŽฏ", "๐Ÿ—๏ธ", "๐Ÿ“"]; + +function emoji(): string { + return EMOJIS[Math.floor(Math.random() * EMOJIS.length)]; +} + +export function setVibeForPrompt(ctx: ExtensionContext, prompt: string): void { + if (!ctx.hasUI) return; + const p = prompt.toLowerCase(); + if (p.includes("fix") || p.includes("bug") || p.includes("error") || p.includes("crash")) { + return ctx.ui.setWorkingMessage(`${emoji()} Hunting bugs...`); + } + if (p.includes("test") || p.includes("spec") || p.includes("jest") || p.includes("vitest")) { + return ctx.ui.setWorkingMessage(`${emoji()} Writing tests...`); + } + if (p.includes("refactor") || p.includes("clean") || p.includes("simplify")) { + return ctx.ui.setWorkingMessage(`${emoji()} Refactoring...`); + } + if (p.includes("doc") || p.includes("readme") || p.includes("comment")) { + return ctx.ui.setWorkingMessage(`${emoji()} Writing docs...`); + } + if (p.includes("deploy") || p.includes("release") || p.includes("publish")) { + return ctx.ui.setWorkingMessage(`${emoji()} Shipping it...`); + } + if (p.includes("review") || p.includes("audit") || p.includes("check")) { + return ctx.ui.setWorkingMessage(`${emoji()} Reviewing code...`); + } + if (p.includes("plan") || p.includes("design") || p.includes("architect")) { + return ctx.ui.setWorkingMessage(`${emoji()} Architecting...`); + } + if (p.includes("search") || p.includes("find") || p.includes("lookup")) { + return ctx.ui.setWorkingMessage(`${emoji()} Searching...`); + } + if (p.includes("implement") || p.includes("build") || p.includes("create")) { + return ctx.ui.setWorkingMessage(`${emoji()} Building...`); + } + ctx.ui.setWorkingMessage(`${emoji()} Thinking...`); +} + +export function setVibeForTool(ctx: ExtensionContext, toolName: string): void { + if (!ctx.hasUI) return; + switch (toolName) { + case "bash": + return ctx.ui.setWorkingMessage(`${emoji()} Running shell spells...`); + case "write": + return ctx.ui.setWorkingMessage(`${emoji()} Inscribing files...`); + case "edit": + return ctx.ui.setWorkingMessage(`${emoji()} Patching code...`); + case "read": + return ctx.ui.setWorkingMessage(`${emoji()} Reading the scrolls...`); + case "search-the-web": + return ctx.ui.setWorkingMessage(`${emoji()} Searching the web...`); + case "browser-navigate": + return ctx.ui.setWorkingMessage(`${emoji()} Browsing...`); + case "ask_user_questions": + return ctx.ui.setWorkingMessage(`${emoji()} Asking questions...`); + default: + return ctx.ui.setWorkingMessage(`${emoji()} Working...`); + } +} + +export function clearVibe(ctx: ExtensionContext): void { + if (!ctx.hasUI) return; + ctx.ui.setWorkingMessage(); +}