aboutsummaryrefslogtreecommitdiff
path: root/src/app/api
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-14 20:45:50 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-14 20:45:59 +0300
commitd3be4f8b431587b14975d0e595e4131e3c119bdb (patch)
tree80bbbbf6c0ab295acb67cf6bdb05cc75f435e3f5 /src/app/api
parent54b58bb3452bd493a2881623a01371705ff806f1 (diff)
fix: add best-effort windows plugin support
Diffstat (limited to 'src/app/api')
-rw-r--r--src/app/api/plugins/mod.rs20
-rw-r--r--src/app/api/plugins/panes.rs9
-rw-r--r--src/app/api/plugins/runtime.rs5
3 files changed, 26 insertions, 8 deletions
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<Vec<crate::api::schema::PluginPlatform>>,
+ 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())