mirror of
https://github.com/Tencent/BrowserSkill.git
synced 2026-09-10 13:01:23 +08:00
Capture user actions in the Agent Window and export a record-only trace (pages[] + navigate/click/fill/select/press steps with target descriptors). Adds the record overlay UI aligned with the control overlay, and wires record start/stop/await through CLI, daemon, protocol, and extension.
120 lines
3.8 KiB
TypeScript
120 lines
3.8 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import { OverlayController, shouldShowAgentControlOverlay } from "../overlay-controller";
|
|
|
|
describe("OverlayController", () => {
|
|
it("resets agent overlays without clearing user-tab borrow requests", () => {
|
|
const controller = new OverlayController();
|
|
|
|
controller.addBorrowRequest({
|
|
id: "borrow-1",
|
|
isActiveTab: true,
|
|
tabTitle: "User page",
|
|
timeoutMs: 5000,
|
|
onAllow: vi.fn(),
|
|
onDeny: vi.fn(),
|
|
});
|
|
controller.activateAgentSession("sess-1");
|
|
controller.setAgentHelpRequest({
|
|
id: "help-1",
|
|
prompt: "Finish login",
|
|
selectors: ["#login"],
|
|
onContinue: vi.fn(),
|
|
onCancel: vi.fn(),
|
|
});
|
|
controller.setAutomationBypass(true);
|
|
|
|
controller.resetAgentOverlays("sess-1");
|
|
|
|
const state = controller.snapshot();
|
|
expect(state.borrowRequests).toHaveLength(1);
|
|
expect(state.borrowRequests[0]?.id).toBe("borrow-1");
|
|
expect(state.controlVisible).toBe(false);
|
|
expect(state.activeSessionId).toBeNull();
|
|
expect(state.activeHelp).toBeNull();
|
|
expect(state.activeRecord).toBeNull();
|
|
expect(state.automationBypassCount).toBe(0);
|
|
});
|
|
|
|
it("ignores a reset for a different session", () => {
|
|
const controller = new OverlayController();
|
|
|
|
controller.activateAgentSession("sess-1");
|
|
controller.setAutomationBypass(true);
|
|
|
|
controller.resetAgentOverlays("sess-2");
|
|
|
|
const state = controller.snapshot();
|
|
expect(state.activeSessionId).toBe("sess-1");
|
|
expect(state.controlVisible).toBe(true);
|
|
expect(state.automationBypassCount).toBe(1);
|
|
});
|
|
|
|
it("returns the previous help request when replacing agent help", () => {
|
|
const controller = new OverlayController();
|
|
|
|
controller.setAgentHelpRequest({
|
|
id: "help-1",
|
|
prompt: "First request",
|
|
selectors: [],
|
|
onContinue: vi.fn(),
|
|
onCancel: vi.fn(),
|
|
});
|
|
const previous = controller.setAgentHelpRequest({
|
|
id: "help-2",
|
|
prompt: "Second request",
|
|
selectors: [],
|
|
onContinue: vi.fn(),
|
|
onCancel: vi.fn(),
|
|
});
|
|
|
|
expect(previous?.id).toBe("help-1");
|
|
expect(controller.snapshot().activeHelp?.id).toBe("help-2");
|
|
});
|
|
|
|
it("tracks active record request state", () => {
|
|
const controller = new OverlayController();
|
|
|
|
controller.activateAgentSession("sess-1");
|
|
controller.setAgentRecordRequest({
|
|
id: "rec-1",
|
|
onFinish: vi.fn(),
|
|
});
|
|
|
|
expect(controller.snapshot().activeRecord?.id).toBe("rec-1");
|
|
});
|
|
|
|
it("hides agent control overlay while recording is active", () => {
|
|
const controller = new OverlayController();
|
|
controller.activateAgentSession("sess-1");
|
|
expect(shouldShowAgentControlOverlay(controller.snapshot())).toBe(true);
|
|
|
|
controller.setAgentRecordRequest({
|
|
id: "rec-1",
|
|
onFinish: vi.fn(),
|
|
});
|
|
expect(shouldShowAgentControlOverlay(controller.snapshot())).toBe(false);
|
|
expect(controller.snapshot().controlVisible).toBe(true);
|
|
});
|
|
|
|
it("keeps control hidden after record ends until session overlays reset", () => {
|
|
const controller = new OverlayController();
|
|
controller.activateAgentSession("sess-1");
|
|
controller.setAgentRecordRequest({
|
|
id: "rec-1",
|
|
onFinish: vi.fn(),
|
|
});
|
|
controller.setAutomationBypass(true);
|
|
controller.setAutomationBypass(true);
|
|
|
|
controller.clearAgentRecordRequest("rec-1");
|
|
expect(controller.snapshot().activeRecord).toBeNull();
|
|
expect(controller.snapshot().suppressControlAfterRecord).toBe(true);
|
|
expect(controller.snapshot().automationBypassCount).toBe(0);
|
|
expect(shouldShowAgentControlOverlay(controller.snapshot())).toBe(false);
|
|
|
|
controller.resetAgentOverlays("sess-1");
|
|
expect(controller.snapshot().suppressControlAfterRecord).toBe(false);
|
|
expect(controller.snapshot().controlVisible).toBe(false);
|
|
});
|
|
});
|