resolve-solo 0.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/README.md +199 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +214 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo-generator.d.ts +12 -0
- package/dist/demo-generator.d.ts.map +1 -0
- package/dist/demo-generator.js +352 -0
- package/dist/demo-generator.js.map +1 -0
- package/dist/demo-output.d.ts +13 -0
- package/dist/demo-output.d.ts.map +1 -0
- package/dist/demo-output.js +116 -0
- package/dist/demo-output.js.map +1 -0
- package/dist/demo-schema.d.ts +66 -0
- package/dist/demo-schema.d.ts.map +1 -0
- package/dist/demo-schema.js +11 -0
- package/dist/demo-schema.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/investigation-types.d.ts +47 -0
- package/dist/investigation-types.d.ts.map +1 -0
- package/dist/investigation-types.js +5 -0
- package/dist/investigation-types.js.map +1 -0
- package/dist/investigation.d.ts +24 -0
- package/dist/investigation.d.ts.map +1 -0
- package/dist/investigation.js +135 -0
- package/dist/investigation.js.map +1 -0
- package/dist/output.d.ts +20 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +151 -0
- package/dist/output.js.map +1 -0
- package/dist/parser.d.ts +16 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +146 -0
- package/dist/parser.js.map +1 -0
- package/dist/storage.d.ts +47 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +133 -0
- package/dist/storage.js.map +1 -0
- package/dist/timeline.d.ts +27 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +145 -0
- package/dist/timeline.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for investigation output
|
|
3
|
+
*/
|
|
4
|
+
export type SignalType = 'deploy' | 'log' | 'incident' | 'metric';
|
|
5
|
+
export type Confidence = 'high' | 'medium' | 'low';
|
|
6
|
+
export interface TimelineItem {
|
|
7
|
+
id: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
signal: SignalType;
|
|
10
|
+
target: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
whyItMatters: string;
|
|
13
|
+
confidence: Confidence;
|
|
14
|
+
details?: Record<string, unknown>;
|
|
15
|
+
isDemo: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface InvestigationPath {
|
|
18
|
+
title: string;
|
|
19
|
+
whyPlausible: string;
|
|
20
|
+
nextStep: string;
|
|
21
|
+
expectedSignal: string;
|
|
22
|
+
}
|
|
23
|
+
export interface RecallMatch {
|
|
24
|
+
incidentId: string;
|
|
25
|
+
title: string;
|
|
26
|
+
matchReason: string;
|
|
27
|
+
whatWorked: string;
|
|
28
|
+
deadEnds: string[];
|
|
29
|
+
similarity: number;
|
|
30
|
+
}
|
|
31
|
+
export interface MissingSignal {
|
|
32
|
+
type: string;
|
|
33
|
+
reason: string;
|
|
34
|
+
impact: 'high' | 'medium' | 'low';
|
|
35
|
+
}
|
|
36
|
+
export interface InvestigationResult {
|
|
37
|
+
mode: 'demo' | 'real';
|
|
38
|
+
sessionId: string;
|
|
39
|
+
query: string;
|
|
40
|
+
timeWindow: string;
|
|
41
|
+
timeline: TimelineItem[];
|
|
42
|
+
paths: InvestigationPath[];
|
|
43
|
+
recall: RecallMatch[];
|
|
44
|
+
missingSignals: MissingSignal[];
|
|
45
|
+
suggestions: string[];
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=investigation-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigation-types.d.ts","sourceRoot":"","sources":["../src/investigation-types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigation-types.js","sourceRoot":"","sources":["../src/investigation-types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Investigation engine
|
|
3
|
+
*
|
|
4
|
+
* Generates investigation paths, recall matches, and missing signals.
|
|
5
|
+
*/
|
|
6
|
+
import type { DemoDataset } from './demo-schema.js';
|
|
7
|
+
import type { InvestigationPath, RecallMatch, MissingSignal, TimelineItem } from './investigation-types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate investigation paths based on timeline
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateInvestigationPaths(timeline: TimelineItem[], dataset: DemoDataset): InvestigationPath[];
|
|
12
|
+
/**
|
|
13
|
+
* Find recall matches (similar past incidents)
|
|
14
|
+
*/
|
|
15
|
+
export declare function findRecallMatches(query: string, dataset: DemoDataset): RecallMatch[];
|
|
16
|
+
/**
|
|
17
|
+
* Detect missing signals that would help investigation
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectMissingSignals(timeline: TimelineItem[]): MissingSignal[];
|
|
20
|
+
/**
|
|
21
|
+
* Generate next command suggestions
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateSuggestions(timeline: TimelineItem[]): string[];
|
|
24
|
+
//# sourceMappingURL=investigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigation.d.ts","sourceRoot":"","sources":["../src/investigation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE,WAAW,GACnB,iBAAiB,EAAE,CAuDrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,GACnB,WAAW,EAAE,CAuCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EAAE,GACvB,aAAa,EAAE,CAsCjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAYtE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Investigation engine
|
|
3
|
+
*
|
|
4
|
+
* Generates investigation paths, recall matches, and missing signals.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Generate investigation paths based on timeline
|
|
8
|
+
*/
|
|
9
|
+
export function generateInvestigationPaths(timeline, dataset) {
|
|
10
|
+
const paths = [];
|
|
11
|
+
// Path 1: Check recent deploys
|
|
12
|
+
const recentDeploys = timeline.filter((item) => item.signal === 'deploy');
|
|
13
|
+
if (recentDeploys.length > 0) {
|
|
14
|
+
const deploy = recentDeploys[0];
|
|
15
|
+
paths.push({
|
|
16
|
+
title: 'Investigate recent deploy',
|
|
17
|
+
whyPlausible: `${deploy.target} deployed ${deploy.details?.version || 'new version'} recently`,
|
|
18
|
+
nextStep: `Check deploy logs and compare error rates before/after ${new Date(deploy.timestamp).toLocaleTimeString()}`,
|
|
19
|
+
expectedSignal: 'Spike in errors or latency after deploy time',
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Path 2: Check error patterns
|
|
23
|
+
const errorLogs = timeline.filter((item) => item.signal === 'log');
|
|
24
|
+
if (errorLogs.length > 0) {
|
|
25
|
+
const errorsByService = new Map();
|
|
26
|
+
for (const log of errorLogs) {
|
|
27
|
+
errorsByService.set(log.target, (errorsByService.get(log.target) || 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
const [topService, count] = Array.from(errorsByService.entries()).sort((a, b) => b[1] - a[1])[0] || ['unknown', 0];
|
|
30
|
+
if (count > 0) {
|
|
31
|
+
paths.push({
|
|
32
|
+
title: 'Investigate error spike',
|
|
33
|
+
whyPlausible: `${topService} shows ${count} error(s) in recent logs`,
|
|
34
|
+
nextStep: 'Check service health metrics and upstream dependencies',
|
|
35
|
+
expectedSignal: 'Correlation with deploy or external service issues',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Path 3: Check for similar past incidents
|
|
40
|
+
const incidents = timeline.filter((item) => item.signal === 'incident');
|
|
41
|
+
if (incidents.length > 0) {
|
|
42
|
+
const incident = incidents[0];
|
|
43
|
+
paths.push({
|
|
44
|
+
title: 'Review similar past incident',
|
|
45
|
+
whyPlausible: `Similar symptoms seen in "${incident.summary}"`,
|
|
46
|
+
nextStep: 'Compare current symptoms with past incident pattern',
|
|
47
|
+
expectedSignal: 'Matching root cause or resolution approach',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Limit to top 3 paths
|
|
51
|
+
return paths.slice(0, 3);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Find recall matches (similar past incidents)
|
|
55
|
+
*/
|
|
56
|
+
export function findRecallMatches(query, dataset) {
|
|
57
|
+
const matches = [];
|
|
58
|
+
const queryLower = query.toLowerCase();
|
|
59
|
+
for (const incident of dataset.incidents) {
|
|
60
|
+
// Simple similarity: check if query terms appear in incident title/symptoms
|
|
61
|
+
const titleLower = incident.title.toLowerCase();
|
|
62
|
+
const symptomsLower = incident.symptoms.join(' ').toLowerCase();
|
|
63
|
+
const titleMatch = queryLower.split(' ').some((term) => titleLower.includes(term));
|
|
64
|
+
const symptomsMatch = queryLower.split(' ').some((term) => symptomsLower.includes(term));
|
|
65
|
+
if (titleMatch || symptomsMatch) {
|
|
66
|
+
// Calculate simple similarity score
|
|
67
|
+
const queryTerms = queryLower.split(' ').filter((t) => t.length > 2);
|
|
68
|
+
const matchCount = queryTerms.filter((term) => titleLower.includes(term) || symptomsLower.includes(term)).length;
|
|
69
|
+
const similarity = matchCount / Math.max(queryTerms.length, 1);
|
|
70
|
+
matches.push({
|
|
71
|
+
incidentId: incident.id,
|
|
72
|
+
title: incident.title,
|
|
73
|
+
matchReason: titleMatch
|
|
74
|
+
? 'Similar issue title'
|
|
75
|
+
: 'Similar symptoms reported',
|
|
76
|
+
whatWorked: incident.resolution || 'Resolution documented in incident',
|
|
77
|
+
deadEnds: [], // Could be populated from incident notes
|
|
78
|
+
similarity,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Sort by similarity and return top 3
|
|
83
|
+
return matches.sort((a, b) => b.similarity - a.similarity).slice(0, 3);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Detect missing signals that would help investigation
|
|
87
|
+
*/
|
|
88
|
+
export function detectMissingSignals(timeline) {
|
|
89
|
+
const signals = [];
|
|
90
|
+
// Always suggest metrics in demo mode
|
|
91
|
+
signals.push({
|
|
92
|
+
type: 'Metrics Dashboard',
|
|
93
|
+
reason: 'Would show latency, error rate, and throughput trends',
|
|
94
|
+
impact: 'high',
|
|
95
|
+
});
|
|
96
|
+
// If we have errors, suggest distributed tracing
|
|
97
|
+
const hasErrors = timeline.some((item) => item.signal === 'log');
|
|
98
|
+
if (hasErrors) {
|
|
99
|
+
signals.push({
|
|
100
|
+
type: 'Distributed Tracing',
|
|
101
|
+
reason: 'Would pinpoint exact failure point in request flow',
|
|
102
|
+
impact: 'high',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// If we have deploys, suggest rollback capability
|
|
106
|
+
const hasDeploys = timeline.some((item) => item.signal === 'deploy');
|
|
107
|
+
if (hasDeploys) {
|
|
108
|
+
signals.push({
|
|
109
|
+
type: 'Automated Rollback',
|
|
110
|
+
reason: 'Could quickly revert problematic deploy',
|
|
111
|
+
impact: 'medium',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
// Suggest alerting
|
|
115
|
+
signals.push({
|
|
116
|
+
type: 'Real-time Alerting',
|
|
117
|
+
reason: 'Would detect issues proactively before customer impact',
|
|
118
|
+
impact: 'high',
|
|
119
|
+
});
|
|
120
|
+
return signals;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate next command suggestions
|
|
124
|
+
*/
|
|
125
|
+
export function generateSuggestions(timeline) {
|
|
126
|
+
const suggestions = [];
|
|
127
|
+
if (timeline.length > 0) {
|
|
128
|
+
suggestions.push('resolveai show details for item 1');
|
|
129
|
+
}
|
|
130
|
+
suggestions.push('resolveai note checked recent deploys');
|
|
131
|
+
suggestions.push('resolveai investigate schema mismatch');
|
|
132
|
+
suggestions.push('resolveai report weekly');
|
|
133
|
+
return suggestions;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=investigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"investigation.js","sourceRoot":"","sources":["../src/investigation.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting and display utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Display welcome message (when user runs `resolveai` with no args)
|
|
6
|
+
*/
|
|
7
|
+
export declare function showWelcome(): void;
|
|
8
|
+
/**
|
|
9
|
+
* Display help documentation
|
|
10
|
+
*/
|
|
11
|
+
export declare function showHelp(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Display "unknown command" fallback
|
|
14
|
+
*/
|
|
15
|
+
export declare function showUnknownCommand(input: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Display "not implemented yet" placeholder
|
|
18
|
+
*/
|
|
19
|
+
export declare function showNotImplemented(intent: string): void;
|
|
20
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAkBlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,IAAI,CA+F/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiBtD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CASvD"}
|
package/dist/output.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatting and display utilities
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { getExamples } from './parser.js';
|
|
6
|
+
import { VERSION } from './index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Display welcome message (when user runs `resolveai` with no args)
|
|
9
|
+
*/
|
|
10
|
+
export function showWelcome() {
|
|
11
|
+
console.log();
|
|
12
|
+
console.log(chalk.bold.cyan('🔍 Resolve Solo'));
|
|
13
|
+
console.log(chalk.gray(`v${VERSION} - Local-first on-call assistant`));
|
|
14
|
+
console.log();
|
|
15
|
+
console.log('Your personal investigation companion for incident response.');
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(chalk.bold('Try these commands:'));
|
|
18
|
+
console.log();
|
|
19
|
+
const examples = getExamples();
|
|
20
|
+
examples.forEach((example) => {
|
|
21
|
+
console.log(chalk.cyan(` ${example}`));
|
|
22
|
+
});
|
|
23
|
+
console.log();
|
|
24
|
+
console.log(chalk.gray(`Type ${chalk.white('resolveai help')} for more information.`));
|
|
25
|
+
console.log();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Display help documentation
|
|
29
|
+
*/
|
|
30
|
+
export function showHelp() {
|
|
31
|
+
console.log();
|
|
32
|
+
console.log(chalk.bold.cyan('🔍 Resolve Solo'));
|
|
33
|
+
console.log(chalk.gray(`v${VERSION} - Local-first on-call assistant`));
|
|
34
|
+
console.log();
|
|
35
|
+
console.log(chalk.bold('WHAT IT DOES'));
|
|
36
|
+
console.log('Resolve Solo helps you investigate incidents using natural language.');
|
|
37
|
+
console.log('It provides timeline analysis, investigation paths, and learning from past incidents.');
|
|
38
|
+
console.log();
|
|
39
|
+
console.log(chalk.bold('GETTING STARTED'));
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(' 1. Try the demo:');
|
|
42
|
+
console.log(chalk.cyan(' resolveai demo'));
|
|
43
|
+
console.log();
|
|
44
|
+
console.log(' 2. Investigate an issue:');
|
|
45
|
+
console.log(chalk.cyan(' resolveai investigate timeouts on api gateway'));
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(' 3. Get weekly report:');
|
|
48
|
+
console.log(chalk.cyan(' resolveai report weekly'));
|
|
49
|
+
console.log();
|
|
50
|
+
console.log(chalk.bold('COMMANDS'));
|
|
51
|
+
console.log();
|
|
52
|
+
console.log(chalk.cyan(' resolveai'));
|
|
53
|
+
console.log(' Show welcome message with examples');
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(chalk.cyan(' resolveai help'));
|
|
56
|
+
console.log(' Show this help documentation');
|
|
57
|
+
console.log();
|
|
58
|
+
console.log(chalk.cyan(' resolveai demo'));
|
|
59
|
+
console.log(' Run an automated demo investigation (seeds data if needed)');
|
|
60
|
+
console.log();
|
|
61
|
+
console.log(chalk.cyan(' resolveai demo seed'));
|
|
62
|
+
console.log(' Generate demo data for testing');
|
|
63
|
+
console.log();
|
|
64
|
+
console.log(chalk.cyan(' resolveai demo reset'));
|
|
65
|
+
console.log(' Clear and regenerate all demo data');
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(chalk.cyan(' resolveai investigate <description>'));
|
|
68
|
+
console.log(' Start an investigation using natural language');
|
|
69
|
+
console.log(chalk.gray(' Examples:'));
|
|
70
|
+
console.log(chalk.gray(' resolveai investigate timeouts on api gateway'));
|
|
71
|
+
console.log(chalk.gray(' resolveai what changed in the last 2 hours'));
|
|
72
|
+
console.log(chalk.gray(' resolveai check database connection errors'));
|
|
73
|
+
console.log();
|
|
74
|
+
console.log(chalk.cyan(' resolveai show details for item <n>'));
|
|
75
|
+
console.log(chalk.gray(' (or: resolveai details <n>)'));
|
|
76
|
+
console.log(' Show detailed information about a timeline item');
|
|
77
|
+
console.log();
|
|
78
|
+
console.log(chalk.cyan(' resolveai note <text>'));
|
|
79
|
+
console.log(' Add a note to the current investigation');
|
|
80
|
+
console.log(chalk.gray(' Example: resolveai note rolled back to previous version'));
|
|
81
|
+
console.log();
|
|
82
|
+
console.log(chalk.cyan(' resolveai close <summary>'));
|
|
83
|
+
console.log(' Close the current investigation and log resolution');
|
|
84
|
+
console.log(chalk.gray(' Example: resolveai close rollback fixed it'));
|
|
85
|
+
console.log();
|
|
86
|
+
console.log(chalk.cyan(' resolveai report weekly'));
|
|
87
|
+
console.log(' Generate a weekly usage and impact report');
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(chalk.cyan(' resolveai doctor'));
|
|
90
|
+
console.log(' Check system health and configuration');
|
|
91
|
+
console.log();
|
|
92
|
+
console.log(chalk.cyan(' resolveai uninstall [--yes]'));
|
|
93
|
+
console.log(' Remove Resolve Solo and optionally clean up data');
|
|
94
|
+
console.log(chalk.gray(' Flags: --keep-data, --all-data, --yes'));
|
|
95
|
+
console.log();
|
|
96
|
+
console.log(chalk.bold('DEMO MODE'));
|
|
97
|
+
console.log('Resolve Solo starts in demo mode with mock data.');
|
|
98
|
+
console.log('All demo signals are labeled (demo) to avoid confusion.');
|
|
99
|
+
console.log();
|
|
100
|
+
console.log('Demo data is stored in:');
|
|
101
|
+
console.log(chalk.gray(' ./.resolveai/demo-data/'));
|
|
102
|
+
console.log();
|
|
103
|
+
console.log(chalk.bold('DATA STORAGE'));
|
|
104
|
+
console.log('Runtime data is stored locally in your project:');
|
|
105
|
+
console.log(chalk.gray(' ./.resolveai/memory.sqlite # Investigation history'));
|
|
106
|
+
console.log(chalk.gray(' ./.resolveai/runs/ # Session logs'));
|
|
107
|
+
console.log(chalk.gray(' ./.resolveai/reports/ # Weekly reports'));
|
|
108
|
+
console.log(chalk.gray(' ./.resolveai/demo-data/ # Demo mock data'));
|
|
109
|
+
console.log();
|
|
110
|
+
console.log(chalk.bold('UNINSTALL'));
|
|
111
|
+
console.log('To remove Resolve Solo:');
|
|
112
|
+
console.log(chalk.cyan(' resolveai uninstall'));
|
|
113
|
+
console.log();
|
|
114
|
+
console.log('This will remove the tool and optionally clean up local data.');
|
|
115
|
+
console.log();
|
|
116
|
+
console.log(chalk.gray('For more examples, visit: https://github.com/resolve-ai/resolve-solo'));
|
|
117
|
+
console.log();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Display "unknown command" fallback
|
|
121
|
+
*/
|
|
122
|
+
export function showUnknownCommand(input) {
|
|
123
|
+
console.log();
|
|
124
|
+
console.log(chalk.yellow('⚠️ I\'m not sure what you mean.'));
|
|
125
|
+
console.log();
|
|
126
|
+
console.log(`You typed: ${chalk.gray(input)}`);
|
|
127
|
+
console.log();
|
|
128
|
+
console.log('Try one of these commands:');
|
|
129
|
+
console.log();
|
|
130
|
+
const examples = getExamples();
|
|
131
|
+
examples.forEach((example) => {
|
|
132
|
+
console.log(chalk.cyan(` ${example}`));
|
|
133
|
+
});
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(chalk.gray(`Type ${chalk.white('resolveai help')} for full documentation.`));
|
|
136
|
+
console.log();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Display "not implemented yet" placeholder
|
|
140
|
+
*/
|
|
141
|
+
export function showNotImplemented(intent) {
|
|
142
|
+
console.log();
|
|
143
|
+
console.log(chalk.yellow(`⚠️ The ${chalk.white(intent)} command is not yet implemented.`));
|
|
144
|
+
console.log();
|
|
145
|
+
console.log('This feature will be available in a future milestone.');
|
|
146
|
+
console.log();
|
|
147
|
+
console.log(chalk.gray('Current milestone: M2 (CLI Entry & Help)'));
|
|
148
|
+
console.log(chalk.gray('This command will be implemented in: M3-M11'));
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural Language Intent Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses natural language input to determine user intent.
|
|
5
|
+
* Uses pattern matching for v1 (no LLM required).
|
|
6
|
+
*/
|
|
7
|
+
import type { Intent, ParsedCommand } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse natural language input into a structured command
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseIntent(input: string): ParsedCommand;
|
|
12
|
+
/**
|
|
13
|
+
* Get example commands for a given intent
|
|
14
|
+
*/
|
|
15
|
+
export declare function getExamples(intent?: Intent): string[];
|
|
16
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmFxD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAqBxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAwCrD"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural Language Intent Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses natural language input to determine user intent.
|
|
5
|
+
* Uses pattern matching for v1 (no LLM required).
|
|
6
|
+
*/
|
|
7
|
+
// Intent patterns ordered by specificity (most specific first)
|
|
8
|
+
const INTENT_PATTERNS = [
|
|
9
|
+
{
|
|
10
|
+
intent: 'help',
|
|
11
|
+
patterns: [/^help$/i, /^--help$/i, /^-h$/i],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
intent: 'demo-seed',
|
|
15
|
+
patterns: [/^demo\s+seed$/i, /^seed\s+demo$/i],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
intent: 'demo-reset',
|
|
19
|
+
patterns: [/^demo\s+reset$/i, /^reset\s+demo$/i],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
intent: 'demo',
|
|
23
|
+
patterns: [/^demo$/i],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
intent: 'details',
|
|
27
|
+
patterns: [
|
|
28
|
+
/^show\s+(me\s+)?(the\s+)?details?\s+(for\s+)?item\s+\d+/i,
|
|
29
|
+
/^details?\s+\d+/i,
|
|
30
|
+
/^item\s+\d+/i,
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
intent: 'note',
|
|
35
|
+
patterns: [
|
|
36
|
+
/^note\s+/i,
|
|
37
|
+
/^add\s+note\s+/i,
|
|
38
|
+
/^log\s+/i,
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
intent: 'close',
|
|
43
|
+
patterns: [
|
|
44
|
+
/^close(\s+|$)/i,
|
|
45
|
+
/^resolve(\s+|$)/i,
|
|
46
|
+
/^end\s+incident(\s+|$)/i,
|
|
47
|
+
/^mark\s+(as\s+)?resolved(\s+|$)/i,
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
intent: 'report-weekly',
|
|
52
|
+
patterns: [
|
|
53
|
+
/^report\s+weekly$/i,
|
|
54
|
+
/^weekly\s+report$/i,
|
|
55
|
+
/^report$/i,
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
intent: 'doctor',
|
|
60
|
+
patterns: [/^doctor$/i, /^health\s*check$/i],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
intent: 'uninstall',
|
|
64
|
+
patterns: [
|
|
65
|
+
/^uninstall$/i,
|
|
66
|
+
/^remove$/i,
|
|
67
|
+
/^cleanup$/i,
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
intent: 'investigate',
|
|
72
|
+
patterns: [
|
|
73
|
+
/^investigate\s+/i,
|
|
74
|
+
/^what\s+changed/i,
|
|
75
|
+
/^show\s+me\s+/i,
|
|
76
|
+
/^debug\s+/i,
|
|
77
|
+
/^look\s+into\s+/i,
|
|
78
|
+
/^check\s+/i,
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
/**
|
|
83
|
+
* Parse natural language input into a structured command
|
|
84
|
+
*/
|
|
85
|
+
export function parseIntent(input) {
|
|
86
|
+
const trimmed = input.trim();
|
|
87
|
+
// Empty input = welcome message (not an intent)
|
|
88
|
+
if (!trimmed) {
|
|
89
|
+
return { intent: 'unknown', args: [], raw: '' };
|
|
90
|
+
}
|
|
91
|
+
// Try to match against known patterns
|
|
92
|
+
for (const { intent, patterns } of INTENT_PATTERNS) {
|
|
93
|
+
for (const pattern of patterns) {
|
|
94
|
+
if (pattern.test(trimmed)) {
|
|
95
|
+
// Extract remaining args by removing the matched pattern
|
|
96
|
+
const args = trimmed.split(/\s+/).slice(1);
|
|
97
|
+
return { intent, args, raw: trimmed };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// No match = unknown intent
|
|
102
|
+
return { intent: 'unknown', args: trimmed.split(/\s+/), raw: trimmed };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get example commands for a given intent
|
|
106
|
+
*/
|
|
107
|
+
export function getExamples(intent) {
|
|
108
|
+
const examples = {
|
|
109
|
+
help: ['resolveai help'],
|
|
110
|
+
demo: ['resolveai demo'],
|
|
111
|
+
'demo-seed': ['resolveai demo seed'],
|
|
112
|
+
'demo-reset': ['resolveai demo reset'],
|
|
113
|
+
investigate: [
|
|
114
|
+
'resolveai investigate timeouts on api gateway',
|
|
115
|
+
'resolveai what changed in the last 2 hours for payments service',
|
|
116
|
+
'resolveai check database connection errors',
|
|
117
|
+
],
|
|
118
|
+
details: [
|
|
119
|
+
'resolveai show details for item 1',
|
|
120
|
+
'resolveai details 3',
|
|
121
|
+
],
|
|
122
|
+
note: [
|
|
123
|
+
'resolveai note we rolled back payments-service',
|
|
124
|
+
'resolveai note spike started after deploy 2026-01-21T01:20Z',
|
|
125
|
+
],
|
|
126
|
+
close: [
|
|
127
|
+
'resolveai close rollback fixed it',
|
|
128
|
+
'resolveai resolve incident was false alarm',
|
|
129
|
+
],
|
|
130
|
+
'report-weekly': ['resolveai report weekly'],
|
|
131
|
+
doctor: ['resolveai doctor'],
|
|
132
|
+
uninstall: ['resolveai uninstall'],
|
|
133
|
+
unknown: [],
|
|
134
|
+
};
|
|
135
|
+
if (intent) {
|
|
136
|
+
return examples[intent] || [];
|
|
137
|
+
}
|
|
138
|
+
// Return a curated subset for welcome message (most common use cases)
|
|
139
|
+
return [
|
|
140
|
+
'resolveai demo',
|
|
141
|
+
'resolveai investigate timeouts on api gateway',
|
|
142
|
+
'resolveai what changed in the last 2 hours',
|
|
143
|
+
'resolveai help',
|
|
144
|
+
];
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage utilities for local data persistence
|
|
3
|
+
*/
|
|
4
|
+
import type { DemoDataset } from './demo-schema.js';
|
|
5
|
+
/**
|
|
6
|
+
* Get the .resolveai directory path (project-local)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getResolveaiDir(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Get the demo data directory path
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDemoDataDir(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Ensure a directory exists (create if missing)
|
|
15
|
+
*/
|
|
16
|
+
export declare function ensureDir(dirPath: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Check if demo data exists
|
|
19
|
+
*/
|
|
20
|
+
export declare function demoDataExists(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Save demo dataset to disk
|
|
23
|
+
*/
|
|
24
|
+
export declare function saveDemoData(dataset: DemoDataset): void;
|
|
25
|
+
/**
|
|
26
|
+
* Load demo dataset from disk
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadDemoData(): DemoDataset | null;
|
|
29
|
+
/**
|
|
30
|
+
* Delete all demo data
|
|
31
|
+
*/
|
|
32
|
+
export declare function deleteDemoData(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get storage info (sizes, counts)
|
|
35
|
+
*/
|
|
36
|
+
export declare function getStorageInfo(): {
|
|
37
|
+
exists: boolean;
|
|
38
|
+
path: string;
|
|
39
|
+
size?: number;
|
|
40
|
+
counts?: {
|
|
41
|
+
services: number;
|
|
42
|
+
deploys: number;
|
|
43
|
+
logs: number;
|
|
44
|
+
incidents: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAkBxC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CA6BvD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,WAAW,GAAG,IAAI,CAmCjD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAyCA"}
|