import { type BoundExtensionEntrypoint } from "./entrypoint-identity.js"; import type { Capability, PackageContractMetadata, ResolvedExtension } from "./types.js"; /** * Metadata extracted from a package.json that declares itself * as a veryfront extension. */ export interface PackageMetadata { isExtension: true; /** * Whether discovery may activate the extension without project config. * Absence is the documented legacy equivalent of `"auto"`. */ activation?: ExtensionActivationMode; capabilities: Capability[]; contracts?: PackageContractMetadata; } /** Controls whether installation alone may activate an extension package. */ export type ExtensionActivationMode = "auto" | "explicit"; /** A package extension whose manifest is bound to one physical import target. */ export interface DiscoveredPackageExtension { packageName: string; importTarget: string; metadata: PackageMetadata; } /** @internal Package discovery result retaining volatile filesystem identity. */ export interface BoundDiscoveredPackageExtension extends DiscoveredPackageExtension { binding: BoundExtensionEntrypoint; } /** @internal Project discovery result retaining volatile filesystem identity. */ export interface BoundDiscoveredProjectExtension { extensionName: string; binding: BoundExtensionEntrypoint; } /** * Resolve package activation without invoking an accessor on an ordinary data * object. Missing activation preserves legacy automatic discovery; malformed * live values fail closed as explicit-only. Injected discovery implementations * are trusted test seams and must not supply Proxies, whose descriptor traps * cannot be detected portably without invoking them. */ export declare function resolvePackageActivation(metadata: PackageMetadata): ExtensionActivationMode; /** * Parse veryfront extension metadata from a package.json-like object. * * Returns `PackageMetadata` when the package declares * `veryfront.extension: true`, otherwise `undefined`. Malformed capability * entries are filtered out; the caller receives only valid shapes. */ export declare function parsePackageMetadata(pkg: Record): PackageMetadata | undefined; /** * Merge extensions from all four sources in priority order. * * Priority (highest first): config > package > project > local-file. * Duplicates are resolved by keeping the highest-priority entry. * Disable directives (`{ name, enabled: false }`) remove matching * extensions regardless of source. */ export declare function mergeExtensions(config: ResolvedExtension[], packages: ResolvedExtension[], project: ResolvedExtension[], local: ResolvedExtension[], disableDirectives?: Array<{ name: string; enabled: false; }>, builtin?: ResolvedExtension[]): ResolvedExtension[]; /** * Scan `node_modules` (including `@scoped` packages) for packages * that declare veryfront extension metadata in their `package.json`. */ export declare function discoverBoundPackageExtensions(baseDir: string): Promise; /** Discover auto-activated package extensions without exposing identity internals. */ export declare function discoverPackageExtensions(baseDir: string): Promise; /** * Discover project extensions living under `extensions/` in the project root. * * Looks for `extensions//src/index.ts` and `extensions//index.ts`. * Extensions whose manifest declares `veryfront.activation: "explicit"` are * deliberately omitted: only a materialized `config.extensions` entry may * activate them. */ export declare function discoverBoundProjectExtensions(baseDir: string): Promise; /** Discover project extension paths without exposing identity internals. */ export declare function discoverProjectExtensions(baseDir: string): Promise; /** * Find `*.extension.ts` files in the project root. * * These are ordinary trusted project source, not manifest-authorized package * code. Symlinks are ignored and the paths intentionally carry no discovery * identity binding; the factory loader still rejects file-URL remapping. */ export declare function discoverLocalExtensions(baseDir: string): Promise; //# sourceMappingURL=discovery.d.ts.map