char-slop/berry

multipurpose self-modifiable agentic harness

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

Charlotte Sombetter code line breakingbc405c3

main
7.6 KiB177 linesraw
1import { assertEquals, assertExists, assertStrictEquals } from "@std/assert";
2import type { ConversationId, EntryId, EntryRecord, LiveState } from "@earendil-works/pi-durable";
3import { fauxAssistantMessage, fauxToolCall } from "@earendil-works/pi-ai/providers/faux";
4import type { JsonValue } from "@berry/api";
5import { withDom } from "@berry/util/dom.ts";
6
7Deno.test("codemode exposes its calls with independent short input and output previews", async (t) => {
8  const observed = new Set<Element>();
9  let resize: (entries: { target: Element }[]) => void;
10  class Resize {
11    constructor(callback: typeof resize) {
12      resize = callback;
13    }
14    observe(target: Element) {
15      observed.add(target);
16    }
17    unobserve(target: Element) {
18      observed.delete(target);
19    }
20  }
21  const record = (id: number, kind: string, model: EntryRecord["model"]): EntryRecord => ({
22    id: id as EntryId,
23    conversationId: 1 as ConversationId,
24    kind,
25    model,
26  });
27  const source = Array.from({ length: 20 }, (_, i) => `text("line ${i + 1}");`).join("\n");
28  const output = Array.from({ length: 20 }, (_, i) => `line ${i + 1}`).join("\n");
29  const calls: JsonValue[] = [
30    { extension: "code", name: "read", args: { path: "a.ts" }, status: "ok", value: "file text" },
31    {
32      extension: "code",
33      name: "bash",
34      args: { command: "false" },
35      status: "error",
36      error: "failed",
37    },
38  ];
39  const entries = [record(1, "pi.assistant", [
40    fauxAssistantMessage(fauxToolCall("codemode", { code: source }, { id: "script" }), {
41      stopReason: "toolUse",
42    }),
43  ])];
44  const live = {
45    run: { taskId: 2 },
46    tools: [{ callId: "script", name: "codemode", status: "running", details: { calls } }],
47  } as unknown as LiveState;
48  let nextResult = 3;
49  const result = (text: string, isError = false) =>
50    record(nextResult++, "pi.tool-result", [{
51      role: "toolResult",
52      toolCallId: "script",
53      toolName: "codemode",
54      content: [{ type: "text", text }],
55      details: { calls },
56      isError,
57      timestamp: 0,
58    }]);
59  await withDom(async () => {
60    const { transcript } = await import("./transcript.tsx");
61    const view = transcript();
62    document.body.append(view.element);
63    const header = (card: Element) => {
64      const button = card.querySelector<HTMLButtonElement>(":scope > .tool-header");
65      assertExists(button);
66      return button;
67    };
68    try {
69      view.update(entries, live);
70      const outer = view.element.querySelector<HTMLElement>(".tool")!;
71      const [input, outputCard] = [...outer.querySelectorAll<HTMLElement>(".codemode-text")];
72      const nested = [...outer.querySelectorAll<HTMLElement>(".nested .tool")];
73      await t.step("the parent starts open and every constituent call starts closed", () => {
74        assertEquals(header(outer).getAttribute("aria-expanded"), "true");
75        assertEquals(outer.dataset.view, "open");
76        for (const call of nested) {
77          assertEquals(header(call).getAttribute("aria-expanded"), "false");
78          assertEquals(call.dataset.view, "closed");
79        }
80        assertEquals(outputCard.hidden, true);
81        assertEquals(
82          [...input.querySelectorAll(".code-text")].map((line) => line.textContent).join(""),
83          source,
84        );
85      });
86      await t.step("input and output expand independently", () => {
87        view.update([...entries, result(`Script completed\n${output}`)], {});
88        assertEquals(outputCard.hidden, false);
89        assertEquals(outputCard.querySelector("pre")!.textContent, output);
90        header(input).click();
91        assertEquals(input.dataset.view, "open");
92        assertEquals(outputCard.dataset.view, "preview");
93        header(outputCard).click();
94        assertEquals(outputCard.dataset.view, "open");
95        header(input).click();
96        header(outputCard).click();
97        assertEquals([input.dataset.view, outputCard.dataset.view], ["preview", "preview"]);
98        assertEquals(outer.dataset.view, "open");
99        assertEquals(nested.map((call) => call.dataset.view), ["closed", "closed"]);
100      });
101      await t.step("clipped text has a working show-all affordance", () => {
102        for (const card of [input, outputCard]) {
103          const preview = card.querySelector<HTMLElement>(":scope > .tool-preview")!;
104          Object.defineProperty(preview, "clientHeight", { configurable: true, value: 96 });
105          Object.defineProperty(preview.firstElementChild!, "offsetHeight", {
106            configurable: true,
107            value: 600,
108          });
109        }
110        resize!([...observed].map((target) => ({ target })));
111        for (const card of [input, outputCard]) {
112          const more = card.querySelector<HTMLButtonElement>(".tool-more")!;
113          const content = card.querySelector<HTMLElement>(".tool-preview > div")!;
114          assertEquals(content.inert, true);
115          assertEquals(more.hidden, false);
116          assertEquals(header(card).getAttribute("aria-expanded"), "false");
117          more.click();
118          assertEquals(more.hidden, true);
119          assertEquals(content.inert, false);
120          assertEquals(header(card).getAttribute("aria-expanded"), "true");
121          assertStrictEquals(document.activeElement, header(card));
122        }
123      });
124      await t.step(
125        "bottom controls restore previews and closed calls without changing siblings",
126        () => {
127          const less = input.querySelector<HTMLButtonElement>(":scope > .tool-less")!;
128          assertEquals(less.hidden, false);
129          less.click();
130          assertEquals(input.dataset.view, "preview");
131          assertEquals(less.hidden, true);
132          assertEquals(header(input).getAttribute("aria-expanded"), "false");
133          assertStrictEquals(document.activeElement, header(input));
134          assertEquals(outputCard.dataset.view, "open");
135          input.querySelector<HTMLButtonElement>(".tool-more")!.click();
136          assertEquals(input.dataset.view, "open");
137
138          header(nested[0]).click();
139          const close = nested[0].querySelector<HTMLButtonElement>(":scope > .tool-less")!;
140          close.click();
141          assertEquals(nested[0].dataset.view, "closed");
142          assertEquals(close.hidden, true);
143          assertEquals(header(nested[0]).getAttribute("aria-expanded"), "false");
144          assertStrictEquals(document.activeElement, header(nested[0]));
145          assertEquals(outer.dataset.view, "open");
146        },
147      );
148      await t.step(
149        "user choices survive progress, completion and errors without affecting siblings",
150        () => {
151          header(input).click();
152          header(nested[0]).click();
153          header(outer).click();
154          view.update(entries, live);
155          view.update([...entries, result("Script failed\nFailure details", true)], {});
156          assertEquals(outer.dataset.view, "closed");
157          header(outer).click();
158          assertEquals(outer.dataset.view, "open");
159          assertStrictEquals(outer.querySelector(".codemode-text"), input);
160          assertEquals(input.dataset.view, "preview");
161          assertEquals(outputCard.dataset.view, "open");
162          assertEquals(nested.map((call) => call.dataset.view), ["open", "closed"]);
163          assertEquals(outputCard.querySelector("pre")!.textContent, "Failure details");
164          view.update(entries, live);
165          assertEquals(outputCard.hidden, true);
166          view.update([...entries, result(`Script completed\n${output}`)], {});
167          assertEquals(outputCard.hidden, false);
168          assertEquals(outputCard.dataset.view, "open");
169          assertEquals(input.dataset.view, "preview");
170        },
171      );
172    } finally {
173      view.dispose();
174      assertEquals(observed.size, 0);
175    }
176  }, { globals: { ResizeObserver: Resize } });
177});