/**
 * Normalize a project path for registry key-matching. Resolves symlinks
 * (macOS `/var` → `/private/var`) so registrations via absolute paths and
 * registrations via shell `$(pwd)` — which the extension's on_enable hook
 * uses — produce the same key. If the path doesn't exist yet, returns the
 * path unchanged rather than throwing.
 */
export declare function normalizeProjectPath(p: string): string;
/**
 * Telemetry project registry — `~/.indusk/telemetry/projects.json`.
 *
 * Tracks which projects have `local-telemetry` enabled so the daemon
 * knows when to auto-start (first enable) and when to graceful-stop
 * (last disable). Mutations only happen via this module's exports.
 *
 * Shape mirrors admin-ui-hosting's `lib/admin/registry.ts` — same
 * atomic-write pattern, same quarantine-on-malformed pattern (admin-UI
 * Phase 7 lesson carried forward: silent-data-loss hazards hide in
 * return-empty-on-error paths).
 */
export interface ProjectEntry {
    name: string;
    path: string;
    registeredAt: string;
    lastSeenAt: string;
}
export interface Registry {
    version: 1;
    projects: ProjectEntry[];
}
/**
 * Read the registry. Returns empty if absent. If the file exists but is
 * malformed (JSON parse failure OR wrong shape), quarantine-renames it to
 * `.corrupt.{ISO}.bak` before returning empty — prevents silent data loss
 * when a subsequent write would otherwise clobber the damaged bytes.
 */
export declare function readRegistry(): Registry;
/**
 * Register a project with the telemetry daemon. Idempotent — if the path
 * is already registered, returns the existing entry without modifying
 * lastSeenAt. Name-collision resolution uses basename + `-N` suffix
 * (same scheme as admin-UI registry).
 */
export declare function registerProject(projectPath: string): ProjectEntry;
/**
 * Deregister a project by path. Idempotent — if the path isn't registered,
 * returns false without modifying the registry. Returns true on successful
 * removal.
 */
export declare function deregisterProject(projectPath: string): boolean;
/**
 * Update lastSeenAt for a project. Used by init/update to refresh activity
 * timestamps when a project is re-scaffolded or upgraded. Idempotent — no
 * throw if the project isn't registered.
 */
export declare function touchProject(projectPath: string): void;
