export type PinMap = Record; export type WorldPins = { systems?: PinMap; abilities?: PinMap; }; export type VersionDetail = { kind: string; slug: string; version: string; manifest: { assetPack?: { slug: string; range: string; }; three?: string; rapier?: string; } & Record; codeBaseUrl: string; assetBaseUrl: string | null; codeFiles?: { path: string; size: number; }[]; }; export type ResolveDeps = { listVersions(slug: string): Promise; getVersion(slug: string, version: string): Promise; satisfies(version: string, normalizedRange: string): boolean; compare(a: string, b: string): number; }; export type ResolvedPackage = { kind: 'system' | 'ability'; slug: string; /** The requested range, kept so `helix install --update` can diff intent vs the baked version. */ range: string; version: string; /** The CDN code base the files download FROM (helix install rewrites to a local path in the lock). */ codeUrl: string; /** The code-only files under codeUrl (no assets) — what `helix install` downloads. */ codeFiles: string[]; /** Always a CDN base (§11): an ability's own asset base, or — for a system — its asset-pack's. */ assetBaseUrl: string | null; /** Systems only: the asset-pack resolved from the system envelope (or the -assets fallback). */ assetPack?: { slug: string; version: string; range: string; assetBaseUrl: string; }; /** Systems only: the full three.js version from the envelope — helix install wires the import map to runtime/three//. */ three?: string; /** Systems only: the full Rapier version from the envelope — helix install wires the import map to runtime/rapier//rapier.es.js. */ rapier?: string; }; export type ResolvedPins = { systems: ResolvedPackage[]; abilities: ResolvedPackage[]; }; export declare function normalizePinRange(range: string): string; export declare function defaultDeps(apiUrl: string): Promise; export declare function resolvePins(apiUrl: string, pins: WorldPins, deps?: ResolveDeps): Promise;