@bluehawks/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +36 -0
- package/.prettierrc +8 -0
- package/README.md +288 -0
- package/dist/cli/app.d.ts +12 -0
- package/dist/cli/app.d.ts.map +1 -0
- package/dist/cli/app.js +201 -0
- package/dist/cli/app.js.map +1 -0
- package/dist/cli/commands/index.d.ts +56 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +201 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/config/constants.d.ts +32 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +39 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schema.d.ts +56 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +28 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/settings.d.ts +20 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +102 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/core/agents/agent.d.ts +33 -0
- package/dist/core/agents/agent.d.ts.map +1 -0
- package/dist/core/agents/agent.js +156 -0
- package/dist/core/agents/agent.js.map +1 -0
- package/dist/core/agents/index.d.ts +3 -0
- package/dist/core/agents/index.d.ts.map +1 -0
- package/dist/core/agents/index.js +3 -0
- package/dist/core/agents/index.js.map +1 -0
- package/dist/core/agents/orchestrator.d.ts +56 -0
- package/dist/core/agents/orchestrator.d.ts.map +1 -0
- package/dist/core/agents/orchestrator.js +151 -0
- package/dist/core/agents/orchestrator.js.map +1 -0
- package/dist/core/api/client.d.ts +46 -0
- package/dist/core/api/client.d.ts.map +1 -0
- package/dist/core/api/client.js +223 -0
- package/dist/core/api/client.js.map +1 -0
- package/dist/core/api/index.d.ts +3 -0
- package/dist/core/api/index.d.ts.map +1 -0
- package/dist/core/api/index.js +3 -0
- package/dist/core/api/index.js.map +1 -0
- package/dist/core/api/types.d.ts +126 -0
- package/dist/core/api/types.d.ts.map +1 -0
- package/dist/core/api/types.js +16 -0
- package/dist/core/api/types.js.map +1 -0
- package/dist/core/hooks/index.d.ts +3 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +3 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/manager.d.ts +43 -0
- package/dist/core/hooks/manager.d.ts.map +1 -0
- package/dist/core/hooks/manager.js +178 -0
- package/dist/core/hooks/manager.js.map +1 -0
- package/dist/core/hooks/types.d.ts +68 -0
- package/dist/core/hooks/types.d.ts.map +1 -0
- package/dist/core/hooks/types.js +6 -0
- package/dist/core/hooks/types.js.map +1 -0
- package/dist/core/mcp/client.d.ts +48 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +139 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/index.d.ts +3 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +3 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +46 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +133 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/plugins/index.d.ts +3 -0
- package/dist/core/plugins/index.d.ts.map +1 -0
- package/dist/core/plugins/index.js +3 -0
- package/dist/core/plugins/index.js.map +1 -0
- package/dist/core/plugins/loader.d.ts +63 -0
- package/dist/core/plugins/loader.d.ts.map +1 -0
- package/dist/core/plugins/loader.js +258 -0
- package/dist/core/plugins/loader.js.map +1 -0
- package/dist/core/plugins/types.d.ts +95 -0
- package/dist/core/plugins/types.d.ts.map +1 -0
- package/dist/core/plugins/types.js +6 -0
- package/dist/core/plugins/types.js.map +1 -0
- package/dist/core/session/index.d.ts +3 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +3 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/manager.d.ts +57 -0
- package/dist/core/session/manager.d.ts.map +1 -0
- package/dist/core/session/manager.js +182 -0
- package/dist/core/session/manager.js.map +1 -0
- package/dist/core/session/storage.d.ts +42 -0
- package/dist/core/session/storage.d.ts.map +1 -0
- package/dist/core/session/storage.js +138 -0
- package/dist/core/session/storage.js.map +1 -0
- package/dist/core/tools/definitions/file.d.ts +6 -0
- package/dist/core/tools/definitions/file.d.ts.map +1 -0
- package/dist/core/tools/definitions/file.js +276 -0
- package/dist/core/tools/definitions/file.js.map +1 -0
- package/dist/core/tools/definitions/git.d.ts +6 -0
- package/dist/core/tools/definitions/git.d.ts.map +1 -0
- package/dist/core/tools/definitions/git.js +294 -0
- package/dist/core/tools/definitions/git.js.map +1 -0
- package/dist/core/tools/definitions/index.d.ts +11 -0
- package/dist/core/tools/definitions/index.d.ts.map +1 -0
- package/dist/core/tools/definitions/index.js +22 -0
- package/dist/core/tools/definitions/index.js.map +1 -0
- package/dist/core/tools/definitions/search.d.ts +6 -0
- package/dist/core/tools/definitions/search.d.ts.map +1 -0
- package/dist/core/tools/definitions/search.js +223 -0
- package/dist/core/tools/definitions/search.js.map +1 -0
- package/dist/core/tools/definitions/shell.d.ts +6 -0
- package/dist/core/tools/definitions/shell.d.ts.map +1 -0
- package/dist/core/tools/definitions/shell.js +190 -0
- package/dist/core/tools/definitions/shell.js.map +1 -0
- package/dist/core/tools/definitions/web.d.ts +6 -0
- package/dist/core/tools/definitions/web.d.ts.map +1 -0
- package/dist/core/tools/definitions/web.js +104 -0
- package/dist/core/tools/definitions/web.js.map +1 -0
- package/dist/core/tools/executor.d.ts +24 -0
- package/dist/core/tools/executor.d.ts.map +1 -0
- package/dist/core/tools/executor.js +111 -0
- package/dist/core/tools/executor.js.map +1 -0
- package/dist/core/tools/index.d.ts +4 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +4 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/registry.d.ts +23 -0
- package/dist/core/tools/registry.d.ts.map +1 -0
- package/dist/core/tools/registry.js +28 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +352 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -0
- package/src/cli/app.tsx +319 -0
- package/src/cli/commands/index.ts +261 -0
- package/src/config/constants.ts +45 -0
- package/src/config/index.ts +3 -0
- package/src/config/schema.ts +36 -0
- package/src/config/settings.ts +121 -0
- package/src/core/agents/agent.ts +205 -0
- package/src/core/agents/index.ts +2 -0
- package/src/core/agents/orchestrator.ts +223 -0
- package/src/core/api/client.ts +300 -0
- package/src/core/api/index.ts +2 -0
- package/src/core/api/types.ts +149 -0
- package/src/core/hooks/index.ts +2 -0
- package/src/core/hooks/manager.ts +212 -0
- package/src/core/hooks/types.ts +116 -0
- package/src/core/mcp/client.ts +198 -0
- package/src/core/mcp/index.ts +2 -0
- package/src/core/mcp/manager.ts +153 -0
- package/src/core/plugins/index.ts +2 -0
- package/src/core/plugins/loader.ts +312 -0
- package/src/core/plugins/types.ts +111 -0
- package/src/core/session/index.ts +2 -0
- package/src/core/session/manager.ts +246 -0
- package/src/core/session/storage.ts +184 -0
- package/src/core/tools/definitions/file.ts +312 -0
- package/src/core/tools/definitions/git.ts +326 -0
- package/src/core/tools/definitions/index.ts +24 -0
- package/src/core/tools/definitions/search.ts +266 -0
- package/src/core/tools/definitions/shell.ts +228 -0
- package/src/core/tools/definitions/web.ts +113 -0
- package/src/core/tools/executor.ts +145 -0
- package/src/core/tools/index.ts +3 -0
- package/src/core/tools/registry.ts +44 -0
- package/src/index.ts +407 -0
- package/tsconfig.json +40 -0
- package/vitest.config.ts +13 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Slash Commands
|
|
3
|
+
*/
|
|
4
|
+
// Help command
|
|
5
|
+
const helpCommand = {
|
|
6
|
+
name: 'help',
|
|
7
|
+
aliases: ['h', '?'],
|
|
8
|
+
description: 'Show available commands',
|
|
9
|
+
execute: (_args, _context) => {
|
|
10
|
+
const lines = [
|
|
11
|
+
'📘 Available Commands:',
|
|
12
|
+
'',
|
|
13
|
+
' /help, /h, /? Show this help message',
|
|
14
|
+
' /clear, /c Clear conversation history',
|
|
15
|
+
' /stats, /s Show session statistics',
|
|
16
|
+
' /tools List available tools',
|
|
17
|
+
' /agents List available sub-agents',
|
|
18
|
+
' /plan Toggle plan mode (think before acting)',
|
|
19
|
+
' /compress Compress conversation history',
|
|
20
|
+
' /save Save current session',
|
|
21
|
+
' /yolo Toggle YOLO mode (auto-approve all tools)',
|
|
22
|
+
' /exit, /quit, /q Exit Bluehawks',
|
|
23
|
+
'',
|
|
24
|
+
'💡 Tips:',
|
|
25
|
+
' - Use @ to reference files: @src/index.ts',
|
|
26
|
+
' - Use Ctrl+C to cancel current operation',
|
|
27
|
+
' - Use Up/Down arrows for command history',
|
|
28
|
+
];
|
|
29
|
+
return lines.join('\n');
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
// Clear command
|
|
33
|
+
const clearCommand = {
|
|
34
|
+
name: 'clear',
|
|
35
|
+
aliases: ['c'],
|
|
36
|
+
description: 'Clear conversation history',
|
|
37
|
+
execute: (_args, context) => {
|
|
38
|
+
context.sessionManager.clear();
|
|
39
|
+
return '🗑️ Conversation history cleared.';
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
// Stats command
|
|
43
|
+
const statsCommand = {
|
|
44
|
+
name: 'stats',
|
|
45
|
+
aliases: ['s'],
|
|
46
|
+
description: 'Show session statistics',
|
|
47
|
+
execute: (_args, context) => {
|
|
48
|
+
const stats = context.sessionManager.getStats();
|
|
49
|
+
const duration = Math.floor(stats.duration / 1000);
|
|
50
|
+
const minutes = Math.floor(duration / 60);
|
|
51
|
+
const seconds = duration % 60;
|
|
52
|
+
const lines = [
|
|
53
|
+
'📊 Session Statistics:',
|
|
54
|
+
'',
|
|
55
|
+
` Messages: ${stats.messageCount}`,
|
|
56
|
+
` User: ${stats.userMessages}`,
|
|
57
|
+
` Assistant: ${stats.assistantMessages}`,
|
|
58
|
+
` Tool calls: ${stats.toolMessages}`,
|
|
59
|
+
` Tokens used: ${stats.tokensUsed}`,
|
|
60
|
+
` Duration: ${minutes}m ${seconds}s`,
|
|
61
|
+
'',
|
|
62
|
+
];
|
|
63
|
+
if (stats.toolsUsed.length > 0) {
|
|
64
|
+
lines.push(` Tools used: ${stats.toolsUsed.join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
// Tools command
|
|
70
|
+
const toolsCommand = {
|
|
71
|
+
name: 'tools',
|
|
72
|
+
description: 'List available tools',
|
|
73
|
+
execute: (_args, context) => {
|
|
74
|
+
const tools = context.toolRegistry.getAll();
|
|
75
|
+
const lines = ['🔧 Available Tools:', ''];
|
|
76
|
+
for (const tool of tools) {
|
|
77
|
+
const desc = tool.definition.function.description.substring(0, 60);
|
|
78
|
+
lines.push(` ${tool.name.padEnd(20)} ${desc}...`);
|
|
79
|
+
}
|
|
80
|
+
return lines.join('\n');
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
// Agents command
|
|
84
|
+
const agentsCommand = {
|
|
85
|
+
name: 'agents',
|
|
86
|
+
description: 'List available sub-agents',
|
|
87
|
+
execute: (_args, context) => {
|
|
88
|
+
const agents = context.orchestrator.getSubAgents();
|
|
89
|
+
const lines = ['🤖 Available Sub-Agents:', ''];
|
|
90
|
+
for (const agent of agents) {
|
|
91
|
+
lines.push(` ${agent.name.padEnd(15)} ${agent.description}`);
|
|
92
|
+
}
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// Plan command
|
|
97
|
+
const planCommand = {
|
|
98
|
+
name: 'plan',
|
|
99
|
+
description: 'Toggle plan mode',
|
|
100
|
+
execute: (_args, context) => {
|
|
101
|
+
const current = context.orchestrator.isPlanMode();
|
|
102
|
+
context.orchestrator.setPlanMode(!current);
|
|
103
|
+
if (!current) {
|
|
104
|
+
return '📋 Plan mode enabled. I will create a plan before making changes.';
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return '⚡ Plan mode disabled. I will execute tasks directly.';
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
// Compress command
|
|
112
|
+
const compressCommand = {
|
|
113
|
+
name: 'compress',
|
|
114
|
+
description: 'Compress conversation history',
|
|
115
|
+
execute: (_args, context) => {
|
|
116
|
+
context.sessionManager.compressHistory();
|
|
117
|
+
return '📦 Conversation history compressed to save tokens.';
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
// Save command
|
|
121
|
+
const saveCommand = {
|
|
122
|
+
name: 'save',
|
|
123
|
+
description: 'Save current session',
|
|
124
|
+
execute: async (_args, context) => {
|
|
125
|
+
const path = await context.sessionManager.save();
|
|
126
|
+
return `💾 Session saved to: ${path}`;
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
// Exit command
|
|
130
|
+
const exitCommand = {
|
|
131
|
+
name: 'exit',
|
|
132
|
+
aliases: ['quit', 'q'],
|
|
133
|
+
description: 'Exit Bluehawks',
|
|
134
|
+
execute: (_args, context) => {
|
|
135
|
+
context.onExit();
|
|
136
|
+
return '👋 Goodbye!';
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
// Bug command
|
|
140
|
+
const bugCommand = {
|
|
141
|
+
name: 'bug',
|
|
142
|
+
description: 'Report a bug',
|
|
143
|
+
execute: () => {
|
|
144
|
+
return `🐛 To report a bug:
|
|
145
|
+
1. Go to: https://github.com/bluehawks/cli/issues
|
|
146
|
+
2. Click "New Issue"
|
|
147
|
+
3. Describe the bug with steps to reproduce
|
|
148
|
+
|
|
149
|
+
Thank you for helping improve Bluehawks!`;
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
// All commands
|
|
153
|
+
export const commands = [
|
|
154
|
+
helpCommand,
|
|
155
|
+
clearCommand,
|
|
156
|
+
statsCommand,
|
|
157
|
+
toolsCommand,
|
|
158
|
+
agentsCommand,
|
|
159
|
+
planCommand,
|
|
160
|
+
compressCommand,
|
|
161
|
+
saveCommand,
|
|
162
|
+
exitCommand,
|
|
163
|
+
bugCommand,
|
|
164
|
+
];
|
|
165
|
+
// Command registry
|
|
166
|
+
class CommandRegistry {
|
|
167
|
+
commands = new Map();
|
|
168
|
+
constructor() {
|
|
169
|
+
for (const cmd of commands) {
|
|
170
|
+
this.register(cmd);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
register(command) {
|
|
174
|
+
this.commands.set(command.name, command);
|
|
175
|
+
if (command.aliases) {
|
|
176
|
+
for (const alias of command.aliases) {
|
|
177
|
+
this.commands.set(alias, command);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
get(name) {
|
|
182
|
+
return this.commands.get(name);
|
|
183
|
+
}
|
|
184
|
+
async execute(input, context) {
|
|
185
|
+
if (!input.startsWith('/'))
|
|
186
|
+
return null;
|
|
187
|
+
const parts = input.slice(1).split(/\s+/);
|
|
188
|
+
const commandName = parts[0].toLowerCase();
|
|
189
|
+
const args = parts.slice(1);
|
|
190
|
+
const command = this.get(commandName);
|
|
191
|
+
if (!command) {
|
|
192
|
+
return `Unknown command: /${commandName}. Type /help for available commands.`;
|
|
193
|
+
}
|
|
194
|
+
return command.execute(args, context);
|
|
195
|
+
}
|
|
196
|
+
isCommand(input) {
|
|
197
|
+
return input.startsWith('/');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export const commandRegistry = new CommandRegistry();
|
|
201
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Core Constants
|
|
3
|
+
*/
|
|
4
|
+
export declare const API_BASE_URL = "https://api.bluehawks.ai/v1";
|
|
5
|
+
export declare const DEFAULT_MODEL = "Qwen/Qwen3-0.6B";
|
|
6
|
+
export declare const CLI_NAME = "bluehawks";
|
|
7
|
+
export declare const CLI_VERSION = "1.0.0";
|
|
8
|
+
export declare const CLI_DESCRIPTION = "A production-ready multi-agent AI CLI assistant";
|
|
9
|
+
export declare const CONFIG_DIR_NAME = ".bluehawks";
|
|
10
|
+
export declare const SETTINGS_FILE = "settings.json";
|
|
11
|
+
export declare const CONTEXT_FILE = "BLUEHAWKS.md";
|
|
12
|
+
export declare const HISTORY_FILE = "history.json";
|
|
13
|
+
export declare const ENV_FILE = ".env";
|
|
14
|
+
export declare const DEFAULT_MAX_TOKENS = 4096;
|
|
15
|
+
export declare const DEFAULT_TEMPERATURE = 0.7;
|
|
16
|
+
export declare const DEFAULT_TIMEOUT_MS = 120000;
|
|
17
|
+
export declare const MAX_RETRIES = 3;
|
|
18
|
+
export declare const RETRY_DELAY_MS = 1000;
|
|
19
|
+
export declare const COMMAND_TIMEOUT_MS = 60000;
|
|
20
|
+
export declare const MAX_OUTPUT_LENGTH = 50000;
|
|
21
|
+
export declare const MAX_FILE_SIZE_BYTES: number;
|
|
22
|
+
export declare const MAX_HISTORY_MESSAGES = 100;
|
|
23
|
+
export declare const COMPRESS_THRESHOLD = 50;
|
|
24
|
+
export declare const COLORS: {
|
|
25
|
+
readonly primary: "#3B82F6";
|
|
26
|
+
readonly success: "#10B981";
|
|
27
|
+
readonly warning: "#F59E0B";
|
|
28
|
+
readonly error: "#EF4444";
|
|
29
|
+
readonly info: "#6366F1";
|
|
30
|
+
readonly muted: "#6B7280";
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,YAAY,gCAAgC,CAAC;AAC1D,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAG/C,eAAO,MAAM,QAAQ,cAAc,CAAC;AACpC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,eAAe,oDAAoD,CAAC;AAGjF,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,QAAQ,SAAS,CAAC;AAG/B,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,cAAc,OAAO,CAAC;AAGnC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,iBAAiB,QAAQ,CAAC;AACvC,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AAGpD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAGrC,eAAO,MAAM,MAAM;;;;;;;CAOT,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Core Constants
|
|
3
|
+
*/
|
|
4
|
+
// API Configuration
|
|
5
|
+
export const API_BASE_URL = 'https://api.bluehawks.ai/v1';
|
|
6
|
+
export const DEFAULT_MODEL = 'Qwen/Qwen3-0.6B';
|
|
7
|
+
// CLI Metadata
|
|
8
|
+
export const CLI_NAME = 'bluehawks';
|
|
9
|
+
export const CLI_VERSION = '1.0.0';
|
|
10
|
+
export const CLI_DESCRIPTION = 'A production-ready multi-agent AI CLI assistant';
|
|
11
|
+
// Configuration Paths
|
|
12
|
+
export const CONFIG_DIR_NAME = '.bluehawks';
|
|
13
|
+
export const SETTINGS_FILE = 'settings.json';
|
|
14
|
+
export const CONTEXT_FILE = 'BLUEHAWKS.md';
|
|
15
|
+
export const HISTORY_FILE = 'history.json';
|
|
16
|
+
export const ENV_FILE = '.env';
|
|
17
|
+
// API Defaults
|
|
18
|
+
export const DEFAULT_MAX_TOKENS = 4096;
|
|
19
|
+
export const DEFAULT_TEMPERATURE = 0.7;
|
|
20
|
+
export const DEFAULT_TIMEOUT_MS = 120000;
|
|
21
|
+
export const MAX_RETRIES = 3;
|
|
22
|
+
export const RETRY_DELAY_MS = 1000;
|
|
23
|
+
// Tool Execution
|
|
24
|
+
export const COMMAND_TIMEOUT_MS = 60000;
|
|
25
|
+
export const MAX_OUTPUT_LENGTH = 50000;
|
|
26
|
+
export const MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024; // 10MB
|
|
27
|
+
// Session
|
|
28
|
+
export const MAX_HISTORY_MESSAGES = 100;
|
|
29
|
+
export const COMPRESS_THRESHOLD = 50;
|
|
30
|
+
// Colors (for terminal output)
|
|
31
|
+
export const COLORS = {
|
|
32
|
+
primary: '#3B82F6',
|
|
33
|
+
success: '#10B981',
|
|
34
|
+
warning: '#F59E0B',
|
|
35
|
+
error: '#EF4444',
|
|
36
|
+
info: '#6366F1',
|
|
37
|
+
muted: '#6B7280',
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAoB;AACpB,MAAM,CAAC,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE/C,eAAe;AACf,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,iDAAiD,CAAC;AAEjF,sBAAsB;AACtB,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE/B,eAAe;AACf,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,iBAAiB;AACjB,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAE5D,UAAU;AACV,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Settings Schema
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export declare const settingsSchema: z.ZodObject<{
|
|
6
|
+
apiUrl: z.ZodOptional<z.ZodString>;
|
|
7
|
+
apiKey: z.ZodOptional<z.ZodString>;
|
|
8
|
+
model: z.ZodOptional<z.ZodString>;
|
|
9
|
+
approvalMode: z.ZodDefault<z.ZodEnum<["always", "never", "unsafe-only"]>>;
|
|
10
|
+
maxTokens: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
temperature: z.ZodDefault<z.ZodNumber>;
|
|
12
|
+
timeout: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
theme: z.ZodDefault<z.ZodEnum<["dark", "light", "auto"]>>;
|
|
14
|
+
showTimestamps: z.ZodDefault<z.ZodBoolean>;
|
|
15
|
+
compactMode: z.ZodDefault<z.ZodBoolean>;
|
|
16
|
+
planMode: z.ZodDefault<z.ZodBoolean>;
|
|
17
|
+
mcpEnabled: z.ZodDefault<z.ZodBoolean>;
|
|
18
|
+
commandTimeout: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
maxOutputLength: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
excludePatterns: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
approvalMode: "always" | "never" | "unsafe-only";
|
|
23
|
+
timeout: number;
|
|
24
|
+
maxTokens: number;
|
|
25
|
+
temperature: number;
|
|
26
|
+
theme: "auto" | "dark" | "light";
|
|
27
|
+
showTimestamps: boolean;
|
|
28
|
+
compactMode: boolean;
|
|
29
|
+
planMode: boolean;
|
|
30
|
+
mcpEnabled: boolean;
|
|
31
|
+
commandTimeout: number;
|
|
32
|
+
maxOutputLength: number;
|
|
33
|
+
excludePatterns: string[];
|
|
34
|
+
apiKey?: string | undefined;
|
|
35
|
+
apiUrl?: string | undefined;
|
|
36
|
+
model?: string | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
approvalMode?: "always" | "never" | "unsafe-only" | undefined;
|
|
39
|
+
timeout?: number | undefined;
|
|
40
|
+
apiKey?: string | undefined;
|
|
41
|
+
apiUrl?: string | undefined;
|
|
42
|
+
model?: string | undefined;
|
|
43
|
+
maxTokens?: number | undefined;
|
|
44
|
+
temperature?: number | undefined;
|
|
45
|
+
theme?: "auto" | "dark" | "light" | undefined;
|
|
46
|
+
showTimestamps?: boolean | undefined;
|
|
47
|
+
compactMode?: boolean | undefined;
|
|
48
|
+
planMode?: boolean | undefined;
|
|
49
|
+
mcpEnabled?: boolean | undefined;
|
|
50
|
+
commandTimeout?: number | undefined;
|
|
51
|
+
maxOutputLength?: number | undefined;
|
|
52
|
+
excludePatterns?: string[] | undefined;
|
|
53
|
+
}>;
|
|
54
|
+
export type Settings = z.infer<typeof settingsSchema>;
|
|
55
|
+
export declare const defaultSettings: Settings;
|
|
56
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyBzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe,EAAE,QAAmC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Settings Schema
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
export const settingsSchema = z.object({
|
|
6
|
+
// API Settings
|
|
7
|
+
apiUrl: z.string().url().optional(),
|
|
8
|
+
apiKey: z.string().optional(),
|
|
9
|
+
model: z.string().optional(),
|
|
10
|
+
// Execution Settings
|
|
11
|
+
approvalMode: z.enum(['always', 'never', 'unsafe-only']).default('unsafe-only'),
|
|
12
|
+
maxTokens: z.number().min(1).max(32768).default(4096),
|
|
13
|
+
temperature: z.number().min(0).max(2).default(0.7),
|
|
14
|
+
timeout: z.number().min(1000).max(600000).default(120000),
|
|
15
|
+
// UI Settings
|
|
16
|
+
theme: z.enum(['dark', 'light', 'auto']).default('dark'),
|
|
17
|
+
showTimestamps: z.boolean().default(false),
|
|
18
|
+
compactMode: z.boolean().default(false),
|
|
19
|
+
// Feature Flags
|
|
20
|
+
planMode: z.boolean().default(false),
|
|
21
|
+
mcpEnabled: z.boolean().default(false),
|
|
22
|
+
// Tool Settings
|
|
23
|
+
commandTimeout: z.number().min(1000).max(300000).default(60000),
|
|
24
|
+
maxOutputLength: z.number().min(1000).max(100000).default(50000),
|
|
25
|
+
excludePatterns: z.array(z.string()).default(['node_modules', '.git', 'dist', 'build']),
|
|
26
|
+
});
|
|
27
|
+
export const defaultSettings = settingsSchema.parse({});
|
|
28
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,eAAe;IACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAE5B,qBAAqB;IACrB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC/E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAEzD,cAAc;IACd,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACxD,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAEvC,gBAAgB;IAChB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAEtC,gBAAgB;IAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAChE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1F,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,eAAe,GAAa,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Settings Manager
|
|
3
|
+
*/
|
|
4
|
+
import { type Settings } from './schema.js';
|
|
5
|
+
export declare class SettingsManager {
|
|
6
|
+
private globalConfigPath;
|
|
7
|
+
private projectConfigPath;
|
|
8
|
+
private settings;
|
|
9
|
+
constructor(projectPath?: string);
|
|
10
|
+
load(): Promise<Settings>;
|
|
11
|
+
private loadFromFile;
|
|
12
|
+
private loadFromEnv;
|
|
13
|
+
save(scope?: 'global' | 'project'): Promise<void>;
|
|
14
|
+
get<K extends keyof Settings>(key: K): Settings[K];
|
|
15
|
+
set<K extends keyof Settings>(key: K, value: Settings[K]): void;
|
|
16
|
+
getAll(): Settings;
|
|
17
|
+
update(partial: Partial<Settings>): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const settingsManager: SettingsManager;
|
|
20
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG7E,qBAAa,eAAe;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAW;gBAEf,WAAW,GAAE,MAAsB;IAMzC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;YAqBjB,YAAY;YASZ,WAAW;IAyCnB,IAAI,CAAC,KAAK,GAAE,QAAQ,GAAG,SAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAIlD,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAI/D,MAAM,IAAI,QAAQ;IAIlB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;CAM3C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Settings Manager
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs/promises';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import * as os from 'node:os';
|
|
7
|
+
import { settingsSchema, defaultSettings } from './schema.js';
|
|
8
|
+
import { CONFIG_DIR_NAME, SETTINGS_FILE, ENV_FILE } from './constants.js';
|
|
9
|
+
export class SettingsManager {
|
|
10
|
+
globalConfigPath;
|
|
11
|
+
projectConfigPath;
|
|
12
|
+
settings;
|
|
13
|
+
constructor(projectPath = process.cwd()) {
|
|
14
|
+
this.globalConfigPath = path.join(os.homedir(), CONFIG_DIR_NAME);
|
|
15
|
+
this.projectConfigPath = path.join(projectPath, CONFIG_DIR_NAME);
|
|
16
|
+
this.settings = { ...defaultSettings };
|
|
17
|
+
}
|
|
18
|
+
async load() {
|
|
19
|
+
// Load in order of increasing precedence
|
|
20
|
+
const globalSettings = await this.loadFromFile(path.join(this.globalConfigPath, SETTINGS_FILE));
|
|
21
|
+
const projectSettings = await this.loadFromFile(path.join(this.projectConfigPath, SETTINGS_FILE));
|
|
22
|
+
const envSettings = await this.loadFromEnv();
|
|
23
|
+
// Merge settings
|
|
24
|
+
this.settings = settingsSchema.parse({
|
|
25
|
+
...defaultSettings,
|
|
26
|
+
...globalSettings,
|
|
27
|
+
...projectSettings,
|
|
28
|
+
...envSettings,
|
|
29
|
+
});
|
|
30
|
+
return this.settings;
|
|
31
|
+
}
|
|
32
|
+
async loadFromFile(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
35
|
+
return JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async loadFromEnv() {
|
|
42
|
+
// Load from .env file if exists
|
|
43
|
+
const envPath = path.join(this.projectConfigPath, ENV_FILE);
|
|
44
|
+
try {
|
|
45
|
+
const content = await fs.readFile(envPath, 'utf-8');
|
|
46
|
+
const lines = content.split('\n');
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
const match = line.match(/^([^=]+)=(.*)$/);
|
|
49
|
+
if (match) {
|
|
50
|
+
const [, key, value] = match;
|
|
51
|
+
if (!process.env[key.trim()]) {
|
|
52
|
+
process.env[key.trim()] = value.trim().replace(/^['"]|['"]$/g, '');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// No .env file
|
|
59
|
+
}
|
|
60
|
+
// Map environment variables to settings
|
|
61
|
+
const settings = {};
|
|
62
|
+
if (process.env.BLUEHAWKS_API_URL) {
|
|
63
|
+
settings.apiUrl = process.env.BLUEHAWKS_API_URL;
|
|
64
|
+
}
|
|
65
|
+
if (process.env.BLUEHAWKS_API_KEY) {
|
|
66
|
+
settings.apiKey = process.env.BLUEHAWKS_API_KEY;
|
|
67
|
+
}
|
|
68
|
+
if (process.env.BLUEHAWKS_MODEL) {
|
|
69
|
+
settings.model = process.env.BLUEHAWKS_MODEL;
|
|
70
|
+
}
|
|
71
|
+
if (process.env.BLUEHAWKS_MAX_TOKENS) {
|
|
72
|
+
settings.maxTokens = parseInt(process.env.BLUEHAWKS_MAX_TOKENS, 10);
|
|
73
|
+
}
|
|
74
|
+
if (process.env.BLUEHAWKS_TEMPERATURE) {
|
|
75
|
+
settings.temperature = parseFloat(process.env.BLUEHAWKS_TEMPERATURE);
|
|
76
|
+
}
|
|
77
|
+
return settings;
|
|
78
|
+
}
|
|
79
|
+
async save(scope = 'project') {
|
|
80
|
+
const configPath = scope === 'global' ? this.globalConfigPath : this.projectConfigPath;
|
|
81
|
+
const filePath = path.join(configPath, SETTINGS_FILE);
|
|
82
|
+
await fs.mkdir(configPath, { recursive: true });
|
|
83
|
+
await fs.writeFile(filePath, JSON.stringify(this.settings, null, 2), 'utf-8');
|
|
84
|
+
}
|
|
85
|
+
get(key) {
|
|
86
|
+
return this.settings[key];
|
|
87
|
+
}
|
|
88
|
+
set(key, value) {
|
|
89
|
+
this.settings[key] = value;
|
|
90
|
+
}
|
|
91
|
+
getAll() {
|
|
92
|
+
return { ...this.settings };
|
|
93
|
+
}
|
|
94
|
+
update(partial) {
|
|
95
|
+
this.settings = settingsSchema.parse({
|
|
96
|
+
...this.settings,
|
|
97
|
+
...partial,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export const settingsManager = new SettingsManager();
|
|
102
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Base Agent
|
|
3
|
+
* Base class for all agents
|
|
4
|
+
*/
|
|
5
|
+
import { APIClient } from '../api/client.js';
|
|
6
|
+
import { ToolExecutor } from '../tools/executor.js';
|
|
7
|
+
import type { Message, ToolDefinition } from '../api/types.js';
|
|
8
|
+
export interface AgentOptions {
|
|
9
|
+
name: string;
|
|
10
|
+
systemPrompt: string;
|
|
11
|
+
tools?: string[];
|
|
12
|
+
maxIterations?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface AgentResponse {
|
|
15
|
+
content: string;
|
|
16
|
+
toolsUsed: string[];
|
|
17
|
+
iterations: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class Agent {
|
|
20
|
+
protected name: string;
|
|
21
|
+
protected systemPrompt: string;
|
|
22
|
+
protected tools: ToolDefinition[];
|
|
23
|
+
protected maxIterations: number;
|
|
24
|
+
protected apiClient: APIClient;
|
|
25
|
+
protected toolExecutor: ToolExecutor;
|
|
26
|
+
protected messages: Message[];
|
|
27
|
+
protected sessionId: string;
|
|
28
|
+
constructor(options: AgentOptions, apiClient: APIClient, toolExecutor: ToolExecutor);
|
|
29
|
+
run(userMessage: string, onChunk?: (content: string) => void, onToolStart?: (name: string) => void, onToolEnd?: (name: string, result: string) => void): Promise<AgentResponse>;
|
|
30
|
+
getMessages(): Message[];
|
|
31
|
+
getName(): string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/core/agents/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAc,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAI3E,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,KAAK;IACd,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IAClC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAChC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC9B,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEhB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY;IAmB7E,GAAG,CACL,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EACnC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACpC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GACnD,OAAO,CAAC,aAAa,CAAC;IA0IzB,WAAW,IAAI,OAAO,EAAE;IAIxB,OAAO,IAAI,MAAM;CAGpB"}
|