@codesherlock/codesherlock-alpha-mcp-server 0.0.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.
Files changed (71) hide show
  1. package/.env +9 -0
  2. package/README.md +185 -0
  3. package/build/handlers/analyzeCommitHandler.d.ts +55 -0
  4. package/build/handlers/analyzeCommitHandler.d.ts.map +1 -0
  5. package/build/handlers/analyzeCommitHandler.js +345 -0
  6. package/build/handlers/analyzeCommitHandler.js.map +1 -0
  7. package/build/handlers/events.d.ts +7 -0
  8. package/build/handlers/events.d.ts.map +1 -0
  9. package/build/handlers/events.js +15 -0
  10. package/build/handlers/events.js.map +1 -0
  11. package/build/handlers/resources.d.ts +10 -0
  12. package/build/handlers/resources.d.ts.map +1 -0
  13. package/build/handlers/resources.js +14 -0
  14. package/build/handlers/resources.js.map +1 -0
  15. package/build/handlers/tools.d.ts +6 -0
  16. package/build/handlers/tools.d.ts.map +1 -0
  17. package/build/handlers/tools.js +24 -0
  18. package/build/handlers/tools.js.map +1 -0
  19. package/build/index.d.ts +3 -0
  20. package/build/index.d.ts.map +1 -0
  21. package/build/index.js +82 -0
  22. package/build/index.js.map +1 -0
  23. package/build/schemas/toolSchemas.d.ts +40 -0
  24. package/build/schemas/toolSchemas.d.ts.map +1 -0
  25. package/build/schemas/toolSchemas.js +42 -0
  26. package/build/schemas/toolSchemas.js.map +1 -0
  27. package/build/services/backendApiService.d.ts +81 -0
  28. package/build/services/backendApiService.d.ts.map +1 -0
  29. package/build/services/backendApiService.js +211 -0
  30. package/build/services/backendApiService.js.map +1 -0
  31. package/build/services/commitReviewService.d.ts +61 -0
  32. package/build/services/commitReviewService.d.ts.map +1 -0
  33. package/build/services/commitReviewService.js +306 -0
  34. package/build/services/commitReviewService.js.map +1 -0
  35. package/build/services/gitService.d.ts +120 -0
  36. package/build/services/gitService.d.ts.map +1 -0
  37. package/build/services/gitService.js +360 -0
  38. package/build/services/gitService.js.map +1 -0
  39. package/build/services/loggingService.d.ts +64 -0
  40. package/build/services/loggingService.d.ts.map +1 -0
  41. package/build/services/loggingService.js +185 -0
  42. package/build/services/loggingService.js.map +1 -0
  43. package/build/services/zipService.d.ts +9 -0
  44. package/build/services/zipService.d.ts.map +1 -0
  45. package/build/services/zipService.js +47 -0
  46. package/build/services/zipService.js.map +1 -0
  47. package/build/tests/backendApiService.test.d.ts +2 -0
  48. package/build/tests/backendApiService.test.d.ts.map +1 -0
  49. package/build/tests/backendApiService.test.js +109 -0
  50. package/build/tests/backendApiService.test.js.map +1 -0
  51. package/build/tests/commitReviewService.test.d.ts +2 -0
  52. package/build/tests/commitReviewService.test.d.ts.map +1 -0
  53. package/build/tests/commitReviewService.test.js +118 -0
  54. package/build/tests/commitReviewService.test.js.map +1 -0
  55. package/build/tests/loggingService.test.d.ts +2 -0
  56. package/build/tests/loggingService.test.d.ts.map +1 -0
  57. package/build/tests/loggingService.test.js +156 -0
  58. package/build/tests/loggingService.test.js.map +1 -0
  59. package/build/tests/setup.test.d.ts +2 -0
  60. package/build/tests/setup.test.d.ts.map +1 -0
  61. package/build/tests/setup.test.js +7 -0
  62. package/build/tests/setup.test.js.map +1 -0
  63. package/build/utils/analysisFormatter.d.ts +40 -0
  64. package/build/utils/analysisFormatter.d.ts.map +1 -0
  65. package/build/utils/analysisFormatter.js +97 -0
  66. package/build/utils/analysisFormatter.js.map +1 -0
  67. package/build/utils/errorExtractor.d.ts +36 -0
  68. package/build/utils/errorExtractor.d.ts.map +1 -0
  69. package/build/utils/errorExtractor.js +178 -0
  70. package/build/utils/errorExtractor.js.map +1 -0
  71. package/package.json +53 -0
