Variable ShopItemSchemaConst

ShopItemSchema: ZodObject<{
    createdAt: ZodString;
    description: ZodString;
    id: ZodString;
    name: ZodString;
    priceUsd: ZodNumber;
    sale: ZodObject<{
        soldAt: ZodOptional<ZodString>;
        soldToPlayerId: ZodOptional<ZodString>;
        status: ZodEnum<["available", "sold"]>;
    }, "strip", ZodTypeAny, {
        soldAt?: string;
        soldToPlayerId?: string;
        status: "available" | "sold";
    }, {
        soldAt?: string;
        soldToPlayerId?: string;
        status: "available" | "sold";
    }>;
    spaceId: ZodString;
    type: ZodEnum<["book", "music", "coffee"]>;
}, "strip", ZodTypeAny, {
    createdAt: string;
    description: string;
    id: string;
    name: string;
    priceUsd: number;
    sale: {
        soldAt?: string;
        soldToPlayerId?: string;
        status: "available" | "sold";
    };
    spaceId: string;
    type: "book" | "music" | "coffee";
}, {
    createdAt: string;
    description: string;
    id: string;
    name: string;
    priceUsd: number;
    sale: {
        soldAt?: string;
        soldToPlayerId?: string;
        status: "available" | "sold";
    };
    spaceId: string;
    type: "book" | "music" | "coffee";
}> = ...

Shop amenity item — books, music, coffee.

Inserted by addShopItem AQL / RPC. Always starts with sale.status === "available". Client renders this via sprite-shop-item.ts and the bookstore amenity stage.

ShopItemSchema.parse({
id: "shop-1",
spaceId: "space-42",
type: "book",
name: "Hitchhiker's Guide",
description: "Don't panic.",
priceUsd: 12.5,
createdAt: new Date().toISOString(),
sale: { status: "available" },
});