/**
 * R2 structural-fields migration (2026-05-12).
 *
 * Backstory: when the encrypted store landed, the R2 credentials
 * (`r2.access_key_id`, `r2.secret_access_key`) moved into the registry
 * but the three structural fields — `account_id`, `bucket`, and
 * `public_url` — kept living in `workspace.json:r2_config.*`. That left
 * the Settings UI broken: users could enter credentials, hit save, and
 * AssetService still picked `local` because workspace-manager gates on
 * the structural fields from workspace.json. Until those fields were
 * also reachable via the store, the UI couldn't fully configure R2.
 *
 * Phase 12 (2026-05-12) already removed the first-run importer that
 * would have piggybacked the structural-field migration onto the
 * existing migrationSource pipeline. So this standalone one-shot fills
 * the gap: it runs at boot, copies pre-existing values from
 * `workspace.json:r2_config.*` into the store on first encounter, and
 * marks a meta flag so it never repeats.
 *
 * Operators who configured R2 via `studiograph r2 setup` before this
 * change see zero behavior difference. Operators who set R2 via the UI
 * post-change write directly to the store and never touch this code.
 *
 * Idempotent. Non-fatal on any single error — we'd rather boot with the
 * legacy fallback path than refuse to start because workspace.json went
 * sideways.
 */
import type { SqliteEncryptedStore } from './SqliteEncryptedStore.js';
interface MigrationOptions {
    workspaceJsonPath: string;
    store: SqliteEncryptedStore;
}
export interface MigrationResult {
    skipped: boolean;
    /** Keys actually written to the store (skipping ones already present). */
    written: string[];
}
export declare function migrateR2Structural(opts: MigrationOptions): Promise<MigrationResult>;
export {};
