diff options
| author | adamdottv <[email protected]> | 2025-05-29 15:10:44 -0500 |
|---|---|---|
| committer | adamdottv <[email protected]> | 2025-05-29 15:10:44 -0500 |
| commit | 37c0c1f358cadbc918319500cd2b1b3fcbe41a9e (patch) | |
| tree | f012aad2481ea47b062c630420ecc008287a65dc /internal/tui/components/chat | |
| parent | 2a132f86d687be767df4a7657e9c4441b8a4058d (diff) | |
| download | opencode-37c0c1f358cadbc918319500cd2b1b3fcbe41a9e.tar.gz opencode-37c0c1f358cadbc918319500cd2b1b3fcbe41a9e.zip | |
wip: refactoring tui
Diffstat (limited to 'internal/tui/components/chat')
| -rw-r--r-- | internal/tui/components/chat/message.go | 386 |
1 files changed, 191 insertions, 195 deletions
diff --git a/internal/tui/components/chat/message.go b/internal/tui/components/chat/message.go index e59f0c5bb..9f8a9de64 100644 --- a/internal/tui/components/chat/message.go +++ b/internal/tui/components/chat/message.go @@ -1,17 +1,13 @@ package chat import ( - "encoding/json" "fmt" - "path/filepath" "strings" "time" "github.com/charmbracelet/lipgloss" "github.com/charmbracelet/x/ansi" "github.com/sst/opencode/internal/config" - "github.com/sst/opencode/internal/diff" - "github.com/sst/opencode/internal/llm/tools" "github.com/sst/opencode/internal/message" "github.com/sst/opencode/internal/tui/styles" "github.com/sst/opencode/internal/tui/theme" @@ -274,25 +270,25 @@ func renderToolAction(name string) string { switch name { // case agent.AgentToolName: // return "Preparing prompt..." - case tools.BashToolName: + case "bash": return "Building command..." - case tools.EditToolName: + case "edit": return "Preparing edit..." - case tools.FetchToolName: + case "fetch": return "Writing fetch..." - case tools.GlobToolName: + case "glob": return "Finding files..." - case tools.GrepToolName: + case "grep": return "Searching content..." - case tools.LSToolName: + case "ls": return "Listing directory..." - case tools.ViewToolName: + case "view": return "Reading file..." - case tools.WriteToolName: + case "write": return "Preparing write..." - case tools.PatchToolName: + case "patch": return "Preparing patch..." - case tools.BatchToolName: + case "batch": return "Running batch operations..." } return "Working..." @@ -361,94 +357,94 @@ func removeWorkingDirPrefix(path string) string { func renderToolParams(paramWidth int, toolCall message.ToolCall) string { params := "" switch toolCall.Name { - // case agent.AgentToolName: - // var params agent.AgentParams + // // case agent.AgentToolName: + // // var params agent.AgentParams + // // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // // prompt := strings.ReplaceAll(params.Prompt, "\n", " ") + // // return renderParams(paramWidth, prompt) + // case "bash": + // var params tools.BashParams // json.Unmarshal([]byte(toolCall.Input), ¶ms) - // prompt := strings.ReplaceAll(params.Prompt, "\n", " ") - // return renderParams(paramWidth, prompt) - case tools.BashToolName: - var params tools.BashParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - command := strings.ReplaceAll(params.Command, "\n", " ") - return renderParams(paramWidth, command) - case tools.EditToolName: - var params tools.EditParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - filePath := removeWorkingDirPrefix(params.FilePath) - return renderParams(paramWidth, filePath) - case tools.FetchToolName: - var params tools.FetchParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - url := params.URL - toolParams := []string{ - url, - } - if params.Format != "" { - toolParams = append(toolParams, "format", params.Format) - } - if params.Timeout != 0 { - toolParams = append(toolParams, "timeout", (time.Duration(params.Timeout) * time.Second).String()) - } - return renderParams(paramWidth, toolParams...) - case tools.GlobToolName: - var params tools.GlobParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - pattern := params.Pattern - toolParams := []string{ - pattern, - } - if params.Path != "" { - toolParams = append(toolParams, "path", params.Path) - } - return renderParams(paramWidth, toolParams...) - case tools.GrepToolName: - var params tools.GrepParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - pattern := params.Pattern - toolParams := []string{ - pattern, - } - if params.Path != "" { - toolParams = append(toolParams, "path", params.Path) - } - if params.Include != "" { - toolParams = append(toolParams, "include", params.Include) - } - if params.LiteralText { - toolParams = append(toolParams, "literal", "true") - } - return renderParams(paramWidth, toolParams...) - case tools.LSToolName: - var params tools.LSParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - path := params.Path - if path == "" { - path = "." - } - return renderParams(paramWidth, path) - case tools.ViewToolName: - var params tools.ViewParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - filePath := removeWorkingDirPrefix(params.FilePath) - toolParams := []string{ - filePath, - } - if params.Limit != 0 { - toolParams = append(toolParams, "limit", fmt.Sprintf("%d", params.Limit)) - } - if params.Offset != 0 { - toolParams = append(toolParams, "offset", fmt.Sprintf("%d", params.Offset)) - } - return renderParams(paramWidth, toolParams...) - case tools.WriteToolName: - var params tools.WriteParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - filePath := removeWorkingDirPrefix(params.FilePath) - return renderParams(paramWidth, filePath) - case tools.BatchToolName: - var params tools.BatchParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - return renderParams(paramWidth, fmt.Sprintf("%d parallel calls", len(params.Calls))) + // command := strings.ReplaceAll(params.Command, "\n", " ") + // return renderParams(paramWidth, command) + // case "edit": + // var params tools.EditParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // filePath := removeWorkingDirPrefix(params.FilePath) + // return renderParams(paramWidth, filePath) + // case "fetch": + // var params tools.FetchParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // url := params.URL + // toolParams := []string{ + // url, + // } + // if params.Format != "" { + // toolParams = append(toolParams, "format", params.Format) + // } + // if params.Timeout != 0 { + // toolParams = append(toolParams, "timeout", (time.Duration(params.Timeout) * time.Second).String()) + // } + // return renderParams(paramWidth, toolParams...) + // case tools.GlobToolName: + // var params tools.GlobParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // pattern := params.Pattern + // toolParams := []string{ + // pattern, + // } + // if params.Path != "" { + // toolParams = append(toolParams, "path", params.Path) + // } + // return renderParams(paramWidth, toolParams...) + // case tools.GrepToolName: + // var params tools.GrepParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // pattern := params.Pattern + // toolParams := []string{ + // pattern, + // } + // if params.Path != "" { + // toolParams = append(toolParams, "path", params.Path) + // } + // if params.Include != "" { + // toolParams = append(toolParams, "include", params.Include) + // } + // if params.LiteralText { + // toolParams = append(toolParams, "literal", "true") + // } + // return renderParams(paramWidth, toolParams...) + // case tools.LSToolName: + // var params tools.LSParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // path := params.Path + // if path == "" { + // path = "." + // } + // return renderParams(paramWidth, path) + // case tools.ViewToolName: + // var params tools.ViewParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // filePath := removeWorkingDirPrefix(params.FilePath) + // toolParams := []string{ + // filePath, + // } + // if params.Limit != 0 { + // toolParams = append(toolParams, "limit", fmt.Sprintf("%d", params.Limit)) + // } + // if params.Offset != 0 { + // toolParams = append(toolParams, "offset", fmt.Sprintf("%d", params.Offset)) + // } + // return renderParams(paramWidth, toolParams...) + // case tools.WriteToolName: + // var params tools.WriteParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // filePath := removeWorkingDirPrefix(params.FilePath) + // return renderParams(paramWidth, filePath) + // case tools.BatchToolName: + // var params tools.BatchParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // return renderParams(paramWidth, fmt.Sprintf("%d parallel calls", len(params.Calls))) default: input := strings.ReplaceAll(toolCall.Input, "\n", " ") params = renderParams(paramWidth, input) @@ -484,100 +480,100 @@ func renderToolResponse(toolCall message.ToolCall, response message.ToolResult, // toMarkdown(resultContent, false, width), // t.Background(), // ) - case tools.BashToolName: - resultContent = fmt.Sprintf("```bash\n%s\n```", resultContent) - return styles.ForceReplaceBackgroundWithLipgloss( - toMarkdown(resultContent, width), - t.Background(), - ) - case tools.EditToolName: - metadata := tools.EditResponseMetadata{} - json.Unmarshal([]byte(response.Metadata), &metadata) - formattedDiff, _ := diff.FormatDiff(metadata.Diff, diff.WithTotalWidth(width)) - return formattedDiff - case tools.FetchToolName: - var params tools.FetchParams - json.Unmarshal([]byte(toolCall.Input), ¶ms) - mdFormat := "markdown" - switch params.Format { - case "text": - mdFormat = "text" - case "html": - mdFormat = "html" - } - resultContent = fmt.Sprintf("```%s\n%s\n```", mdFormat, resultContent) - return styles.ForceReplaceBackgroundWithLipgloss( - toMarkdown(resultContent, width), - t.Background(), - ) - case tools.GlobToolName: - return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) - case tools.GrepToolName: - return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) - case tools.LSToolName: - return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) - case tools.ViewToolName: - metadata := tools.ViewResponseMetadata{} - json.Unmarshal([]byte(response.Metadata), &metadata) - ext := filepath.Ext(metadata.FilePath) - if ext == "" { - ext = "" - } else { - ext = strings.ToLower(ext[1:]) - } - resultContent = fmt.Sprintf("```%s\n%s\n```", ext, truncateHeight(metadata.Content, maxResultHeight)) - return styles.ForceReplaceBackgroundWithLipgloss( - toMarkdown(resultContent, width), - t.Background(), - ) - case tools.WriteToolName: - params := tools.WriteParams{} - json.Unmarshal([]byte(toolCall.Input), ¶ms) - metadata := tools.WriteResponseMetadata{} - json.Unmarshal([]byte(response.Metadata), &metadata) - ext := filepath.Ext(params.FilePath) - if ext == "" { - ext = "" - } else { - ext = strings.ToLower(ext[1:]) - } - resultContent = fmt.Sprintf("```%s\n%s\n```", ext, truncateHeight(params.Content, maxResultHeight)) - return styles.ForceReplaceBackgroundWithLipgloss( - toMarkdown(resultContent, width), - t.Background(), - ) - case tools.BatchToolName: - var batchResult tools.BatchResult - if err := json.Unmarshal([]byte(resultContent), &batchResult); err != nil { - return baseStyle.Width(width).Foreground(t.Error()).Render(fmt.Sprintf("Error parsing batch result: %s", err)) - } - - var toolCalls []string - for i, result := range batchResult.Results { - toolName := renderToolName(result.ToolName) - - // Format the tool input as a string - inputStr := string(result.ToolInput) - - // Format the result - var resultStr string - if result.Error != "" { - resultStr = fmt.Sprintf("Error: %s", result.Error) - } else { - var toolResponse tools.ToolResponse - if err := json.Unmarshal(result.Result, &toolResponse); err != nil { - resultStr = "Error parsing tool response" - } else { - resultStr = truncateHeight(toolResponse.Content, 3) - } - } - - // Format the tool call - toolCall := fmt.Sprintf("%d. %s: %s\n %s", i+1, toolName, inputStr, resultStr) - toolCalls = append(toolCalls, toolCall) - } - - return baseStyle.Width(width).Foreground(t.TextMuted()).Render(strings.Join(toolCalls, "\n\n")) + // case tools.BashToolName: + // resultContent = fmt.Sprintf("```bash\n%s\n```", resultContent) + // return styles.ForceReplaceBackgroundWithLipgloss( + // toMarkdown(resultContent, width), + // t.Background(), + // ) + // case tools.EditToolName: + // metadata := tools.EditResponseMetadata{} + // json.Unmarshal([]byte(response.Metadata), &metadata) + // formattedDiff, _ := diff.FormatDiff(metadata.Diff, diff.WithTotalWidth(width)) + // return formattedDiff + // case tools.FetchToolName: + // var params tools.FetchParams + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // mdFormat := "markdown" + // switch params.Format { + // case "text": + // mdFormat = "text" + // case "html": + // mdFormat = "html" + // } + // resultContent = fmt.Sprintf("```%s\n%s\n```", mdFormat, resultContent) + // return styles.ForceReplaceBackgroundWithLipgloss( + // toMarkdown(resultContent, width), + // t.Background(), + // ) + // case tools.GlobToolName: + // return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) + // case tools.GrepToolName: + // return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) + // case tools.LSToolName: + // return baseStyle.Width(width).Foreground(t.TextMuted()).Render(resultContent) + // case tools.ViewToolName: + // metadata := tools.ViewResponseMetadata{} + // json.Unmarshal([]byte(response.Metadata), &metadata) + // ext := filepath.Ext(metadata.FilePath) + // if ext == "" { + // ext = "" + // } else { + // ext = strings.ToLower(ext[1:]) + // } + // resultContent = fmt.Sprintf("```%s\n%s\n```", ext, truncateHeight(metadata.Content, maxResultHeight)) + // return styles.ForceReplaceBackgroundWithLipgloss( + // toMarkdown(resultContent, width), + // t.Background(), + // ) + // case tools.WriteToolName: + // params := tools.WriteParams{} + // json.Unmarshal([]byte(toolCall.Input), ¶ms) + // metadata := tools.WriteResponseMetadata{} + // json.Unmarshal([]byte(response.Metadata), &metadata) + // ext := filepath.Ext(params.FilePath) + // if ext == "" { + // ext = "" + // } else { + // ext = strings.ToLower(ext[1:]) + // } + // resultContent = fmt.Sprintf("```%s\n%s\n```", ext, truncateHeight(params.Content, maxResultHeight)) + // return styles.ForceReplaceBackgroundWithLipgloss( + // toMarkdown(resultContent, width), + // t.Background(), + // ) + // case tools.BatchToolName: + // var batchResult tools.BatchResult + // if err := json.Unmarshal([]byte(resultContent), &batchResult); err != nil { + // return baseStyle.Width(width).Foreground(t.Error()).Render(fmt.Sprintf("Error parsing batch result: %s", err)) + // } + // + // var toolCalls []string + // for i, result := range batchResult.Results { + // toolName := renderToolName(result.ToolName) + // + // // Format the tool input as a string + // inputStr := string(result.ToolInput) + // + // // Format the result + // var resultStr string + // if result.Error != "" { + // resultStr = fmt.Sprintf("Error: %s", result.Error) + // } else { + // var toolResponse tools.ToolResponse + // if err := json.Unmarshal(result.Result, &toolResponse); err != nil { + // resultStr = "Error parsing tool response" + // } else { + // resultStr = truncateHeight(toolResponse.Content, 3) + // } + // } + // + // // Format the tool call + // toolCall := fmt.Sprintf("%d. %s: %s\n %s", i+1, toolName, inputStr, resultStr) + // toolCalls = append(toolCalls, toolCall) + // } + // + // return baseStyle.Width(width).Foreground(t.TextMuted()).Render(strings.Join(toolCalls, "\n\n")) default: resultContent = fmt.Sprintf("```text\n%s\n```", resultContent) return styles.ForceReplaceBackgroundWithLipgloss( |
