@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.
Files changed (176) hide show
  1. package/.eslintrc.json +36 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +288 -0
  4. package/dist/cli/app.d.ts +12 -0
  5. package/dist/cli/app.d.ts.map +1 -0
  6. package/dist/cli/app.js +201 -0
  7. package/dist/cli/app.js.map +1 -0
  8. package/dist/cli/commands/index.d.ts +56 -0
  9. package/dist/cli/commands/index.d.ts.map +1 -0
  10. package/dist/cli/commands/index.js +201 -0
  11. package/dist/cli/commands/index.js.map +1 -0
  12. package/dist/config/constants.d.ts +32 -0
  13. package/dist/config/constants.d.ts.map +1 -0
  14. package/dist/config/constants.js +39 -0
  15. package/dist/config/constants.js.map +1 -0
  16. package/dist/config/index.d.ts +4 -0
  17. package/dist/config/index.d.ts.map +1 -0
  18. package/dist/config/index.js +4 -0
  19. package/dist/config/index.js.map +1 -0
  20. package/dist/config/schema.d.ts +56 -0
  21. package/dist/config/schema.d.ts.map +1 -0
  22. package/dist/config/schema.js +28 -0
  23. package/dist/config/schema.js.map +1 -0
  24. package/dist/config/settings.d.ts +20 -0
  25. package/dist/config/settings.d.ts.map +1 -0
  26. package/dist/config/settings.js +102 -0
  27. package/dist/config/settings.js.map +1 -0
  28. package/dist/core/agents/agent.d.ts +33 -0
  29. package/dist/core/agents/agent.d.ts.map +1 -0
  30. package/dist/core/agents/agent.js +156 -0
  31. package/dist/core/agents/agent.js.map +1 -0
  32. package/dist/core/agents/index.d.ts +3 -0
  33. package/dist/core/agents/index.d.ts.map +1 -0
  34. package/dist/core/agents/index.js +3 -0
  35. package/dist/core/agents/index.js.map +1 -0
  36. package/dist/core/agents/orchestrator.d.ts +56 -0
  37. package/dist/core/agents/orchestrator.d.ts.map +1 -0
  38. package/dist/core/agents/orchestrator.js +151 -0
  39. package/dist/core/agents/orchestrator.js.map +1 -0
  40. package/dist/core/api/client.d.ts +46 -0
  41. package/dist/core/api/client.d.ts.map +1 -0
  42. package/dist/core/api/client.js +223 -0
  43. package/dist/core/api/client.js.map +1 -0
  44. package/dist/core/api/index.d.ts +3 -0
  45. package/dist/core/api/index.d.ts.map +1 -0
  46. package/dist/core/api/index.js +3 -0
  47. package/dist/core/api/index.js.map +1 -0
  48. package/dist/core/api/types.d.ts +126 -0
  49. package/dist/core/api/types.d.ts.map +1 -0
  50. package/dist/core/api/types.js +16 -0
  51. package/dist/core/api/types.js.map +1 -0
  52. package/dist/core/hooks/index.d.ts +3 -0
  53. package/dist/core/hooks/index.d.ts.map +1 -0
  54. package/dist/core/hooks/index.js +3 -0
  55. package/dist/core/hooks/index.js.map +1 -0
  56. package/dist/core/hooks/manager.d.ts +43 -0
  57. package/dist/core/hooks/manager.d.ts.map +1 -0
  58. package/dist/core/hooks/manager.js +178 -0
  59. package/dist/core/hooks/manager.js.map +1 -0
  60. package/dist/core/hooks/types.d.ts +68 -0
  61. package/dist/core/hooks/types.d.ts.map +1 -0
  62. package/dist/core/hooks/types.js +6 -0
  63. package/dist/core/hooks/types.js.map +1 -0
  64. package/dist/core/mcp/client.d.ts +48 -0
  65. package/dist/core/mcp/client.d.ts.map +1 -0
  66. package/dist/core/mcp/client.js +139 -0
  67. package/dist/core/mcp/client.js.map +1 -0
  68. package/dist/core/mcp/index.d.ts +3 -0
  69. package/dist/core/mcp/index.d.ts.map +1 -0
  70. package/dist/core/mcp/index.js +3 -0
  71. package/dist/core/mcp/index.js.map +1 -0
  72. package/dist/core/mcp/manager.d.ts +46 -0
  73. package/dist/core/mcp/manager.d.ts.map +1 -0
  74. package/dist/core/mcp/manager.js +133 -0
  75. package/dist/core/mcp/manager.js.map +1 -0
  76. package/dist/core/plugins/index.d.ts +3 -0
  77. package/dist/core/plugins/index.d.ts.map +1 -0
  78. package/dist/core/plugins/index.js +3 -0
  79. package/dist/core/plugins/index.js.map +1 -0
  80. package/dist/core/plugins/loader.d.ts +63 -0
  81. package/dist/core/plugins/loader.d.ts.map +1 -0
  82. package/dist/core/plugins/loader.js +258 -0
  83. package/dist/core/plugins/loader.js.map +1 -0
  84. package/dist/core/plugins/types.d.ts +95 -0
  85. package/dist/core/plugins/types.d.ts.map +1 -0
  86. package/dist/core/plugins/types.js +6 -0
  87. package/dist/core/plugins/types.js.map +1 -0
  88. package/dist/core/session/index.d.ts +3 -0
  89. package/dist/core/session/index.d.ts.map +1 -0
  90. package/dist/core/session/index.js +3 -0
  91. package/dist/core/session/index.js.map +1 -0
  92. package/dist/core/session/manager.d.ts +57 -0
  93. package/dist/core/session/manager.d.ts.map +1 -0
  94. package/dist/core/session/manager.js +182 -0
  95. package/dist/core/session/manager.js.map +1 -0
  96. package/dist/core/session/storage.d.ts +42 -0
  97. package/dist/core/session/storage.d.ts.map +1 -0
  98. package/dist/core/session/storage.js +138 -0
  99. package/dist/core/session/storage.js.map +1 -0
  100. package/dist/core/tools/definitions/file.d.ts +6 -0
  101. package/dist/core/tools/definitions/file.d.ts.map +1 -0
  102. package/dist/core/tools/definitions/file.js +276 -0
  103. package/dist/core/tools/definitions/file.js.map +1 -0
  104. package/dist/core/tools/definitions/git.d.ts +6 -0
  105. package/dist/core/tools/definitions/git.d.ts.map +1 -0
  106. package/dist/core/tools/definitions/git.js +294 -0
  107. package/dist/core/tools/definitions/git.js.map +1 -0
  108. package/dist/core/tools/definitions/index.d.ts +11 -0
  109. package/dist/core/tools/definitions/index.d.ts.map +1 -0
  110. package/dist/core/tools/definitions/index.js +22 -0
  111. package/dist/core/tools/definitions/index.js.map +1 -0
  112. package/dist/core/tools/definitions/search.d.ts +6 -0
  113. package/dist/core/tools/definitions/search.d.ts.map +1 -0
  114. package/dist/core/tools/definitions/search.js +223 -0
  115. package/dist/core/tools/definitions/search.js.map +1 -0
  116. package/dist/core/tools/definitions/shell.d.ts +6 -0
  117. package/dist/core/tools/definitions/shell.d.ts.map +1 -0
  118. package/dist/core/tools/definitions/shell.js +190 -0
  119. package/dist/core/tools/definitions/shell.js.map +1 -0
  120. package/dist/core/tools/definitions/web.d.ts +6 -0
  121. package/dist/core/tools/definitions/web.d.ts.map +1 -0
  122. package/dist/core/tools/definitions/web.js +104 -0
  123. package/dist/core/tools/definitions/web.js.map +1 -0
  124. package/dist/core/tools/executor.d.ts +24 -0
  125. package/dist/core/tools/executor.d.ts.map +1 -0
  126. package/dist/core/tools/executor.js +111 -0
  127. package/dist/core/tools/executor.js.map +1 -0
  128. package/dist/core/tools/index.d.ts +4 -0
  129. package/dist/core/tools/index.d.ts.map +1 -0
  130. package/dist/core/tools/index.js +4 -0
  131. package/dist/core/tools/index.js.map +1 -0
  132. package/dist/core/tools/registry.d.ts +23 -0
  133. package/dist/core/tools/registry.d.ts.map +1 -0
  134. package/dist/core/tools/registry.js +28 -0
  135. package/dist/core/tools/registry.js.map +1 -0
  136. package/dist/index.d.ts +7 -0
  137. package/dist/index.d.ts.map +1 -0
  138. package/dist/index.js +352 -0
  139. package/dist/index.js.map +1 -0
  140. package/package.json +62 -0
  141. package/src/cli/app.tsx +319 -0
  142. package/src/cli/commands/index.ts +261 -0
  143. package/src/config/constants.ts +45 -0
  144. package/src/config/index.ts +3 -0
  145. package/src/config/schema.ts +36 -0
  146. package/src/config/settings.ts +121 -0
  147. package/src/core/agents/agent.ts +205 -0
  148. package/src/core/agents/index.ts +2 -0
  149. package/src/core/agents/orchestrator.ts +223 -0
  150. package/src/core/api/client.ts +300 -0
  151. package/src/core/api/index.ts +2 -0
  152. package/src/core/api/types.ts +149 -0
  153. package/src/core/hooks/index.ts +2 -0
  154. package/src/core/hooks/manager.ts +212 -0
  155. package/src/core/hooks/types.ts +116 -0
  156. package/src/core/mcp/client.ts +198 -0
  157. package/src/core/mcp/index.ts +2 -0
  158. package/src/core/mcp/manager.ts +153 -0
  159. package/src/core/plugins/index.ts +2 -0
  160. package/src/core/plugins/loader.ts +312 -0
  161. package/src/core/plugins/types.ts +111 -0
  162. package/src/core/session/index.ts +2 -0
  163. package/src/core/session/manager.ts +246 -0
  164. package/src/core/session/storage.ts +184 -0
  165. package/src/core/tools/definitions/file.ts +312 -0
  166. package/src/core/tools/definitions/git.ts +326 -0
  167. package/src/core/tools/definitions/index.ts +24 -0
  168. package/src/core/tools/definitions/search.ts +266 -0
  169. package/src/core/tools/definitions/shell.ts +228 -0
  170. package/src/core/tools/definitions/web.ts +113 -0
  171. package/src/core/tools/executor.ts +145 -0
  172. package/src/core/tools/index.ts +3 -0
  173. package/src/core/tools/registry.ts +44 -0
  174. package/src/index.ts +407 -0
  175. package/tsconfig.json +40 -0
  176. package/vitest.config.ts +13 -0
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Bluehawks CLI - API Client
3
+ * OpenAI-compatible API client with streaming support
4
+ */
5
+ import { API_BASE_URL, DEFAULT_MODEL, DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, DEFAULT_TIMEOUT_MS, MAX_RETRIES, RETRY_DELAY_MS, } from '../../config/constants.js';
6
+ import { APIError, } from './types.js';
7
+ export class APIClient {
8
+ baseUrl;
9
+ apiKey;
10
+ model;
11
+ maxTokens;
12
+ temperature;
13
+ timeout;
14
+ constructor(options = {}) {
15
+ this.baseUrl = options.baseUrl || process.env.BLUEHAWKS_API_URL || API_BASE_URL;
16
+ this.apiKey = options.apiKey || process.env.BLUEHAWKS_API_KEY || '';
17
+ this.model = options.model || process.env.BLUEHAWKS_MODEL || DEFAULT_MODEL;
18
+ this.maxTokens = options.maxTokens || DEFAULT_MAX_TOKENS;
19
+ this.temperature = options.temperature || DEFAULT_TEMPERATURE;
20
+ this.timeout = options.timeout || DEFAULT_TIMEOUT_MS;
21
+ }
22
+ /**
23
+ * Create a chat completion (non-streaming)
24
+ */
25
+ async createChatCompletion(messages, tools, toolChoice) {
26
+ const request = {
27
+ model: this.model,
28
+ messages,
29
+ max_tokens: this.maxTokens,
30
+ temperature: this.temperature,
31
+ stream: false,
32
+ };
33
+ if (tools && tools.length > 0) {
34
+ request.tools = tools;
35
+ request.tool_choice = toolChoice || 'auto';
36
+ }
37
+ const response = await this.makeRequest('/chat/completions', request);
38
+ return response;
39
+ }
40
+ /**
41
+ * Create a streaming chat completion
42
+ */
43
+ async *createStreamingChatCompletion(messages, _tools, _toolChoice) {
44
+ const request = {
45
+ model: this.model,
46
+ messages,
47
+ max_tokens: this.maxTokens,
48
+ temperature: this.temperature,
49
+ stream: true,
50
+ };
51
+ // Note: Many vLLM backends don't support tool_choice in streaming mode
52
+ // So we skip sending tools for streaming requests.
53
+ // For tool-based workflows, use non-streaming createChatCompletion instead.
54
+ const response = await this.fetchWithRetry('/chat/completions', {
55
+ method: 'POST',
56
+ headers: this.getHeaders(),
57
+ body: JSON.stringify(request),
58
+ });
59
+ if (!response.ok) {
60
+ const errorBody = await response.text();
61
+ throw new APIError(`API request failed: ${response.status}`, response.status, errorBody);
62
+ }
63
+ if (!response.body) {
64
+ throw new APIError('Response body is empty');
65
+ }
66
+ const reader = response.body.getReader();
67
+ const decoder = new TextDecoder();
68
+ let buffer = '';
69
+ try {
70
+ while (true) {
71
+ const { done, value } = await reader.read();
72
+ if (done)
73
+ break;
74
+ buffer += decoder.decode(value, { stream: true });
75
+ const lines = buffer.split('\n');
76
+ buffer = lines.pop() || '';
77
+ for (const line of lines) {
78
+ const trimmed = line.trim();
79
+ if (!trimmed || trimmed === 'data: [DONE]')
80
+ continue;
81
+ if (!trimmed.startsWith('data: '))
82
+ continue;
83
+ try {
84
+ const data = trimmed.slice(6);
85
+ const chunk = JSON.parse(data);
86
+ yield chunk;
87
+ }
88
+ catch {
89
+ // Skip invalid JSON
90
+ }
91
+ }
92
+ }
93
+ }
94
+ finally {
95
+ reader.releaseLock();
96
+ }
97
+ }
98
+ /**
99
+ * Convenience method to stream and collect tool calls
100
+ */
101
+ async streamChatCompletion(messages, tools, onChunk, onToolCalls) {
102
+ let content = '';
103
+ const toolCalls = [];
104
+ const toolCallsMap = new Map();
105
+ let finishReason = 'stop';
106
+ for await (const chunk of this.createStreamingChatCompletion(messages, tools)) {
107
+ for (const choice of chunk.choices) {
108
+ if (choice.finish_reason) {
109
+ finishReason = choice.finish_reason;
110
+ }
111
+ const deltaContent = choice.delta.content;
112
+ if (typeof deltaContent === 'string') {
113
+ content += deltaContent;
114
+ onChunk?.(deltaContent);
115
+ }
116
+ const deltaToolCalls = choice.delta.tool_calls;
117
+ if (deltaToolCalls) {
118
+ for (const tc of deltaToolCalls) {
119
+ const index = tc.index ?? 0;
120
+ const existing = toolCallsMap.get(index);
121
+ if (existing) {
122
+ // Append to existing tool call
123
+ if (tc.function?.arguments) {
124
+ existing.function.arguments += tc.function.arguments;
125
+ }
126
+ }
127
+ else if (tc.id) {
128
+ // New tool call
129
+ const newToolCall = {
130
+ id: tc.id,
131
+ type: 'function',
132
+ function: {
133
+ name: tc.function?.name || '',
134
+ arguments: tc.function?.arguments || '',
135
+ },
136
+ };
137
+ toolCallsMap.set(index, newToolCall);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ // Convert map to array
144
+ toolCalls.push(...toolCallsMap.values());
145
+ if (toolCalls.length > 0) {
146
+ onToolCalls?.(toolCalls);
147
+ }
148
+ return { content, toolCalls, finishReason };
149
+ }
150
+ /**
151
+ * Send tool results back to the API
152
+ */
153
+ async sendToolResults(messages, toolResults, tools, onChunk, onToolCalls) {
154
+ // Add tool results as messages
155
+ const toolMessages = toolResults.map((result) => ({
156
+ role: 'tool',
157
+ tool_call_id: result.tool_call_id,
158
+ content: result.content,
159
+ }));
160
+ const allMessages = [...messages, ...toolMessages];
161
+ return this.streamChatCompletion(allMessages, tools, onChunk, onToolCalls);
162
+ }
163
+ getHeaders() {
164
+ const headers = {
165
+ 'Content-Type': 'application/json',
166
+ };
167
+ if (this.apiKey) {
168
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
169
+ }
170
+ return headers;
171
+ }
172
+ async makeRequest(endpoint, body) {
173
+ const response = await this.fetchWithRetry(endpoint, {
174
+ method: 'POST',
175
+ headers: this.getHeaders(),
176
+ body: JSON.stringify(body),
177
+ });
178
+ if (!response.ok) {
179
+ const errorBody = await response.text();
180
+ throw new APIError(`API request failed: ${response.status}`, response.status, errorBody);
181
+ }
182
+ return response.json();
183
+ }
184
+ async fetchWithRetry(endpoint, options, retries = MAX_RETRIES) {
185
+ const url = `${this.baseUrl}${endpoint}`;
186
+ const controller = new AbortController();
187
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
188
+ try {
189
+ const response = await fetch(url, {
190
+ ...options,
191
+ signal: controller.signal,
192
+ });
193
+ clearTimeout(timeoutId);
194
+ // Retry on 5xx errors
195
+ if (response.status >= 500 && retries > 0) {
196
+ await this.delay(RETRY_DELAY_MS * (MAX_RETRIES - retries + 1));
197
+ return this.fetchWithRetry(endpoint, options, retries - 1);
198
+ }
199
+ return response;
200
+ }
201
+ catch (error) {
202
+ clearTimeout(timeoutId);
203
+ if (retries > 0 && error instanceof Error && error.name !== 'AbortError') {
204
+ await this.delay(RETRY_DELAY_MS * (MAX_RETRIES - retries + 1));
205
+ return this.fetchWithRetry(endpoint, options, retries - 1);
206
+ }
207
+ throw new APIError(`Network error: ${error instanceof Error ? error.message : 'Unknown error'}`);
208
+ }
209
+ }
210
+ delay(ms) {
211
+ return new Promise((resolve) => setTimeout(resolve, ms));
212
+ }
213
+ // Getters for current configuration
214
+ get currentModel() {
215
+ return this.model;
216
+ }
217
+ get currentBaseUrl() {
218
+ return this.baseUrl;
219
+ }
220
+ }
221
+ // Export singleton instance
222
+ export const apiClient = new APIClient();
223
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './client.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './client.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Bluehawks CLI - API Types
3
+ * OpenAI-compatible API type definitions
4
+ */
5
+ export type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
6
+ export interface Message {
7
+ role: MessageRole;
8
+ content: string | ContentPart[];
9
+ name?: string;
10
+ tool_calls?: ToolCall[];
11
+ tool_call_id?: string;
12
+ }
13
+ export interface ContentPart {
14
+ type: 'text' | 'image_url';
15
+ text?: string;
16
+ image_url?: {
17
+ url: string;
18
+ detail?: 'auto' | 'low' | 'high';
19
+ };
20
+ }
21
+ export interface ToolCall {
22
+ id: string;
23
+ type: 'function';
24
+ function: {
25
+ name: string;
26
+ arguments: string;
27
+ };
28
+ }
29
+ export interface ToolDefinition {
30
+ type: 'function';
31
+ function: {
32
+ name: string;
33
+ description: string;
34
+ parameters: {
35
+ type: 'object';
36
+ properties: Record<string, ToolParameterSchema>;
37
+ required?: string[];
38
+ };
39
+ };
40
+ }
41
+ export interface ToolParameterSchema {
42
+ type: string;
43
+ description?: string;
44
+ enum?: string[];
45
+ items?: ToolParameterSchema;
46
+ properties?: Record<string, ToolParameterSchema>;
47
+ required?: string[];
48
+ }
49
+ export interface ToolResult {
50
+ tool_call_id: string;
51
+ content: string;
52
+ isError?: boolean;
53
+ }
54
+ export interface ChatCompletionRequest {
55
+ model: string;
56
+ messages: Message[];
57
+ tools?: ToolDefinition[];
58
+ tool_choice?: 'auto' | 'none' | 'required' | {
59
+ type: 'function';
60
+ function: {
61
+ name: string;
62
+ };
63
+ };
64
+ max_tokens?: number;
65
+ temperature?: number;
66
+ stream?: boolean;
67
+ stop?: string[];
68
+ }
69
+ export interface ChatCompletionResponse {
70
+ id: string;
71
+ object: 'chat.completion';
72
+ created: number;
73
+ model: string;
74
+ choices: Choice[];
75
+ usage?: Usage;
76
+ }
77
+ export interface Choice {
78
+ index: number;
79
+ message: Message;
80
+ finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;
81
+ }
82
+ export interface Usage {
83
+ prompt_tokens: number;
84
+ completion_tokens: number;
85
+ total_tokens: number;
86
+ }
87
+ export interface StreamDelta {
88
+ content?: string;
89
+ tool_calls?: Array<{
90
+ index?: number;
91
+ id?: string;
92
+ type?: 'function';
93
+ function?: {
94
+ name?: string;
95
+ arguments?: string;
96
+ };
97
+ }>;
98
+ }
99
+ export interface ChatCompletionChunk {
100
+ id: string;
101
+ object: 'chat.completion.chunk';
102
+ created: number;
103
+ model: string;
104
+ choices: StreamChoice[];
105
+ }
106
+ export interface StreamChoice {
107
+ index: number;
108
+ delta: StreamDelta;
109
+ finish_reason: string | null;
110
+ }
111
+ export interface APIClientOptions {
112
+ baseUrl?: string;
113
+ apiKey?: string;
114
+ model?: string;
115
+ maxTokens?: number;
116
+ temperature?: number;
117
+ timeout?: number;
118
+ }
119
+ export type StreamCallback = (chunk: string) => void;
120
+ export type ToolCallCallback = (toolCalls: ToolCall[]) => void;
121
+ export declare class APIError extends Error {
122
+ statusCode?: number | undefined;
123
+ response?: unknown | undefined;
124
+ constructor(message: string, statusCode?: number | undefined, response?: unknown | undefined);
125
+ }
126
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/api/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bluehawks CLI - API Types
3
+ * OpenAI-compatible API type definitions
4
+ */
5
+ // API Error
6
+ export class APIError extends Error {
7
+ statusCode;
8
+ response;
9
+ constructor(message, statusCode, response) {
10
+ super(message);
11
+ this.statusCode = statusCode;
12
+ this.response = response;
13
+ this.name = 'APIError';
14
+ }
15
+ }
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/api/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuIH,YAAY;AACZ,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGpB;IACA;IAHX,YACI,OAAe,EACR,UAAmB,EACnB,QAAkB;QAEzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAS;QACnB,aAAQ,GAAR,QAAQ,CAAU;QAGzB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './manager.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './manager.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Bluehawks CLI - Hooks Manager
3
+ * Central registry for hook handlers
4
+ */
5
+ import type { HookEvent, HookHandler, HookInput, HookOutput, HooksConfig } from './types.js';
6
+ export declare class HooksManager {
7
+ private handlers;
8
+ constructor();
9
+ /**
10
+ * Register a hook handler
11
+ */
12
+ register(handler: HookHandler): void;
13
+ /**
14
+ * Register multiple handlers from config
15
+ */
16
+ registerFromConfig(config: HooksConfig): void;
17
+ /**
18
+ * Unregister a hook handler by ID
19
+ */
20
+ unregister(handlerId: string): boolean;
21
+ /**
22
+ * Execute all handlers for an event
23
+ */
24
+ execute(event: HookEvent, input: HookInput): Promise<HookOutput[]>;
25
+ /**
26
+ * Execute a single handler
27
+ */
28
+ private executeHandler;
29
+ /**
30
+ * Execute a shell command hook
31
+ */
32
+ private executeCommand;
33
+ /**
34
+ * Get all registered handlers
35
+ */
36
+ getHandlers(event?: HookEvent): HookHandler[];
37
+ /**
38
+ * Clear all handlers
39
+ */
40
+ clear(): void;
41
+ }
42
+ export declare const hooksManager: HooksManager;
43
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB,qBAAa,YAAY;IACrB,OAAO,CAAC,QAAQ,CAA4C;;IAkB5D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAMpC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAa7C;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAYtC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAgCxE;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAoDtB;;OAEG;IACH,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,EAAE;IAO7C;;OAEG;IACH,KAAK,IAAI,IAAI;CAKhB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Bluehawks CLI - Hooks Manager
3
+ * Central registry for hook handlers
4
+ */
5
+ import { spawn } from 'node:child_process';
6
+ export class HooksManager {
7
+ handlers = new Map();
8
+ constructor() {
9
+ // Initialize empty handler arrays for each event
10
+ const events = [
11
+ 'SessionStart',
12
+ 'UserPromptSubmit',
13
+ 'PreToolUse',
14
+ 'PostToolUse',
15
+ 'PostToolUseFailure',
16
+ 'Stop',
17
+ 'SessionEnd',
18
+ ];
19
+ for (const event of events) {
20
+ this.handlers.set(event, []);
21
+ }
22
+ }
23
+ /**
24
+ * Register a hook handler
25
+ */
26
+ register(handler) {
27
+ const handlers = this.handlers.get(handler.event) || [];
28
+ handlers.push(handler);
29
+ this.handlers.set(handler.event, handlers);
30
+ }
31
+ /**
32
+ * Register multiple handlers from config
33
+ */
34
+ registerFromConfig(config) {
35
+ for (const [event, handlers] of Object.entries(config)) {
36
+ for (const handler of handlers || []) {
37
+ this.register({
38
+ ...handler,
39
+ event: event,
40
+ id: handler.id || `${event}-${Date.now()}`,
41
+ name: handler.name || handler.command || 'anonymous',
42
+ });
43
+ }
44
+ }
45
+ }
46
+ /**
47
+ * Unregister a hook handler by ID
48
+ */
49
+ unregister(handlerId) {
50
+ for (const [event, handlers] of this.handlers) {
51
+ const index = handlers.findIndex((h) => h.id === handlerId);
52
+ if (index !== -1) {
53
+ handlers.splice(index, 1);
54
+ this.handlers.set(event, handlers);
55
+ return true;
56
+ }
57
+ }
58
+ return false;
59
+ }
60
+ /**
61
+ * Execute all handlers for an event
62
+ */
63
+ async execute(event, input) {
64
+ const handlers = this.handlers.get(event) || [];
65
+ const results = [];
66
+ for (const handler of handlers) {
67
+ // Check matcher if present
68
+ if (handler.matcher && 'toolName' in input) {
69
+ const pattern = typeof handler.matcher === 'string'
70
+ ? new RegExp(handler.matcher)
71
+ : handler.matcher;
72
+ if (!pattern.test(input.toolName)) {
73
+ continue;
74
+ }
75
+ }
76
+ try {
77
+ const result = await this.executeHandler(handler, input);
78
+ if (result) {
79
+ results.push(result);
80
+ // Stop processing if handler blocks
81
+ if (result.block) {
82
+ break;
83
+ }
84
+ }
85
+ }
86
+ catch (error) {
87
+ console.error(`Hook error (${handler.name}):`, error);
88
+ }
89
+ }
90
+ return results;
91
+ }
92
+ /**
93
+ * Execute a single handler
94
+ */
95
+ async executeHandler(handler, input) {
96
+ const timeout = handler.timeout || 30000;
97
+ // If handler has inline function
98
+ if (handler.handler) {
99
+ return Promise.race([
100
+ handler.handler(input),
101
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Hook timeout')), timeout)),
102
+ ]);
103
+ }
104
+ // If handler has command
105
+ if (handler.command) {
106
+ return this.executeCommand(handler.command, input, timeout);
107
+ }
108
+ return undefined;
109
+ }
110
+ /**
111
+ * Execute a shell command hook
112
+ */
113
+ executeCommand(command, input, timeout) {
114
+ return new Promise((resolve, reject) => {
115
+ const proc = spawn('sh', ['-c', command], {
116
+ env: {
117
+ ...process.env,
118
+ HOOK_INPUT: JSON.stringify(input),
119
+ },
120
+ timeout,
121
+ });
122
+ let stdout = '';
123
+ let stderr = '';
124
+ proc.stdout.on('data', (data) => {
125
+ stdout += data.toString();
126
+ });
127
+ proc.stderr.on('data', (data) => {
128
+ stderr += data.toString();
129
+ });
130
+ proc.on('close', (code) => {
131
+ if (code !== 0) {
132
+ // Non-zero exit = block action
133
+ resolve({
134
+ block: true,
135
+ blockReason: stderr || `Hook exited with code ${code}`,
136
+ });
137
+ }
138
+ else {
139
+ // Try to parse JSON output
140
+ try {
141
+ if (stdout.trim()) {
142
+ resolve(JSON.parse(stdout));
143
+ }
144
+ else {
145
+ resolve(undefined);
146
+ }
147
+ }
148
+ catch {
149
+ resolve(undefined);
150
+ }
151
+ }
152
+ });
153
+ proc.on('error', (err) => {
154
+ reject(err);
155
+ });
156
+ });
157
+ }
158
+ /**
159
+ * Get all registered handlers
160
+ */
161
+ getHandlers(event) {
162
+ if (event) {
163
+ return this.handlers.get(event) || [];
164
+ }
165
+ return Array.from(this.handlers.values()).flat();
166
+ }
167
+ /**
168
+ * Clear all handlers
169
+ */
170
+ clear() {
171
+ for (const event of this.handlers.keys()) {
172
+ this.handlers.set(event, []);
173
+ }
174
+ }
175
+ }
176
+ // Singleton instance
177
+ export const hooksManager = new HooksManager();
178
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/hooks/manager.ts"],"names":[],"mappings":"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"}