@@ -137,6 +137,7 @@ Because of this, we don't use the ACP SDK in the browser, but instead handle raw
137137JSON-RPC messages and use the ACP-SDK for types. The proxy will continue to forward
138138any requests to the new connection.
139139*/
140+ use crate :: command:: create_shell_command;
140141use anyhow:: { anyhow, Result } ;
141142use axum:: {
142143 extract:: {
@@ -152,7 +153,6 @@ use serde::{Deserialize, Serialize};
152153use serde_json:: { Map , Value } ;
153154use std:: {
154155 collections:: HashMap ,
155- path:: Path ,
156156 process:: Stdio ,
157157 sync:: {
158158 atomic:: { AtomicBool , AtomicU64 , Ordering } ,
@@ -161,7 +161,7 @@ use std::{
161161} ;
162162use tokio:: {
163163 io:: { AsyncBufReadExt , AsyncWriteExt , BufReader } ,
164- process:: { Child , Command } ,
164+ process:: Child ,
165165 sync:: { mpsc, Mutex , RwLock } ,
166166} ;
167167use tracing:: { debug, error, info, trace, warn} ;
@@ -239,6 +239,8 @@ pub struct TidewaveSpawnOptions {
239239 pub command : String ,
240240 pub env : HashMap < String , String > ,
241241 pub cwd : String ,
242+ #[ serde( default ) ]
243+ is_wsl : bool ,
242244}
243245
244246#[ derive( Debug , Clone , Serialize , Deserialize ) ]
@@ -1201,18 +1203,6 @@ async fn forward_response_to_process(
12011203 Ok ( ( ) )
12021204}
12031205
1204- fn get_shell_command ( cmd : & str ) -> ( & ' static str , Vec < & str > ) {
1205- #[ cfg( target_os = "windows" ) ]
1206- {
1207- ( "cmd.exe" , vec ! [ "/s" , "/c" , cmd] )
1208- }
1209-
1210- #[ cfg( not( target_os = "windows" ) ) ]
1211- {
1212- ( "sh" , vec ! [ "-c" , cmd] )
1213- }
1214- }
1215-
12161206// ============================================================================
12171207// Process Management
12181208// ============================================================================
@@ -1221,21 +1211,19 @@ fn get_shell_command(cmd: &str) -> (&'static str, Vec<&str>) {
12211211pub fn real_process_starter ( ) -> ProcessStarterFn {
12221212 Arc :: new ( |spawn_opts : TidewaveSpawnOptions | {
12231213 Box :: pin ( async move {
1224- let ( cmd , args ) = get_shell_command ( & spawn_opts. command ) ;
1214+ info ! ( "Starting ACP process: {}" , spawn_opts. command) ;
12251215
1226- info ! ( "Starting ACP process: {} with args: {:?}" , cmd, args) ;
1216+ let mut cmd = create_shell_command (
1217+ & spawn_opts. command ,
1218+ spawn_opts. env ,
1219+ & spawn_opts. cwd ,
1220+ spawn_opts. is_wsl ,
1221+ ) ;
12271222
1228- let mut cmd = Command :: new ( cmd) ;
1229- cmd. args ( args)
1230- . envs ( spawn_opts. env )
1231- . current_dir ( Path :: new ( & spawn_opts. cwd ) )
1232- . stdin ( Stdio :: piped ( ) )
1223+ cmd. stdin ( Stdio :: piped ( ) )
12331224 . stdout ( Stdio :: piped ( ) )
12341225 . stderr ( Stdio :: piped ( ) ) ;
12351226
1236- #[ cfg( windows) ]
1237- cmd. creation_flags ( winapi:: um:: winbase:: CREATE_NO_WINDOW ) ;
1238-
12391227 let mut child = cmd
12401228 . spawn ( )
12411229 . map_err ( |e| anyhow ! ( "Failed to spawn process: {}" , e) ) ?;
@@ -1903,6 +1891,7 @@ mod tests {
19031891 command : "test_cmd" . to_string ( ) ,
19041892 env : HashMap :: new ( ) ,
19051893 cwd : "." . to_string ( ) ,
1894+ is_wsl : false ,
19061895 }
19071896 }
19081897
0 commit comments