Commit c422e9a

mo khan <mo@mokhan.ca>
2025-06-22 03:16:52
feat: use streaming output
1 parent dd0879a
Changed files (1)
internal
internal/del/assistant.go
@@ -5,7 +5,6 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
 	"os"
 	"os/exec"
 	"regexp"
@@ -36,15 +35,30 @@ func NewDel(provider AIProvider) *Del {
 			Name:        "run_command",
 			Description: "Execute a shell command and return the output",
 			Handler: func(args map[string]interface{}) (interface{}, error) {
-				cmd, ok := args["command"].(string)
+				cmdStr, ok := args["command"].(string)
 				if !ok {
 					return nil, fmt.Errorf("missing 'command' string argument")
 				}
-				out, err := exec.Command("bash", "-c", cmd).CombinedOutput()
+				cmd := exec.Command("bash", "-c", cmdStr)
+				stdout, err := cmd.StdoutPipe()
 				if err != nil {
-					return nil, fmt.Errorf("command failed: %v\n%s", err, string(out))
+					return nil, err
+				}
+				if err := cmd.Start(); err != nil {
+					return nil, err
+				}
+				var output strings.Builder
+				scanner := bufio.NewScanner(stdout)
+				for scanner.Scan() {
+					output.WriteString(scanner.Text() + "\n")
+				}
+				if err := scanner.Err(); err != nil {
+					return nil, err
+				}
+				if err := cmd.Wait(); err != nil {
+					return nil, err
 				}
-				return string(out), nil
+				return output.String(), nil
 			},
 		},
 		"read_file": {
@@ -55,7 +69,7 @@ func NewDel(provider AIProvider) *Del {
 				if !ok {
 					return nil, fmt.Errorf("missing 'path' string argument")
 				}
-				data, err := ioutil.ReadFile(path)
+				data, err := os.ReadFile(path)
 				if err != nil {
 					return nil, err
 				}
@@ -71,7 +85,7 @@ func NewDel(provider AIProvider) *Del {
 				if !ok1 || !ok2 {
 					return nil, fmt.Errorf("missing 'path' or 'content' argument")
 				}
-				if err := ioutil.WriteFile(path, []byte(content), 0644); err != nil {
+				if err := os.WriteFile(path, []byte(content), 0644); err != nil {
 					return nil, err
 				}
 				return fmt.Sprintf("wrote %d bytes to %s", len(content), path), nil
@@ -165,7 +179,7 @@ func (d *Del) StartREPL(ctx context.Context) {
 
 		d.chatHistory = append(d.chatHistory, api.Message{Role: "assistant", Content: response})
 		output := d.handleToolCalls(ctx, response)
-		fmt.Println(output)
+		fmt.Print(output)
 	}
 }