@nxuss/lemma 0.3.0 ā 0.3.1
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/dist/cjs/core/GhostAlchemist.d.ts +18 -0
- package/dist/cjs/core/GhostAlchemist.d.ts.map +1 -0
- package/dist/cjs/core/GhostAlchemist.js +55 -0
- package/dist/cjs/core/GhostAlchemist.js.map +1 -0
- package/dist/cjs/core/GhostListener.d.ts +20 -0
- package/dist/cjs/core/GhostListener.d.ts.map +1 -0
- package/dist/cjs/core/GhostListener.js +97 -0
- package/dist/cjs/core/GhostListener.js.map +1 -0
- package/dist/esm/core/GhostAlchemist.d.ts +18 -0
- package/dist/esm/core/GhostAlchemist.d.ts.map +1 -0
- package/dist/esm/core/GhostAlchemist.js +48 -0
- package/dist/esm/core/GhostAlchemist.js.map +1 -0
- package/dist/esm/core/GhostListener.d.ts +20 -0
- package/dist/esm/core/GhostListener.d.ts.map +1 -0
- package/dist/esm/core/GhostListener.js +93 -0
- package/dist/esm/core/GhostListener.js.map +1 -0
- package/lemma-proxy.cjs +477 -0
- package/package.json +9 -7
- package/lemma-proxy.js +0 -810
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Diagnosis {
|
|
2
|
+
fix: string;
|
|
3
|
+
confidence: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class GhostAlchemist {
|
|
6
|
+
private model;
|
|
7
|
+
private host;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Synthesize context for token savings
|
|
11
|
+
*/
|
|
12
|
+
synthesize(context: string, goal: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Diagnose a failure and suggest a fix
|
|
15
|
+
*/
|
|
16
|
+
diagnoseFailure(error: string, context: string): Promise<Diagnosis>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=GhostAlchemist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.d.ts","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;;IAOrB;;OAEG;IACU,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBvE;;OAEG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAgBjF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GhostAlchemist = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const logger_1 = require("../utils/logger");
|
|
9
|
+
class GhostAlchemist {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.model = process.env.OLLAMA_GEN_MODEL || 'llama3';
|
|
12
|
+
this.host = process.env.OLLAMA_HOST || 'http://localhost:11434';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Synthesize context for token savings
|
|
16
|
+
*/
|
|
17
|
+
async synthesize(context, goal) {
|
|
18
|
+
try {
|
|
19
|
+
const prompt = `TASK: Synthesize this technical context into a DENSE SEMANTIC SUMMARY for another LLM.\nGOAL: ${goal}\nCONTEXT:\n${context}`;
|
|
20
|
+
const resp = await axios_1.default.post(`${this.host}/api/generate`, {
|
|
21
|
+
model: this.model,
|
|
22
|
+
prompt,
|
|
23
|
+
stream: false,
|
|
24
|
+
options: { temperature: 0.1 }
|
|
25
|
+
});
|
|
26
|
+
return resp.data.response.trim();
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
logger_1.logger.error('Ghost synthesis failed', e);
|
|
30
|
+
return context;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Diagnose a failure and suggest a fix
|
|
35
|
+
*/
|
|
36
|
+
async diagnoseFailure(error, context) {
|
|
37
|
+
try {
|
|
38
|
+
const prompt = `DIAGNOSTIC: Analyze error and context. Return JSON { "fix": "...", "confidence": 0.0-1.0 }\nERROR: ${error}\nCONTEXT: ${context.slice(-2000)}`;
|
|
39
|
+
const resp = await axios_1.default.post(`${this.host}/api/generate`, {
|
|
40
|
+
model: this.model,
|
|
41
|
+
prompt,
|
|
42
|
+
stream: false,
|
|
43
|
+
format: 'json',
|
|
44
|
+
options: { temperature: 0 }
|
|
45
|
+
});
|
|
46
|
+
return JSON.parse(resp.data.response);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
logger_1.logger.error('Ghost diagnostic failed', e);
|
|
50
|
+
return { fix: 'Unable to diagnose', confidence: 0 };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.GhostAlchemist = GhostAlchemist;
|
|
55
|
+
//# sourceMappingURL=GhostAlchemist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.js","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,4CAAyC;AAOzC,MAAa,cAAc;IAIzB;QACE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC;IAClE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,IAAY;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,iGAAiG,IAAI,eAAe,OAAO,EAAE,CAAC;YAC7I,MAAM,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE;aAC9B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,OAAe;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sGAAsG,KAAK,cAAc,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/J,MAAM,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;aAC5B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;CACF;AA/CD,wCA+CC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GhostListener
|
|
3
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
4
|
+
*/
|
|
5
|
+
export declare class GhostListener {
|
|
6
|
+
private alchemist;
|
|
7
|
+
private currentProcess;
|
|
8
|
+
private outputBuffer;
|
|
9
|
+
private readonly MAX_BUFFER_LINES;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Run a command and watch its output
|
|
13
|
+
*/
|
|
14
|
+
run(command: string, args: string[]): void;
|
|
15
|
+
private addToBuffer;
|
|
16
|
+
private analyzeOutput;
|
|
17
|
+
private handleDetectedError;
|
|
18
|
+
private copyToClipboard;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=GhostListener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.d.ts","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;;IAMxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IA+BjD,OAAO,CAAC,WAAW;YAQL,aAAa;YAUb,mBAAmB;IA2BjC,OAAO,CAAC,eAAe;CAUxB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GhostListener = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const GhostAlchemist_1 = require("./GhostAlchemist");
|
|
6
|
+
const logger_1 = require("../utils/logger");
|
|
7
|
+
/**
|
|
8
|
+
* GhostListener
|
|
9
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
10
|
+
*/
|
|
11
|
+
class GhostListener {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.currentProcess = null;
|
|
14
|
+
this.outputBuffer = [];
|
|
15
|
+
this.MAX_BUFFER_LINES = 100;
|
|
16
|
+
this.alchemist = new GhostAlchemist_1.GhostAlchemist();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run a command and watch its output
|
|
20
|
+
*/
|
|
21
|
+
run(command, args) {
|
|
22
|
+
console.log(`šµļøāāļø [Ghost] Watching: ${command} ${args.join(' ')}\n`);
|
|
23
|
+
this.currentProcess = (0, child_process_1.spawn)(command, args, {
|
|
24
|
+
shell: true,
|
|
25
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
26
|
+
env: { ...process.env, FORCE_COLOR: 'true' } // Keep colors for better detection
|
|
27
|
+
});
|
|
28
|
+
// Handle stdout
|
|
29
|
+
this.currentProcess.stdout?.on('data', (data) => {
|
|
30
|
+
const text = data.toString();
|
|
31
|
+
process.stdout.write(data); // Pass through to user terminal
|
|
32
|
+
this.addToBuffer(text);
|
|
33
|
+
this.analyzeOutput(text);
|
|
34
|
+
});
|
|
35
|
+
// Handle stderr
|
|
36
|
+
this.currentProcess.stderr?.on('data', (data) => {
|
|
37
|
+
const text = data.toString();
|
|
38
|
+
process.stderr.write(data); // Pass through to user terminal
|
|
39
|
+
this.addToBuffer(text);
|
|
40
|
+
this.analyzeOutput(text, true);
|
|
41
|
+
});
|
|
42
|
+
this.currentProcess.on('exit', (code) => {
|
|
43
|
+
console.log(`\nš [Ghost] Process exited with code ${code}`);
|
|
44
|
+
process.exit(code || 0);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
addToBuffer(text) {
|
|
48
|
+
const lines = text.split('\n');
|
|
49
|
+
this.outputBuffer.push(...lines);
|
|
50
|
+
if (this.outputBuffer.length > this.MAX_BUFFER_LINES) {
|
|
51
|
+
this.outputBuffer = this.outputBuffer.slice(-this.MAX_BUFFER_LINES);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async analyzeOutput(text, isErrorStream = false) {
|
|
55
|
+
// Look for error patterns
|
|
56
|
+
const errorKeywords = ['Error:', 'Exception:', 'failed', '500 Internal', 'stack trace', 'FATAL'];
|
|
57
|
+
const hasError = errorKeywords.some(kw => text.includes(kw)) || isErrorStream;
|
|
58
|
+
if (hasError && text.length > 10) {
|
|
59
|
+
this.handleDetectedError(text);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async handleDetectedError(errorSnippet) {
|
|
63
|
+
console.log('\nš» [Ghost] Bug detected! Analyzing...');
|
|
64
|
+
const context = this.outputBuffer.join('\n');
|
|
65
|
+
const diagnosis = await this.alchemist.diagnoseFailure(errorSnippet, context);
|
|
66
|
+
if (diagnosis.confidence > 0.5) {
|
|
67
|
+
const promptToPaste = `GHOST DIAGNOSTIC REPORT š»
|
|
68
|
+
---
|
|
69
|
+
ERROR DETECTED IN TERMINAL:
|
|
70
|
+
${errorSnippet}
|
|
71
|
+
|
|
72
|
+
CONTEXT:
|
|
73
|
+
${context.slice(-500)}
|
|
74
|
+
|
|
75
|
+
SUGGESTED FIX:
|
|
76
|
+
${diagnosis.fix}
|
|
77
|
+
---
|
|
78
|
+
Please apply this fix to the project.`;
|
|
79
|
+
this.copyToClipboard(promptToPaste);
|
|
80
|
+
console.log('⨠[Ghost] Solution generated and copied to CLIPBOARD.');
|
|
81
|
+
console.log(`š” Suggestion: ${diagnosis.fix.substring(0, 100)}...\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
copyToClipboard(text) {
|
|
85
|
+
try {
|
|
86
|
+
// Use Mac native pbcopy
|
|
87
|
+
const child = (0, child_process_1.spawn)('pbcopy');
|
|
88
|
+
child.stdin.write(text);
|
|
89
|
+
child.stdin.end();
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
logger_1.logger.error('Failed to copy to clipboard', e);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.GhostListener = GhostListener;
|
|
97
|
+
//# sourceMappingURL=GhostListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.js","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Diagnosis {
|
|
2
|
+
fix: string;
|
|
3
|
+
confidence: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class GhostAlchemist {
|
|
6
|
+
private model;
|
|
7
|
+
private host;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Synthesize context for token savings
|
|
11
|
+
*/
|
|
12
|
+
synthesize(context: string, goal: string): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Diagnose a failure and suggest a fix
|
|
15
|
+
*/
|
|
16
|
+
diagnoseFailure(error: string, context: string): Promise<Diagnosis>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=GhostAlchemist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.d.ts","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,IAAI,CAAS;;IAOrB;;OAEG;IACU,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBvE;;OAEG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAgBjF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { logger } from '../utils/logger';
|
|
3
|
+
export class GhostAlchemist {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.model = process.env.OLLAMA_GEN_MODEL || 'llama3';
|
|
6
|
+
this.host = process.env.OLLAMA_HOST || 'http://localhost:11434';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Synthesize context for token savings
|
|
10
|
+
*/
|
|
11
|
+
async synthesize(context, goal) {
|
|
12
|
+
try {
|
|
13
|
+
const prompt = `TASK: Synthesize this technical context into a DENSE SEMANTIC SUMMARY for another LLM.\nGOAL: ${goal}\nCONTEXT:\n${context}`;
|
|
14
|
+
const resp = await axios.post(`${this.host}/api/generate`, {
|
|
15
|
+
model: this.model,
|
|
16
|
+
prompt,
|
|
17
|
+
stream: false,
|
|
18
|
+
options: { temperature: 0.1 }
|
|
19
|
+
});
|
|
20
|
+
return resp.data.response.trim();
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
logger.error('Ghost synthesis failed', e);
|
|
24
|
+
return context;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Diagnose a failure and suggest a fix
|
|
29
|
+
*/
|
|
30
|
+
async diagnoseFailure(error, context) {
|
|
31
|
+
try {
|
|
32
|
+
const prompt = `DIAGNOSTIC: Analyze error and context. Return JSON { "fix": "...", "confidence": 0.0-1.0 }\nERROR: ${error}\nCONTEXT: ${context.slice(-2000)}`;
|
|
33
|
+
const resp = await axios.post(`${this.host}/api/generate`, {
|
|
34
|
+
model: this.model,
|
|
35
|
+
prompt,
|
|
36
|
+
stream: false,
|
|
37
|
+
format: 'json',
|
|
38
|
+
options: { temperature: 0 }
|
|
39
|
+
});
|
|
40
|
+
return JSON.parse(resp.data.response);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
logger.error('Ghost diagnostic failed', e);
|
|
44
|
+
return { fix: 'Unable to diagnose', confidence: 0 };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=GhostAlchemist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostAlchemist.js","sourceRoot":"","sources":["../../../src/core/GhostAlchemist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAOzC,MAAM,OAAO,cAAc;IAIzB;QACE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,QAAQ,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,wBAAwB,CAAC;IAClE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,IAAY;QACnD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,iGAAiG,IAAI,eAAe,OAAO,EAAE,CAAC;YAC7I,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE;aAC9B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,OAAe;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sGAAsG,KAAK,cAAc,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/J,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,EAAE;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;aAC5B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GhostListener
|
|
3
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
4
|
+
*/
|
|
5
|
+
export declare class GhostListener {
|
|
6
|
+
private alchemist;
|
|
7
|
+
private currentProcess;
|
|
8
|
+
private outputBuffer;
|
|
9
|
+
private readonly MAX_BUFFER_LINES;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Run a command and watch its output
|
|
13
|
+
*/
|
|
14
|
+
run(command: string, args: string[]): void;
|
|
15
|
+
private addToBuffer;
|
|
16
|
+
private analyzeOutput;
|
|
17
|
+
private handleDetectedError;
|
|
18
|
+
private copyToClipboard;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=GhostListener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.d.ts","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;;IAMxC;;OAEG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IA+BjD,OAAO,CAAC,WAAW;YAQL,aAAa;YAUb,mBAAmB;IA2BjC,OAAO,CAAC,eAAe;CAUxB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { GhostAlchemist } from './GhostAlchemist';
|
|
3
|
+
import { logger } from '../utils/logger';
|
|
4
|
+
/**
|
|
5
|
+
* GhostListener
|
|
6
|
+
* Watches terminal output for errors and provides instant diagnostics.
|
|
7
|
+
*/
|
|
8
|
+
export class GhostListener {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.currentProcess = null;
|
|
11
|
+
this.outputBuffer = [];
|
|
12
|
+
this.MAX_BUFFER_LINES = 100;
|
|
13
|
+
this.alchemist = new GhostAlchemist();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Run a command and watch its output
|
|
17
|
+
*/
|
|
18
|
+
run(command, args) {
|
|
19
|
+
console.log(`šµļøāāļø [Ghost] Watching: ${command} ${args.join(' ')}\n`);
|
|
20
|
+
this.currentProcess = spawn(command, args, {
|
|
21
|
+
shell: true,
|
|
22
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
23
|
+
env: { ...process.env, FORCE_COLOR: 'true' } // Keep colors for better detection
|
|
24
|
+
});
|
|
25
|
+
// Handle stdout
|
|
26
|
+
this.currentProcess.stdout?.on('data', (data) => {
|
|
27
|
+
const text = data.toString();
|
|
28
|
+
process.stdout.write(data); // Pass through to user terminal
|
|
29
|
+
this.addToBuffer(text);
|
|
30
|
+
this.analyzeOutput(text);
|
|
31
|
+
});
|
|
32
|
+
// Handle stderr
|
|
33
|
+
this.currentProcess.stderr?.on('data', (data) => {
|
|
34
|
+
const text = data.toString();
|
|
35
|
+
process.stderr.write(data); // Pass through to user terminal
|
|
36
|
+
this.addToBuffer(text);
|
|
37
|
+
this.analyzeOutput(text, true);
|
|
38
|
+
});
|
|
39
|
+
this.currentProcess.on('exit', (code) => {
|
|
40
|
+
console.log(`\nš [Ghost] Process exited with code ${code}`);
|
|
41
|
+
process.exit(code || 0);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
addToBuffer(text) {
|
|
45
|
+
const lines = text.split('\n');
|
|
46
|
+
this.outputBuffer.push(...lines);
|
|
47
|
+
if (this.outputBuffer.length > this.MAX_BUFFER_LINES) {
|
|
48
|
+
this.outputBuffer = this.outputBuffer.slice(-this.MAX_BUFFER_LINES);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async analyzeOutput(text, isErrorStream = false) {
|
|
52
|
+
// Look for error patterns
|
|
53
|
+
const errorKeywords = ['Error:', 'Exception:', 'failed', '500 Internal', 'stack trace', 'FATAL'];
|
|
54
|
+
const hasError = errorKeywords.some(kw => text.includes(kw)) || isErrorStream;
|
|
55
|
+
if (hasError && text.length > 10) {
|
|
56
|
+
this.handleDetectedError(text);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async handleDetectedError(errorSnippet) {
|
|
60
|
+
console.log('\nš» [Ghost] Bug detected! Analyzing...');
|
|
61
|
+
const context = this.outputBuffer.join('\n');
|
|
62
|
+
const diagnosis = await this.alchemist.diagnoseFailure(errorSnippet, context);
|
|
63
|
+
if (diagnosis.confidence > 0.5) {
|
|
64
|
+
const promptToPaste = `GHOST DIAGNOSTIC REPORT š»
|
|
65
|
+
---
|
|
66
|
+
ERROR DETECTED IN TERMINAL:
|
|
67
|
+
${errorSnippet}
|
|
68
|
+
|
|
69
|
+
CONTEXT:
|
|
70
|
+
${context.slice(-500)}
|
|
71
|
+
|
|
72
|
+
SUGGESTED FIX:
|
|
73
|
+
${diagnosis.fix}
|
|
74
|
+
---
|
|
75
|
+
Please apply this fix to the project.`;
|
|
76
|
+
this.copyToClipboard(promptToPaste);
|
|
77
|
+
console.log('⨠[Ghost] Solution generated and copied to CLIPBOARD.');
|
|
78
|
+
console.log(`š” Suggestion: ${diagnosis.fix.substring(0, 100)}...\n`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
copyToClipboard(text) {
|
|
82
|
+
try {
|
|
83
|
+
// Use Mac native pbcopy
|
|
84
|
+
const child = spawn('pbcopy');
|
|
85
|
+
child.stdin.write(text);
|
|
86
|
+
child.stdin.end();
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
logger.error('Failed to copy to clipboard', e);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=GhostListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GhostListener.js","sourceRoot":"","sources":["../../../src/core/GhostListener.ts"],"names":[],"mappings":"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"}
|