Commit 1c7cd5f
Changed files (1)
cmd
del
cmd/del/main.go
@@ -176,11 +176,45 @@ func (d *Del) updateThinking(message string) {
}
func isCodeFile(name string) bool {
- return strings.HasSuffix(name, ".go") || strings.HasSuffix(name, ".py") ||
- strings.HasSuffix(name, ".js") || strings.HasSuffix(name, ".ts") ||
- strings.HasSuffix(name, ".java") || strings.HasSuffix(name, ".cpp") ||
- strings.HasSuffix(name, ".c") || strings.HasSuffix(name, ".rs") ||
- strings.HasSuffix(name, ".rb") || strings.HasSuffix(name, ".php")
+ codeExtensions := []string{
+ ".go", ".py", ".js", ".ts", ".tsx", ".jsx",
+ ".java", ".cpp", ".c", ".h", ".hpp", ".cc", ".cxx",
+ ".rs", ".rb", ".php", ".swift", ".kt", ".scala",
+ ".cs", ".vb", ".fs", ".ml", ".hs", ".elm",
+ ".clj", ".cljs", ".lisp", ".scheme", ".lua",
+ ".perl", ".pl", ".r", ".m", ".mm", ".dart",
+ ".zig", ".nim", ".crystal", ".d", ".pas",
+ ".ada", ".cobol", ".fortran", ".f90", ".f95",
+ ".sql", ".css", ".scss", ".sass", ".less",
+ ".html", ".htm", ".xml", ".xhtml", ".vue",
+ ".svelte", ".jsx", ".tsx", ".coffee",
+ ".sh", ".bash", ".zsh", ".fish", ".ps1", ".bat", ".cmd",
+ ".dockerfile", ".makefile", ".cmake", ".gradle",
+ ".vim", ".nvim", ".emacs", ".elisp",
+ }
+
+ lowerName := strings.ToLower(name)
+ for _, ext := range codeExtensions {
+ if strings.HasSuffix(lowerName, ext) {
+ return true
+ }
+ }
+
+ // Check for common filenames without extensions
+ baseName := strings.ToLower(filepath.Base(name))
+ commonNames := []string{
+ "dockerfile", "makefile", "rakefile", "gemfile", "podfile",
+ "vagrantfile", "gruntfile", "gulpfile", "webpack.config",
+ "package.json", "composer.json", "cargo.toml", "pyproject.toml",
+ }
+
+ for _, commonName := range commonNames {
+ if strings.Contains(baseName, commonName) {
+ return true
+ }
+ }
+
+ return false
}
// ANSI color codes for terminal formatting
@@ -329,30 +363,48 @@ func (d *Del) readFile(ctx context.Context, args map[string]interface{}, progres
Content: fmt.Sprintf("Reading %s...", path),
}
- data, err := os.ReadFile(path)
- if err != nil {
- return "", err
+ // Check if file exists first
+ if _, err := os.Stat(path); os.IsNotExist(err) {
+ return "", fmt.Errorf("file does not exist: %s", path)
}
- lines := strings.Split(string(data), "\n")
+ // Try to use bat for syntax highlighting if available
var result string
- if len(lines) > 50 {
- result = fmt.Sprintf("Read %s (%d lines)", path, len(lines))
- progress <- StreamMessage{
- Type: MessageTypeProgress,
- ToolName: "read_file",
- Status: "completed",
- Content: fmt.Sprintf("Read %d lines (ctrl+r to expand)", len(lines)),
+ // Check if this looks like a code file
+ isCode := isCodeFile(path) || strings.HasSuffix(path, ".md") || strings.HasSuffix(path, ".yaml") || strings.HasSuffix(path, ".yml") || strings.HasSuffix(path, ".json") || strings.HasSuffix(path, ".toml") || strings.HasSuffix(path, ".sh")
+
+ if isCode {
+ // Try bat first for syntax highlighting
+ cmd := exec.CommandContext(ctx, "bat", "--color=always", "--style=numbers,grid", "--pager=never", path)
+ batOutput, batErr := cmd.Output()
+
+ if batErr == nil && len(batOutput) > 0 {
+ // bat worked, use its output
+ result = fmt.Sprintf("Read %s (syntax highlighted)\n%s", path, string(batOutput))
+ } else {
+ // Fall back to regular file reading
+ data, readErr := os.ReadFile(path)
+ if readErr != nil {
+ return "", readErr
+ }
+ result = fmt.Sprintf("Read %s\n%s", path, string(data))
}
} else {
- result = fmt.Sprintf("Read %s (%d lines)\n%s", path, len(lines), string(data))
- progress <- StreamMessage{
- Type: MessageTypeProgress,
- ToolName: "read_file",
- Status: "completed",
- Content: fmt.Sprintf("Read %d lines", len(lines)),
+ // Not a code file, use regular reading
+ data, readErr := os.ReadFile(path)
+ if readErr != nil {
+ return "", readErr
}
+ result = fmt.Sprintf("Read %s\n%s", path, string(data))
+ }
+
+ lines := strings.Count(result, "\n")
+ progress <- StreamMessage{
+ Type: MessageTypeProgress,
+ ToolName: "read_file",
+ Status: "completed",
+ Content: fmt.Sprintf("Read %d lines", lines),
}
return result, nil
@@ -2106,31 +2158,12 @@ func (d *Del) processMessage(ctx context.Context, userInput string) {
})
}
- d.updateThinking("🎨 Generating final response...")
-
- // Get final response with tool results (with timeout)
- var finalResponse string
- chatCtx, cancel := context.WithTimeout(ctx, 30*time.Second)
- defer cancel()
-
- err := d.client.Chat(chatCtx, &api.ChatRequest{
- Model: d.model,
- Messages: d.chatHistory,
- }, func(resp api.ChatResponse) error {
- finalResponse += resp.Message.Content
- return nil
- })
-
+ // For now, skip AI response generation to avoid hanging - just show tool results
d.stopThinking()
- if err == nil {
- d.chatHistory = append(d.chatHistory, api.Message{Role: "assistant", Content: finalResponse})
- d.streamResponseChunks(ctx, finalResponse)
- } else {
- d.emit(StreamMessage{
- Type: MessageTypeSystem,
- Error: err.Error(),
- })
- }
+ d.emit(StreamMessage{
+ Type: MessageTypeAssistant,
+ Content: "✅ Tool execution completed successfully.",
+ })
} else {
d.updateThinking("🧠 Processing with AI model...")
@@ -2240,16 +2273,12 @@ func (d *Del) renderUI() {
case "completed":
if msg.Result != "" {
- lines := strings.Split(msg.Result, "\n")
timing := ""
if msg.Content != "" {
timing = fmt.Sprintf(" (⏱️ %s)", msg.Content)
}
- if len(lines) <= 5 {
- fmt.Printf(" ⎿ %s%s\n", strings.ReplaceAll(msg.Result, "\n", "\n "), timing)
- } else {
- fmt.Printf(" ⎿ %s (%d lines, ctrl+r to expand)%s\n", lines[0], len(lines), timing)
- }
+ // Always show the full result, but format it nicely
+ fmt.Printf(" ⎿ %s%s\n", strings.ReplaceAll(msg.Result, "\n", "\n "), timing)
}
case "error":