mirror of
https://github.com/hanzoai/frames.git
synced 2026-09-24 00:08:03 +00:00
The workflow skills, the CLI reference, and the guides described a vendor's services: a separate account to sign into, a credential file beside the project, a music library and asset search that are not ours, and preview media on a CDN we do not run. Auth is now one Hanzo IAM token in $HANZO_API_KEY, read from Hanzo KMS — one credential for voice, music, sound effects, images, video, the shared catalog, and cloud rendering. The credential guide, the cloud-render pages, and the CLI auth reference all say the same thing, because there is now only one thing to say. Docs previews resolve from the docs site's own /images/ path, produced by our own generator. They are not committed (docs/images/ is ignored), so a deploy must run `bun run generate:catalog-previews` first — the same gap as before, minus a CDN we cannot publish to. Element grounding calls zen-vl through api.hanzo.ai rather than a third-party vision endpoint, and the LUT library builds every look from params, so no look needs a host at all. Command examples read `npx @hanzo/frame` / `hanzo frame` throughout. Three navigation entries left dangling by the rebrand now resolve. The changelog and the weekly archive keep their entries as written and say plainly that pre-port entries describe the upstream product.
86 lines
3.1 KiB
JavaScript
86 lines
3.1 KiB
JavaScript
import { strict as assert } from "node:assert";
|
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { test } from "node:test";
|
|
import {
|
|
BUNDLED_SFX_RECOVERY_COMMAND,
|
|
BundledSfxAssetsError,
|
|
bundledSfxProvider,
|
|
extensionForBundledSfxFile,
|
|
inspectBundledSfxAssets,
|
|
} from "./bundled-sfx-provider.mjs";
|
|
|
|
test("derives bundled SFX extension from the manifest filename", () => {
|
|
assert.equal(extensionForBundledSfxFile("impact.wav"), ".wav");
|
|
assert.equal(extensionForBundledSfxFile("whoosh.ogg"), ".ogg");
|
|
assert.equal(extensionForBundledSfxFile("extensionless"), ".mp3");
|
|
});
|
|
|
|
test("reports an agent-friendly recovery when the bundled SFX manifest is absent", () => {
|
|
const libraryDir = mkdtempSync(join(tmpdir(), "media-use-sfx-missing-"));
|
|
try {
|
|
const health = inspectBundledSfxAssets(libraryDir);
|
|
assert.equal(health.ok, false);
|
|
assert.equal(health.code, "bundled_sfx_assets_missing");
|
|
assert.match(health.detail, /manifest\.json/);
|
|
assert.match(health.fix, /@hanzo\/frame skills update media-use/);
|
|
assert.equal(health.fix, BUNDLED_SFX_RECOVERY_COMMAND);
|
|
} finally {
|
|
rmSync(libraryDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("reports the exact missing file from an incomplete bundled SFX install", () => {
|
|
const libraryDir = mkdtempSync(join(tmpdir(), "media-use-sfx-incomplete-"));
|
|
try {
|
|
writeFileSync(
|
|
join(libraryDir, "manifest.json"),
|
|
JSON.stringify({ whoosh: { file: "whoosh.mp3", description: "transition" } }),
|
|
);
|
|
const health = inspectBundledSfxAssets(libraryDir);
|
|
assert.equal(health.ok, false);
|
|
assert.equal(health.code, "bundled_sfx_assets_missing");
|
|
assert.match(health.detail, /whoosh\.mp3/);
|
|
} finally {
|
|
rmSync(libraryDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("bundled provider raises a typed install error instead of a generic catalog miss", async () => {
|
|
const libraryDir = mkdtempSync(join(tmpdir(), "media-use-sfx-provider-"));
|
|
try {
|
|
await assert.rejects(
|
|
() => bundledSfxProvider.search("whoosh", { libraryDir }),
|
|
(error) => {
|
|
assert.ok(error instanceof BundledSfxAssetsError);
|
|
assert.equal(error.code, "bundled_sfx_assets_missing");
|
|
assert.match(error.message, /@hanzo\/frame skills update media-use/);
|
|
return true;
|
|
},
|
|
);
|
|
} finally {
|
|
rmSync(libraryDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("accepts a complete bundled SFX library", () => {
|
|
const libraryDir = mkdtempSync(join(tmpdir(), "media-use-sfx-complete-"));
|
|
try {
|
|
mkdirSync(libraryDir, { recursive: true });
|
|
writeFileSync(
|
|
join(libraryDir, "manifest.json"),
|
|
JSON.stringify({ whoosh: { file: "whoosh.mp3", description: "transition" } }),
|
|
);
|
|
writeFileSync(join(libraryDir, "whoosh.mp3"), "audio");
|
|
assert.deepEqual(inspectBundledSfxAssets(libraryDir), {
|
|
ok: true,
|
|
count: 1,
|
|
detail: "1 bundled SFX asset available",
|
|
fix: "",
|
|
});
|
|
} finally {
|
|
rmSync(libraryDir, { recursive: true, force: true });
|
|
}
|
|
});
|