@@ -0,0 +1,47 @@
1
+ import archiver from 'archiver';
2
+ import { Writable } from 'stream';
3
+ import { logger } from './loggingService.js';
4
+ export class ZipService {
5
+ /**
6
+ * Zips the provided data into a file named 'files.json' within the archive.
7
+ * @param data - The data to be zipped (will be stringified to JSON)
8
+ * @returns Buffer containing the zip file
9
+ */
10
+ async createZip(data) {
11
+ try {
12
+ logger.logInfo('Creating zip archive');
13
+ const chunks = [];
14
+ // Create a writable stream to capture the zip output in memory
15
+ const output = new Writable({
16
+ write(chunk, encoding, callback) {
17
+ chunks.push(Buffer.from(chunk));
18
+ callback();
19
+ }
20
+ });
21
+ const archive = archiver('zip', {
22
+ zlib: { level: 9 } // Maximum compression
23
+ });
24
+ return new Promise((resolve, reject) => {
25
+ output.on('finish', () => {
26
+ const result = Buffer.concat(chunks);
27
+ logger.logInfo(`Zip archive created successfully. Size: ${result.length} bytes`);
28
+ resolve(result);
29
+ });
30
+ archive.on('error', (err) => {
31
+ logger.logError('Error creating zip archive', err);
32
+ reject(err);
33
+ });
34
+ archive.pipe(output);
35
+ // The Python endpoint expects 'files.json'
36
+ logger.logInfo('Appending files.json to archive');
37
+ archive.append(JSON.stringify(data, null, 2), { name: 'files.json' });
38
+ archive.finalize();
39
+ });
40
+ }
41
+ catch (error) {
42
+ logger.logError('Unexpected error in createZip', error);
43
+ throw error;
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=zipService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipService.js","sourceRoot":"","sources":["../../src/services/zipService.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,OAAO,UAAU;IACnB;;;;OAIG;IACH,KAAK,CAAC,SAAS,CAAC,IAAS;QACrB,IAAI,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YACvC,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,+DAA+D;YAC/D,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC;gBACxB,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ;oBAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAChC,QAAQ,EAAE,CAAC;gBACf,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE;gBAC5B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,sBAAsB;aAC5C,CAAC,CAAC;YAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACnC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACrB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACrC,MAAM,CAAC,OAAO,CAAC,2CAA2C,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC;oBACjF,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpB,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACxB,MAAM,CAAC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;oBACnD,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAErB,2CAA2C;gBAC3C,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;gBAEtE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,CAAC,+BAA+B,EAAE,KAAc,CAAC,CAAC;YACjE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backendApiService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendApiService.test.d.ts","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,109 @@
1
+ import { BackendApiService } from '../services/backendApiService.js';
2
+ import { logger } from '../services/loggingService.js';
3
+ import WebSocket from 'ws';
4
+ import JSZip from 'jszip';
5
+ // Mock dependencies
6
+ jest.mock('../services/loggingService');
7
+ jest.mock('ws');
8
+ jest.mock('jszip');
9
+ // Mock global fetch
10
+ global.fetch = jest.fn();
11
+ describe('BackendApiService', () => {
12
+ let backendApiService;
13
+ const baseUrl = 'http://api.example.com';
14
+ const apiKey = 'test-api-key';
15
+ beforeEach(() => {
16
+ jest.clearAllMocks();
17
+ backendApiService = new BackendApiService(baseUrl, apiKey);
18
+ // Mock JSZip implementation
19
+ JSZip.mockImplementation(() => ({
20
+ file: jest.fn(),
21
+ generateAsync: jest.fn().mockResolvedValue(Buffer.from('zip-content')),
22
+ }));
23
+ });
24
+ describe('submitCommitReview', () => {
25
+ const mockParams = {
26
+ factor: 'power_analysis',
27
+ user_id: 'user123',
28
+ repo_name: 'test-repo',
29
+ commit_id: 'commit123',
30
+ username: 'tester',
31
+ files_json: JSON.stringify([{ file: 'test.ts' }]),
32
+ organization_name: 'org1',
33
+ };
34
+ it('should submit review successfully', async () => {
35
+ const mockResponseData = { analysis_id: 'analysis123' };
36
+ global.fetch.mockResolvedValue({
37
+ ok: true,
38
+ json: jest.fn().mockResolvedValue(mockResponseData),
39
+ });
40
+ const result = await backendApiService.submitCommitReview(mockParams);
41
+ expect(result.success).toBe(true);
42
+ expect(result.analysisId).toBe('analysis123');
43
+ expect(global.fetch).toHaveBeenCalledWith(`${baseUrl}/v2/commit-review/power_analysis`, expect.objectContaining({
44
+ method: 'POST',
45
+ headers: expect.objectContaining({
46
+ Authorization: `Bearer ${apiKey}`,
47
+ }),
48
+ body: expect.any(FormData),
49
+ }));
50
+ });
51
+ it('should handle HTTP errors', async () => {
52
+ global.fetch.mockResolvedValue({
53
+ ok: false,
54
+ status: 500,
55
+ text: jest.fn().mockResolvedValue('Internal Server Error'),
56
+ });
57
+ await expect(backendApiService.submitCommitReview(mockParams)).rejects.toThrow('HTTP error! status: 500, body: Internal Server Error');
58
+ expect(logger.logError).toHaveBeenCalled();
59
+ });
60
+ it('should handle network errors', async () => {
61
+ const networkError = new Error('Network error');
62
+ global.fetch.mockRejectedValue(networkError);
63
+ await expect(backendApiService.submitCommitReview(mockParams)).rejects.toThrow(networkError);
64
+ expect(logger.logError).toHaveBeenCalled();
65
+ });
66
+ });
67
+ describe('connectWebSocket', () => {
68
+ let mockWs;
69
+ beforeEach(() => {
70
+ mockWs = {
71
+ on: jest.fn(),
72
+ close: jest.fn(),
73
+ };
74
+ WebSocket.mockImplementation(() => mockWs);
75
+ });
76
+ it('should connect to WebSocket successfully', async () => {
77
+ const userId = 'user123';
78
+ const connectPromise = backendApiService.connectWebSocket(userId, jest.fn());
79
+ // Simulate 'open' event
80
+ const openCallback = mockWs.on.mock.calls.find((call) => call[0] === 'open')[1];
81
+ openCallback();
82
+ const ws = await connectPromise;
83
+ expect(ws).toBe(mockWs);
84
+ expect(WebSocket).toHaveBeenCalledWith(expect.stringContaining(`ws://api.example.com/v2/ws/${userId}`));
85
+ });
86
+ it('should handle WebSocket messages', async () => {
87
+ const onMessage = jest.fn();
88
+ const connectPromise = backendApiService.connectWebSocket('user123', onMessage);
89
+ // Open connection
90
+ const openCallback = mockWs.on.mock.calls.find((call) => call[0] === 'open')[1];
91
+ openCallback();
92
+ await connectPromise;
93
+ // Simulate message
94
+ const messageCallback = mockWs.on.mock.calls.find((call) => call[0] === 'message')[1];
95
+ const mockData = JSON.stringify({ status_code: 200, content: { status: 'complete' } });
96
+ messageCallback(Buffer.from(mockData));
97
+ expect(onMessage).toHaveBeenCalledWith(expect.objectContaining({ status_code: 200 }));
98
+ });
99
+ it('should handle WebSocket errors during connection', async () => {
100
+ const connectPromise = backendApiService.connectWebSocket('user123', jest.fn());
101
+ // Simulate error
102
+ const errorCallback = mockWs.on.mock.calls.find((call) => call[0] === 'error')[1];
103
+ const error = new Error('Connection failed');
104
+ errorCallback(error);
105
+ await expect(connectPromise).rejects.toThrow('Connection failed');
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=backendApiService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendApiService.test.js","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commitReviewService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitReviewService.test.d.ts","sourceRoot":"","sources":["../../src/tests/commitReviewService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
1
+ import { CommitReviewService } from '../services/commitReviewService.js';
2
+ import { BackendApiService } from '../services/backendApiService.js';
3
+ // Mock dependencies
4
+ jest.mock('../services/backendApiService');
5
+ jest.mock('../services/loggingService');
6
+ describe('CommitReviewService', () => {
7
+ let commitReviewService;
8
+ let mockBackendApiService;
9
+ beforeEach(() => {
10
+ jest.clearAllMocks();
11
+ mockBackendApiService = new BackendApiService('url');
12
+ commitReviewService = new CommitReviewService(mockBackendApiService);
13
+ });
14
+ describe('submitAndWaitForResults', () => {
15
+ const mockParams = {
16
+ factor: 'power_analysis',
17
+ user_id: 'user123',
18
+ repo_name: 'test-repo',
19
+ commit_id: 'commit123',
20
+ username: 'tester',
21
+ file_changes: [],
22
+ organization_name: 'org1',
23
+ };
24
+ it('should submit review and collect results successfully', async () => {
25
+ // Mock submitCommitReview response
26
+ mockBackendApiService.submitCommitReview.mockResolvedValue({
27
+ success: true,
28
+ analysisId: 'analysis123',
29
+ message: 'Submitted',
30
+ });
31
+ // Mock connectWebSocket to simulate receiving results
32
+ mockBackendApiService.connectWebSocket.mockImplementation((userId, onMessage) => {
33
+ // Simulate message delivery asynchronously but deterministically
34
+ Promise.resolve().then(() => {
35
+ // 1. Send result message
36
+ onMessage({
37
+ status_code: 200,
38
+ content: {
39
+ analysis_type: 'commit_review',
40
+ analysis: { issue: 'bug' },
41
+ language: 'ts',
42
+ file_name: 'test.ts',
43
+ is_complete: false,
44
+ },
45
+ analysis_id: 123,
46
+ });
47
+ // 2. Send completion message
48
+ onMessage({
49
+ status_code: 200,
50
+ content: {
51
+ analysis_type: 'commit_review',
52
+ status: 'complete',
53
+ is_complete: true,
54
+ },
55
+ });
56
+ });
57
+ return Promise.resolve({});
58
+ });
59
+ const result = await commitReviewService.submitAndWaitForResults(mockParams);
60
+ expect(result.success).toBe(true);
61
+ expect(result.analysisId).toBe('analysis123');
62
+ expect(result.results).toHaveLength(1);
63
+ expect(result.results?.[0]).toEqual({
64
+ analysis: { issue: 'bug' },
65
+ language: 'ts',
66
+ file_name: 'test.ts',
67
+ analysisId: 123,
68
+ });
69
+ expect(mockBackendApiService.submitCommitReview).toHaveBeenCalled();
70
+ expect(mockBackendApiService.connectWebSocket).toHaveBeenCalled();
71
+ });
72
+ it('should handle WebSocket errors', async () => {
73
+ mockBackendApiService.submitCommitReview.mockResolvedValue({
74
+ success: true,
75
+ analysisId: 'analysis123',
76
+ });
77
+ mockBackendApiService.connectWebSocket.mockImplementation((userId, onMessage, onError) => {
78
+ setTimeout(() => {
79
+ if (onError)
80
+ onError(new Error('WebSocket error'));
81
+ }, 10);
82
+ return Promise.resolve({});
83
+ });
84
+ const result = await commitReviewService.submitAndWaitForResults(mockParams);
85
+ expect(result.success).toBe(false);
86
+ expect(result.error).toContain('WebSocket error');
87
+ });
88
+ it('should handle backend submission failure', async () => {
89
+ const error = new Error('Submission failed');
90
+ mockBackendApiService.submitCommitReview.mockRejectedValue(error);
91
+ // Mock WS to just hang or resolve immediately to avoid blocking,
92
+ // but the error in submit should trigger catch block
93
+ mockBackendApiService.connectWebSocket.mockImplementation(() => Promise.resolve({}));
94
+ const result = await commitReviewService.submitAndWaitForResults(mockParams);
95
+ expect(result.success).toBe(false);
96
+ expect(result.error).toBe('Submission failed');
97
+ });
98
+ it('should handle non-200 status code in WebSocket message', async () => {
99
+ mockBackendApiService.submitCommitReview.mockResolvedValue({
100
+ success: true,
101
+ analysisId: 'analysis123',
102
+ });
103
+ mockBackendApiService.connectWebSocket.mockImplementation((userId, onMessage) => {
104
+ setTimeout(() => {
105
+ onMessage({
106
+ status_code: 400,
107
+ error_message: 'Bad Request',
108
+ });
109
+ }, 10);
110
+ return Promise.resolve({});
111
+ });
112
+ const result = await commitReviewService.submitAndWaitForResults(mockParams);
113
+ expect(result.success).toBe(false);
114
+ expect(result.error).toBe('Bad Request');
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=commitReviewService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitReviewService.test.js","sourceRoot":"","sources":["../../src/tests/commitReviewService.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;AAC3C,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AAExC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,mBAAwC,CAAC;IAC7C,IAAI,qBAAqD,CAAC;IAE1D,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,qBAAqB,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAmC,CAAC;QACvF,mBAAmB,GAAG,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACrC,MAAM,UAAU,GAA6B;YACzC,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,EAAE;YAChB,iBAAiB,EAAE,MAAM;SAC5B,CAAC;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACnE,mCAAmC;YACnC,qBAAqB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;gBACvD,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,aAAa;gBACzB,OAAO,EAAE,WAAW;aACvB,CAAC,CAAC;YAEH,sDAAsD;YACtD,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBAC5E,iEAAiE;gBACjE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBACxB,yBAAyB;oBACzB,SAAS,CAAC;wBACN,WAAW,EAAE,GAAG;wBAChB,OAAO,EAAE;4BACL,aAAa,EAAE,eAAe;4BAC9B,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;4BAC1B,QAAQ,EAAE,IAAI;4BACd,SAAS,EAAE,SAAS;4BACpB,WAAW,EAAE,KAAK;yBACrB;wBACD,WAAW,EAAE,GAAG;qBACnB,CAAC,CAAC;oBAEH,6BAA6B;oBAC7B,SAAS,CAAC;wBACN,WAAW,EAAE,GAAG;wBAChB,OAAO,EAAE;4BACL,aAAa,EAAE,eAAe;4BAC9B,MAAM,EAAE,UAAU;4BAClB,WAAW,EAAE,IAAI;yBACpB;qBACJ,CAAC,CAAC;gBACP,CAAC,CAAC,CAAC;gBACH,OAAO,OAAO,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBAChC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC1B,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,GAAG;aAClB,CAAC,CAAC;YACH,MAAM,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACpE,MAAM,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC5C,qBAAqB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;gBACvD,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,aAAa;aAC5B,CAAC,CAAC;YAEH,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;gBACrF,UAAU,CAAC,GAAG,EAAE;oBACZ,IAAI,OAAO;wBAAE,OAAO,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBACvD,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,OAAO,OAAO,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC7C,qBAAqB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAElE,kEAAkE;YAClE,qDAAqD;YACrD,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACpE,qBAAqB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;gBACvD,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,aAAa;aAC5B,CAAC,CAAC;YAEH,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;gBAC5E,UAAU,CAAC,GAAG,EAAE;oBACZ,SAAS,CAAC;wBACN,WAAW,EAAE,GAAG;wBAChB,aAAa,EAAE,aAAa;qBAC/B,CAAC,CAAC;gBACP,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,OAAO,OAAO,CAAC,OAAO,CAAC,EAAS,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loggingService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loggingService.test.d.ts","sourceRoot":"","sources":["../../src/tests/loggingService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ import { LoggingService } from '../services/loggingService.js';
2
+ import * as appInsights from 'applicationinsights';
3
+ // Mock applicationinsights
4
+ jest.mock('applicationinsights', () => {
5
+ const trackTrace = jest.fn();
6
+ const trackException = jest.fn();
7
+ const trackEvent = jest.fn();
8
+ const trackMetric = jest.fn();
9
+ const trackDependency = jest.fn();
10
+ const flush = jest.fn();
11
+ return {
12
+ setup: jest.fn().mockReturnThis(),
13
+ setAutoDependencyCorrelation: jest.fn().mockReturnThis(),
14
+ setAutoCollectRequests: jest.fn().mockReturnThis(),
15
+ setAutoCollectPerformance: jest.fn().mockReturnThis(),
16
+ setAutoCollectExceptions: jest.fn().mockReturnThis(),
17
+ setAutoCollectDependencies: jest.fn().mockReturnThis(),
18
+ setAutoCollectConsole: jest.fn().mockReturnThis(),
19
+ setUseDiskRetryCaching: jest.fn().mockReturnThis(),
20
+ setSendLiveMetrics: jest.fn().mockReturnThis(),
21
+ start: jest.fn(),
22
+ defaultClient: {
23
+ trackTrace,
24
+ trackException,
25
+ trackEvent,
26
+ trackMetric,
27
+ trackDependency,
28
+ flush,
29
+ },
30
+ TelemetryClient: jest.fn(),
31
+ };
32
+ });
33
+ describe('LoggingService', () => {
34
+ let loggingService;
35
+ let consoleErrorSpy;
36
+ let consoleWarnSpy;
37
+ beforeEach(() => {
38
+ // Reset singleton instance if possible or just get the instance
39
+ // Since it's a singleton, we might need to be careful.
40
+ // However, for unit tests, we can just get the instance.
41
+ loggingService = LoggingService.getInstance();
42
+ // Spy on console methods to avoid cluttering test output and to verify calls
43
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
44
+ consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => { });
45
+ // Reset mocks
46
+ jest.clearAllMocks();
47
+ });
48
+ afterEach(() => {
49
+ consoleErrorSpy.mockRestore();
50
+ consoleWarnSpy.mockRestore();
51
+ });
52
+ describe('initialization', () => {
53
+ it('should initialize successfully with a connection string', () => {
54
+ // We need to access the private property 'isInitialized' or reset it if we want to test init multiple times
55
+ // Since we can't easily reset private state without casting to any, we'll try to initialize
56
+ // If it's already initialized from a previous test run (singleton), this might hit the "already initialized" path
57
+ // Force reset for testing purposes
58
+ loggingService.isInitialized = false;
59
+ loggingService.client = null;
60
+ loggingService.initialize('fake-connection-string');
61
+ expect(appInsights.setup).toHaveBeenCalledWith('fake-connection-string');
62
+ expect(appInsights.start).toHaveBeenCalled();
63
+ expect(loggingService.isInitialized).toBe(true);
64
+ });
65
+ it('should log error if no connection string provided', () => {
66
+ loggingService.isInitialized = false;
67
+ loggingService.initialize(undefined);
68
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Application Insights connection string not provided'));
69
+ expect(appInsights.setup).not.toHaveBeenCalled();
70
+ });
71
+ it('should warn if already initialized', () => {
72
+ loggingService.isInitialized = true;
73
+ loggingService.initialize('another-string');
74
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Logging service already initialized');
75
+ expect(appInsights.setup).not.toHaveBeenCalled();
76
+ });
77
+ });
78
+ describe('logging methods', () => {
79
+ beforeEach(() => {
80
+ // Ensure service is "initialized" with a mock client for these tests
81
+ loggingService.isInitialized = true;
82
+ loggingService.client = appInsights.defaultClient;
83
+ });
84
+ it('logInfo should track trace with severity 1', () => {
85
+ loggingService.logInfo('test info', { key: 'value' });
86
+ expect(appInsights.defaultClient.trackTrace).toHaveBeenCalledWith({
87
+ message: 'test info',
88
+ severity: 1,
89
+ properties: { key: 'value' },
90
+ });
91
+ });
92
+ it('logWarning should track trace with severity 2', () => {
93
+ loggingService.logWarning('test warning', { key: 'value' });
94
+ expect(appInsights.defaultClient.trackTrace).toHaveBeenCalledWith({
95
+ message: 'test warning',
96
+ severity: 2,
97
+ properties: { key: 'value' },
98
+ });
99
+ });
100
+ it('logError should track exception if error object provided', () => {
101
+ const error = new Error('test error');
102
+ loggingService.logError('error message', error, { key: 'value' });
103
+ expect(appInsights.defaultClient.trackException).toHaveBeenCalledWith({
104
+ exception: error,
105
+ properties: { key: 'value', customMessage: 'error message' },
106
+ });
107
+ });
108
+ it('logError should track trace with severity 3 if no error object provided', () => {
109
+ loggingService.logError('error message', undefined, { key: 'value' });
110
+ expect(appInsights.defaultClient.trackTrace).toHaveBeenCalledWith({
111
+ message: 'error message',
112
+ severity: 3,
113
+ properties: { key: 'value' },
114
+ });
115
+ });
116
+ it('logEvent should track event', () => {
117
+ loggingService.logEvent('test event', { prop: 'val' }, { measure: 1 });
118
+ expect(appInsights.defaultClient.trackEvent).toHaveBeenCalledWith({
119
+ name: 'test event',
120
+ properties: { prop: 'val' },
121
+ measurements: { measure: 1 },
122
+ });
123
+ });
124
+ it('trackMetric should track metric', () => {
125
+ loggingService.trackMetric('test metric', 100, { prop: 'val' });
126
+ expect(appInsights.defaultClient.trackMetric).toHaveBeenCalledWith({
127
+ name: 'test metric',
128
+ value: 100,
129
+ properties: { prop: 'val' },
130
+ });
131
+ });
132
+ it('trackDependency should track dependency', () => {
133
+ loggingService.trackDependency('dep name', 'command', 100, true, 'SQL');
134
+ expect(appInsights.defaultClient.trackDependency).toHaveBeenCalledWith({
135
+ name: 'dep name',
136
+ data: 'command',
137
+ duration: 100,
138
+ success: true,
139
+ dependencyTypeName: 'SQL',
140
+ });
141
+ });
142
+ });
143
+ describe('flush', () => {
144
+ it('should flush telemetry', async () => {
145
+ loggingService.client = appInsights.defaultClient;
146
+ // Mock setTimeout to execute immediately
147
+ jest.useFakeTimers();
148
+ const flushPromise = loggingService.flush();
149
+ jest.runAllTimers();
150
+ await flushPromise;
151
+ jest.useRealTimers();
152
+ expect(appInsights.defaultClient.flush).toHaveBeenCalled();
153
+ });
154
+ });
155
+ });
156
+ //# sourceMappingURL=loggingService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loggingService.test.js","sourceRoot":"","sources":["../../src/tests/loggingService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.test.d.ts","sourceRoot":"","sources":["../../src/tests/setup.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ describe('Unit Testing Setup', () => {
2
+ it('should pass this dummy test', () => {
3
+ expect(true).toBe(true);
4
+ });
5
+ });
6
+ export {};
7
+ //# sourceMappingURL=setup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/tests/setup.test.ts"],"names":[],"mappings":"AAAA,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Analysis Formatter Utility
3
+ * Converts analysis JSON to markdown format
4
+ */
5
+ export interface IssueItem {
6
+ issue: string;
7
+ uid: string;
8
+ start_line?: string | number;
9
+ end_line?: string | number;
10
+ issue_code_snippet?: string;
11
+ severity: string;
12
+ solution: string;
13
+ solution_code_snippet?: string;
14
+ }
15
+ export interface CharacteristicAnalysis {
16
+ characteristic: string;
17
+ description_of_characteristic: string;
18
+ issue_items?: IssueItem[];
19
+ }
20
+ /**
21
+ * Converts a single issue dictionary into markdown format
22
+ */
23
+ export declare function jsonToMdIssue(issueItem: IssueItem, codeLanguage?: string, characteristic?: string): string;
24
+ /**
25
+ * Processes a list of analysis characteristics into markdown format
26
+ */
27
+ export declare function jsonToMdAnalysis(jsonList: (CharacteristicAnalysis | null)[], codeLanguage?: string): string;
28
+ /**
29
+ * Formats a single file analysis result to markdown
30
+ */
31
+ export declare function formatFileAnalysisToMarkdown(analysis: any, language?: string, fileName?: string): string;
32
+ /**
33
+ * Formats multiple file analysis results to markdown
34
+ */
35
+ export declare function formatMultipleFileAnalysisToMarkdown(analysisResults: Array<{
36
+ analysis: any;
37
+ language?: string;
38
+ file_name: string;
39
+ }>): string;
40
+ //# sourceMappingURL=analysisFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysisFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/analysisFormatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,6BAA6B,EAAE,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,SAAS,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,SAAS,EAAE,SAAS,EACpB,YAAY,GAAE,MAAW,EACzB,cAAc,GAAE,MAAW,GAC5B,MAAM,CA6BR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,CAAC,sBAAsB,GAAG,IAAI,CAAC,EAAE,EAC3C,YAAY,GAAE,MAAW,GAC1B,MAAM,CA2CR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,QAAQ,EAAE,GAAG,EACb,QAAQ,GAAE,MAAW,EACrB,QAAQ,GAAE,MAAW,GACtB,MAAM,CAcR;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAChD,eAAe,EAAE,KAAK,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC,GACH,MAAM,CAcR"}