/**
 * Shared Contract Primitives
 *
 * These types are intentionally cross-cutting primitives used by multiple owner
 * modules, so they live in a small shared contract file instead of the root monolith.
 *
 * Note: Keep this file limited to truly shared primitives to avoid recreating a
 * second catch-all bucket next to `types.ts`.
 */
export type MediaUsageLocation = {
    kind: "pageBlock";
    siteId: string;
    pageId: string;
    pageTitle: string | null;
    pageDraftPath: string | null;
    pagePublishedPath: string | null;
    blockId: string;
    blockKind: string;
    blockIdentifier: string | null;
    stage: "draft" | "published";
} | {
    kind: "contentEntry";
    siteId: string;
    entryId: string;
    entryTitle: string;
    typeKey: string;
    routeDraftPath: string | null;
    routePublishedPath: string | null;
    stage: "draft" | "published";
} | {
    kind: "productFileDownload";
    siteId: string;
    productId: string;
    productTitle: string;
};
export type MediaUsageCheckItem = {
    assetId: string;
    filename: string | null;
    usedCount: number;
    locations: MediaUsageLocation[];
};
export type MediaUsageCheckResponse = {
    items: MediaUsageCheckItem[];
};
export type AIChatMessage = {
    role: "user" | "assistant" | "system";
    content: string;
};
export type AiBriefTurn = {
    nextState: "brief_collecting" | "brief_ready";
    statePatch: Record<string, unknown>;
    questions?: string[];
    message: string;
};
export type JsonPrimitive = string | number | boolean | null;
export type JsonValue = JsonPrimitive | JsonValue[] | {
    [key: string]: JsonValue;
};
