From d3be4f8b431587b14975d0e595e4131e3c119bdb Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sun, 14 Jun 2026 20:45:50 +0300 Subject: fix: add best-effort windows plugin support --- src/app/api/plugins/mod.rs | 20 ++++++++++++++++---- src/app/api/plugins/panes.rs | 9 ++++++++- src/app/api/plugins/runtime.rs | 5 ++--- 3 files changed, 26 insertions(+), 8 deletions(-) (limited to 'src/app/api/plugins') diff --git a/src/app/api/plugins/mod.rs b/src/app/api/plugins/mod.rs index 6cc266e3..d00ad20f 100644 --- a/src/app/api/plugins/mod.rs +++ b/src/app/api/plugins/mod.rs @@ -471,7 +471,7 @@ impl App { .actions .iter() .find(|a| a.id == action_id) - .map(|a| manifest_action_info(&plugin_id, a)) + .map(|a| manifest_action_info(&plugin_id, &plugin.platforms, a)) .ok_or_else(|| { ( "plugin_action_not_found", @@ -622,7 +622,11 @@ fn plugin_manifest_available(plugin: &InstalledPluginInfo) -> bool { }) } -fn manifest_action_info(plugin_id: &str, action: &PluginManifestAction) -> PluginActionInfo { +fn manifest_action_info( + plugin_id: &str, + plugin_platforms: &Option>, + action: &PluginManifestAction, +) -> PluginActionInfo { PluginActionInfo { plugin_id: plugin_id.to_string(), action_id: action.id.clone(), @@ -630,7 +634,7 @@ fn manifest_action_info(plugin_id: &str, action: &PluginManifestAction) -> Plugi description: action.description.clone(), contexts: action.contexts.clone(), command: action.command.clone(), - platforms: action.platforms.clone(), + platforms: effective_platforms(&action.platforms, plugin_platforms).clone(), } } @@ -644,7 +648,7 @@ fn manifest_actions( plugin .actions .iter() - .map(|action| manifest_action_info(&plugin.plugin_id, action)) + .map(|action| manifest_action_info(&plugin.plugin_id, &plugin.platforms, action)) }) } @@ -1311,6 +1315,14 @@ command = ["sh", "-c", "sleep 1"] "example.worktree-bootstrap.bootstrap" ); assert_eq!(actions[0].command, ["bun", "run", "bootstrap.ts"]); + assert_eq!( + actions[0].platforms, + Some(vec![ + crate::api::schema::PluginPlatform::Linux, + crate::api::schema::PluginPlatform::Macos, + crate::api::schema::PluginPlatform::Windows, + ]) + ); let invoke = app.handle_api_request(Request { id: "invoke".into(), diff --git a/src/app/api/plugins/panes.rs b/src/app/api/plugins/panes.rs index 22173cbf..e6fe7b44 100644 --- a/src/app/api/plugins/panes.rs +++ b/src/app/api/plugins/panes.rs @@ -185,6 +185,11 @@ impl App { .map_err(|err| ("invalid_plugin_context".to_string(), err.to_string()))?; env.retain(|(key, _)| !plugin_pane_protected_env_key(key)); env.extend(super::env::plugin_path_env(plugin)); + env.push(( + crate::api::SOCKET_PATH_ENV_VAR.to_string(), + crate::api::socket_path().display().to_string(), + )); + env.push(("HERDR_ENV".to_string(), "1".to_string())); env.push(("HERDR_PLUGIN_ID".to_string(), plugin.plugin_id.clone())); env.push(( "HERDR_PLUGIN_ENTRYPOINT_ID".to_string(), @@ -273,7 +278,9 @@ impl App { fn plugin_pane_protected_env_key(key: &str) -> bool { matches!( key, - "HERDR_PLUGIN_ID" + crate::api::SOCKET_PATH_ENV_VAR + | "HERDR_ENV" + | "HERDR_PLUGIN_ID" | "HERDR_PLUGIN_ROOT" | "HERDR_PLUGIN_CONFIG_DIR" | "HERDR_PLUGIN_STATE_DIR" diff --git a/src/app/api/plugins/runtime.rs b/src/app/api/plugins/runtime.rs index c6955bb4..94a49dd4 100644 --- a/src/app/api/plugins/runtime.rs +++ b/src/app/api/plugins/runtime.rs @@ -1,5 +1,5 @@ use std::io::Read; -use std::process::{Command, Stdio}; +use std::process::Stdio; use super::manifest::{effective_platforms, ensure_platform_supported}; use super::plugin_manifest_available; @@ -117,8 +117,7 @@ impl App { self.state.plugin_commands_in_flight += 1; let event_tx = self.event_tx.clone(); std::thread::spawn(move || { - let child = Command::new(&program) - .args(args) + let child = crate::plugin_command::command_for_argv(&program, &args) .current_dir(plugin_root) .envs(env) .stdout(Stdio::piped()) -- cgit v1.2.3