-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchat_tools.go
More file actions
136 lines (126 loc) · 3.22 KB
/
Copy pathchat_tools.go
File metadata and controls
136 lines (126 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package cmd
import (
"context"
"strings"
hawkconfig "github.com/GrayCodeAI/hawk/internal/config"
"github.com/GrayCodeAI/hawk/internal/tool"
)
// This file holds the tool-registry construction used by the chat TUI:
// the essential/optional tool sets and the registry builder that wires in
// MCP servers and CLI tool filters. Split out of chat.go for clarity.
func essentialTools() []tool.Tool {
// Core tools needed for basic agent operation - always loaded at startup
return []tool.Tool{
tool.BashTool{},
tool.FileReadTool{},
tool.FileWriteTool{},
tool.FileEditTool{},
tool.StructuredEditTool{},
tool.LSTool{},
tool.GlobTool{},
tool.GrepTool{},
tool.WebFetchTool{},
tool.WebSearchTool{},
tool.ToolSearchTool{},
tool.SkillTool{},
tool.AgentTool{},
tool.AskUserQuestionTool{},
tool.TodoWriteTool{},
tool.TaskOutputTool{},
tool.TaskStopTool{},
tool.LSPTool{},
tool.MultiEditTool{},
}
}
func optionalTools() []tool.Tool {
// Specialized tools that can be lazy-loaded on demand
return []tool.Tool{
tool.EnterPlanModeTool{},
tool.ExitPlanModeTool{},
tool.NotebookEditTool{},
tool.EnterWorktreeTool{},
tool.ExitWorktreeTool{},
tool.ListMcpResourcesTool{},
tool.ReadMcpResourceTool{},
tool.ConfigTool{},
tool.BriefTool{},
tool.TaskCreateTool{},
tool.TaskGetTool{},
tool.TaskListTool{},
tool.TaskUpdateTool{},
tool.SleepTool{},
tool.CronCreateTool{},
tool.CronDeleteTool{},
tool.CronListTool{},
tool.VerifyPlanExecutionTool{},
tool.WorkflowTool{},
tool.McpAuthTool{},
tool.DiagnosticsTool{},
tool.CodeSearchTool{},
tool.CoreMemoryAppendTool{},
tool.CoreMemoryReplaceTool{},
tool.CoreMemoryRethinkTool{},
tool.DownloadTool{},
tool.AgenticFetchTool{},
tool.ImpactTool{},
tool.GitHistoryTool{},
tool.CodeGraphTool{},
tool.NilAwayTool{},
tool.ReviveTool{},
tool.MCPLanguageServerTool{},
tool.SQLTool{},
}
}
func defaultRegistry(settings hawkconfig.Settings) (*tool.Registry, error) {
// Load essential tools first for fast startup
tools := essentialTools()
if tool.IsPowerShellAvailable() {
tools = append(tools, tool.PowerShellTool{})
}
for _, cfg := range settings.MCPServers {
if cfg.Name == "" || cfg.Command == "" {
continue
}
mcpTools, err := tool.LoadMCPTools(context.Background(), cfg.Name, cfg.Command, cfg.Args...)
if err != nil {
continue
}
tools = append(tools, mcpTools...)
}
// Load MCP server tools
for _, cmd := range mcpServers {
parts := strings.Fields(cmd)
if len(parts) == 0 {
continue
}
name := parts[0]
mcpTools, err := tool.LoadMCPTools(context.Background(), name, parts[0], parts[1:]...)
if err != nil {
// MCP server failed to connect — skip silently, will show in /doctor
continue
}
tools = append(tools, mcpTools...)
}
filtered, err := filterAvailableTools(
tools,
toolsFlagSet,
parseToolListFromCLI(toolsFlag),
parseToolListFromCLI(disallowedToolsFlag),
)
if err != nil {
return nil, err
}
registry := tool.NewRegistry(filtered...)
// Lazy-load optional tools in background
go func() {
for _, t := range optionalTools() {
_ = registry.Register(t)
}
}()
return registry, nil
}
func allTools() []tool.Tool {
t := essentialTools()
t = append(t, optionalTools()...)
return t
}