-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10 from copilot-extensions/add-stream-cmd
Add stream cmd
- Loading branch information
Showing
4 changed files
with
145 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// rootCmd.go | ||
package cmd | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
|
||
"github.com/spf13/cobra" | ||
) | ||
|
||
var rootCmd = &cobra.Command{ | ||
Use: "gh-debug-cli", | ||
Short: "A CLI tool for debugging", | ||
Long: `This CLI tool allows you to debug your agent by chatting with it locally.`, | ||
Run: func(cmd *cobra.Command, args []string) { | ||
fmt.Println("Use 'gh-debug-cli --help' to see available commands") | ||
}, | ||
} | ||
|
||
func Execute() { | ||
if err := rootCmd.Execute(); err != nil { | ||
fmt.Println(err) | ||
os.Exit(1) | ||
} | ||
} | ||
|
||
func init() { | ||
// Add subcommands to rootCmd | ||
rootCmd.AddCommand(chatCmd) | ||
rootCmd.AddCommand(streamCmd) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// stream.go | ||
package cmd | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
|
||
"github.com/github-technology-partners/gh-debug-cli/pkg/stream" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
const ( | ||
streamCmdFileFlag = "file" | ||
) | ||
|
||
// streamCmd represents the new command for streaming functionality | ||
var streamCmd = &cobra.Command{ | ||
Use: "stream [file]", | ||
Short: "Stream data to your agent", | ||
Long: `The stream command allows you to initiate a data stream to your agent.`, | ||
Run: agentStream, | ||
} | ||
|
||
func init() { | ||
streamCmd.PersistentFlags().String(streamCmdFileFlag, "", "Parse agent responses from a file") | ||
} | ||
|
||
func agentStream(cmd *cobra.Command, args []string) { | ||
fmt.Println("stream command executed successfully") | ||
|
||
file := args[0] | ||
|
||
err := stream.ParseFile(file) | ||
if err != nil { | ||
fmt.Fprintf(os.Stderr, "Error parsing file: %v\n", err) | ||
os.Exit(1) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
package stream | ||
|
||
import ( | ||
"bufio" | ||
"encoding/json" | ||
"fmt" | ||
"os" | ||
"strings" | ||
) | ||
|
||
type Choice struct { | ||
Delta struct { | ||
Content string `json:"content"` | ||
} `json:"delta"` | ||
} | ||
|
||
type Data struct { | ||
Choices []Choice `json:"choices"` | ||
} | ||
|
||
func ParseFile(filename string) error { | ||
// Open the file | ||
file, err := os.Open(filename) | ||
if err != nil { | ||
return fmt.Errorf("could not open file: %w", err) | ||
} | ||
defer file.Close() | ||
|
||
scanner := bufio.NewScanner(file) | ||
var contentBuilder strings.Builder | ||
|
||
for scanner.Scan() { | ||
line := scanner.Text() | ||
|
||
// Check if the line has "data: " prefix | ||
if strings.HasPrefix(line, "data: ") { | ||
// Remove the "data: " prefix | ||
line = strings.TrimPrefix(line, "data: ") | ||
} else { | ||
continue // skip lines without "data: " | ||
} | ||
|
||
// Handle special cases | ||
if line == "[DONE]" { | ||
break // stop processing if we encounter [DONE] | ||
} | ||
if line == "" { | ||
continue // skip empty data lines | ||
} | ||
|
||
// Parse the JSON line into our `Data` struct | ||
var data Data | ||
err := json.Unmarshal([]byte(line), &data) | ||
if err != nil { | ||
// Skip this line if JSON is incomplete or malformed | ||
continue | ||
} | ||
|
||
// Extract delta.content and concatenate it | ||
for _, choice := range data.Choices { | ||
contentBuilder.WriteString(choice.Delta.Content) | ||
} | ||
} | ||
|
||
// Check for scanner errors | ||
if err := scanner.Err(); err != nil { | ||
return fmt.Errorf("error reading file: %w", err) | ||
} | ||
|
||
// Print the final concatenated result | ||
result := contentBuilder.String() | ||
fmt.Println(result) | ||
|
||
return nil | ||
} |