import type { ProjectWithBranches, Branch } from "#ai-utils";
export declare class ProjectNotFoundError extends Error {
    readonly projectId: string;
    readonly builderPublicKey: string;
    constructor(projectId: string, builderPublicKey: string);
}
export interface ProjectSummary {
    id: string;
    name: string;
    repoUrl?: string;
    settings?: {
        folders?: Array<{
            remoteUrl: string;
        }>;
    };
}
export declare function getGitRemoteUrl(): Promise<string | null>;
export declare function readPinnedProjectIdAsync(): Promise<string | null>;
export declare function persistPinnedProjectId(projectId: string): Promise<void>;
/**
 * Normalize a git remote URL for comparison, mirroring the server-side logic.
 * Strips .git suffix, converts SSH to HTTPS-like format, removes protocol and lowercases.
 */
export declare function normalizeRepoUrl(url: string): string;
/**
 * Returns whether the given URL matches the project's primary repo URL.
 */
export declare function isPrimaryRepo(project: ProjectSummary, normalizedRemote: string): boolean;
/**
 * Returns whether any of the project's configured repo URLs match the given remote URL.
 * Checks both the primary repoUrl and any secondary repos in settings.folders.
 */
export declare function projectMatchesRemote(project: ProjectSummary, normalizedRemote: string): boolean;
export declare function listProjects(builderPublicKey: string, builderPrivateKey: string, userId: string): Promise<ProjectSummary[]>;
export declare function getProjectWithBranches(builderPublicKey: string, builderPrivateKey: string, userId: string, projectId: string): Promise<ProjectWithBranches>;
export declare function findBranchByGitBranch(project: ProjectWithBranches, gitBranch: string): [string, Branch] | null;
export declare function resolveGitBranchFromBuilderBranch(project: ProjectWithBranches, builderBranchArg: string): string | null;
export declare function createFusionBranchForGitBranch(builderPublicKey: string, builderPrivateKey: string, userId: string, projectId: string, gitBranch: string, branchContext?: string, isPrimary?: boolean): Promise<string>;
export declare function notifyRemoteToSync(builderPublicKey: string, builderPrivateKey: string, userId: string, projectId: string, branchName: string): Promise<void>;
export interface ResolveProjectIdOptions {
    projectId?: string;
    builderPublicKey: string;
    builderPrivateKey: string;
    userId: string;
    spaceName?: string;
    /**
     * Called when multiple projects match the current git remote.
     * The caller should pick one and return its ID, or throw to cancel.
     */
    onMultipleRepoMatches: (matched: ProjectSummary[]) => Promise<string>;
    /**
     * Called when no projects match the current git remote, or there is no
     * remote, and multiple projects exist. The caller should pick one and
     * return its ID, or throw to cancel.
     */
    onNoRepoMatch: (allProjects: ProjectSummary[]) => Promise<string>;
}
export declare function resolveProjectId(options: ResolveProjectIdOptions): Promise<string>;
