← back to Kickbacks Ai Upstream

src/modes.ts

58 lines

import { existsSync, readFileSync, writeFileSync, rmSync, mkdirSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
import type { BannerOverride } from "./banner";

/** Dev-only overrides for the three injection surfaces, backed by sentinel
 *  files under ~/.vibe-ads/ (headless parity with debug.enabled / banner.txt).
 *  Every function is guarded — fs failure ⇒ safe default, never throws. */
function dir(): string { return join(homedir(), ".vibe-ads"); }

function ensureDir(): void {
  try { mkdirSync(dir(), { recursive: true }); } catch { /* ignore */ }
}

/** Presence of <name> ⇒ true. */
function present(name: string): boolean {
  try { return existsSync(join(dir(), name)); } catch { return false; }
}

function setPresent(name: string, on: boolean): void {
  try {
    const p = join(dir(), name);
    if (on) { ensureDir(); writeFileSync(p, ""); }
    else rmSync(p, { force: true });
  } catch { /* ignore */ }
}

/** Default ON; ~/.vibe-ads/webview.off forces OFF. */
export function webviewMode(): "on" | "off" {
  return present("webview.off") ? "off" : "on";
}
export function setWebviewMode(on: boolean): void {
  setPresent("webview.off", !on);
}

/** Default ON; ~/.vibe-ads/cli.off forces OFF. */
export function cliMode(): "on" | "off" {
  return present("cli.off") ? "off" : "on";
}
export function setCliMode(on: boolean): void {
  setPresent("cli.off", !on);
}

/** Default "server"; ~/.vibe-ads/banner.mode content ∈ {server,on,off}. */
export function bannerOverride(): BannerOverride {
  try {
    const raw = readFileSync(join(dir(), "banner.mode"), "utf8").trim();
    return raw === "on" || raw === "off" || raw === "server" ? raw : "server";
  } catch { return "server"; }
}
export function setBannerOverride(o: BannerOverride): void {
  try {
    const p = join(dir(), "banner.mode");
    if (o === "server") rmSync(p, { force: true });
    else { ensureDir(); writeFileSync(p, o); }
  } catch { /* ignore */ }
}