






















11// Canvas tests cover copy a2ui plugin behavior.
2-import { createHash } from "node:crypto";
32import fs from "node:fs/promises";
43import path from "node:path";
54import { resolvePreferredOpenClawTmpDir, withTempWorkspace } from "openclaw/plugin-sdk/temp-path";
@@ -8,24 +7,6 @@ import { copyA2uiAssets } from "./copy-a2ui.mjs";
8798const ORIGINAL_SKIP_MISSING = process.env.OPENCLAW_A2UI_SKIP_MISSING;
109const ORIGINAL_SPARSE_PROFILE = process.env.OPENCLAW_SPARSE_PROFILE;
11-const REQUIRED_COMPATIBILITY_ASSETS = [
12-{
13-path: path.join("assets", "providers", "google.png"),
14-sha256: "cea7e50b816514db6ca0f21d9545173fae1669643c71ed475c45c7f8440dac53",
15-},
16-{
17-path: path.join("assets", "providers", "x.png"),
18-sha256: "307c5dbde1ad66164fcfa1d9787435d99906fa78e7ba7d068f2aa705e86ff5aa",
19-},
20-{
21-path: "granola.png",
22-sha256: "16bc6b7f1b1229c8b1984c64520c30141b62c24b156c7590f86ca50bdc494d34",
23-},
24-];
25-26-function sha256(bytes: Buffer): string {
27-return createHash("sha256").update(bytes).digest("hex");
28-}
29103011describe("canvas a2ui copy", () => {
3112beforeEach(() => {
@@ -54,19 +35,6 @@ describe("canvas a2ui copy", () => {
5435);
5536}
563757-it("ships provider assets and the legacy granola compatibility image", async () => {
58-const srcDir = path.join(process.cwd(), "extensions", "canvas", "src", "host", "a2ui");
59-const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
60-61-for (const asset of REQUIRED_COMPATIBILITY_ASSETS) {
62-const bytes = await fs.readFile(path.join(srcDir, asset.path));
63-64-expect([...bytes.subarray(0, pngSignature.length)]).toEqual(pngSignature);
65-expect(bytes.length).toBeGreaterThan(64);
66-expect(sha256(bytes)).toBe(asset.sha256);
67-}
68-});
69-7038it("throws a helpful error when assets are missing", async () => {
7139await withA2uiFixture(async (dir) => {
7240await expect(copyA2uiAssets({ srcDir: dir, outDir: path.join(dir, "out") })).rejects.toThrow(
@@ -112,29 +80,26 @@ describe("canvas a2ui copy", () => {
11280});
11381});
11482115-it("preserves provider assets and the legacy granola compatibility image", async () => {
83+it("copies nested bundled assets and removes stale output", async () => {
11684await withA2uiFixture(async (dir) => {
11785const srcDir = path.join(dir, "src");
11886const outDir = path.join(dir, "dist");
119-const providerAssetDir = path.join(srcDir, "assets", "providers");
120-await fs.mkdir(providerAssetDir, { recursive: true });
87+const nestedAssetDir = path.join(srcDir, "assets", "demo");
88+await fs.mkdir(nestedAssetDir, { recursive: true });
89+await fs.mkdir(outDir, { recursive: true });
12190await fs.writeFile(path.join(srcDir, "index.html"), "<html></html>", "utf8");
12291await fs.writeFile(path.join(srcDir, "a2ui.bundle.js"), "console.log(1);", "utf8");
123-await fs.writeFile(path.join(providerAssetDir, "google.png"), "google-asset", "utf8");
124-await fs.writeFile(path.join(providerAssetDir, "x.png"), "x-asset", "utf8");
125-await fs.writeFile(path.join(srcDir, "granola.png"), "legacy-granola-asset", "utf8");
92+await fs.writeFile(path.join(nestedAssetDir, "sample.txt"), "nested-asset", "utf8");
93+await fs.writeFile(path.join(outDir, "stale.txt"), "stale-output", "utf8");
1269412795await copyA2uiAssets({ srcDir, outDir });
1289612997await expect(
130-fs.readFile(path.join(outDir, "assets", "providers", "google.png"), "utf8"),
131-).resolves.toBe("google-asset");
132-await expect(
133-fs.readFile(path.join(outDir, "assets", "providers", "x.png"), "utf8"),
134-).resolves.toBe("x-asset");
135-await expect(fs.readFile(path.join(outDir, "granola.png"), "utf8")).resolves.toBe(
136-"legacy-granola-asset",
137-);
98+fs.readFile(path.join(outDir, "assets", "demo", "sample.txt"), "utf8"),
99+).resolves.toBe("nested-asset");
100+await expect(fs.stat(path.join(outDir, "stale.txt"))).rejects.toMatchObject({
101+code: "ENOENT",
102+});
138103});
139104});
140105});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。