/**
 * Build the `trait name → owning orbital` map used to form the qualified
 * `UI:<orbital>.<trait>.<event>` bus keys that trait state machines subscribe
 * to. Pure + dependency-free so it can be unit-tested without a React render.
 *
 * Critically, it backfills from the RESOLVED page bindings, not just the source
 * `schema.orbitals[].traits`. An auto-pulled sibling trait (e.g. an embedded
 * `@trait.X` calendar lifted into the orbital by the compiler's sibling-pull)
 * is absent from the source orbital's `traits[]`, so a source-only map misses
 * it — leaving its self-subscription unregistered and its own fetch-success
 * (e.g. `CalendarEventLoaded`) unheard, so the trait sticks in `loading`. A
 * pulled sibling lands in the same orbital as the page that references it, so
 * we backfill from the resolved page's owning orbital. Source-declared mappings
 * win; the IR only fills gaps.
 */
export interface OrbitalsByTraitSchema {
    orbitals?: ReadonlyArray<{
        name: string;
        traits?: ReadonlyArray<string | {
            ref?: string;
            name?: string;
        }>;
        pages?: ReadonlyArray<string | {
            path?: string;
        }>;
    }>;
}
export interface ResolvedPageTraits {
    /** Page route path, matched against the source orbital's page paths. */
    path?: string;
    /** Resolved trait names mounted on the page (includes pulled siblings). */
    traitNames: readonly string[];
}
export declare function buildOrbitalsByTrait(schema: OrbitalsByTraitSchema | undefined, resolvedPages?: ReadonlyArray<ResolvedPageTraits>): Record<string, string>;
