/** * Tauri adapter for {@link PluginGateway} (ticket #43, F1). * * Commands use snake_case (Tauri convention); payload keys are camelCase, * consistent with the other adapters in this directory. Command names and * envelope match the carnet §5 exactly — no contract improvised here. * * NOTE: The Tauri commands wired here are defined in the backend `app-tauri` * crate (lots B1-B4, in progress in parallel on this branch). The mock gateway * covers tests and offline dev today. */ import { invoke } from "@tauri-apps/api/core"; import type { PluginAdmin, PluginInstallResult, PluginReview, PluginRuntimeContributionCatalog, PluginUninstallResult, } from "@/domain"; import type { PluginGateway, ReviewPluginPackageInput } from "@/ports"; export class TauriPluginGateway implements PluginGateway { listPlugins(): Promise { return invoke("plugin_list_plugins"); } reviewPackage(input: ReviewPluginPackageInput): Promise { return invoke("plugin_review_package", { request: { sourceKind: input.sourceKind, path: input.path }, }); } installFromArchive(path: string): Promise { return invoke("plugin_install_from_archive", { path }); } installFromDirectory(path: string): Promise { return invoke("plugin_install_from_directory", { path }); } setEnabled(pluginId: string, enabled: boolean): Promise { return invoke("plugin_set_enabled", { pluginId, enabled }); } uninstall(pluginId: string): Promise { return invoke("plugin_uninstall", { pluginId }); } listRuntimeContributions(): Promise { return invoke("plugin_list_runtime_contributions"); } async openPluginsFolder(pluginId?: string): Promise { await invoke("plugin_open_plugins_folder", { pluginId: pluginId ?? null }); } }