hawkeye-mcp-server 2.0.13 → 2.1.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/build/index.js +6 -2
- package/build/index.js.map +1 -1
- package/build/services/investigation-progress-store.d.ts +79 -0
- package/build/services/investigation-progress-store.js +193 -0
- package/build/services/investigation-progress-store.js.map +1 -0
- package/build/services/investigation-stream.d.ts +43 -0
- package/build/services/investigation-stream.js +326 -0
- package/build/services/investigation-stream.js.map +1 -0
- package/build/tools/create-manual-investigation.d.ts +0 -6
- package/build/tools/create-manual-investigation.js +35 -66
- package/build/tools/create-manual-investigation.js.map +1 -1
- package/build/tools/get-status.js +120 -47
- package/build/tools/get-status.js.map +1 -1
- package/build/tools/index.d.ts +1 -0
- package/build/tools/index.js +3 -13
- package/build/tools/index.js.map +1 -1
- package/build/tools/inspect-session.js +20 -4
- package/build/tools/inspect-session.js.map +1 -1
- package/build/types/mcp.d.ts +17 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -22,7 +22,7 @@ import { getToolDefinitions } from './tools/index.js';
|
|
|
22
22
|
/**
|
|
23
23
|
* Initialize services
|
|
24
24
|
*/
|
|
25
|
-
function initializeServices() {
|
|
25
|
+
async function initializeServices() {
|
|
26
26
|
const config = getConfig();
|
|
27
27
|
const httpClient = new HttpClient(config.baseUrl);
|
|
28
28
|
const authService = new AuthenticationService(httpClient);
|
|
@@ -30,6 +30,8 @@ function initializeServices() {
|
|
|
30
30
|
const sessionService = new SessionService(httpClient, authService);
|
|
31
31
|
const connectionService = new ConnectionService(httpClient, authService);
|
|
32
32
|
const guidanceService = new GuidanceService();
|
|
33
|
+
const { InvestigationStreamService } = await import('./services/investigation-stream.js');
|
|
34
|
+
const investigationStreamService = new InvestigationStreamService(httpClient);
|
|
33
35
|
return {
|
|
34
36
|
httpClient,
|
|
35
37
|
authService,
|
|
@@ -37,6 +39,7 @@ function initializeServices() {
|
|
|
37
39
|
sessionService,
|
|
38
40
|
connectionService,
|
|
39
41
|
guidanceService,
|
|
42
|
+
investigationStreamService,
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
/**
|
|
@@ -45,7 +48,7 @@ function initializeServices() {
|
|
|
45
48
|
async function main() {
|
|
46
49
|
try {
|
|
47
50
|
const config = getConfig();
|
|
48
|
-
const services = initializeServices();
|
|
51
|
+
const services = await initializeServices();
|
|
49
52
|
// Create MCP server
|
|
50
53
|
const server = new Server({
|
|
51
54
|
name: config.serverName,
|
|
@@ -96,6 +99,7 @@ async function main() {
|
|
|
96
99
|
sessionService: services.sessionService,
|
|
97
100
|
connectionService: services.connectionService,
|
|
98
101
|
guidanceService: services.guidanceService,
|
|
102
|
+
investigationStreamService: services.investigationStreamService,
|
|
99
103
|
};
|
|
100
104
|
const result = await handler(toolServices, toolArgs);
|
|
101
105
|
// Return the result
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAE5C,8BAA8B;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,WAAW;AACX,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAqB,MAAM,kBAAkB,CAAC;AAEzE;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory store for tracking investigation progress
|
|
3
|
+
* Shared across all tools - no worker threads needed!
|
|
4
|
+
*/
|
|
5
|
+
export interface InvestigationProgress {
|
|
6
|
+
session_uuid: string;
|
|
7
|
+
prompt_cycle_id?: string;
|
|
8
|
+
status: 'in_progress' | 'completed' | 'failed' | 'unknown';
|
|
9
|
+
progress_percentage?: number;
|
|
10
|
+
current_step?: string;
|
|
11
|
+
current_step_id?: string;
|
|
12
|
+
steps_completed: Array<{
|
|
13
|
+
step_id?: string;
|
|
14
|
+
step_number: number;
|
|
15
|
+
description: string;
|
|
16
|
+
explanation?: string;
|
|
17
|
+
category: string;
|
|
18
|
+
status: string;
|
|
19
|
+
sources_consulted: string[];
|
|
20
|
+
timestamp: string;
|
|
21
|
+
}>;
|
|
22
|
+
sources_discovered: string[];
|
|
23
|
+
created_at: string;
|
|
24
|
+
last_updated: string;
|
|
25
|
+
streaming_active: boolean;
|
|
26
|
+
}
|
|
27
|
+
declare class InvestigationProgressStore {
|
|
28
|
+
private store;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize a new investigation session
|
|
31
|
+
*/
|
|
32
|
+
initSession(sessionUuid: string, promptCycleId?: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Update progress for a session
|
|
35
|
+
*/
|
|
36
|
+
updateProgress(sessionUuid: string, updates: Partial<Omit<InvestigationProgress, 'session_uuid' | 'created_at'>>): void;
|
|
37
|
+
/**
|
|
38
|
+
* Add a completed step
|
|
39
|
+
*/
|
|
40
|
+
addStep(sessionUuid: string, step: Omit<InvestigationProgress['steps_completed'][0], 'timestamp'>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Add discovered sources (deduplicates automatically)
|
|
43
|
+
*/
|
|
44
|
+
addSources(sessionUuid: string, sources: string[]): void;
|
|
45
|
+
/**
|
|
46
|
+
* Update or add a step by ID (for chain of thought updates)
|
|
47
|
+
*/
|
|
48
|
+
updateStepById(sessionUuid: string, stepId: string, updates: Partial<Omit<InvestigationProgress['steps_completed'][0], 'step_id' | 'timestamp'>>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Get progress for a session
|
|
51
|
+
*/
|
|
52
|
+
getProgress(sessionUuid: string): InvestigationProgress | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Check if we're actively streaming for this session
|
|
55
|
+
*/
|
|
56
|
+
isStreaming(sessionUuid: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Mark streaming as active/inactive
|
|
59
|
+
*/
|
|
60
|
+
setStreaming(sessionUuid: string, active: boolean): void;
|
|
61
|
+
/**
|
|
62
|
+
* Mark session as complete
|
|
63
|
+
*/
|
|
64
|
+
completeSession(sessionUuid: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Clean up old sessions (older than 1 hour)
|
|
67
|
+
*/
|
|
68
|
+
cleanup(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get all active sessions (for debugging)
|
|
71
|
+
*/
|
|
72
|
+
getActiveSessions(): string[];
|
|
73
|
+
/**
|
|
74
|
+
* Clear all (for testing)
|
|
75
|
+
*/
|
|
76
|
+
clear(): void;
|
|
77
|
+
}
|
|
78
|
+
export declare const investigationProgressStore: InvestigationProgressStore;
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory store for tracking investigation progress
|
|
3
|
+
* Shared across all tools - no worker threads needed!
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
class InvestigationProgressStore {
|
|
7
|
+
store = new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Initialize a new investigation session
|
|
10
|
+
*/
|
|
11
|
+
initSession(sessionUuid, promptCycleId) {
|
|
12
|
+
const now = new Date().toISOString();
|
|
13
|
+
this.store.set(sessionUuid, {
|
|
14
|
+
session_uuid: sessionUuid,
|
|
15
|
+
prompt_cycle_id: promptCycleId,
|
|
16
|
+
status: 'in_progress',
|
|
17
|
+
progress_percentage: 0,
|
|
18
|
+
current_step: 'Starting investigation...',
|
|
19
|
+
steps_completed: [],
|
|
20
|
+
sources_discovered: [],
|
|
21
|
+
created_at: now,
|
|
22
|
+
last_updated: now,
|
|
23
|
+
streaming_active: false,
|
|
24
|
+
});
|
|
25
|
+
logger.debug(`Initialized progress tracking for session ${sessionUuid}`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Update progress for a session
|
|
29
|
+
*/
|
|
30
|
+
updateProgress(sessionUuid, updates) {
|
|
31
|
+
const existing = this.store.get(sessionUuid);
|
|
32
|
+
if (!existing) {
|
|
33
|
+
logger.warn(`Attempted to update non-existent session ${sessionUuid}`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.store.set(sessionUuid, {
|
|
37
|
+
...existing,
|
|
38
|
+
...updates,
|
|
39
|
+
last_updated: new Date().toISOString(),
|
|
40
|
+
});
|
|
41
|
+
logger.debug(`Updated progress for session ${sessionUuid}`, {
|
|
42
|
+
status: updates.status,
|
|
43
|
+
progress: updates.progress_percentage,
|
|
44
|
+
step: updates.current_step,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Add a completed step
|
|
49
|
+
*/
|
|
50
|
+
addStep(sessionUuid, step) {
|
|
51
|
+
const existing = this.store.get(sessionUuid);
|
|
52
|
+
if (!existing) {
|
|
53
|
+
logger.warn(`Attempted to add step to non-existent session ${sessionUuid}`);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
existing.steps_completed.push({
|
|
57
|
+
...step,
|
|
58
|
+
timestamp: new Date().toISOString(),
|
|
59
|
+
});
|
|
60
|
+
this.store.set(sessionUuid, {
|
|
61
|
+
...existing,
|
|
62
|
+
last_updated: new Date().toISOString(),
|
|
63
|
+
});
|
|
64
|
+
logger.debug(`Added step ${step.step_number} to session ${sessionUuid}: ${step.description}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Add discovered sources (deduplicates automatically)
|
|
68
|
+
*/
|
|
69
|
+
addSources(sessionUuid, sources) {
|
|
70
|
+
const existing = this.store.get(sessionUuid);
|
|
71
|
+
if (!existing) {
|
|
72
|
+
logger.warn(`Attempted to add sources to non-existent session ${sessionUuid}`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Add to set to deduplicate
|
|
76
|
+
const sourcesSet = new Set([...existing.sources_discovered, ...sources]);
|
|
77
|
+
existing.sources_discovered = Array.from(sourcesSet);
|
|
78
|
+
this.store.set(sessionUuid, {
|
|
79
|
+
...existing,
|
|
80
|
+
last_updated: new Date().toISOString(),
|
|
81
|
+
});
|
|
82
|
+
logger.debug(`Added ${sources.length} sources to session ${sessionUuid} (total: ${existing.sources_discovered.length})`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Update or add a step by ID (for chain of thought updates)
|
|
86
|
+
*/
|
|
87
|
+
updateStepById(sessionUuid, stepId, updates) {
|
|
88
|
+
const existing = this.store.get(sessionUuid);
|
|
89
|
+
if (!existing) {
|
|
90
|
+
logger.warn(`Attempted to update step in non-existent session ${sessionUuid}`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Find existing step with this ID
|
|
94
|
+
const stepIndex = existing.steps_completed.findIndex(s => s.step_id === stepId);
|
|
95
|
+
if (stepIndex >= 0) {
|
|
96
|
+
// Update existing step
|
|
97
|
+
existing.steps_completed[stepIndex] = {
|
|
98
|
+
...existing.steps_completed[stepIndex],
|
|
99
|
+
...updates,
|
|
100
|
+
timestamp: new Date().toISOString(),
|
|
101
|
+
};
|
|
102
|
+
logger.debug(`Updated step ${stepId} in session ${sessionUuid}`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Create new step
|
|
106
|
+
const stepNumber = existing.steps_completed.length + 1;
|
|
107
|
+
existing.steps_completed.push({
|
|
108
|
+
step_id: stepId,
|
|
109
|
+
step_number: stepNumber,
|
|
110
|
+
description: updates.description || 'Investigation step',
|
|
111
|
+
category: updates.category || 'analysis',
|
|
112
|
+
status: updates.status || 'in_progress',
|
|
113
|
+
sources_consulted: updates.sources_consulted || [],
|
|
114
|
+
timestamp: new Date().toISOString(),
|
|
115
|
+
});
|
|
116
|
+
logger.debug(`Created new step ${stepId} (#${stepNumber}) in session ${sessionUuid}`);
|
|
117
|
+
}
|
|
118
|
+
this.store.set(sessionUuid, {
|
|
119
|
+
...existing,
|
|
120
|
+
last_updated: new Date().toISOString(),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get progress for a session
|
|
125
|
+
*/
|
|
126
|
+
getProgress(sessionUuid) {
|
|
127
|
+
return this.store.get(sessionUuid);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if we're actively streaming for this session
|
|
131
|
+
*/
|
|
132
|
+
isStreaming(sessionUuid) {
|
|
133
|
+
return this.store.get(sessionUuid)?.streaming_active ?? false;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Mark streaming as active/inactive
|
|
137
|
+
*/
|
|
138
|
+
setStreaming(sessionUuid, active) {
|
|
139
|
+
const existing = this.store.get(sessionUuid);
|
|
140
|
+
if (existing) {
|
|
141
|
+
existing.streaming_active = active;
|
|
142
|
+
this.store.set(sessionUuid, existing);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Mark session as complete
|
|
147
|
+
*/
|
|
148
|
+
completeSession(sessionUuid) {
|
|
149
|
+
this.updateProgress(sessionUuid, {
|
|
150
|
+
status: 'completed',
|
|
151
|
+
progress_percentage: 100,
|
|
152
|
+
current_step: 'Investigation complete',
|
|
153
|
+
streaming_active: false,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Clean up old sessions (older than 1 hour)
|
|
158
|
+
*/
|
|
159
|
+
cleanup() {
|
|
160
|
+
const oneHourAgo = Date.now() - 60 * 60 * 1000;
|
|
161
|
+
let removed = 0;
|
|
162
|
+
for (const [uuid, progress] of this.store.entries()) {
|
|
163
|
+
const lastUpdated = new Date(progress.last_updated).getTime();
|
|
164
|
+
if (lastUpdated < oneHourAgo) {
|
|
165
|
+
this.store.delete(uuid);
|
|
166
|
+
removed++;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (removed > 0) {
|
|
170
|
+
logger.info(`Cleaned up ${removed} old investigation progress entries`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get all active sessions (for debugging)
|
|
175
|
+
*/
|
|
176
|
+
getActiveSessions() {
|
|
177
|
+
return Array.from(this.store.keys());
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Clear all (for testing)
|
|
181
|
+
*/
|
|
182
|
+
clear() {
|
|
183
|
+
this.store.clear();
|
|
184
|
+
logger.debug('Cleared all investigation progress');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Singleton instance
|
|
188
|
+
export const investigationProgressStore = new InvestigationProgressStore();
|
|
189
|
+
// Cleanup old sessions every 10 minutes
|
|
190
|
+
setInterval(() => {
|
|
191
|
+
investigationProgressStore.cleanup();
|
|
192
|
+
}, 10 * 60 * 1000);
|
|
193
|
+
//# sourceMappingURL=investigation-progress-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigation-progress-store.js","sourceRoot":"","sources":["../../src/services/investigation-progress-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service for consuming investigation progress streams
|
|
3
|
+
* Runs in background and updates the progress store
|
|
4
|
+
*/
|
|
5
|
+
import { HttpClient } from '../utils/http-client.js';
|
|
6
|
+
export declare class InvestigationStreamService {
|
|
7
|
+
private httpClient;
|
|
8
|
+
private activeStreams;
|
|
9
|
+
constructor(httpClient: HttpClient);
|
|
10
|
+
/**
|
|
11
|
+
* Start streaming progress updates for a session
|
|
12
|
+
* Returns immediately while stream runs in background
|
|
13
|
+
*/
|
|
14
|
+
startStreaming(sessionUuid: string, promptCycleId: string, projectUuid: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Stop streaming for a session
|
|
17
|
+
*/
|
|
18
|
+
stopStreaming(sessionUuid: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Consume the SSE stream and update progress store
|
|
21
|
+
*/
|
|
22
|
+
private consumeStream;
|
|
23
|
+
/**
|
|
24
|
+
* Process a single stream event
|
|
25
|
+
*/
|
|
26
|
+
private processStreamEvent;
|
|
27
|
+
/**
|
|
28
|
+
* Humanize category names
|
|
29
|
+
*/
|
|
30
|
+
private humanizeCategory;
|
|
31
|
+
/**
|
|
32
|
+
* Check if actively streaming
|
|
33
|
+
*/
|
|
34
|
+
isStreaming(sessionUuid: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Get active stream count (for debugging)
|
|
37
|
+
*/
|
|
38
|
+
getActiveStreamCount(): number;
|
|
39
|
+
/**
|
|
40
|
+
* Stop all streams (cleanup on shutdown)
|
|
41
|
+
*/
|
|
42
|
+
stopAll(): void;
|
|
43
|
+
}
|