/**
 * Shared repo-asset listing.
 *
 * Builds the list of assets owned by entries in a single repo, merging the two
 * storage schemes (legacy `{type}/{id}/{filename}` blobs surfaced by the
 * backend's listAll, and immutable-keyed assets tracked only in the ownership
 * index). Extracted from the asset-api route so the HTTP endpoints and the MCP
 * `list_assets` tool return an identical shape — including a render-safe
 * `embed` string callers can paste straight into an entry body.
 */
import type { WorkspaceManager } from '../core/workspace-manager.js';
export interface RepoAsset {
    filename: string;
    size: number;
    contentType: string;
    url: string;
    /** Render-safe markdown embed: `![filename](url)`. Paste verbatim. */
    embed: string;
    /** Immutable asset id when the asset is index-tracked; null for legacy blobs. */
    assetId: string | null;
    entityType: string;
    entityId: string;
    entityName: string;
    mediaType: string;
}
/**
 * Build the asset list for a single repo. Returns [] if the repo's graph can't
 * be loaded (right for the bulk endpoint; single-repo callers should check
 * repo existence themselves first if they want a 404).
 *
 * Algorithm (works for both local and R2 backends):
 *   1. One listAllAssets() call — single filesystem walk or one paginated S3
 *      ListObjectsV2 request. No HEAD round-trips, no markdown parsing.
 *   2. Resolve each asset's entity markdown path via the graph's file index
 *      (not a `{plural}/{id}.md` guess, which misses root/nested entries).
 *   3. Merge in immutable-keyed assets from the ownership index — these live
 *      under an `{assetId}/` prefix the backend's listAll can't see.
 */
export declare function listRepoAssets(repo: string, workspaceManager: WorkspaceManager): Promise<RepoAsset[]>;
