resolve-solo 0.2.0 → 0.4.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/README.md +197 -47
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +214 -137
- package/dist/cli.js.map +1 -1
- package/dist/database.d.ts +46 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +185 -0
- package/dist/database.js.map +1 -0
- package/dist/handlers.d.ts +55 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +366 -0
- package/dist/handlers.js.map +1 -0
- package/dist/mcp/tools.d.ts +16 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +105 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp-cli.d.ts +9 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +9 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/mcp-server.d.ts +9 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +154 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +11 -0
- package/dist/parser.js.map +1 -1
- package/dist/repl.d.ts +11 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +375 -0
- package/dist/repl.js.map +1 -0
- package/dist/setup.d.ts +25 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +108 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -3
package/dist/database.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database module for session persistence
|
|
3
|
+
*
|
|
4
|
+
* Uses SQLite to store:
|
|
5
|
+
* - Investigation sessions
|
|
6
|
+
* - Session timeline items
|
|
7
|
+
* - Session notes
|
|
8
|
+
* - Closed incidents for recall
|
|
9
|
+
*/
|
|
10
|
+
import Database from 'better-sqlite3';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
// Use test database path if running tests
|
|
14
|
+
const DB_DIR = process.env.NODE_ENV === 'test'
|
|
15
|
+
? path.join(process.cwd(), '.resolveai-test')
|
|
16
|
+
: path.join(process.cwd(), '.resolveai');
|
|
17
|
+
const DB_PATH = path.join(DB_DIR, 'memory.sqlite');
|
|
18
|
+
/**
|
|
19
|
+
* Get or create database connection
|
|
20
|
+
*/
|
|
21
|
+
export function getDatabase() {
|
|
22
|
+
// Ensure directory exists
|
|
23
|
+
if (!fs.existsSync(DB_DIR)) {
|
|
24
|
+
fs.mkdirSync(DB_DIR, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
const db = new Database(DB_PATH);
|
|
27
|
+
// Initialize schema if needed
|
|
28
|
+
initializeSchema(db);
|
|
29
|
+
return db;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Initialize database schema
|
|
33
|
+
*/
|
|
34
|
+
function initializeSchema(db) {
|
|
35
|
+
// Sessions table
|
|
36
|
+
db.exec(`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
query TEXT NOT NULL,
|
|
40
|
+
mode TEXT NOT NULL,
|
|
41
|
+
created_at TEXT NOT NULL,
|
|
42
|
+
closed_at TEXT,
|
|
43
|
+
resolution TEXT,
|
|
44
|
+
time_saved_minutes INTEGER
|
|
45
|
+
)
|
|
46
|
+
`);
|
|
47
|
+
// Session timeline items
|
|
48
|
+
db.exec(`
|
|
49
|
+
CREATE TABLE IF NOT EXISTS session_timeline (
|
|
50
|
+
session_id TEXT NOT NULL,
|
|
51
|
+
item_id TEXT NOT NULL,
|
|
52
|
+
item_index INTEGER NOT NULL,
|
|
53
|
+
item_data TEXT NOT NULL,
|
|
54
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
55
|
+
)
|
|
56
|
+
`);
|
|
57
|
+
// Session notes
|
|
58
|
+
db.exec(`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS session_notes (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
session_id TEXT NOT NULL,
|
|
62
|
+
timestamp TEXT NOT NULL,
|
|
63
|
+
note TEXT NOT NULL,
|
|
64
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
65
|
+
)
|
|
66
|
+
`);
|
|
67
|
+
// Closed incidents for recall
|
|
68
|
+
db.exec(`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS incidents (
|
|
70
|
+
id TEXT PRIMARY KEY,
|
|
71
|
+
query TEXT NOT NULL,
|
|
72
|
+
resolution TEXT NOT NULL,
|
|
73
|
+
time_saved_minutes INTEGER,
|
|
74
|
+
created_at TEXT NOT NULL,
|
|
75
|
+
closed_at TEXT NOT NULL,
|
|
76
|
+
timeline_summary TEXT
|
|
77
|
+
)
|
|
78
|
+
`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Save investigation session
|
|
82
|
+
*/
|
|
83
|
+
export function saveSession(result) {
|
|
84
|
+
const db = getDatabase();
|
|
85
|
+
// Insert session
|
|
86
|
+
const insertSession = db.prepare(`
|
|
87
|
+
INSERT OR REPLACE INTO sessions (id, query, mode, created_at)
|
|
88
|
+
VALUES (?, ?, ?, ?)
|
|
89
|
+
`);
|
|
90
|
+
insertSession.run(result.sessionId, result.query, result.mode, new Date().toISOString());
|
|
91
|
+
// Insert timeline items
|
|
92
|
+
const insertItem = db.prepare(`
|
|
93
|
+
INSERT OR REPLACE INTO session_timeline (session_id, item_id, item_index, item_data)
|
|
94
|
+
VALUES (?, ?, ?, ?)
|
|
95
|
+
`);
|
|
96
|
+
for (let i = 0; i < result.timeline.length; i++) {
|
|
97
|
+
const item = result.timeline[i];
|
|
98
|
+
insertItem.run(result.sessionId, item.id, i + 1, // 1-indexed for user display
|
|
99
|
+
JSON.stringify(item));
|
|
100
|
+
}
|
|
101
|
+
db.close();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get active session (most recent unclosed session)
|
|
105
|
+
*/
|
|
106
|
+
export function getActiveSession() {
|
|
107
|
+
const db = getDatabase();
|
|
108
|
+
const session = db
|
|
109
|
+
.prepare('SELECT id, query FROM sessions WHERE closed_at IS NULL ORDER BY created_at DESC LIMIT 1')
|
|
110
|
+
.get();
|
|
111
|
+
db.close();
|
|
112
|
+
if (!session)
|
|
113
|
+
return null;
|
|
114
|
+
return { sessionId: session.id, query: session.query };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get timeline item by index for active session
|
|
118
|
+
*/
|
|
119
|
+
export function getTimelineItem(sessionId, itemIndex) {
|
|
120
|
+
const db = getDatabase();
|
|
121
|
+
const row = db
|
|
122
|
+
.prepare('SELECT item_data FROM session_timeline WHERE session_id = ? AND item_index = ?')
|
|
123
|
+
.get(sessionId, itemIndex);
|
|
124
|
+
db.close();
|
|
125
|
+
if (!row)
|
|
126
|
+
return null;
|
|
127
|
+
return JSON.parse(row.item_data);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Add note to session
|
|
131
|
+
*/
|
|
132
|
+
export function addNote(sessionId, note) {
|
|
133
|
+
const db = getDatabase();
|
|
134
|
+
db.prepare(`
|
|
135
|
+
INSERT INTO session_notes (session_id, timestamp, note)
|
|
136
|
+
VALUES (?, ?, ?)
|
|
137
|
+
`).run(sessionId, new Date().toISOString(), note);
|
|
138
|
+
db.close();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get all notes for a session
|
|
142
|
+
*/
|
|
143
|
+
export function getNotes(sessionId) {
|
|
144
|
+
const db = getDatabase();
|
|
145
|
+
const notes = db
|
|
146
|
+
.prepare('SELECT timestamp, note FROM session_notes WHERE session_id = ? ORDER BY timestamp')
|
|
147
|
+
.all(sessionId);
|
|
148
|
+
db.close();
|
|
149
|
+
return notes;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Close session and save to incidents
|
|
153
|
+
*/
|
|
154
|
+
export function closeSession(sessionId, resolution, timeSavedMinutes) {
|
|
155
|
+
const db = getDatabase();
|
|
156
|
+
// Update session
|
|
157
|
+
db.prepare(`
|
|
158
|
+
UPDATE sessions
|
|
159
|
+
SET closed_at = ?, resolution = ?, time_saved_minutes = ?
|
|
160
|
+
WHERE id = ?
|
|
161
|
+
`).run(new Date().toISOString(), resolution, timeSavedMinutes, sessionId);
|
|
162
|
+
// Copy to incidents table for recall
|
|
163
|
+
const session = db
|
|
164
|
+
.prepare('SELECT query, created_at FROM sessions WHERE id = ?')
|
|
165
|
+
.get(sessionId);
|
|
166
|
+
if (session) {
|
|
167
|
+
// Get timeline summary
|
|
168
|
+
const timeline = db
|
|
169
|
+
.prepare('SELECT item_data FROM session_timeline WHERE session_id = ? ORDER BY item_index')
|
|
170
|
+
.all(sessionId);
|
|
171
|
+
const timelineSummary = timeline
|
|
172
|
+
.slice(0, 5)
|
|
173
|
+
.map((row) => {
|
|
174
|
+
const item = JSON.parse(row.item_data);
|
|
175
|
+
return `${item.signal}: ${item.summary}`;
|
|
176
|
+
})
|
|
177
|
+
.join('; ');
|
|
178
|
+
db.prepare(`
|
|
179
|
+
INSERT INTO incidents (id, query, resolution, time_saved_minutes, created_at, closed_at, timeline_summary)
|
|
180
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
181
|
+
`).run(sessionId, session.query, resolution, timeSavedMinutes, session.created_at, new Date().toISOString(), timelineSummary);
|
|
182
|
+
}
|
|
183
|
+
db.close();
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared command handlers for all modes (CLI, REPL, MCP)
|
|
3
|
+
*
|
|
4
|
+
* Handlers contain business logic only and return structured results.
|
|
5
|
+
* Each mode is responsible for formatting and displaying results appropriately.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Execution context for handlers
|
|
9
|
+
*/
|
|
10
|
+
export interface HandlerContext {
|
|
11
|
+
mode: 'cli' | 'repl' | 'mcp';
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Standardized handler result
|
|
16
|
+
*/
|
|
17
|
+
export interface HandlerResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
message: string;
|
|
20
|
+
data?: unknown;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Handle demo command - automated investigation
|
|
25
|
+
*/
|
|
26
|
+
export declare function handleDemo(context: HandlerContext): Promise<HandlerResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Handle investigate command - custom query
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleInvestigate(query: string, context: HandlerContext): Promise<HandlerResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Handle show details command
|
|
33
|
+
*/
|
|
34
|
+
export declare function handleDetails(itemNumber: number, context: HandlerContext): Promise<HandlerResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Handle note command
|
|
37
|
+
*/
|
|
38
|
+
export declare function handleNote(note: string, context: HandlerContext): Promise<HandlerResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Handle close command
|
|
41
|
+
*/
|
|
42
|
+
export declare function handleClose(resolution: string, context: HandlerContext): Promise<HandlerResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Handle demo seed command
|
|
45
|
+
*/
|
|
46
|
+
export declare function handleDemoSeed(context: HandlerContext): HandlerResult;
|
|
47
|
+
/**
|
|
48
|
+
* Handle demo reset command
|
|
49
|
+
*/
|
|
50
|
+
export declare function handleDemoReset(context: HandlerContext): HandlerResult;
|
|
51
|
+
/**
|
|
52
|
+
* Handle setup command - configure Claude Code integration
|
|
53
|
+
*/
|
|
54
|
+
export declare function handleSetup(context: HandlerContext): Promise<HandlerResult>;
|
|
55
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuDhF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAgExB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA+CxB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAsCxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA+BrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA2BtE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAyCjF"}
|
package/dist/handlers.js
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared command handlers for all modes (CLI, REPL, MCP)
|
|
3
|
+
*
|
|
4
|
+
* Handlers contain business logic only and return structured results.
|
|
5
|
+
* Each mode is responsible for formatting and displaying results appropriately.
|
|
6
|
+
*/
|
|
7
|
+
import { generateDemoData } from './demo-generator.js';
|
|
8
|
+
import { saveDemoData, loadDemoData, deleteDemoData, demoDataExists, } from './storage.js';
|
|
9
|
+
import { buildTimeline, deduplicateTimeline } from './timeline.js';
|
|
10
|
+
import { generateInvestigationPaths, findRecallMatches, detectMissingSignals, generateSuggestions, } from './investigation.js';
|
|
11
|
+
import { saveSession, getActiveSession, getTimelineItem, addNote as dbAddNote, getNotes, closeSession as dbCloseSession, } from './database.js';
|
|
12
|
+
/**
|
|
13
|
+
* Handle demo command - automated investigation
|
|
14
|
+
*/
|
|
15
|
+
export async function handleDemo(context) {
|
|
16
|
+
try {
|
|
17
|
+
// Seed data if needed
|
|
18
|
+
if (!demoDataExists()) {
|
|
19
|
+
const dataset = generateDemoData();
|
|
20
|
+
saveDemoData(dataset);
|
|
21
|
+
}
|
|
22
|
+
// Load demo data
|
|
23
|
+
const dataset = loadDemoData();
|
|
24
|
+
if (!dataset) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
message: 'Failed to load demo data',
|
|
28
|
+
error: 'Try running demo reset',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Run investigation
|
|
32
|
+
const query = 'API Gateway timeout spike';
|
|
33
|
+
const rawTimeline = buildTimeline(dataset, {
|
|
34
|
+
hoursAgo: 48,
|
|
35
|
+
maxItems: 20,
|
|
36
|
+
});
|
|
37
|
+
const timeline = deduplicateTimeline(rawTimeline);
|
|
38
|
+
const paths = generateInvestigationPaths(timeline, dataset);
|
|
39
|
+
const recall = findRecallMatches(query, dataset);
|
|
40
|
+
const missingSignals = detectMissingSignals(timeline);
|
|
41
|
+
const suggestions = generateSuggestions(timeline);
|
|
42
|
+
const result = {
|
|
43
|
+
mode: 'demo',
|
|
44
|
+
sessionId: `demo-${Date.now()}`,
|
|
45
|
+
query,
|
|
46
|
+
timeWindow: 'Last 48 hours',
|
|
47
|
+
timeline,
|
|
48
|
+
paths,
|
|
49
|
+
recall,
|
|
50
|
+
missingSignals,
|
|
51
|
+
suggestions,
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
message: 'Demo investigation complete',
|
|
56
|
+
data: result,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
message: 'Demo failed',
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle investigate command - custom query
|
|
69
|
+
*/
|
|
70
|
+
export async function handleInvestigate(query, context) {
|
|
71
|
+
try {
|
|
72
|
+
// Check for demo data
|
|
73
|
+
if (!demoDataExists()) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
message: 'No demo data found',
|
|
77
|
+
error: 'Run demo seed first, or use demo mode',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Load demo data
|
|
81
|
+
const dataset = loadDemoData();
|
|
82
|
+
if (!dataset) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
message: 'Failed to load demo data',
|
|
86
|
+
error: 'Try running demo reset',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Build timeline with query filtering
|
|
90
|
+
const timeline = buildTimeline(dataset, {
|
|
91
|
+
hoursAgo: 48,
|
|
92
|
+
maxItems: 15,
|
|
93
|
+
query,
|
|
94
|
+
});
|
|
95
|
+
const dedupedTimeline = deduplicateTimeline(timeline, { maxPerService: 3 });
|
|
96
|
+
// Generate investigation data
|
|
97
|
+
const paths = generateInvestigationPaths(dedupedTimeline, dataset);
|
|
98
|
+
const recall = findRecallMatches(query, dataset);
|
|
99
|
+
const missingSignals = detectMissingSignals(dedupedTimeline);
|
|
100
|
+
const suggestions = generateSuggestions(dedupedTimeline);
|
|
101
|
+
// Create investigation result
|
|
102
|
+
const result = {
|
|
103
|
+
mode: 'demo',
|
|
104
|
+
sessionId: context.sessionId || `inv-${Date.now()}`,
|
|
105
|
+
query,
|
|
106
|
+
timeWindow: 'Last 48 hours',
|
|
107
|
+
timeline: dedupedTimeline,
|
|
108
|
+
paths,
|
|
109
|
+
recall,
|
|
110
|
+
missingSignals,
|
|
111
|
+
suggestions,
|
|
112
|
+
};
|
|
113
|
+
// Save session to database
|
|
114
|
+
saveSession(result);
|
|
115
|
+
return {
|
|
116
|
+
success: true,
|
|
117
|
+
message: 'Investigation complete',
|
|
118
|
+
data: result,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
message: 'Investigation failed',
|
|
125
|
+
error: error instanceof Error ? error.message : String(error),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Handle show details command
|
|
131
|
+
*/
|
|
132
|
+
export async function handleDetails(itemNumber, context) {
|
|
133
|
+
try {
|
|
134
|
+
// Get active session
|
|
135
|
+
const session = getActiveSession();
|
|
136
|
+
if (!session) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
message: 'No active investigation session',
|
|
140
|
+
error: 'Run investigate command first',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
// Validate item number
|
|
144
|
+
if (isNaN(itemNumber) || itemNumber < 1) {
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
message: 'Invalid item number',
|
|
148
|
+
error: 'Item number must be a positive integer',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// Get timeline item
|
|
152
|
+
const item = getTimelineItem(session.sessionId, itemNumber);
|
|
153
|
+
if (!item) {
|
|
154
|
+
return {
|
|
155
|
+
success: false,
|
|
156
|
+
message: `Item ${itemNumber} not found`,
|
|
157
|
+
error: 'Check timeline for available items',
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
message: `Details for item ${itemNumber}`,
|
|
163
|
+
data: {
|
|
164
|
+
itemNumber,
|
|
165
|
+
sessionId: session.sessionId,
|
|
166
|
+
item,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
message: 'Failed to get details',
|
|
174
|
+
error: error instanceof Error ? error.message : String(error),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Handle note command
|
|
180
|
+
*/
|
|
181
|
+
export async function handleNote(note, context) {
|
|
182
|
+
try {
|
|
183
|
+
if (!note.trim()) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
message: 'Note cannot be empty',
|
|
187
|
+
error: 'Provide note text',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Get active session
|
|
191
|
+
const session = getActiveSession();
|
|
192
|
+
if (!session) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
message: 'No active investigation session',
|
|
196
|
+
error: 'Run investigate command first',
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Add note
|
|
200
|
+
dbAddNote(session.sessionId, note);
|
|
201
|
+
return {
|
|
202
|
+
success: true,
|
|
203
|
+
message: 'Note added',
|
|
204
|
+
data: {
|
|
205
|
+
sessionId: session.sessionId,
|
|
206
|
+
note,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return {
|
|
212
|
+
success: false,
|
|
213
|
+
message: 'Failed to add note',
|
|
214
|
+
error: error instanceof Error ? error.message : String(error),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Handle close command
|
|
220
|
+
*/
|
|
221
|
+
export async function handleClose(resolution, context) {
|
|
222
|
+
try {
|
|
223
|
+
// Get active session
|
|
224
|
+
const session = getActiveSession();
|
|
225
|
+
if (!session) {
|
|
226
|
+
return {
|
|
227
|
+
success: false,
|
|
228
|
+
message: 'No active investigation session',
|
|
229
|
+
error: 'Run investigate command first',
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
const finalResolution = resolution.trim() || 'Investigation closed';
|
|
233
|
+
// Get all notes
|
|
234
|
+
const notes = getNotes(session.sessionId);
|
|
235
|
+
// For now, use a default time saved (15 min)
|
|
236
|
+
// In CLI/REPL modes, this will be prompted interactively
|
|
237
|
+
const timeSaved = 15;
|
|
238
|
+
// Close session
|
|
239
|
+
dbCloseSession(session.sessionId, finalResolution, timeSaved);
|
|
240
|
+
return {
|
|
241
|
+
success: true,
|
|
242
|
+
message: 'Investigation closed',
|
|
243
|
+
data: {
|
|
244
|
+
sessionId: session.sessionId,
|
|
245
|
+
query: session.query,
|
|
246
|
+
resolution: finalResolution,
|
|
247
|
+
notes,
|
|
248
|
+
timeSaved,
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
return {
|
|
254
|
+
success: false,
|
|
255
|
+
message: 'Failed to close investigation',
|
|
256
|
+
error: error instanceof Error ? error.message : String(error),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Handle demo seed command
|
|
262
|
+
*/
|
|
263
|
+
export function handleDemoSeed(context) {
|
|
264
|
+
try {
|
|
265
|
+
const alreadyExists = demoDataExists();
|
|
266
|
+
if (alreadyExists) {
|
|
267
|
+
return {
|
|
268
|
+
success: false,
|
|
269
|
+
message: 'Demo data already exists',
|
|
270
|
+
error: 'Use demo reset to regenerate',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const dataset = generateDemoData();
|
|
274
|
+
saveDemoData(dataset);
|
|
275
|
+
return {
|
|
276
|
+
success: true,
|
|
277
|
+
message: 'Demo data seeded successfully',
|
|
278
|
+
data: {
|
|
279
|
+
services: dataset.services.length,
|
|
280
|
+
deploys: dataset.deploys.length,
|
|
281
|
+
logs: dataset.logs.length,
|
|
282
|
+
incidents: dataset.incidents.length,
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
return {
|
|
288
|
+
success: false,
|
|
289
|
+
message: 'Failed to seed demo data',
|
|
290
|
+
error: error instanceof Error ? error.message : String(error),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Handle demo reset command
|
|
296
|
+
*/
|
|
297
|
+
export function handleDemoReset(context) {
|
|
298
|
+
try {
|
|
299
|
+
const exists = demoDataExists();
|
|
300
|
+
if (exists) {
|
|
301
|
+
deleteDemoData();
|
|
302
|
+
}
|
|
303
|
+
const dataset = generateDemoData();
|
|
304
|
+
saveDemoData(dataset);
|
|
305
|
+
return {
|
|
306
|
+
success: true,
|
|
307
|
+
message: 'Demo data reset successfully',
|
|
308
|
+
data: {
|
|
309
|
+
services: dataset.services.length,
|
|
310
|
+
deploys: dataset.deploys.length,
|
|
311
|
+
logs: dataset.logs.length,
|
|
312
|
+
incidents: dataset.incidents.length,
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
message: 'Failed to reset demo data',
|
|
320
|
+
error: error instanceof Error ? error.message : String(error),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handle setup command - configure Claude Code integration
|
|
326
|
+
*/
|
|
327
|
+
export async function handleSetup(context) {
|
|
328
|
+
try {
|
|
329
|
+
const setup = await import('./setup.js');
|
|
330
|
+
const { setupClaudeIntegration, verifyBinaryAccessible, getManualInstructions } = setup;
|
|
331
|
+
// First verify the binary is accessible
|
|
332
|
+
if (!verifyBinaryAccessible()) {
|
|
333
|
+
return {
|
|
334
|
+
success: false,
|
|
335
|
+
message: 'resolve-solo-mcp binary not found in PATH',
|
|
336
|
+
error: 'Try running: npm install -g resolve-solo',
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
// Attempt auto-configuration
|
|
340
|
+
const result = setupClaudeIntegration();
|
|
341
|
+
if (result.success) {
|
|
342
|
+
return {
|
|
343
|
+
success: true,
|
|
344
|
+
message: result.message,
|
|
345
|
+
data: {
|
|
346
|
+
method: result.method,
|
|
347
|
+
configPath: result.configPath,
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// Auto-config failed, return manual instructions
|
|
352
|
+
return {
|
|
353
|
+
success: false,
|
|
354
|
+
message: 'Could not automatically configure Claude Code',
|
|
355
|
+
error: getManualInstructions(),
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
return {
|
|
360
|
+
success: false,
|
|
361
|
+
message: 'Setup failed',
|
|
362
|
+
error: error instanceof Error ? error.message : String(error),
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Definitions and Execution
|
|
3
|
+
*
|
|
4
|
+
* Defines the tools exposed to Claude Code and routes execution to handlers.
|
|
5
|
+
*/
|
|
6
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import type { HandlerResult } from '../handlers.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register all available MCP tools
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerTools(): Tool[];
|
|
12
|
+
/**
|
|
13
|
+
* Execute a tool by name with given arguments
|
|
14
|
+
*/
|
|
15
|
+
export declare function executeTool(name: string, args: Record<string, unknown>): Promise<HandlerResult>;
|
|
16
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,EAAE,CAmEtC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
|