export type ProjectSource = "ggcoder" | "claude-code" | "codex";
export interface DiscoveredProject {
    name: string;
    path: string;
    lastActiveMs: number;
    lastActiveDisplay: string;
    /** Sorted, deduped list of stores this project showed up in. */
    sources: ProjectSource[];
}
/**
 * Scan ggcoder + Claude Code + Codex session stores and return one row per
 * project, sorted most-recent first. Duplicates (same cwd) are collapsed; the
 * `sources` field lists every store the project appeared in so the picker can
 * show a combined badge.
 */
export declare function discoverProjects(): Promise<DiscoveredProject[]>;
/**
 * Is `value` an absolute path on ANY platform?
 *
 * `path.isAbsolute` is platform-bound, but a session store is portable: read on
 * Windows it carries `C:\Users\…` / `\\server\share\…`, on POSIX `/Users/…`.
 * The old POSIX-only `startsWith("/")` check silently rejected every Windows
 * cwd header, so discovery fell back to the lossy directory-name decode and
 * every project/session vanished from the picker on Windows.
 */
export declare function isAbsoluteCwd(value: string): boolean;
export interface RecentSession {
    /** Session id. */
    id: string;
    /** Absolute resumable path to a plain or gzip GG Coder session. */
    path: string;
    /** Legacy saved label, falling back to the first real user prompt. */
    preview: string;
    /** Relative "3h ago" string from last activity. */
    lastActiveDisplay: string;
    messageCount: number;
}
/**
 * List the most recent ggcoder conversations for a project cwd. Compaction
 * checkpoints share a conversation id, so only the newest resumable checkpoint
 * is shown. Legacy labels win; otherwise the first real user prompt is used.
 */
export declare function listRecentSessions(cwd: string, limit?: number, sessionsDir?: string): Promise<RecentSession[]>;
//# sourceMappingURL=project-discovery.d.ts.map