@@ -45,7 +45,7 @@ func (e *Engine) runCommand(ctx context.Context, tool types.Tool, input string)
4545 extraEnv = append (extraEnv , "GPTSCRIPT_TOOL_DIR=" + tool .WorkingDir )
4646 }
4747
48- cmd , stop , err := e .newCommand (ctx , extraEnv , tool . Instructions , input )
48+ cmd , stop , err := e .newCommand (ctx , extraEnv , tool , input )
4949 if err != nil {
5050 return "" , err
5151 }
@@ -74,62 +74,95 @@ func (e *Engine) runCommand(ctx context.Context, tool types.Tool, input string)
7474 return output .String (), nil
7575}
7676
77- func (e * Engine ) newCommand (ctx context.Context , extraEnv []string , instructions , input string ) (* exec.Cmd , func (), error ) {
78- env := append (e .Env [:], extraEnv ... )
79- data := map [string ]any {}
80-
81- dec := json .NewDecoder (bytes .NewReader ([]byte (input )))
82- dec .UseNumber ()
77+ func (e * Engine ) getRuntimeEnv (ctx context.Context , tool types.Tool , cmd , env []string ) ([]string , error ) {
78+ var (
79+ workdir = tool .WorkingDir
80+ err error
81+ )
82+ if e .RuntimeManager != nil {
83+ workdir , env , err = e .RuntimeManager .GetContext (ctx , tool , cmd , env )
84+ if err != nil {
85+ return nil , err
86+ }
87+ }
88+ return append (env , "GPTSCRIPT_TOOL_DIR=" + workdir ), nil
89+ }
8390
91+ func envAsMap (env []string ) map [string ]string {
8492 envMap := map [string ]string {}
8593 for _ , env := range env {
8694 key , value , _ := strings .Cut (env , "=" )
8795 envMap [key ] = value
8896 }
97+ return envMap
98+ }
99+
100+ var ignoreENV = map [string ]struct {}{
101+ "PATH" : {},
102+ }
103+
104+ func appendEnv (env []string , k , v string ) []string {
105+ for _ , k := range []string {k , strings .ToUpper (strings .ReplaceAll (k , "-" , "_" ))} {
106+ if _ , ignore := ignoreENV [k ]; ! ignore {
107+ env = append (env , k + "=" + v )
108+ }
109+ }
110+ return env
111+ }
89112
90- if err := json .Unmarshal ([]byte (input ), & data ); err == nil {
91- for k , v := range data {
92- envName := strings .ToUpper (strings .ReplaceAll (k , "-" , "_" ))
93- switch val := v .(type ) {
94- case string :
95- envMap [envName ] = val
96- env = append (env , envName + "=" + val )
97- envMap [k ] = val
98- env = append (env , k + "=" + val )
99- case json.Number :
100- envMap [envName ] = string (val )
101- env = append (env , envName + "=" + string (val ))
102- envMap [k ] = string (val )
103- env = append (env , k + "=" + string (val ))
104- case bool :
105- envMap [envName ] = fmt .Sprint (val )
106- env = append (env , envName + "=" + fmt .Sprint (val ))
107- envMap [k ] = fmt .Sprint (val )
108- env = append (env , k + "=" + fmt .Sprint (val ))
109- default :
110- data , err := json .Marshal (val )
111- if err == nil {
112- envMap [envName ] = string (data )
113- env = append (env , envName + "=" + string (data ))
114- envMap [k ] = string (data )
115- env = append (env , k + "=" + string (data ))
116- }
113+ func appendInputAsEnv (env []string , input string ) []string {
114+ data := map [string ]any {}
115+ dec := json .NewDecoder (bytes .NewReader ([]byte (input )))
116+ dec .UseNumber ()
117+
118+ if err := json .Unmarshal ([]byte (input ), & data ); err != nil {
119+ // ignore invalid JSON
120+ return env
121+ }
122+
123+ for k , v := range data {
124+ switch val := v .(type ) {
125+ case string :
126+ env = appendEnv (env , k , val )
127+ case json.Number :
128+ env = appendEnv (env , k , string (val ))
129+ case bool :
130+ env = appendEnv (env , k , fmt .Sprint (val ))
131+ default :
132+ data , err := json .Marshal (val )
133+ if err == nil {
134+ env = appendEnv (env , k , string (data ))
117135 }
118136 }
119137 }
120138
121- interpreter , rest , _ := strings . Cut ( instructions , " \n " )
122- interpreter = strings . TrimSpace ( interpreter )[ 2 :]
139+ return env
140+ }
123141
124- interpreter = os .Expand (interpreter , func (s string ) string {
125- return envMap [s ]
126- })
142+ func (e * Engine ) newCommand (ctx context.Context , extraEnv []string , tool types.Tool , input string ) (* exec.Cmd , func (), error ) {
143+ env := append (e .Env [:], extraEnv ... )
144+ env = appendInputAsEnv (env , input )
145+ envMap := envAsMap (env )
146+
147+ interpreter , rest , _ := strings .Cut (tool .Instructions , "\n " )
148+ interpreter = strings .TrimSpace (interpreter )[2 :]
127149
128150 args , err := shlex .Split (interpreter )
129151 if err != nil {
130152 return nil , nil , err
131153 }
132154
155+ env , err = e .getRuntimeEnv (ctx , tool , args , env )
156+ if err != nil {
157+ return nil , nil , err
158+ }
159+
160+ for i , arg := range args {
161+ args [i ] = os .Expand (arg , func (s string ) string {
162+ return envMap [s ]
163+ })
164+ }
165+
133166 var (
134167 cmdArgs = args [1 :]
135168 stop = func () {}
0 commit comments