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 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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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
+ }