11package builtin
22
33import (
4+ "bytes"
45 "context"
56 "encoding/json"
67 "errors"
@@ -264,7 +265,7 @@ func Builtin(name string) (types.Tool, bool) {
264265 return SetDefaults (t ), ok
265266}
266267
267- func SysFind (_ context.Context , _ []string , input string ) (string , error ) {
268+ func SysFind (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
268269 var result []string
269270 var params struct {
270271 Pattern string `json:"pattern,omitempty"`
@@ -305,7 +306,7 @@ func SysFind(_ context.Context, _ []string, input string) (string, error) {
305306 return strings .Join (result , "\n " ), nil
306307}
307308
308- func SysExec (_ context.Context , env []string , input string ) (string , error ) {
309+ func SysExec (_ context.Context , env []string , input string , progress chan <- string ) (string , error ) {
309310 var params struct {
310311 Command string `json:"command,omitempty"`
311312 Directory string `json:"directory,omitempty"`
@@ -328,13 +329,30 @@ func SysExec(_ context.Context, env []string, input string) (string, error) {
328329 cmd = exec .Command ("/bin/sh" , "-c" , params .Command )
329330 }
330331
332+ var (
333+ out bytes.Buffer
334+ pw = progressWriter {
335+ out : progress ,
336+ }
337+ combined = io .MultiWriter (& out , & pw )
338+ )
331339 cmd .Env = env
332340 cmd .Dir = params .Directory
333- out , err := cmd .CombinedOutput ()
334- if err != nil {
341+ cmd .Stdout = combined
342+ cmd .Stderr = combined
343+ if err := cmd .Run (); err != nil {
335344 return fmt .Sprintf ("ERROR: %s\n OUTPUT:\n %s" , err , out ), nil
336345 }
337- return string (out ), nil
346+ return out .String (), nil
347+ }
348+
349+ type progressWriter struct {
350+ out chan <- string
351+ }
352+
353+ func (pw * progressWriter ) Write (p []byte ) (n int , err error ) {
354+ pw .out <- string (p )
355+ return len (p ), nil
338356}
339357
340358func getWorkspaceDir (envs []string ) (string , error ) {
@@ -347,7 +365,7 @@ func getWorkspaceDir(envs []string) (string, error) {
347365 return "" , fmt .Errorf ("no workspace directory found in env" )
348366}
349367
350- func SysLs (_ context.Context , _ []string , input string ) (string , error ) {
368+ func SysLs (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
351369 var params struct {
352370 Dir string `json:"dir,omitempty"`
353371 }
@@ -383,7 +401,7 @@ func SysLs(_ context.Context, _ []string, input string) (string, error) {
383401 return strings .Join (result , "\n " ), nil
384402}
385403
386- func SysRead (_ context.Context , _ []string , input string ) (string , error ) {
404+ func SysRead (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
387405 var params struct {
388406 Filename string `json:"filename,omitempty"`
389407 }
@@ -411,7 +429,7 @@ func SysRead(_ context.Context, _ []string, input string) (string, error) {
411429 return string (data ), nil
412430}
413431
414- func SysWrite (_ context.Context , _ []string , input string ) (string , error ) {
432+ func SysWrite (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
415433 var params struct {
416434 Filename string `json:"filename,omitempty"`
417435 Content string `json:"content,omitempty"`
@@ -443,7 +461,7 @@ func SysWrite(_ context.Context, _ []string, input string) (string, error) {
443461 return fmt .Sprintf ("Wrote (%d) bytes to file %s" , len (data ), file ), nil
444462}
445463
446- func SysAppend (_ context.Context , _ []string , input string ) (string , error ) {
464+ func SysAppend (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
447465 var params struct {
448466 Filename string `json:"filename,omitempty"`
449467 Content string `json:"content,omitempty"`
@@ -489,7 +507,7 @@ func fixQueries(u string) string {
489507 return url .String ()
490508}
491509
492- func SysHTTPGet (_ context.Context , _ []string , input string ) (_ string , err error ) {
510+ func SysHTTPGet (_ context.Context , _ []string , input string , _ chan <- string ) (_ string , err error ) {
493511 var params struct {
494512 URL string `json:"url,omitempty"`
495513 }
@@ -523,8 +541,8 @@ func SysHTTPGet(_ context.Context, _ []string, input string) (_ string, err erro
523541 return string (data ), nil
524542}
525543
526- func SysHTTPHtml2Text (ctx context.Context , env []string , input string ) (string , error ) {
527- content , err := SysHTTPGet (ctx , env , input )
544+ func SysHTTPHtml2Text (ctx context.Context , env []string , input string , progress chan <- string ) (string , error ) {
545+ content , err := SysHTTPGet (ctx , env , input , progress )
528546 if err != nil {
529547 return "" , err
530548 }
@@ -533,7 +551,7 @@ func SysHTTPHtml2Text(ctx context.Context, env []string, input string) (string,
533551 })
534552}
535553
536- func SysHTTPPost (ctx context.Context , _ []string , input string ) (_ string , err error ) {
554+ func SysHTTPPost (ctx context.Context , _ []string , input string , _ chan <- string ) (_ string , err error ) {
537555 var params struct {
538556 URL string `json:"url,omitempty"`
539557 Content string `json:"content,omitempty"`
@@ -569,7 +587,7 @@ func SysHTTPPost(ctx context.Context, _ []string, input string) (_ string, err e
569587 return fmt .Sprintf ("Wrote %d to %s" , len ([]byte (params .Content )), params .URL ), nil
570588}
571589
572- func SysGetenv (_ context.Context , env []string , input string ) (string , error ) {
590+ func SysGetenv (_ context.Context , env []string , input string , _ chan <- string ) (string , error ) {
573591 var params struct {
574592 Name string `json:"name,omitempty"`
575593 }
@@ -597,7 +615,7 @@ func invalidArgument(input string, err error) string {
597615 return fmt .Sprintf ("Failed to parse arguments %s: %v" , input , err )
598616}
599617
600- func SysChatHistory (ctx context.Context , _ []string , _ string ) (string , error ) {
618+ func SysChatHistory (ctx context.Context , _ []string , _ string , _ chan <- string ) (string , error ) {
601619 engineContext , _ := engine .FromContext (ctx )
602620
603621 data , err := json .Marshal (engine.ChatHistory {
@@ -627,7 +645,7 @@ func writeHistory(ctx *engine.Context) (result []engine.ChatHistoryCall) {
627645 return
628646}
629647
630- func SysChatFinish (_ context.Context , _ []string , input string ) (string , error ) {
648+ func SysChatFinish (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
631649 var params struct {
632650 Message string `json:"return,omitempty"`
633651 }
@@ -641,7 +659,7 @@ func SysChatFinish(_ context.Context, _ []string, input string) (string, error)
641659 }
642660}
643661
644- func SysAbort (_ context.Context , _ []string , input string ) (string , error ) {
662+ func SysAbort (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
645663 var params struct {
646664 Message string `json:"message,omitempty"`
647665 }
@@ -651,7 +669,7 @@ func SysAbort(_ context.Context, _ []string, input string) (string, error) {
651669 return "" , fmt .Errorf ("ABORT: %s" , params .Message )
652670}
653671
654- func SysRemove (_ context.Context , _ []string , input string ) (string , error ) {
672+ func SysRemove (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
655673 var params struct {
656674 Location string `json:"location,omitempty"`
657675 }
@@ -670,7 +688,7 @@ func SysRemove(_ context.Context, _ []string, input string) (string, error) {
670688 return fmt .Sprintf ("Removed file: %s" , params .Location ), nil
671689}
672690
673- func SysStat (_ context.Context , _ []string , input string ) (string , error ) {
691+ func SysStat (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
674692 var params struct {
675693 Filepath string `json:"filepath,omitempty"`
676694 }
@@ -690,7 +708,7 @@ func SysStat(_ context.Context, _ []string, input string) (string, error) {
690708 return fmt .Sprintf ("%s %s mode: %s, size: %d bytes, modtime: %s" , title , params .Filepath , stat .Mode ().String (), stat .Size (), stat .ModTime ().String ()), nil
691709}
692710
693- func SysDownload (_ context.Context , env []string , input string ) (_ string , err error ) {
711+ func SysDownload (_ context.Context , env []string , input string , _ chan <- string ) (_ string , err error ) {
694712 var params struct {
695713 URL string `json:"url,omitempty"`
696714 Location string `json:"location,omitempty"`
@@ -763,6 +781,6 @@ func SysDownload(_ context.Context, env []string, input string) (_ string, err e
763781 return fmt .Sprintf ("Downloaded %s to %s" , params .URL , params .Location ), nil
764782}
765783
766- func SysTimeNow (context.Context , []string , string ) (string , error ) {
784+ func SysTimeNow (context.Context , []string , string , chan <- string ) (string , error ) {
767785 return time .Now ().Format (time .RFC3339 ), nil
768786}
0 commit comments