/** * 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, ProjectPluginSettings, ProjectPluginSettingsView, PluginUninstallResult, } from "@/domain"; import type { MutateAgentPluginSkillInput, MutateAgentPluginToolInput, PluginGateway, ReviewPluginPackageInput, SetProjectPluginEnabledInput, } from "@/ports"; type TauriPluginReviewDto = Omit & { issues?: PluginReview["issues"]; installable?: boolean; }; function normalizeReview(review: TauriPluginReviewDto): PluginReview { return { ...review, issues: review.issues ?? [], installable: review.installable ?? true, }; } export class TauriPluginGateway implements PluginGateway { listPlugins(): Promise { return invoke("plugin_list_plugins"); } async reviewPackage(input: ReviewPluginPackageInput): Promise { const review = await invoke("plugin_review_package", { input: { sourceKind: input.sourceKind, path: input.path }, }); return normalizeReview(review); } 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(projectId?: string): Promise { return invoke("plugin_list_runtime_contributions", { projectId: projectId ?? null, }); } listProjectSettings(projectId: string): Promise { return invoke("plugin_list_project_settings", { projectId }); } setProjectEnabled(input: SetProjectPluginEnabledInput): Promise { return invoke("plugin_set_project_enabled", { input }); } assignAgentSkill(input: MutateAgentPluginSkillInput): Promise { return invoke("plugin_assign_agent_skill", { input }); } unassignAgentSkill(input: MutateAgentPluginSkillInput): Promise { return invoke("plugin_unassign_agent_skill", { input }); } assignAgentTool(input: MutateAgentPluginToolInput): Promise { return invoke("plugin_assign_agent_tool", { input }); } unassignAgentTool(input: MutateAgentPluginToolInput): Promise { return invoke("plugin_unassign_agent_tool", { input }); } async openPluginsFolder(pluginId?: string): Promise { await invoke("plugin_open_plugins_folder", { pluginId: pluginId ?? null }); } }