Initial WallMuse project

This commit is contained in:
fenglee
2026-05-09 09:12:41 +00:00
commit 3ea7d29827
91 changed files with 13136 additions and 0 deletions

30
scripts/health-check.sh Executable file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
echo "WallMuse health check"
echo "Workspace: $ROOT_DIR"
if command -v docker >/dev/null 2>&1; then
docker compose -f infra/docker-compose.yml --env-file .env ps
else
echo "docker is not installed"
fi
check_tcp() {
local name="$1"
local host="$2"
local port="$3"
if timeout 2 bash -c "</dev/tcp/$host/$port" 2>/dev/null; then
echo "ok: $name $host:$port"
else
echo "warn: $name $host:$port is not reachable"
fi
}
check_tcp postgres 127.0.0.1 5432
check_tcp redis 127.0.0.1 6379
check_tcp minio 127.0.0.1 9000
check_tcp minio-console 127.0.0.1 9001

View File

@@ -0,0 +1,19 @@
import { JsonWallMuseDb } from "../packages/db/src/json-store.js";
import type { GenerationWorkerJobData } from "../packages/db/src/json-store.js";
import { GenerationProcessor } from "../apps/worker-generation/src/processor.js";
const db = JsonWallMuseDb.fromEnv();
const processor = new GenerationProcessor(db);
const jobData: GenerationWorkerJobData = { groupId: crypto.randomUUID(), taskId: crypto.randomUUID(), userId: "user_mock", mode: "text_to_image", prompt: "futuristic city at sunrise, clean wallpaper composition", negativePrompt: "text, logo, watermark", resolution: "2k", providerId: "00000000-0000-4000-8000-000000000001", providerSlug: "mock", modelId: "00000000-0000-4000-8000-000000000101", modelSlug: "mock-wallpaper-v1", seed: 42 };
await db.seedQueuedGeneration(jobData);
console.log(`queued group=${jobData.groupId} task=${jobData.taskId}`);
await processor.process({ data: jobData, updateProgress: async (progress: number) => console.log(`progress=${progress}`) } as never);
const state = await db.read();
const group = state.generationGroups.find((item) => item.id === jobData.groupId);
const assets = group?.assets ?? [];
const logs = state.providerCallLogs.filter((item) => item.groupId === jobData.groupId);
console.log(`final status=${group?.status}`);
console.log(`assets=${assets.map((asset) => `${asset.kind}:${asset.status}`).join(",")}`);
console.log(`provider_call_logs=${logs.length}`);
if (group?.status !== "succeeded") throw new Error(`Expected succeeded, received ${group?.status ?? "missing"}`);
if (!["master", "landscape", "portrait"].every((kind) => assets.some((asset) => asset.kind === kind && asset.status === "active"))) throw new Error("Expected active master, landscape and portrait assets");
if (logs.length < 3 || !logs.every((log) => log.status === "succeeded")) throw new Error("Expected succeeded provider_call_logs for each generated asset");