@@ -217,38 +217,42 @@ func appendInputAsEnv(env []string, input string) []string {
217
217
dec := json .NewDecoder (bytes .NewReader ([]byte (input )))
218
218
dec .UseNumber ()
219
219
220
- env = appendEnv (env , "GPTSCRIPT_INPUT" , input )
220
+ // If we don't create a new slice here, then parallel tool calls can end up getting messed up.
221
+ newEnv := make ([]string , len (env ), cap (env )+ 1 + len (data ))
222
+ copy (newEnv , env )
223
+
224
+ newEnv = appendEnv (newEnv , "GPTSCRIPT_INPUT" , input )
221
225
222
226
if err := json .Unmarshal ([]byte (input ), & data ); err != nil {
223
227
// ignore invalid JSON
224
- return env
228
+ return newEnv
225
229
}
226
230
227
231
for k , v := range data {
228
232
switch val := v .(type ) {
229
233
case string :
230
- env = appendEnv (env , k , val )
234
+ newEnv = appendEnv (newEnv , k , val )
231
235
case json.Number :
232
- env = appendEnv (env , k , string (val ))
236
+ newEnv = appendEnv (newEnv , k , string (val ))
233
237
case bool :
234
- env = appendEnv (env , k , fmt .Sprint (val ))
238
+ newEnv = appendEnv (newEnv , k , fmt .Sprint (val ))
235
239
default :
236
240
data , err := json .Marshal (val )
237
241
if err == nil {
238
- env = appendEnv (env , k , string (data ))
242
+ newEnv = appendEnv (newEnv , k , string (data ))
239
243
}
240
244
}
241
245
}
242
246
243
- return env
247
+ return newEnv
244
248
}
245
249
246
250
func (e * Engine ) newCommand (ctx context.Context , extraEnv []string , tool types.Tool , input string , useShell bool ) (* exec.Cmd , func (), error ) {
247
251
if runtime .GOOS == "windows" {
248
252
useShell = false
249
253
}
250
254
251
- envvars := append (e .Env [:] , extraEnv ... )
255
+ envvars := append (e .Env , extraEnv ... )
252
256
envvars = appendInputAsEnv (envvars , input )
253
257
if log .IsDebug () {
254
258
envvars = append (envvars , "GPTSCRIPT_DEBUG=true" )
0 commit comments