@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,258 @@
1
+ /**
2
+ * Bluehawks CLI - Plugin Loader
3
+ * Discovers and loads plugins from plugin directories
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 { pathToFileURL } from 'node:url';
9
+ import { toolRegistry } from '../tools/index.js';
10
+ import { hooksManager } from '../hooks/index.js';
11
+ // Plugin directories to search
12
+ const PLUGIN_DIRS = [
13
+ path.join(os.homedir(), '.bluehawks', 'plugins'),
14
+ path.join(process.cwd(), '.bluehawks', 'plugins'),
15
+ ];
16
+ export class PluginLoader {
17
+ plugins = new Map();
18
+ commandHandlers = new Map();
19
+ /**
20
+ * Discover all plugins in plugin directories
21
+ */
22
+ async discover() {
23
+ const discoveries = [];
24
+ for (const pluginDir of PLUGIN_DIRS) {
25
+ try {
26
+ const entries = await fs.readdir(pluginDir, { withFileTypes: true });
27
+ for (const entry of entries) {
28
+ if (!entry.isDirectory())
29
+ continue;
30
+ const pluginPath = path.join(pluginDir, entry.name);
31
+ const manifestPath = path.join(pluginPath, 'plugin.json');
32
+ try {
33
+ const manifestContent = await fs.readFile(manifestPath, 'utf-8');
34
+ const manifest = JSON.parse(manifestContent);
35
+ discoveries.push({ path: pluginPath, manifest });
36
+ }
37
+ catch {
38
+ // No valid manifest, skip
39
+ }
40
+ }
41
+ }
42
+ catch {
43
+ // Directory doesn't exist, skip
44
+ }
45
+ }
46
+ return discoveries;
47
+ }
48
+ /**
49
+ * Load all discovered plugins
50
+ */
51
+ async loadAll() {
52
+ const discoveries = await this.discover();
53
+ for (const discovery of discoveries) {
54
+ try {
55
+ await this.load(discovery);
56
+ }
57
+ catch (error) {
58
+ console.error(`Failed to load plugin ${discovery.manifest.name}:`, error);
59
+ }
60
+ }
61
+ }
62
+ /**
63
+ * Load a single plugin
64
+ */
65
+ async load(discovery) {
66
+ const { manifest, path: pluginPath } = discovery;
67
+ const loaded = {
68
+ manifest,
69
+ path: pluginPath,
70
+ commands: new Map(),
71
+ tools: new Map(),
72
+ hooks: [],
73
+ agents: new Map(),
74
+ };
75
+ // Load commands
76
+ if (manifest.commands) {
77
+ for (const cmd of manifest.commands) {
78
+ const handler = await this.loadCommandHandler(pluginPath, cmd.handler);
79
+ if (handler) {
80
+ loaded.commands.set(cmd.name, handler);
81
+ this.commandHandlers.set(`/${cmd.name}`, handler);
82
+ // Register aliases
83
+ if (cmd.aliases) {
84
+ for (const alias of cmd.aliases) {
85
+ this.commandHandlers.set(`/${alias}`, handler);
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ // Load tools
92
+ if (manifest.tools) {
93
+ for (const tool of manifest.tools) {
94
+ const handler = await this.loadToolHandler(pluginPath, tool.handler);
95
+ if (handler) {
96
+ loaded.tools.set(tool.name, handler);
97
+ this.registerPluginTool(tool.name, tool.description, tool.parameters, handler, tool.safeToAutoRun);
98
+ }
99
+ }
100
+ }
101
+ // Load hooks
102
+ if (manifest.hooks) {
103
+ for (const hook of manifest.hooks) {
104
+ const hookHandler = await this.createHookHandler(pluginPath, hook, manifest.name);
105
+ loaded.hooks.push(hookHandler);
106
+ hooksManager.register(hookHandler);
107
+ }
108
+ }
109
+ // Load agents
110
+ if (manifest.agents) {
111
+ for (const agent of manifest.agents) {
112
+ loaded.agents.set(agent.name, agent);
113
+ }
114
+ }
115
+ this.plugins.set(manifest.name, loaded);
116
+ return loaded;
117
+ }
118
+ /**
119
+ * Load a command handler from file
120
+ */
121
+ async loadCommandHandler(pluginPath, handlerPath) {
122
+ if (!handlerPath)
123
+ return null;
124
+ try {
125
+ const fullPath = path.join(pluginPath, handlerPath);
126
+ const module = await import(pathToFileURL(fullPath).href);
127
+ return module.default || module.handler;
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ /**
134
+ * Load a tool handler from file
135
+ */
136
+ async loadToolHandler(pluginPath, handlerPath) {
137
+ try {
138
+ const fullPath = path.join(pluginPath, handlerPath);
139
+ const module = await import(pathToFileURL(fullPath).href);
140
+ return module.default || module.handler;
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Create a hook handler from plugin config
148
+ */
149
+ async createHookHandler(pluginPath, hook, pluginName) {
150
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
+ const hookHandler = {
152
+ id: `${pluginName}-${hook.event}-${Date.now()}`,
153
+ name: `${pluginName}:${hook.event}`,
154
+ event: hook.event,
155
+ async: hook.async,
156
+ timeout: hook.timeout,
157
+ };
158
+ if (hook.matcher) {
159
+ hookHandler.matcher = new RegExp(hook.matcher);
160
+ }
161
+ if (hook.command) {
162
+ hookHandler.command = hook.command;
163
+ }
164
+ else if (hook.handler) {
165
+ try {
166
+ const fullPath = path.join(pluginPath, hook.handler);
167
+ const module = await import(pathToFileURL(fullPath).href);
168
+ hookHandler.handler = module.default || module.handler;
169
+ }
170
+ catch {
171
+ // Handler load failed
172
+ }
173
+ }
174
+ return hookHandler;
175
+ }
176
+ /**
177
+ * Register a plugin tool with the tool registry
178
+ */
179
+ registerPluginTool(name, description, parameters, handler, safeToAutoRun = false) {
180
+ const definition = {
181
+ type: 'function',
182
+ function: {
183
+ name: `plugin_${name}`,
184
+ description: `[Plugin] ${description}`,
185
+ parameters,
186
+ },
187
+ };
188
+ toolRegistry.register({
189
+ name: `plugin_${name}`,
190
+ definition,
191
+ execute: async (args) => {
192
+ const context = {
193
+ projectPath: process.cwd(),
194
+ sessionId: `session_${Date.now()}`,
195
+ model: process.env.BLUEHAWKS_MODEL || 'unknown',
196
+ };
197
+ return handler(args, context);
198
+ },
199
+ safeToAutoRun,
200
+ });
201
+ }
202
+ /**
203
+ * Execute a plugin command
204
+ */
205
+ async executeCommand(commandName, args, context) {
206
+ const handler = this.commandHandlers.get(commandName);
207
+ if (!handler)
208
+ return null;
209
+ const result = await handler(args, context);
210
+ return result || '';
211
+ }
212
+ /**
213
+ * Check if a command is a plugin command
214
+ */
215
+ hasCommand(commandName) {
216
+ return this.commandHandlers.has(commandName);
217
+ }
218
+ /**
219
+ * Get all loaded plugins
220
+ */
221
+ getPlugins() {
222
+ return Array.from(this.plugins.values());
223
+ }
224
+ /**
225
+ * Get a specific plugin
226
+ */
227
+ getPlugin(name) {
228
+ return this.plugins.get(name);
229
+ }
230
+ /**
231
+ * Get all plugin agents
232
+ */
233
+ getAgents() {
234
+ const allAgents = new Map();
235
+ for (const [name, plugin] of this.plugins) {
236
+ if (plugin.agents.size > 0) {
237
+ allAgents.set(name, plugin.agents);
238
+ }
239
+ }
240
+ return allAgents;
241
+ }
242
+ /**
243
+ * Unload all plugins
244
+ */
245
+ unloadAll() {
246
+ for (const plugin of this.plugins.values()) {
247
+ // Remove hooks
248
+ for (const hook of plugin.hooks) {
249
+ hooksManager.unregister(hook.id);
250
+ }
251
+ }
252
+ this.plugins.clear();
253
+ this.commandHandlers.clear();
254
+ }
255
+ }
256
+ // Singleton instance
257
+ export const pluginLoader = new PluginLoader();
258
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/plugins/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Bluehawks CLI - Plugin Types
3
+ * Type definitions for the plugin system
4
+ */
5
+ import type { ToolDefinition } from '../api/types.js';
6
+ import type { HookHandler } from '../hooks/types.js';
7
+ /**
8
+ * Plugin manifest (plugin.json)
9
+ */
10
+ export interface PluginManifest {
11
+ name: string;
12
+ version: string;
13
+ description?: string;
14
+ author?: string;
15
+ main?: string;
16
+ commands?: PluginCommand[];
17
+ tools?: PluginTool[];
18
+ hooks?: PluginHook[];
19
+ agents?: PluginAgent[];
20
+ }
21
+ /**
22
+ * Custom slash command definition
23
+ */
24
+ export interface PluginCommand {
25
+ name: string;
26
+ description: string;
27
+ aliases?: string[];
28
+ handler?: string;
29
+ }
30
+ /**
31
+ * Custom tool definition
32
+ */
33
+ export interface PluginTool {
34
+ name: string;
35
+ description: string;
36
+ parameters: ToolDefinition['function']['parameters'];
37
+ handler: string;
38
+ safeToAutoRun?: boolean;
39
+ }
40
+ /**
41
+ * Hook configuration
42
+ */
43
+ export interface PluginHook {
44
+ event: string;
45
+ command?: string;
46
+ handler?: string;
47
+ matcher?: string;
48
+ async?: boolean;
49
+ timeout?: number;
50
+ }
51
+ /**
52
+ * Custom agent definition
53
+ */
54
+ export interface PluginAgent {
55
+ name: string;
56
+ description: string;
57
+ systemPrompt: string;
58
+ tools?: string[];
59
+ maxIterations?: number;
60
+ }
61
+ /**
62
+ * Loaded plugin instance
63
+ */
64
+ export interface LoadedPlugin {
65
+ manifest: PluginManifest;
66
+ path: string;
67
+ commands: Map<string, PluginCommandHandler>;
68
+ tools: Map<string, PluginToolHandler>;
69
+ hooks: HookHandler[];
70
+ agents: Map<string, PluginAgent>;
71
+ }
72
+ /**
73
+ * Command handler function
74
+ */
75
+ export type PluginCommandHandler = (args: string[], context: PluginContext) => Promise<string | void>;
76
+ /**
77
+ * Tool handler function
78
+ */
79
+ export type PluginToolHandler = (args: Record<string, unknown>, context: PluginContext) => Promise<string>;
80
+ /**
81
+ * Context passed to plugin handlers
82
+ */
83
+ export interface PluginContext {
84
+ projectPath: string;
85
+ sessionId: string;
86
+ model: string;
87
+ }
88
+ /**
89
+ * Plugin discovery result
90
+ */
91
+ export interface PluginDiscovery {
92
+ path: string;
93
+ manifest: PluginManifest;
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACtC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,aAAa,KACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,aAAa,KACrB,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;CAC5B"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bluehawks CLI - Plugin Types
3
+ * Type definitions for the plugin system
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/plugins/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,3 @@
1
+ export * from './manager.js';
2
+ export * from './storage.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './manager.js';
2
+ export * from './storage.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Bluehawks CLI - Session Manager
3
+ * Manages conversation history and session state
4
+ */
5
+ import type { Message } from '../api/types.js';
6
+ export interface Session {
7
+ id: string;
8
+ startTime: Date;
9
+ messages: Message[];
10
+ metadata: {
11
+ projectPath: string;
12
+ model: string;
13
+ tokensUsed: number;
14
+ toolsUsed: string[];
15
+ };
16
+ }
17
+ export interface SessionStats {
18
+ messageCount: number;
19
+ userMessages: number;
20
+ assistantMessages: number;
21
+ toolMessages: number;
22
+ tokensUsed: number;
23
+ toolsUsed: string[];
24
+ duration: number;
25
+ }
26
+ export declare class SessionManager {
27
+ private session;
28
+ private configDir;
29
+ constructor(projectPath: string, model: string);
30
+ private generateSessionId;
31
+ addMessage(message: Message): void;
32
+ addMessages(messages: Message[]): void;
33
+ addToolUsed(toolName: string): void;
34
+ addTokensUsed(tokens: number): void;
35
+ getMessages(): Message[];
36
+ getStats(): SessionStats;
37
+ clear(): void;
38
+ compressHistory(): void;
39
+ private extractTopics;
40
+ save(name?: string): Promise<string>;
41
+ /**
42
+ * Get a preview of the session (first user message)
43
+ */
44
+ private getPreview;
45
+ /**
46
+ * Load from global session storage (for --continue/--resume)
47
+ */
48
+ loadFromGlobalStorage(sessionIdOrName?: string): Promise<boolean>;
49
+ /**
50
+ * Set a name for the current session
51
+ */
52
+ setSessionName(name: string): void;
53
+ load(sessionId?: string): Promise<boolean>;
54
+ getSessionId(): string;
55
+ getStartTime(): Date;
56
+ }
57
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACL;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAe9C,OAAO,CAAC,iBAAiB;IAIzB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IASlC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAMtC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,WAAW,IAAI,OAAO,EAAE;IAIxB,QAAQ,IAAI,YAAY;IAexB,KAAK,IAAI,IAAI;IAMb,eAAe,IAAI,IAAI;IA4BvB,OAAO,CAAC,aAAa;IAaf,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B1C;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACG,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBvE;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM5B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBhD,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,IAAI;CAGvB"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Bluehawks CLI - Session Manager
3
+ * Manages conversation history and session state
4
+ */
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+ import { CONFIG_DIR_NAME, HISTORY_FILE, MAX_HISTORY_MESSAGES } from '../../config/constants.js';
8
+ export class SessionManager {
9
+ session;
10
+ configDir;
11
+ constructor(projectPath, model) {
12
+ this.configDir = path.join(projectPath, CONFIG_DIR_NAME);
13
+ this.session = {
14
+ id: this.generateSessionId(),
15
+ startTime: new Date(),
16
+ messages: [],
17
+ metadata: {
18
+ projectPath,
19
+ model,
20
+ tokensUsed: 0,
21
+ toolsUsed: [],
22
+ },
23
+ };
24
+ }
25
+ generateSessionId() {
26
+ return `session_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
27
+ }
28
+ addMessage(message) {
29
+ this.session.messages.push(message);
30
+ // Limit history size
31
+ if (this.session.messages.length > MAX_HISTORY_MESSAGES) {
32
+ this.compressHistory();
33
+ }
34
+ }
35
+ addMessages(messages) {
36
+ for (const message of messages) {
37
+ this.addMessage(message);
38
+ }
39
+ }
40
+ addToolUsed(toolName) {
41
+ if (!this.session.metadata.toolsUsed.includes(toolName)) {
42
+ this.session.metadata.toolsUsed.push(toolName);
43
+ }
44
+ }
45
+ addTokensUsed(tokens) {
46
+ this.session.metadata.tokensUsed += tokens;
47
+ }
48
+ getMessages() {
49
+ return [...this.session.messages];
50
+ }
51
+ getStats() {
52
+ const messages = this.session.messages;
53
+ const duration = Date.now() - this.session.startTime.getTime();
54
+ return {
55
+ messageCount: messages.length,
56
+ userMessages: messages.filter((m) => m.role === 'user').length,
57
+ assistantMessages: messages.filter((m) => m.role === 'assistant').length,
58
+ toolMessages: messages.filter((m) => m.role === 'tool').length,
59
+ tokensUsed: this.session.metadata.tokensUsed,
60
+ toolsUsed: [...this.session.metadata.toolsUsed],
61
+ duration,
62
+ };
63
+ }
64
+ clear() {
65
+ this.session.messages = [];
66
+ this.session.metadata.tokensUsed = 0;
67
+ this.session.metadata.toolsUsed = [];
68
+ }
69
+ compressHistory() {
70
+ // Keep system message and recent messages
71
+ const systemMessage = this.session.messages.find((m) => m.role === 'system');
72
+ const recentMessages = this.session.messages.slice(-20);
73
+ // Create a summary of older messages
74
+ const olderMessages = this.session.messages.slice(systemMessage ? 1 : 0, -20);
75
+ if (olderMessages.length > 0) {
76
+ const summaryContent = `[Previous conversation compressed: ${olderMessages.length} messages removed to save context. Key topics discussed included: ${this.extractTopics(olderMessages)}]`;
77
+ const newMessages = [];
78
+ if (systemMessage) {
79
+ newMessages.push(systemMessage);
80
+ }
81
+ newMessages.push({
82
+ role: 'assistant',
83
+ content: summaryContent,
84
+ });
85
+ newMessages.push(...recentMessages);
86
+ this.session.messages = newMessages;
87
+ }
88
+ }
89
+ extractTopics(messages) {
90
+ // Simple topic extraction - just get first few words from user messages
91
+ const userMessages = messages
92
+ .filter((m) => m.role === 'user')
93
+ .map((m) => {
94
+ const content = typeof m.content === 'string' ? m.content : '';
95
+ return content.substring(0, 50).replace(/\n/g, ' ');
96
+ })
97
+ .slice(0, 5);
98
+ return userMessages.join(', ') || 'general coding assistance';
99
+ }
100
+ async save(name) {
101
+ await fs.mkdir(this.configDir, { recursive: true });
102
+ // Save to local project config
103
+ const historyPath = path.join(this.configDir, HISTORY_FILE);
104
+ const data = JSON.stringify(this.session, null, 2);
105
+ await fs.writeFile(historyPath, data, 'utf-8');
106
+ // Also save to global session storage for --continue/--resume
107
+ const { sessionStorage } = await import('./storage.js');
108
+ const preview = this.getPreview();
109
+ await sessionStorage.saveSession(this.session.id, name || null, this.session, {
110
+ projectPath: this.session.metadata.projectPath,
111
+ model: this.session.metadata.model,
112
+ messageCount: this.session.messages.length,
113
+ preview,
114
+ });
115
+ return historyPath;
116
+ }
117
+ /**
118
+ * Get a preview of the session (first user message)
119
+ */
120
+ getPreview() {
121
+ const userMessage = this.session.messages.find(m => m.role === 'user');
122
+ if (userMessage && typeof userMessage.content === 'string') {
123
+ return userMessage.content.substring(0, 100).replace(/\n/g, ' ');
124
+ }
125
+ return '';
126
+ }
127
+ /**
128
+ * Load from global session storage (for --continue/--resume)
129
+ */
130
+ async loadFromGlobalStorage(sessionIdOrName) {
131
+ const { sessionStorage } = await import('./storage.js');
132
+ let sessionData;
133
+ if (sessionIdOrName) {
134
+ sessionData = await sessionStorage.loadSession(sessionIdOrName);
135
+ }
136
+ else {
137
+ const last = await sessionStorage.loadLastSession();
138
+ sessionData = last?.data;
139
+ }
140
+ if (sessionData && typeof sessionData === 'object' && sessionData !== null) {
141
+ const loaded = sessionData;
142
+ this.session = {
143
+ ...loaded,
144
+ startTime: new Date(loaded.startTime),
145
+ };
146
+ return true;
147
+ }
148
+ return false;
149
+ }
150
+ /**
151
+ * Set a name for the current session
152
+ */
153
+ setSessionName(name) {
154
+ // Store the name - will be used when saving
155
+ this.session.name = name;
156
+ }
157
+ async load(sessionId) {
158
+ const historyPath = path.join(this.configDir, HISTORY_FILE);
159
+ try {
160
+ const data = await fs.readFile(historyPath, 'utf-8');
161
+ const loaded = JSON.parse(data);
162
+ if (!sessionId || loaded.id === sessionId) {
163
+ this.session = {
164
+ ...loaded,
165
+ startTime: new Date(loaded.startTime),
166
+ };
167
+ return true;
168
+ }
169
+ }
170
+ catch {
171
+ // No history file or invalid format
172
+ }
173
+ return false;
174
+ }
175
+ getSessionId() {
176
+ return this.session.id;
177
+ }
178
+ getStartTime() {
179
+ return this.session.startTime;
180
+ }
181
+ }
182
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/session/manager.ts"],"names":[],"mappings":"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"}