feat(extension): add popup toggle to hide Agent control hints (#81)

Add a per-browser "Control hints" switch to the popup that hides the in-page control overlay (status pill + orange glow, along with its input blocker) while the Agent controls a tab. Preference lives in chrome.storage.local (bsk_control_hints_hidden, default: shown) and is applied live in content scripts via storage.onChanged.

Both popup settings rows share a single Switch component; the hint copy lives in an info-icon tooltip.

Refs #62
This commit is contained in:
BB-fat
2026-08-13 10:24:17 +08:00
committed by GitHub
parent f81a1e7796
commit 37fbaacc94
12 changed files with 373 additions and 20 deletions
@@ -1,10 +1,12 @@
import { describe, expect, it, vi } from "vitest";
import {
getConnectionEnabled,
getControlHintsHidden,
getLabel,
getOrCreateInstanceId,
STORAGE_KEYS,
setConnectionEnabled,
setControlHintsHidden,
setLabel,
} from "../instance-id";
@@ -93,4 +95,26 @@ describe("instance-id", () => {
expect(store[STORAGE_KEYS.CONNECTION_ENABLED]).toBe(false);
expect(await getConnectionEnabled(backend)).toBe(false);
});
it("getControlHintsHidden returns false when storage is empty", async () => {
const { backend } = fakeStorage();
expect(await getControlHintsHidden(backend)).toBe(false);
});
it("getControlHintsHidden returns persisted boolean values", async () => {
const { backend } = fakeStorage({ [STORAGE_KEYS.CONTROL_HINTS_HIDDEN]: true });
expect(await getControlHintsHidden(backend)).toBe(true);
});
it("getControlHintsHidden treats non-boolean stored values as shown", async () => {
const { backend } = fakeStorage({ [STORAGE_KEYS.CONTROL_HINTS_HIDDEN]: "true" });
expect(await getControlHintsHidden(backend)).toBe(false);
});
it("setControlHintsHidden persists the value retrievable by getControlHintsHidden", async () => {
const { backend, store } = fakeStorage();
await setControlHintsHidden(true, backend);
expect(store[STORAGE_KEYS.CONTROL_HINTS_HIDDEN]).toBe(true);
expect(await getControlHintsHidden(backend)).toBe(true);
});
});
+23
View File
@@ -1,6 +1,7 @@
const STORAGE_KEY = "bsk_instance_id";
const LABEL_STORAGE_KEY = "bh_label";
const CONNECTION_ENABLED_KEY = "bh_connection_enabled";
const CONTROL_HINTS_HIDDEN_KEY = "bsk_control_hints_hidden";
export interface StorageBackend {
get(keys: string | string[]): Promise<Record<string, unknown>>;
@@ -105,8 +106,30 @@ export async function setConnectionEnabled(
await storage.set({ [CONNECTION_ENABLED_KEY]: enabled });
}
/**
* User preference for the in-page control hints (status pill + orange glow
* shown while the Agent controls a tab). Defaults to shown when unset or
* non-boolean; when hidden the whole control overlay — including its input
* blocker — is skipped so the page looks and behaves normally.
*/
export async function getControlHintsHidden(
storage: StorageBackend = defaultStorage(),
): Promise<boolean> {
const items = await storage.get(CONTROL_HINTS_HIDDEN_KEY);
const raw = items[CONTROL_HINTS_HIDDEN_KEY];
return typeof raw === "boolean" ? raw : false;
}
export async function setControlHintsHidden(
hidden: boolean,
storage: StorageBackend = defaultStorage(),
): Promise<void> {
await storage.set({ [CONTROL_HINTS_HIDDEN_KEY]: hidden });
}
export const STORAGE_KEYS = {
INSTANCE_ID: STORAGE_KEY,
LABEL: LABEL_STORAGE_KEY,
CONNECTION_ENABLED: CONNECTION_ENABLED_KEY,
CONTROL_HINTS_HIDDEN: CONTROL_HINTS_HIDDEN_KEY,
} as const;