codeatlas-mcp-server 2.20.2
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/LICENSE +21 -0
- package/README.md +338 -0
- package/dist/index.js +261 -0
- package/dist/index.js.map +1 -0
- package/dist/src/analyzer/parser.js +1072 -0
- package/dist/src/analyzer/parser.js.map +1 -0
- package/dist/src/analyzer/parser.test.js +73 -0
- package/dist/src/analyzer/parser.test.js.map +1 -0
- package/dist/src/analyzer/phpParser.js +147 -0
- package/dist/src/analyzer/phpParser.js.map +1 -0
- package/dist/src/analyzer/pythonParser.js +185 -0
- package/dist/src/analyzer/pythonParser.js.map +1 -0
- package/dist/src/analyzer/types.js +2 -0
- package/dist/src/analyzer/types.js.map +1 -0
- package/dist/src/context.js +3 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/memoryGenerator.js +293 -0
- package/dist/src/memoryGenerator.js.map +1 -0
- package/dist/src/oracleDatabase.js +298 -0
- package/dist/src/oracleDatabase.js.map +1 -0
- package/dist/src/presentation/httpServer.js +306 -0
- package/dist/src/presentation/httpServer.js.map +1 -0
- package/dist/src/presentation/mcpServer.js +1487 -0
- package/dist/src/presentation/mcpServer.js.map +1 -0
- package/dist/src/repositories.js +144 -0
- package/dist/src/repositories.js.map +1 -0
- package/dist/src/securityScanner.js +69 -0
- package/dist/src/securityScanner.js.map +1 -0
- package/dist/src/services/authService.js +24 -0
- package/dist/src/services/authService.js.map +1 -0
- package/dist/src/services/dreamingService.js +119 -0
- package/dist/src/services/dreamingService.js.map +1 -0
- package/dist/src/services/dreamingService.test.js +179 -0
- package/dist/src/services/dreamingService.test.js.map +1 -0
- package/dist/src/services/projectService.js +1068 -0
- package/dist/src/services/projectService.js.map +1 -0
- package/dist/src/services/projectService.test.js +217 -0
- package/dist/src/services/projectService.test.js.map +1 -0
- package/dist/src/services/watcherService.js +164 -0
- package/dist/src/services/watcherService.js.map +1 -0
- package/dist/src/services/watcherService.test.js +65 -0
- package/dist/src/services/watcherService.test.js.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { describe, it, mock, before, beforeEach, afterEach } from "node:test";
|
|
2
|
+
import * as assert from "node:assert";
|
|
3
|
+
let requestMock;
|
|
4
|
+
let apiKeyMock;
|
|
5
|
+
function mockSuccessResponse(statusCode, body, capture) {
|
|
6
|
+
const bodyStr = typeof body === "string" ? body : JSON.stringify(body);
|
|
7
|
+
return (options, callback) => {
|
|
8
|
+
if (capture)
|
|
9
|
+
capture.options = options;
|
|
10
|
+
const mockRes = { statusCode, on(event, handler) { if (event === "data")
|
|
11
|
+
handler(bodyStr); if (event === "end")
|
|
12
|
+
handler(); } };
|
|
13
|
+
const mockReq = { _errorHandler: null, on(event, handler) { if (event === "error")
|
|
14
|
+
mockReq._errorHandler = handler; return mockReq; }, write(data) { if (capture)
|
|
15
|
+
capture.written = String(data); }, end() { callback(mockRes); } };
|
|
16
|
+
return mockReq;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function mockNetworkError(message) {
|
|
20
|
+
return (_options, _callback) => {
|
|
21
|
+
const mockReq = { _errorHandler: null, on(event, handler) { if (event === "error")
|
|
22
|
+
mockReq._errorHandler = handler; return mockReq; }, write() { }, end() { setImmediate(() => { if (mockReq._errorHandler)
|
|
23
|
+
mockReq._errorHandler(new Error(message)); }); } };
|
|
24
|
+
return mockReq;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
describe("Dreaming Service - HTTPS Client", () => {
|
|
28
|
+
let dreamingService;
|
|
29
|
+
before(async () => {
|
|
30
|
+
mock.module("https", {
|
|
31
|
+
namedExports: {
|
|
32
|
+
request(options, callback) {
|
|
33
|
+
if (!requestMock)
|
|
34
|
+
throw new Error("requestMock is not set - did you forget to assign it in a test?");
|
|
35
|
+
return requestMock(options, callback);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
mock.module("./projectService.js", {
|
|
40
|
+
namedExports: { getResolvedApiKey() { return apiKeyMock; } },
|
|
41
|
+
});
|
|
42
|
+
dreamingService = await import("./dreamingService.js");
|
|
43
|
+
});
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
apiKeyMock = "test-mock-key";
|
|
46
|
+
requestMock = null;
|
|
47
|
+
delete process.env.CODEATLAS_API_KEY;
|
|
48
|
+
});
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
apiKeyMock = undefined;
|
|
51
|
+
requestMock = null;
|
|
52
|
+
});
|
|
53
|
+
// ----- saveDreamMemory -----
|
|
54
|
+
describe("saveDreamMemory()", () => {
|
|
55
|
+
it("returns success when API responds 200 with id", async () => {
|
|
56
|
+
requestMock = mockSuccessResponse(200, { id: "dream-42" });
|
|
57
|
+
const result = await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
|
|
58
|
+
assert.deepStrictEqual(result, { success: true, id: "dream-42" });
|
|
59
|
+
});
|
|
60
|
+
it("uses dreamId when id is absent", async () => {
|
|
61
|
+
requestMock = mockSuccessResponse(200, { dreamId: "alt-99" });
|
|
62
|
+
const result = await dreamingService.saveDreamMemory({ memory_type: "KNOWLEDGE", content: "test" });
|
|
63
|
+
assert.deepStrictEqual(result, { success: true, id: "alt-99" });
|
|
64
|
+
});
|
|
65
|
+
it("falls back to unknown when no id in response", async () => {
|
|
66
|
+
requestMock = mockSuccessResponse(200, { ok: true });
|
|
67
|
+
const result = await dreamingService.saveDreamMemory({ memory_type: "PATTERN", content: "test" });
|
|
68
|
+
assert.deepStrictEqual(result, { success: true, id: "unknown" });
|
|
69
|
+
});
|
|
70
|
+
it("throws on 4xx", async () => {
|
|
71
|
+
requestMock = mockSuccessResponse(401, "Unauthorized");
|
|
72
|
+
await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Failed to save dream memory: status 401/ });
|
|
73
|
+
});
|
|
74
|
+
it("throws on 5xx", async () => {
|
|
75
|
+
requestMock = mockSuccessResponse(500, "Error");
|
|
76
|
+
await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Failed to save dream memory: status 500/ });
|
|
77
|
+
});
|
|
78
|
+
it("throws on network error", async () => {
|
|
79
|
+
requestMock = mockNetworkError("ECONNREFUSED");
|
|
80
|
+
await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /Network Error: ECONNREFUSED/ });
|
|
81
|
+
});
|
|
82
|
+
it("throws when CODEATLAS_API_KEY is not set", async () => {
|
|
83
|
+
apiKeyMock = undefined;
|
|
84
|
+
await assert.rejects(() => dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" }), { message: /CODEATLAS_API_KEY is not set/ });
|
|
85
|
+
});
|
|
86
|
+
it("sends body fields", async () => {
|
|
87
|
+
const capture = {};
|
|
88
|
+
requestMock = mockSuccessResponse(200, { id: "x" }, capture);
|
|
89
|
+
await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test body", importance: 9, session_id: "s-1", project: "p" });
|
|
90
|
+
const parsed = JSON.parse(capture.written);
|
|
91
|
+
assert.strictEqual(parsed.memory_type, "MISTAKE");
|
|
92
|
+
assert.strictEqual(parsed.content, "test body");
|
|
93
|
+
assert.strictEqual(parsed.importance, 9);
|
|
94
|
+
assert.strictEqual(parsed.session_id, "s-1");
|
|
95
|
+
assert.strictEqual(parsed.project, "p");
|
|
96
|
+
});
|
|
97
|
+
it("sends apiKey in query param and x-api-key header", async () => {
|
|
98
|
+
process.env.CODEATLAS_API_KEY = "key-sentinel";
|
|
99
|
+
const capture = {};
|
|
100
|
+
requestMock = mockSuccessResponse(200, { id: "x" }, capture);
|
|
101
|
+
await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
|
|
102
|
+
const opts = capture.options;
|
|
103
|
+
assert.ok(String(opts.path).includes("apiKey=key-sentinel"), `path should contain apiKey, got: ${opts.path}`);
|
|
104
|
+
assert.strictEqual(opts.headers["x-api-key"], "key-sentinel");
|
|
105
|
+
});
|
|
106
|
+
it("sends Chrome User-Agent", async () => {
|
|
107
|
+
const capture = {};
|
|
108
|
+
requestMock = mockSuccessResponse(200, { id: "x" }, capture);
|
|
109
|
+
await dreamingService.saveDreamMemory({ memory_type: "MISTAKE", content: "test" });
|
|
110
|
+
assert.ok(String(capture.options.headers["User-Agent"]).includes("Chrome/125.0.0.0"));
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
// ----- queryDreamMemories -----
|
|
114
|
+
describe("queryDreamMemories()", () => {
|
|
115
|
+
it("returns memories array from API", async () => {
|
|
116
|
+
requestMock = mockSuccessResponse(200, { memories: [{ id: "m1", content: "a", memory_type: "MISTAKE", importance: 0.8, session_id: null, project: null, created_at: "2024-01-01T00:00:00Z", score: 0.95 }] });
|
|
117
|
+
const memories = await dreamingService.queryDreamMemories({ query: "test" });
|
|
118
|
+
assert.strictEqual(memories.length, 1);
|
|
119
|
+
assert.strictEqual(memories[0].id, "m1");
|
|
120
|
+
assert.strictEqual(memories[0].score, 0.95);
|
|
121
|
+
});
|
|
122
|
+
it("uses results when memories absent", async () => {
|
|
123
|
+
requestMock = mockSuccessResponse(200, { results: [{ id: "r1", content: "x", memory_type: "PATTERN", importance: 0.5, session_id: null, project: null, created_at: "", score: 0.7 }] });
|
|
124
|
+
const memories = await dreamingService.queryDreamMemories({ query: "x" });
|
|
125
|
+
assert.strictEqual(memories.length, 1);
|
|
126
|
+
assert.strictEqual(memories[0].id, "r1");
|
|
127
|
+
});
|
|
128
|
+
it("returns empty array for empty memories", async () => {
|
|
129
|
+
requestMock = mockSuccessResponse(200, { memories: [] });
|
|
130
|
+
const memories = await dreamingService.queryDreamMemories({ query: "x" });
|
|
131
|
+
assert.deepStrictEqual(memories, []);
|
|
132
|
+
});
|
|
133
|
+
it("throws on invalid JSON", async () => {
|
|
134
|
+
requestMock = mockSuccessResponse(200, "not-json");
|
|
135
|
+
await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Failed to parse/ });
|
|
136
|
+
});
|
|
137
|
+
it("throws on non-2xx", async () => {
|
|
138
|
+
requestMock = mockSuccessResponse(403, "Forbidden");
|
|
139
|
+
await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Failed to query dream memories: status 403/ });
|
|
140
|
+
});
|
|
141
|
+
it("throws on network error", async () => {
|
|
142
|
+
requestMock = mockNetworkError("ETIMEDOUT");
|
|
143
|
+
await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /Network Error: ETIMEDOUT/ });
|
|
144
|
+
});
|
|
145
|
+
it("throws when CODEATLAS_API_KEY is not set", async () => {
|
|
146
|
+
apiKeyMock = undefined;
|
|
147
|
+
await assert.rejects(() => dreamingService.queryDreamMemories({ query: "x" }), { message: /CODEATLAS_API_KEY is not set/ });
|
|
148
|
+
});
|
|
149
|
+
it("sends query params", async () => {
|
|
150
|
+
const capture = {};
|
|
151
|
+
requestMock = mockSuccessResponse(200, { memories: [] }, capture);
|
|
152
|
+
await dreamingService.queryDreamMemories({ query: "search", limit: 5, project: "my-app" });
|
|
153
|
+
const path = String(capture.options.path);
|
|
154
|
+
assert.ok(path.includes("query=search") && path.includes("limit=5") && path.includes("project=my-app"));
|
|
155
|
+
});
|
|
156
|
+
it("does NOT send limit when omitted", async () => {
|
|
157
|
+
const capture = {};
|
|
158
|
+
requestMock = mockSuccessResponse(200, { memories: [] }, capture);
|
|
159
|
+
await dreamingService.queryDreamMemories({ query: "search" });
|
|
160
|
+
assert.ok(!String(capture.options.path).includes("limit="));
|
|
161
|
+
});
|
|
162
|
+
it("includes apiKey in query params and x-api-key header for GET", async () => {
|
|
163
|
+
process.env.CODEATLAS_API_KEY = "test-key-query";
|
|
164
|
+
const capture = {};
|
|
165
|
+
requestMock = mockSuccessResponse(200, { memories: [] }, capture);
|
|
166
|
+
await dreamingService.queryDreamMemories({ query: "test" });
|
|
167
|
+
const path = String(capture.options.path);
|
|
168
|
+
assert.ok(path.includes("apiKey=test-key-query"), `Expected apiKey in query, got: ${path}`);
|
|
169
|
+
assert.strictEqual(capture.options.headers["x-api-key"], "test-key-query");
|
|
170
|
+
});
|
|
171
|
+
it("sends Chrome User-Agent for GET", async () => {
|
|
172
|
+
const capture = {};
|
|
173
|
+
requestMock = mockSuccessResponse(200, { memories: [] }, capture);
|
|
174
|
+
await dreamingService.queryDreamMemories({ query: "test" });
|
|
175
|
+
assert.ok(String(capture.options.headers["User-Agent"]).includes("Chrome/125.0.0.0"));
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=dreamingService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dreamingService.test.js","sourceRoot":"","sources":["../../../src/services/dreamingService.test.ts"],"names":[],"mappings":"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"}
|