@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,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Hooks Types
|
|
3
|
+
* Type definitions for the hooks system
|
|
4
|
+
*/
|
|
5
|
+
export type HookEvent = 'SessionStart' | 'UserPromptSubmit' | 'PreToolUse' | 'PostToolUse' | 'PostToolUseFailure' | 'Stop' | 'SessionEnd';
|
|
6
|
+
export interface HookContext {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
projectPath: string;
|
|
9
|
+
model: string;
|
|
10
|
+
timestamp: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionStartInput extends HookContext {
|
|
13
|
+
cwd: string;
|
|
14
|
+
}
|
|
15
|
+
export interface UserPromptSubmitInput extends HookContext {
|
|
16
|
+
prompt: string;
|
|
17
|
+
}
|
|
18
|
+
export interface PreToolUseInput extends HookContext {
|
|
19
|
+
toolName: string;
|
|
20
|
+
toolInput: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface PostToolUseInput extends HookContext {
|
|
23
|
+
toolName: string;
|
|
24
|
+
toolInput: Record<string, unknown>;
|
|
25
|
+
toolOutput: string;
|
|
26
|
+
duration: number;
|
|
27
|
+
}
|
|
28
|
+
export interface PostToolUseFailureInput extends HookContext {
|
|
29
|
+
toolName: string;
|
|
30
|
+
toolInput: Record<string, unknown>;
|
|
31
|
+
error: string;
|
|
32
|
+
}
|
|
33
|
+
export interface StopInput extends HookContext {
|
|
34
|
+
reason: 'completed' | 'cancelled' | 'error';
|
|
35
|
+
messageCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface SessionEndInput extends HookContext {
|
|
38
|
+
duration: number;
|
|
39
|
+
tokensUsed: number;
|
|
40
|
+
}
|
|
41
|
+
export type HookInput = SessionStartInput | UserPromptSubmitInput | PreToolUseInput | PostToolUseInput | PostToolUseFailureInput | StopInput | SessionEndInput;
|
|
42
|
+
export interface HookOutput {
|
|
43
|
+
block?: boolean;
|
|
44
|
+
blockReason?: string;
|
|
45
|
+
modifiedInput?: Record<string, unknown>;
|
|
46
|
+
addContent?: string;
|
|
47
|
+
data?: Record<string, unknown>;
|
|
48
|
+
}
|
|
49
|
+
export interface HookHandler {
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
event: HookEvent;
|
|
53
|
+
command?: string;
|
|
54
|
+
handler?: (input: HookInput) => Promise<HookOutput | void>;
|
|
55
|
+
async?: boolean;
|
|
56
|
+
timeout?: number;
|
|
57
|
+
matcher?: string | RegExp;
|
|
58
|
+
}
|
|
59
|
+
export interface HooksConfig {
|
|
60
|
+
SessionStart?: HookHandler[];
|
|
61
|
+
UserPromptSubmit?: HookHandler[];
|
|
62
|
+
PreToolUse?: HookHandler[];
|
|
63
|
+
PostToolUse?: HookHandler[];
|
|
64
|
+
PostToolUseFailure?: HookHandler[];
|
|
65
|
+
Stop?: HookHandler[];
|
|
66
|
+
SessionEnd?: HookHandler[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GACf,cAAc,GACd,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,oBAAoB,GACpB,MAAM,GACN,YAAY,CAAC;AAEnB,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IAClD,GAAG,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACtD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC1C,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;IAC5C,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,SAAS,GACf,iBAAiB,GACjB,qBAAqB,GACrB,eAAe,GACf,gBAAgB,GAChB,uBAAuB,GACvB,SAAS,GACT,eAAe,CAAC;AAEtB,MAAM,WAAW,UAAU;IAEvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGxC,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,WAAW;IAExB,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,SAAS,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAG3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IACxB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,WAAW,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - MCP Client
|
|
3
|
+
* Model Context Protocol client for connecting to external data sources
|
|
4
|
+
*/
|
|
5
|
+
export interface MCPServerConfig {
|
|
6
|
+
command: string;
|
|
7
|
+
args?: string[];
|
|
8
|
+
env?: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface MCPTool {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: string;
|
|
15
|
+
properties?: Record<string, unknown>;
|
|
16
|
+
required?: string[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface MCPResource {
|
|
20
|
+
uri: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
mimeType?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class MCPClient {
|
|
26
|
+
private serverName;
|
|
27
|
+
private process;
|
|
28
|
+
private requestId;
|
|
29
|
+
private pendingRequests;
|
|
30
|
+
private tools;
|
|
31
|
+
private resources;
|
|
32
|
+
private reader;
|
|
33
|
+
constructor(serverName: string);
|
|
34
|
+
connect(config: MCPServerConfig): Promise<void>;
|
|
35
|
+
private sendRequest;
|
|
36
|
+
private sendNotification;
|
|
37
|
+
listTools(): Promise<MCPTool[]>;
|
|
38
|
+
listResources(): Promise<MCPResource[]>;
|
|
39
|
+
callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
40
|
+
readResource(uri: string): Promise<{
|
|
41
|
+
contents: unknown[];
|
|
42
|
+
}>;
|
|
43
|
+
getTools(): MCPTool[];
|
|
44
|
+
getResources(): MCPResource[];
|
|
45
|
+
getServerName(): string;
|
|
46
|
+
disconnect(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAgBD,qBAAa,SAAS;IAClB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAGlB;IACL,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAmC;gBAErC,UAAU,EAAE,MAAM;IAIxB,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDrD,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,gBAAgB;IAWlB,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAM/B,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAMvC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAQvE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC;IAKjE,QAAQ,IAAI,OAAO,EAAE;IAIrB,YAAY,IAAI,WAAW,EAAE;IAI7B,aAAa,IAAI,MAAM;IAIjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAUpC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - MCP Client
|
|
3
|
+
* Model Context Protocol client for connecting to external data sources
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
import * as readline from 'node:readline';
|
|
7
|
+
export class MCPClient {
|
|
8
|
+
serverName;
|
|
9
|
+
process = null;
|
|
10
|
+
requestId = 0;
|
|
11
|
+
pendingRequests = new Map();
|
|
12
|
+
tools = [];
|
|
13
|
+
resources = [];
|
|
14
|
+
reader = null;
|
|
15
|
+
constructor(serverName) {
|
|
16
|
+
this.serverName = serverName;
|
|
17
|
+
}
|
|
18
|
+
async connect(config) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
this.process = spawn(config.command, config.args || [], {
|
|
21
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
22
|
+
env: { ...process.env, ...config.env },
|
|
23
|
+
});
|
|
24
|
+
if (!this.process.stdout || !this.process.stdin) {
|
|
25
|
+
reject(new Error('Failed to create MCP process'));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.reader = readline.createInterface({
|
|
29
|
+
input: this.process.stdout,
|
|
30
|
+
});
|
|
31
|
+
this.reader.on('line', (line) => {
|
|
32
|
+
try {
|
|
33
|
+
const response = JSON.parse(line);
|
|
34
|
+
const pending = this.pendingRequests.get(response.id);
|
|
35
|
+
if (pending) {
|
|
36
|
+
this.pendingRequests.delete(response.id);
|
|
37
|
+
if (response.error) {
|
|
38
|
+
pending.reject(new Error(response.error.message));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
pending.resolve(response.result);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Ignore non-JSON output
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.process.on('error', (err) => {
|
|
50
|
+
reject(err);
|
|
51
|
+
});
|
|
52
|
+
// Initialize the MCP connection
|
|
53
|
+
this.sendRequest('initialize', {
|
|
54
|
+
protocolVersion: '2024-11-05',
|
|
55
|
+
capabilities: {},
|
|
56
|
+
clientInfo: { name: 'bluehawks-cli', version: '1.0.0' },
|
|
57
|
+
}).then(() => {
|
|
58
|
+
// Send initialized notification
|
|
59
|
+
this.sendNotification('notifications/initialized');
|
|
60
|
+
resolve();
|
|
61
|
+
}).catch(reject);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
sendRequest(method, params) {
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
if (!this.process?.stdin) {
|
|
67
|
+
reject(new Error('MCP process not connected'));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const id = ++this.requestId;
|
|
71
|
+
const request = {
|
|
72
|
+
jsonrpc: '2.0',
|
|
73
|
+
id,
|
|
74
|
+
method,
|
|
75
|
+
params,
|
|
76
|
+
};
|
|
77
|
+
this.pendingRequests.set(id, { resolve, reject });
|
|
78
|
+
this.process.stdin.write(JSON.stringify(request) + '\n');
|
|
79
|
+
// Timeout after 30 seconds
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
if (this.pendingRequests.has(id)) {
|
|
82
|
+
this.pendingRequests.delete(id);
|
|
83
|
+
reject(new Error(`Request ${method} timed out`));
|
|
84
|
+
}
|
|
85
|
+
}, 30000);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
sendNotification(method, params) {
|
|
89
|
+
if (!this.process?.stdin)
|
|
90
|
+
return;
|
|
91
|
+
const notification = {
|
|
92
|
+
jsonrpc: '2.0',
|
|
93
|
+
method,
|
|
94
|
+
params,
|
|
95
|
+
};
|
|
96
|
+
this.process.stdin.write(JSON.stringify(notification) + '\n');
|
|
97
|
+
}
|
|
98
|
+
async listTools() {
|
|
99
|
+
const result = await this.sendRequest('tools/list');
|
|
100
|
+
this.tools = result.tools || [];
|
|
101
|
+
return this.tools;
|
|
102
|
+
}
|
|
103
|
+
async listResources() {
|
|
104
|
+
const result = await this.sendRequest('resources/list');
|
|
105
|
+
this.resources = result.resources || [];
|
|
106
|
+
return this.resources;
|
|
107
|
+
}
|
|
108
|
+
async callTool(name, args) {
|
|
109
|
+
const result = await this.sendRequest('tools/call', {
|
|
110
|
+
name,
|
|
111
|
+
arguments: args,
|
|
112
|
+
});
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
async readResource(uri) {
|
|
116
|
+
const result = await this.sendRequest('resources/read', { uri });
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
getTools() {
|
|
120
|
+
return this.tools;
|
|
121
|
+
}
|
|
122
|
+
getResources() {
|
|
123
|
+
return this.resources;
|
|
124
|
+
}
|
|
125
|
+
getServerName() {
|
|
126
|
+
return this.serverName;
|
|
127
|
+
}
|
|
128
|
+
async disconnect() {
|
|
129
|
+
if (this.reader) {
|
|
130
|
+
this.reader.close();
|
|
131
|
+
}
|
|
132
|
+
if (this.process) {
|
|
133
|
+
this.process.kill();
|
|
134
|
+
this.process = null;
|
|
135
|
+
}
|
|
136
|
+
this.pendingRequests.clear();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - MCP Manager
|
|
3
|
+
* Manages MCP server connections and integrates tools
|
|
4
|
+
*/
|
|
5
|
+
import { MCPClient, type MCPServerConfig } from './client.js';
|
|
6
|
+
export interface MCPConfig {
|
|
7
|
+
mcpServers?: Record<string, MCPServerConfig>;
|
|
8
|
+
}
|
|
9
|
+
export declare class MCPManager {
|
|
10
|
+
private clients;
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Load MCP configuration from file
|
|
14
|
+
*/
|
|
15
|
+
loadConfig(): Promise<MCPConfig | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Connect to all configured MCP servers
|
|
18
|
+
*/
|
|
19
|
+
connectAll(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Connect to a specific MCP server
|
|
22
|
+
*/
|
|
23
|
+
connect(name: string, config: MCPServerConfig): Promise<MCPClient>;
|
|
24
|
+
/**
|
|
25
|
+
* Register an MCP tool as a Bluehawks tool
|
|
26
|
+
*/
|
|
27
|
+
private registerMCPTool;
|
|
28
|
+
/**
|
|
29
|
+
* Get all connected clients
|
|
30
|
+
*/
|
|
31
|
+
getClients(): Map<string, MCPClient>;
|
|
32
|
+
/**
|
|
33
|
+
* Get a specific client
|
|
34
|
+
*/
|
|
35
|
+
getClient(name: string): MCPClient | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Disconnect all MCP servers
|
|
38
|
+
*/
|
|
39
|
+
disconnectAll(): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect a specific server
|
|
42
|
+
*/
|
|
43
|
+
disconnect(name: string): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
export declare const mcpManager: MCPManager;
|
|
46
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAgB,MAAM,aAAa,CAAC;AAI5E,MAAM,WAAW,SAAS;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAChD;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,OAAO,CAAqC;;IAMpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAiB7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAcxE;;OAEG;IACH,OAAO,CAAC,eAAe;IAkCvB;;OAEG;IACH,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAIpC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI9C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOhD;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - MCP Manager
|
|
3
|
+
* Manages MCP server connections and integrates tools
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'node:fs/promises';
|
|
6
|
+
import * as path from 'node:path';
|
|
7
|
+
import * as os from 'node:os';
|
|
8
|
+
import { MCPClient } from './client.js';
|
|
9
|
+
import { toolRegistry } from '../tools/index.js';
|
|
10
|
+
export class MCPManager {
|
|
11
|
+
clients = new Map();
|
|
12
|
+
constructor() {
|
|
13
|
+
// Manager initialized - config will be loaded on connectAll
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Load MCP configuration from file
|
|
17
|
+
*/
|
|
18
|
+
async loadConfig() {
|
|
19
|
+
const paths = [
|
|
20
|
+
path.join(process.cwd(), '.mcp.json'),
|
|
21
|
+
path.join(os.homedir(), '.bluehawks', '.mcp.json'),
|
|
22
|
+
];
|
|
23
|
+
for (const configPath of paths) {
|
|
24
|
+
try {
|
|
25
|
+
const content = await fs.readFile(configPath, 'utf-8');
|
|
26
|
+
return JSON.parse(content);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Connect to all configured MCP servers
|
|
36
|
+
*/
|
|
37
|
+
async connectAll() {
|
|
38
|
+
const config = await this.loadConfig();
|
|
39
|
+
if (!config?.mcpServers) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
|
|
43
|
+
try {
|
|
44
|
+
await this.connect(name, serverConfig);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(`Failed to connect to MCP server ${name}:`, error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Connect to a specific MCP server
|
|
53
|
+
*/
|
|
54
|
+
async connect(name, config) {
|
|
55
|
+
const client = new MCPClient(name);
|
|
56
|
+
await client.connect(config);
|
|
57
|
+
// List and register tools
|
|
58
|
+
const tools = await client.listTools();
|
|
59
|
+
for (const tool of tools) {
|
|
60
|
+
this.registerMCPTool(name, tool);
|
|
61
|
+
}
|
|
62
|
+
this.clients.set(name, client);
|
|
63
|
+
return client;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Register an MCP tool as a Bluehawks tool
|
|
67
|
+
*/
|
|
68
|
+
registerMCPTool(serverName, mcpTool) {
|
|
69
|
+
const toolName = `mcp_${serverName}_${mcpTool.name}`;
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
+
const definition = {
|
|
72
|
+
type: 'function',
|
|
73
|
+
function: {
|
|
74
|
+
name: toolName,
|
|
75
|
+
description: `[MCP:${serverName}] ${mcpTool.description}`,
|
|
76
|
+
parameters: mcpTool.inputSchema,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const clients = this.clients;
|
|
80
|
+
toolRegistry.register({
|
|
81
|
+
name: toolName,
|
|
82
|
+
definition,
|
|
83
|
+
execute: async (args) => {
|
|
84
|
+
const client = clients.get(serverName);
|
|
85
|
+
if (!client) {
|
|
86
|
+
return `MCP server ${serverName} not connected`;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const result = await client.callTool(mcpTool.name, args);
|
|
90
|
+
return typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return `MCP tool error: ${error instanceof Error ? error.message : String(error)}`;
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
safeToAutoRun: false, // MCP tools require approval by default
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get all connected clients
|
|
101
|
+
*/
|
|
102
|
+
getClients() {
|
|
103
|
+
return this.clients;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get a specific client
|
|
107
|
+
*/
|
|
108
|
+
getClient(name) {
|
|
109
|
+
return this.clients.get(name);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Disconnect all MCP servers
|
|
113
|
+
*/
|
|
114
|
+
async disconnectAll() {
|
|
115
|
+
for (const client of this.clients.values()) {
|
|
116
|
+
await client.disconnect();
|
|
117
|
+
}
|
|
118
|
+
this.clients.clear();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Disconnect a specific server
|
|
122
|
+
*/
|
|
123
|
+
async disconnect(name) {
|
|
124
|
+
const client = this.clients.get(name);
|
|
125
|
+
if (client) {
|
|
126
|
+
await client.disconnect();
|
|
127
|
+
this.clients.delete(name);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Singleton instance
|
|
132
|
+
export const mcpManager = new MCPManager();
|
|
133
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/mcp/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/plugins/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bluehawks CLI - Plugin Loader
|
|
3
|
+
* Discovers and loads plugins from plugin directories
|
|
4
|
+
*/
|
|
5
|
+
import type { LoadedPlugin, PluginDiscovery, PluginContext } from './types.js';
|
|
6
|
+
export declare class PluginLoader {
|
|
7
|
+
private plugins;
|
|
8
|
+
private commandHandlers;
|
|
9
|
+
/**
|
|
10
|
+
* Discover all plugins in plugin directories
|
|
11
|
+
*/
|
|
12
|
+
discover(): Promise<PluginDiscovery[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Load all discovered plugins
|
|
15
|
+
*/
|
|
16
|
+
loadAll(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Load a single plugin
|
|
19
|
+
*/
|
|
20
|
+
load(discovery: PluginDiscovery): Promise<LoadedPlugin>;
|
|
21
|
+
/**
|
|
22
|
+
* Load a command handler from file
|
|
23
|
+
*/
|
|
24
|
+
private loadCommandHandler;
|
|
25
|
+
/**
|
|
26
|
+
* Load a tool handler from file
|
|
27
|
+
*/
|
|
28
|
+
private loadToolHandler;
|
|
29
|
+
/**
|
|
30
|
+
* Create a hook handler from plugin config
|
|
31
|
+
*/
|
|
32
|
+
private createHookHandler;
|
|
33
|
+
/**
|
|
34
|
+
* Register a plugin tool with the tool registry
|
|
35
|
+
*/
|
|
36
|
+
private registerPluginTool;
|
|
37
|
+
/**
|
|
38
|
+
* Execute a plugin command
|
|
39
|
+
*/
|
|
40
|
+
executeCommand(commandName: string, args: string[], context: PluginContext): Promise<string | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Check if a command is a plugin command
|
|
43
|
+
*/
|
|
44
|
+
hasCommand(commandName: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get all loaded plugins
|
|
47
|
+
*/
|
|
48
|
+
getPlugins(): LoadedPlugin[];
|
|
49
|
+
/**
|
|
50
|
+
* Get a specific plugin
|
|
51
|
+
*/
|
|
52
|
+
getPlugin(name: string): LoadedPlugin | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Get all plugin agents
|
|
55
|
+
*/
|
|
56
|
+
getAgents(): Map<string, LoadedPlugin['agents']>;
|
|
57
|
+
/**
|
|
58
|
+
* Unload all plugins
|
|
59
|
+
*/
|
|
60
|
+
unloadAll(): void;
|
|
61
|
+
}
|
|
62
|
+
export declare const pluginLoader: PluginLoader;
|
|
63
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAER,YAAY,EACZ,eAAe,EAGf,aAAa,EAChB,MAAM,YAAY,CAAC;AAWpB,qBAAa,YAAY;IACrB,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,eAAe,CAAgD;IAEvE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IA6B5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IA6D7D;;OAEG;YACW,kBAAkB;IAehC;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,iBAAiB;IAiC/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACG,cAAc,CAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQzB;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD;;OAEG;IACH,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAUhD;;OAEG;IACH,SAAS,IAAI,IAAI;CAUpB;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|