/**
 * Node capability-slot resolution — the single source of truth for a node's
 * effective slots (ORCHESTRATION_NODE_SLOTS.md). Every layer that needs a node's
 * slots (queue claim/launch caps, scheduling-runtime status projection, coordinator
 * prompt) resolves them here so the "explicit policy.slots, else legacy-derived"
 * rule is applied identically everywhere.
 *
 * Kept as a tiny standalone module (rather than living in mesh-queue-assignment)
 * so importing slot resolution does not drag in the whole assignment engine and to
 * avoid an import cycle between the status builder and the assignment engine.
 */
import { type NodeCapabilitySlot } from '@adhdev/mesh-shared';
/** Ordered, de-duplicated providerPriority from a node policy (defensive). */
export declare function normalizeProviderPriority(policy: unknown): string[];
/**
 * Resolve a node's capability slots — coordinator-owned config is the single source
 * of truth for ALL nodes (REMOTE-NODE-SLOTS-COORDINATOR-LOCAL fix).
 *
 * The coordinator's local meshes.json owns `policy.slots` for every node in the mesh
 * (self AND remote members alike — a remote member's mesh config lives on the
 * coordinator, its own on-disk meshes.json is empty). So slots resolve directly from
 * the coordinator's locally-owned `node.policy.slots`, with no remote reporter
 * round-trip: there is no per-node "reported slots" mirror to consult.
 *
 * Precedence:
 *   1. `policy.slots` — coordinator-owned, authoritative for self and remote alike.
 *   2. Legacy-derived from `providerPriority` + machine-global difficultyBrains.
 *
 * (The former per-provider `providerRoles` cap has been removed; a persisted
 * meshes.json is migrated to slots on load, so by the time a node reaches routing
 * its cap already lives on `slots[].maxParallel`.)
 */
export declare function resolveNodeCapabilitySlots(node: any): NodeCapabilitySlot[];
