44package aiusechat
55
66import (
7+ "context"
78 "fmt"
9+ "log"
10+ "time"
811
912 "github.com/wavetermdev/waveterm/pkg/aiusechat/uctypes"
13+ "github.com/wavetermdev/waveterm/pkg/buildercontroller"
1014 "github.com/wavetermdev/waveterm/pkg/util/fileutil"
1115 "github.com/wavetermdev/waveterm/pkg/util/utilfn"
1216 "github.com/wavetermdev/waveterm/pkg/waveappstore"
17+ "github.com/wavetermdev/waveterm/pkg/waveobj"
1318 "github.com/wavetermdev/waveterm/pkg/wps"
19+ "github.com/wavetermdev/waveterm/pkg/wstore"
1420)
1521
1622const BuilderAppFileName = "app.go"
@@ -19,6 +25,35 @@ type builderWriteAppFileParams struct {
1925 Contents string `json:"contents"`
2026}
2127
28+ func triggerBuildAndWait (builderId string , appId string ) map [string ]any {
29+ bc := buildercontroller .GetOrCreateController (builderId )
30+ rtInfo := wstore .GetRTInfo (waveobj .MakeORef (waveobj .OType_Builder , builderId ))
31+
32+ var builderEnv map [string ]string
33+ if rtInfo != nil {
34+ builderEnv = rtInfo .BuilderEnv
35+ }
36+
37+ ctx , cancel := context .WithTimeout (context .Background (), 60 * time .Second )
38+ defer cancel ()
39+
40+ result , err := bc .RestartAndWaitForBuild (ctx , appId , builderEnv )
41+ if err != nil {
42+ log .Printf ("Build failed for %s: %v" , builderId , err )
43+ return map [string ]any {
44+ "build_success" : false ,
45+ "build_error" : err .Error (),
46+ "build_output" : "" ,
47+ }
48+ }
49+
50+ return map [string ]any {
51+ "build_success" : result .Success ,
52+ "build_error" : result .ErrorMessage ,
53+ "build_output" : result .BuildOutput ,
54+ }
55+ }
56+
2257func parseBuilderWriteAppFileInput (input any ) (* builderWriteAppFileParams , error ) {
2358 result := & builderWriteAppFileParams {}
2459
@@ -37,7 +72,7 @@ func parseBuilderWriteAppFileInput(input any) (*builderWriteAppFileParams, error
3772 return result , nil
3873}
3974
40- func GetBuilderWriteAppFileToolDefinition (appId string ) uctypes.ToolDefinition {
75+ func GetBuilderWriteAppFileToolDefinition (appId string , builderId string ) uctypes.ToolDefinition {
4176 return uctypes.ToolDefinition {
4277 Name : "builder_write_app_file" ,
4378 DisplayName : "Write App File" ,
@@ -74,10 +109,19 @@ func GetBuilderWriteAppFileToolDefinition(appId string) uctypes.ToolDefinition {
74109 Scopes : []string {appId },
75110 })
76111
77- return map [string ]any {
112+ result := map [string ]any {
78113 "success" : true ,
79114 "message" : fmt .Sprintf ("Successfully wrote %s" , BuilderAppFileName ),
80- }, nil
115+ }
116+
117+ if builderId != "" {
118+ buildResult := triggerBuildAndWait (builderId , appId )
119+ result ["build_success" ] = buildResult ["build_success" ]
120+ result ["build_error" ] = buildResult ["build_error" ]
121+ result ["build_output" ] = buildResult ["build_output" ]
122+ }
123+
124+ return result , nil
81125 },
82126 }
83127}
@@ -104,7 +148,7 @@ func parseBuilderEditAppFileInput(input any) (*builderEditAppFileParams, error)
104148 return result , nil
105149}
106150
107- func GetBuilderEditAppFileToolDefinition (appId string ) uctypes.ToolDefinition {
151+ func GetBuilderEditAppFileToolDefinition (appId string , builderId string ) uctypes.ToolDefinition {
108152 return uctypes.ToolDefinition {
109153 Name : "builder_edit_app_file" ,
110154 DisplayName : "Edit App File" ,
@@ -147,7 +191,12 @@ func GetBuilderEditAppFileToolDefinition(appId string) uctypes.ToolDefinition {
147191 if err != nil {
148192 return fmt .Sprintf ("error parsing input: %v" , err )
149193 }
150- return fmt .Sprintf ("editing app.go for %s (%d edits)" , appId , len (params .Edits ))
194+ numEdits := len (params .Edits )
195+ editStr := "edits"
196+ if numEdits == 1 {
197+ editStr = "edit"
198+ }
199+ return fmt .Sprintf ("editing app.go for %s (%d %s)" , appId , numEdits , editStr )
151200 },
152201 ToolAnyCallback : func (input any , toolUseData * uctypes.UIMessageDataToolUse ) (any , error ) {
153202 params , err := parseBuilderEditAppFileInput (input )
@@ -165,10 +214,19 @@ func GetBuilderEditAppFileToolDefinition(appId string) uctypes.ToolDefinition {
165214 Scopes : []string {appId },
166215 })
167216
168- return map [string ]any {
217+ result := map [string ]any {
169218 "success" : true ,
170219 "message" : fmt .Sprintf ("Successfully edited %s with %d changes" , BuilderAppFileName , len (params .Edits )),
171- }, nil
220+ }
221+
222+ if builderId != "" {
223+ buildResult := triggerBuildAndWait (builderId , appId )
224+ result ["build_success" ] = buildResult ["build_success" ]
225+ result ["build_error" ] = buildResult ["build_error" ]
226+ result ["build_output" ] = buildResult ["build_output" ]
227+ }
228+
229+ return result , nil
172230 },
173231 }
174232}
0 commit comments