/**
 * Schema.org SoftwareApplication JSON-LD for an extension's public site.
 *
 * Pure and dependency-free on purpose: the landing-page generator
 * (./landing-page.ts) embeds it, and that generator ships in three places —
 * dojo (through shared-types), the published @extenshi/mcp package and the
 * published @extenshi/cli package. Those two cannot import workspace
 * shared-types at runtime, so they carry copies of this file:
 *
 *   shared-types/json-ld.ts            (canonical — edit here)
 *   tools/extenshi-mcp/src/json-ld.ts  (byte-identical copy)
 *   tools/extenshi-cli/src/json-ld.ts  (byte-identical copy)
 *
 * `landing-page-sync.test.ts` in each package fails when a copy drifts. After
 * editing, run:
 *   cp shared-types/json-ld.ts tools/extenshi-mcp/src/json-ld.ts
 *   cp shared-types/json-ld.ts tools/extenshi-cli/src/json-ld.ts
 *
 * `shared-types/ai-visibility.ts` re-exports everything here, so existing
 * `shared-types/ai-visibility.js` imports keep working.
 */
export interface JsonLdInput {
    extensionName: string;
    description: string;
    websiteUrl?: string;
    authorName?: string;
    chromeUrl?: string;
    firefoxUrl?: string;
    edgeUrl?: string;
    privacyPolicyUrl?: string;
    /** Free (default) vs paid. Paid still omits a number — we are not the store. */
    offersPrice?: '0' | 'paid';
    /**
     * Real prices (an Extenshi Pay offer bound to the page). When non-empty they
     * replace the free offer: one Offer, or an AggregateOffer for several plans.
     */
    paidOffers?: JsonLdPriceInput[];
    capabilities?: string[];
    /** ISO date; omitted when blank. */
    datePublished?: string;
    /** Absolute https screenshot URLs; anything else is dropped. */
    screenshots?: string[];
}
export interface SoftwareApplicationJsonLd {
    '@context': 'https://schema.org';
    '@type': 'SoftwareApplication';
    name: string;
    description?: string;
    url?: string;
    applicationCategory: 'BrowserApplication';
    operatingSystem?: string;
    author?: {
        '@type': 'Organization';
        name: string;
    };
    offers?: JsonLdOffer | JsonLdAggregateOffer | JsonLdOffer[];
    installUrl?: string;
    sameAs?: string[];
    featureList?: string[];
    privacyPolicy?: string;
    screenshot?: string[];
}
export interface JsonLdPriceInput {
    name?: string;
    /** Decimal amount in major units ("4.99"). */
    price: string;
    /** ISO 4217 code, any case. */
    currency: string;
    period?: 'month' | 'year' | 'one-time' | 'lifetime';
}
export interface JsonLdOffer {
    '@type': 'Offer';
    name?: string;
    price: string;
    priceCurrency: string;
    priceSpecification?: {
        '@type': 'UnitPriceSpecification';
        price: string;
        priceCurrency: string;
        billingDuration: 'P1M' | 'P1Y';
    };
}
export interface JsonLdAggregateOffer {
    '@type': 'AggregateOffer';
    lowPrice: string;
    highPrice: string;
    priceCurrency: string;
    offerCount: number;
    offers: JsonLdOffer[];
}
/**
 * Offers for real prices: one Offer, an AggregateOffer when every plan is in
 * one currency, else a list. Malformed entries are dropped; null when none is left.
 */
export declare function jsonLdOffers(list: readonly JsonLdPriceInput[]): JsonLdOffer | JsonLdAggregateOffer | JsonLdOffer[] | null;
/**
 * Schema.org SoftwareApplication. Only fields we have evidence for are emitted —
 * empty author / URL / install links are omitted rather than faked.
 */
export declare function generateJsonLd(input: JsonLdInput): SoftwareApplicationJsonLd;
export declare function generateJsonLdSnippet(input: JsonLdInput): string;
/**
 * A `<script type="application/ld+json">` tag safe to drop into HTML.
 * `<` is escaped so a description cannot close the script element.
 */
export declare function jsonLdScriptTag(input: JsonLdInput): string;
/** Map a landing-page form onto JSON-LD without a second source of truth. */
export declare function jsonLdFromLanding(input: {
    extensionName: string;
    tagline: string;
    description: string;
    storeUrls: Partial<Record<'chrome' | 'firefox' | 'edge', string>>;
    features: {
        title: string;
        description: string;
    }[];
    privacyPolicyUrl: string;
    /** Canonical URL of the landing page itself (JSON-LD `url`). */
    homepageUrl?: string;
    /** Absolute https screenshot URLs (JSON-LD `screenshot`). */
    screenshots?: string[];
    /** `paid` drops the free offer when no real price is known. Default free. */
    offersPrice?: '0' | 'paid';
    /** Prices of the plans the page shows (bound Pay offers). */
    paidOffers?: JsonLdPriceInput[];
}): JsonLdInput;
//# sourceMappingURL=json-ld.d.ts.map