1
1
package builtin
2
2
3
3
import (
4
+ "bytes"
4
5
"context"
5
6
"encoding/json"
6
7
"errors"
@@ -264,7 +265,7 @@ func Builtin(name string) (types.Tool, bool) {
264
265
return SetDefaults (t ), ok
265
266
}
266
267
267
- func SysFind (_ context.Context , _ []string , input string ) (string , error ) {
268
+ func SysFind (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
268
269
var result []string
269
270
var params struct {
270
271
Pattern string `json:"pattern,omitempty"`
@@ -305,7 +306,7 @@ func SysFind(_ context.Context, _ []string, input string) (string, error) {
305
306
return strings .Join (result , "\n " ), nil
306
307
}
307
308
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 ) {
309
310
var params struct {
310
311
Command string `json:"command,omitempty"`
311
312
Directory string `json:"directory,omitempty"`
@@ -328,13 +329,30 @@ func SysExec(_ context.Context, env []string, input string) (string, error) {
328
329
cmd = exec .Command ("/bin/sh" , "-c" , params .Command )
329
330
}
330
331
332
+ var (
333
+ out bytes.Buffer
334
+ pw = progressWriter {
335
+ out : progress ,
336
+ }
337
+ combined = io .MultiWriter (& out , & pw )
338
+ )
331
339
cmd .Env = env
332
340
cmd .Dir = params .Directory
333
- out , err := cmd .CombinedOutput ()
334
- if err != nil {
335
- return fmt .Sprintf ("ERROR: %s\n OUTPUT:\n %s" , err , out ), nil
341
+ cmd .Stdout = combined
342
+ cmd .Stderr = combined
343
+ if err := cmd .Run (); err != nil {
344
+ return fmt .Sprintf ("ERROR: %s\n OUTPUT:\n %s" , err , & out ), nil
336
345
}
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
338
356
}
339
357
340
358
func getWorkspaceDir (envs []string ) (string , error ) {
@@ -347,7 +365,7 @@ func getWorkspaceDir(envs []string) (string, error) {
347
365
return "" , fmt .Errorf ("no workspace directory found in env" )
348
366
}
349
367
350
- func SysLs (_ context.Context , _ []string , input string ) (string , error ) {
368
+ func SysLs (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
351
369
var params struct {
352
370
Dir string `json:"dir,omitempty"`
353
371
}
@@ -383,7 +401,7 @@ func SysLs(_ context.Context, _ []string, input string) (string, error) {
383
401
return strings .Join (result , "\n " ), nil
384
402
}
385
403
386
- func SysRead (_ context.Context , _ []string , input string ) (string , error ) {
404
+ func SysRead (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
387
405
var params struct {
388
406
Filename string `json:"filename,omitempty"`
389
407
}
@@ -411,7 +429,7 @@ func SysRead(_ context.Context, _ []string, input string) (string, error) {
411
429
return string (data ), nil
412
430
}
413
431
414
- func SysWrite (_ context.Context , _ []string , input string ) (string , error ) {
432
+ func SysWrite (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
415
433
var params struct {
416
434
Filename string `json:"filename,omitempty"`
417
435
Content string `json:"content,omitempty"`
@@ -443,7 +461,7 @@ func SysWrite(_ context.Context, _ []string, input string) (string, error) {
443
461
return fmt .Sprintf ("Wrote (%d) bytes to file %s" , len (data ), file ), nil
444
462
}
445
463
446
- func SysAppend (_ context.Context , _ []string , input string ) (string , error ) {
464
+ func SysAppend (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
447
465
var params struct {
448
466
Filename string `json:"filename,omitempty"`
449
467
Content string `json:"content,omitempty"`
@@ -489,7 +507,7 @@ func fixQueries(u string) string {
489
507
return url .String ()
490
508
}
491
509
492
- func SysHTTPGet (_ context.Context , _ []string , input string ) (_ string , err error ) {
510
+ func SysHTTPGet (_ context.Context , _ []string , input string , _ chan <- string ) (_ string , err error ) {
493
511
var params struct {
494
512
URL string `json:"url,omitempty"`
495
513
}
@@ -523,8 +541,8 @@ func SysHTTPGet(_ context.Context, _ []string, input string) (_ string, err erro
523
541
return string (data ), nil
524
542
}
525
543
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 )
528
546
if err != nil {
529
547
return "" , err
530
548
}
@@ -533,7 +551,7 @@ func SysHTTPHtml2Text(ctx context.Context, env []string, input string) (string,
533
551
})
534
552
}
535
553
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 ) {
537
555
var params struct {
538
556
URL string `json:"url,omitempty"`
539
557
Content string `json:"content,omitempty"`
@@ -569,7 +587,18 @@ func SysHTTPPost(ctx context.Context, _ []string, input string) (_ string, err e
569
587
return fmt .Sprintf ("Wrote %d to %s" , len ([]byte (params .Content )), params .URL ), nil
570
588
}
571
589
572
- func SysGetenv (_ context.Context , env []string , input string ) (string , error ) {
590
+ func DiscardProgress () (progress chan <- string , closeFunc func ()) {
591
+ ch := make (chan string )
592
+ go func () {
593
+ for range ch {
594
+ }
595
+ }()
596
+ return ch , func () {
597
+ close (ch )
598
+ }
599
+ }
600
+
601
+ func SysGetenv (_ context.Context , env []string , input string , _ chan <- string ) (string , error ) {
573
602
var params struct {
574
603
Name string `json:"name,omitempty"`
575
604
}
@@ -597,7 +626,7 @@ func invalidArgument(input string, err error) string {
597
626
return fmt .Sprintf ("Failed to parse arguments %s: %v" , input , err )
598
627
}
599
628
600
- func SysChatHistory (ctx context.Context , _ []string , _ string ) (string , error ) {
629
+ func SysChatHistory (ctx context.Context , _ []string , _ string , _ chan <- string ) (string , error ) {
601
630
engineContext , _ := engine .FromContext (ctx )
602
631
603
632
data , err := json .Marshal (engine.ChatHistory {
@@ -627,7 +656,7 @@ func writeHistory(ctx *engine.Context) (result []engine.ChatHistoryCall) {
627
656
return
628
657
}
629
658
630
- func SysChatFinish (_ context.Context , _ []string , input string ) (string , error ) {
659
+ func SysChatFinish (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
631
660
var params struct {
632
661
Message string `json:"return,omitempty"`
633
662
}
@@ -641,7 +670,7 @@ func SysChatFinish(_ context.Context, _ []string, input string) (string, error)
641
670
}
642
671
}
643
672
644
- func SysAbort (_ context.Context , _ []string , input string ) (string , error ) {
673
+ func SysAbort (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
645
674
var params struct {
646
675
Message string `json:"message,omitempty"`
647
676
}
@@ -651,7 +680,7 @@ func SysAbort(_ context.Context, _ []string, input string) (string, error) {
651
680
return "" , fmt .Errorf ("ABORT: %s" , params .Message )
652
681
}
653
682
654
- func SysRemove (_ context.Context , _ []string , input string ) (string , error ) {
683
+ func SysRemove (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
655
684
var params struct {
656
685
Location string `json:"location,omitempty"`
657
686
}
@@ -670,7 +699,7 @@ func SysRemove(_ context.Context, _ []string, input string) (string, error) {
670
699
return fmt .Sprintf ("Removed file: %s" , params .Location ), nil
671
700
}
672
701
673
- func SysStat (_ context.Context , _ []string , input string ) (string , error ) {
702
+ func SysStat (_ context.Context , _ []string , input string , _ chan <- string ) (string , error ) {
674
703
var params struct {
675
704
Filepath string `json:"filepath,omitempty"`
676
705
}
@@ -690,7 +719,7 @@ func SysStat(_ context.Context, _ []string, input string) (string, error) {
690
719
return fmt .Sprintf ("%s %s mode: %s, size: %d bytes, modtime: %s" , title , params .Filepath , stat .Mode ().String (), stat .Size (), stat .ModTime ().String ()), nil
691
720
}
692
721
693
- func SysDownload (_ context.Context , env []string , input string ) (_ string , err error ) {
722
+ func SysDownload (_ context.Context , env []string , input string , _ chan <- string ) (_ string , err error ) {
694
723
var params struct {
695
724
URL string `json:"url,omitempty"`
696
725
Location string `json:"location,omitempty"`
@@ -763,6 +792,6 @@ func SysDownload(_ context.Context, env []string, input string) (_ string, err e
763
792
return fmt .Sprintf ("Downloaded %s to %s" , params .URL , params .Location ), nil
764
793
}
765
794
766
- func SysTimeNow (context.Context , []string , string ) (string , error ) {
795
+ func SysTimeNow (context.Context , []string , string , chan <- string ) (string , error ) {
767
796
return time .Now ().Format (time .RFC3339 ), nil
768
797
}
0 commit comments