@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.
@@ -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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"}