char-slop/berry

multipurpose self-modifiable agentic harness

git clone https://git.t4t.associates/char-slop/berry

Charlotte Somsubscription: add usage limits for opencode-goaa0b468

main
4.4 KiB101 linesraw
1import { assertEquals, assertStringIncludes } from "@std/assert";
2import { press, withDom } from "@berry/util/dom.ts";
3import type { JsonValue } from "@berry/api";
4import type { HeaderContext, HeaderView } from "@berry/api/web.ts";
5import { builtRenderers } from "./fixture.ts";
6
7Deno.test("subscription headers open only on press, reject stale replies, and dismiss on Escape or focus-out", async () => {
8  await withDom(async (window) => {
9    let view: HeaderView | undefined;
10    const settle = async () => {
11      for (let i = 0; i < 5; i++) await Promise.resolve();
12    };
13    try {
14      view = (await builtRenderers("subscription")).header!();
15      const element = view.element as HTMLElement;
16      document.body.append(element);
17      const button = element.querySelector("button")!;
18      const requests: string[] = [];
19      const old = Promise.withResolvers<JsonValue | null>();
20      const context: HeaderContext = {
21        tid: "test",
22        model: { provider: "anthropic", modelId: "claude" },
23        command: () => Promise.reject(new Error("the widget asks its own handler")),
24        connect: () => {
25          throw new Error("the widget opens no channels");
26        },
27        request(name, args) {
28          assertEquals(name, "usage");
29          const { provider } = args as { provider: string };
30          requests.push(provider);
31          if (provider === "anthropic") return old.promise as Promise<JsonValue>;
32          return Promise.resolve({
33            status: "ok",
34            fetchedAt: "2026-04-01T12:00:00Z",
35            windows: [{ label: "5 hours", usedPercent: 25, resetsAt: "2026-04-02T12:00:00Z" }],
36          });
37        },
38      };
39      view.update({ ...context, model: { provider: "other", modelId: "other" } });
40      assertEquals(element.hidden, true);
41      assertEquals(requests, []);
42      view.update(context);
43      assertEquals(element.hidden, false);
44      assertEquals(requests, []);
45      const panel = element.querySelector<HTMLElement>('[role="region"]')!;
46      element.dispatchEvent(new window.Event("mouseenter") as unknown as Event);
47      button.dispatchEvent(new window.FocusEvent("focusin", { bubbles: true }) as unknown as Event);
48      assertEquals(requests, []);
49      assertEquals(button.getAttribute("aria-expanded"), "false");
50      assertEquals(panel.hidden, true);
51      button.click();
52      assertEquals(requests, ["anthropic"]);
53      assertEquals(button.getAttribute("aria-expanded"), "true");
54      assertEquals(panel.hidden, false);
55      view.update({ ...context, model: { provider: "openai-codex", modelId: "codex" } });
56      assertEquals(panel.hidden, true);
57      button.click();
58      await settle();
59      assertEquals(requests, ["anthropic", "openai-codex"]);
60      assertStringIncludes(element.textContent!, "25% used");
61      old.resolve({ status: "error", message: "Old Claude reply" });
62      await settle();
63      assertEquals(element.textContent!.includes("Old Claude reply"), false);
64      element.dispatchEvent(new window.Event("mouseleave") as unknown as Event);
65      assertEquals(button.getAttribute("aria-expanded"), "true");
66      button.click();
67      assertEquals(button.getAttribute("aria-expanded"), "false");
68      assertEquals(panel.hidden, true);
69      button.click();
70      assertEquals(button.getAttribute("aria-expanded"), "true");
71      assertEquals(requests.length, 2);
72      press(element, "Escape");
73      assertEquals(button.getAttribute("aria-expanded"), "false");
74      assertEquals(panel.hidden, true);
75      button.click();
76      button.dispatchEvent(
77        new window.FocusEvent("focusout", {
78          bubbles: true,
79          relatedTarget: window.document.body,
80        }) as unknown as Event,
81      );
82      assertEquals(button.getAttribute("aria-expanded"), "false");
83      assertEquals(panel.hidden, true);
84      view.update({ ...context, model: { provider: "opencode-go", modelId: "kimi" } });
85      assertEquals(element.hidden, false);
86      assertStringIncludes(button.getAttribute("aria-label")!, "OpenCode Go");
87      assertEquals(panel.hidden, true);
88      button.click();
89      await settle();
90      assertEquals(requests, ["anthropic", "openai-codex", "opencode-go"]);
91      assertStringIncludes(panel.textContent!, "OpenCode Go");
92      assertStringIncludes(panel.textContent!, "25% used");
93      view.dispose?.();
94      view = undefined;
95      button.click();
96      assertEquals(requests.length, 3);
97    } finally {
98      view?.dispose?.();
99    }
100  });
101});