/** * Tauri adapter for {@link ProfileGateway} (L5). Like the sibling adapters this * is one of the *only* places that calls `invoke()`; components reach it * exclusively through the port. * * Commands and payload keys are camelCase, matching the backend DTO convention. */ import { invoke } from "@tauri-apps/api/core"; import type { AgentProfile, FirstRunState, OpenCodeProviderCatalogEntry, ProfileModelCatalog, ProfileAvailability, } from "@/domain"; import type { CloneProfileFromSeedInput, CloneOpenCodeProfileFromSeedInput, ProfileGateway, SaveOpenCodeProviderProfileInput, } from "@/ports"; import { normalizeProfileModelCatalog } from "./profileCatalog"; export class TauriProfileGateway implements ProfileGateway { firstRunState(): Promise { return invoke("first_run_state"); } referenceProfiles(): Promise { return invoke("reference_profiles"); } detectProfiles(candidates: AgentProfile[]): Promise { return invoke("detect_profiles", { request: { candidates }, }); } listProfiles(): Promise { return invoke("list_profiles"); } saveProfile(profile: AgentProfile): Promise { return invoke("save_profile", { request: { profile } }); } async deleteProfile(profileId: string): Promise { await invoke("delete_profile", { profileId }); } cloneProfileFromSeed(input: CloneProfileFromSeedInput): Promise { return invoke("clone_profile_from_seed", { request: { seedProfileId: input.seedProfileId, name: input.name, model: input.model, }, }); } async listClaudeModels(): Promise { return normalizeProfileModelCatalog(await invoke("list_claude_models")); } async listCodexModels(): Promise { return normalizeProfileModelCatalog(await invoke("list_codex_models")); } configureProfiles(profiles: AgentProfile[]): Promise { return invoke("configure_profiles", { request: { profiles }, }); } cloneOpenCodeProfileFromSeed( input: CloneOpenCodeProfileFromSeedInput = {}, ): Promise { return invoke("clone_opencode_profile_from_seed", { request: { name: input.name, opencode: input.opencode }, }); } listOpenCodeProviders(): Promise { return invoke("list_opencode_providers"); } saveOpenCodeProviderProfile( input: SaveOpenCodeProviderProfileInput, ): Promise { return invoke("save_opencode_provider_profile", { request: { profile: input.profile, providerId: input.providerId, model: input.model, apiKey: input.apiKey, custom: input.custom, }, }); } }