@@ -336,6 +336,11 @@ func SysExec(_ context.Context, env []string, input string, progress chan<- stri
336
336
}
337
337
combined = io .MultiWriter (& out , & pw )
338
338
)
339
+
340
+ if envvars , err := getWorkspaceEnvFileContents (env ); err == nil {
341
+ env = append (env , envvars ... )
342
+ }
343
+
339
344
cmd .Env = env
340
345
cmd .Dir = params .Directory
341
346
cmd .Stdout = combined
@@ -355,6 +360,43 @@ func (pw *progressWriter) Write(p []byte) (n int, err error) {
355
360
return len (p ), nil
356
361
}
357
362
363
+ func getWorkspaceEnvFileContents (envs []string ) ([]string , error ) {
364
+ dir , err := getWorkspaceDir (envs )
365
+ if err != nil {
366
+ return nil , err
367
+ }
368
+
369
+ file := filepath .Join (dir , "gptscript.env" )
370
+
371
+ // Lock the file to prevent concurrent writes from other tool calls.
372
+ locker .RLock (file )
373
+ defer locker .RUnlock (file )
374
+
375
+ // This is optional, so no errors are returned if the file does not exist.
376
+ log .Debugf ("Reading file %s" , file )
377
+ data , err := os .ReadFile (file )
378
+ if errors .Is (err , fs .ErrNotExist ) {
379
+ log .Debugf ("The file %s does not exist" , file )
380
+ return []string {}, nil
381
+ } else if err != nil {
382
+ log .Debugf ("Failed to read file %s: %v" , file , err .Error ())
383
+ return []string {}, nil
384
+ }
385
+
386
+ lines := strings .Split (string (data ), "\n " )
387
+ var envContents []string
388
+
389
+ for _ , line := range lines {
390
+ line = strings .TrimSpace (line )
391
+ if strings .Contains (line , "=" ) {
392
+ envContents = append (envContents , line )
393
+ }
394
+ }
395
+
396
+ return envContents , nil
397
+
398
+ }
399
+
358
400
func getWorkspaceDir (envs []string ) (string , error ) {
359
401
for _ , env := range envs {
360
402
dir , ok := strings .CutPrefix (env , "GPTSCRIPT_WORKSPACE_DIR=" )
0 commit comments