@maxanatsko/gemini-mcp-tool 2.0.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/LICENSE +25 -0
- package/README.md +230 -0
- package/dist/constants.d.ts +153 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +150 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +188 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +74 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm.tool.d.ts +3 -0
- package/dist/tools/brainstorm.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm.tool.js +202 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +62 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +80 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/review-code.tool.d.ts +3 -0
- package/dist/tools/review-code.tool.d.ts.map +1 -0
- package/dist/tools/review-code.tool.js +186 -0
- package/dist/tools/review-code.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +4 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +32 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/askGeminiSessionManager.d.ts +57 -0
- package/dist/utils/askGeminiSessionManager.d.ts.map +1 -0
- package/dist/utils/askGeminiSessionManager.js +110 -0
- package/dist/utils/askGeminiSessionManager.js.map +1 -0
- package/dist/utils/brainstormSessionManager.d.ts +67 -0
- package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
- package/dist/utils/brainstormSessionManager.js +165 -0
- package/dist/utils/brainstormSessionManager.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +161 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/commandExecutor.d.ts +2 -0
- package/dist/utils/commandExecutor.d.ts.map +1 -0
- package/dist/utils/commandExecutor.js +74 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +170 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/gitStateDetector.d.ts +31 -0
- package/dist/utils/gitStateDetector.d.ts.map +1 -0
- package/dist/utils/gitStateDetector.js +67 -0
- package/dist/utils/gitStateDetector.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +42 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/reviewFormatter.d.ts +35 -0
- package/dist/utils/reviewFormatter.d.ts.map +1 -0
- package/dist/utils/reviewFormatter.js +198 -0
- package/dist/utils/reviewFormatter.js.map +1 -0
- package/dist/utils/reviewPromptBuilder.d.ts +35 -0
- package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
- package/dist/utils/reviewPromptBuilder.js +146 -0
- package/dist/utils/reviewPromptBuilder.js.map +1 -0
- package/dist/utils/reviewResponseParser.d.ts +20 -0
- package/dist/utils/reviewResponseParser.d.ts.map +1 -0
- package/dist/utils/reviewResponseParser.js +149 -0
- package/dist/utils/reviewResponseParser.js.map +1 -0
- package/dist/utils/reviewSessionCache.d.ts +81 -0
- package/dist/utils/reviewSessionCache.d.ts.map +1 -0
- package/dist/utils/reviewSessionCache.js +220 -0
- package/dist/utils/reviewSessionCache.js.map +1 -0
- package/dist/utils/reviewSessionManager.d.ts +52 -0
- package/dist/utils/reviewSessionManager.d.ts.map +1 -0
- package/dist/utils/reviewSessionManager.js +65 -0
- package/dist/utils/reviewSessionManager.js.map +1 -0
- package/dist/utils/sessionManager.d.ts +94 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +374 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/dist/utils/sessionSchemas.d.ts +126 -0
- package/dist/utils/sessionSchemas.d.ts.map +1 -0
- package/dist/utils/sessionSchemas.js +2 -0
- package/dist/utils/sessionSchemas.js.map +1 -0
- package/dist/utils/timeoutManager.d.ts +2 -0
- package/dist/utils/timeoutManager.d.ts.map +1 -0
- package/dist/utils/timeoutManager.js +2 -0
- package/dist/utils/timeoutManager.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated This file is deprecated. Session management has been migrated to the shared infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* - For session operations, use: src/utils/reviewSessionManager.ts
|
|
5
|
+
* - For type definitions, use: src/utils/sessionSchemas.ts
|
|
6
|
+
*
|
|
7
|
+
* This file is kept only for backward compatibility and type exports (ReviewComment, ReviewRound).
|
|
8
|
+
* The actual session cache functions (save/load/create) have been moved to reviewSessionManager.ts
|
|
9
|
+
*/
|
|
10
|
+
import { GitState } from './gitStateDetector.js';
|
|
11
|
+
export interface ReviewComment {
|
|
12
|
+
id: string;
|
|
13
|
+
filePattern: string;
|
|
14
|
+
lineRange?: {
|
|
15
|
+
start: number;
|
|
16
|
+
end: number;
|
|
17
|
+
};
|
|
18
|
+
severity: 'critical' | 'important' | 'suggestion' | 'question';
|
|
19
|
+
comment: string;
|
|
20
|
+
roundGenerated: number;
|
|
21
|
+
status: 'pending' | 'accepted' | 'rejected' | 'modified' | 'deferred';
|
|
22
|
+
resolution?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ReviewRound {
|
|
25
|
+
roundNumber: number;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
filesReviewed: string[];
|
|
28
|
+
userPrompt: string;
|
|
29
|
+
geminiResponse: string;
|
|
30
|
+
commentsGenerated: ReviewComment[];
|
|
31
|
+
gitState: GitState;
|
|
32
|
+
}
|
|
33
|
+
export interface CodeReviewSession {
|
|
34
|
+
sessionId: string;
|
|
35
|
+
createdAt: number;
|
|
36
|
+
lastAccessedAt: number;
|
|
37
|
+
gitState: GitState;
|
|
38
|
+
currentGitState: GitState;
|
|
39
|
+
rounds: ReviewRound[];
|
|
40
|
+
allComments: ReviewComment[];
|
|
41
|
+
filesTracked: string[];
|
|
42
|
+
focusFiles?: string[];
|
|
43
|
+
reviewScope?: 'full' | 'changes-only' | 'focused';
|
|
44
|
+
totalRounds: number;
|
|
45
|
+
sessionState: 'active' | 'paused' | 'completed';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Saves a review session to the cache
|
|
49
|
+
* @param session The session to save
|
|
50
|
+
*/
|
|
51
|
+
export declare function saveReviewSession(session: CodeReviewSession): void;
|
|
52
|
+
/**
|
|
53
|
+
* Loads a review session from the cache
|
|
54
|
+
* @param sessionId The session ID to load
|
|
55
|
+
* @returns The session or null if not found/expired
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadReviewSession(sessionId: string): CodeReviewSession | null;
|
|
58
|
+
/**
|
|
59
|
+
* Lists all active review sessions
|
|
60
|
+
* @returns Array of active sessions
|
|
61
|
+
*/
|
|
62
|
+
export declare function listActiveSessions(): CodeReviewSession[];
|
|
63
|
+
/**
|
|
64
|
+
* Creates a new review session
|
|
65
|
+
* @param sessionId The session ID
|
|
66
|
+
* @param gitState The initial git state
|
|
67
|
+
* @param focusFiles Optional files to focus on
|
|
68
|
+
* @returns New CodeReviewSession object
|
|
69
|
+
*/
|
|
70
|
+
export declare function createNewSession(sessionId: string, gitState: GitState, focusFiles?: string[]): CodeReviewSession;
|
|
71
|
+
/**
|
|
72
|
+
* Gets cache statistics
|
|
73
|
+
* @returns Cache stats object
|
|
74
|
+
*/
|
|
75
|
+
export declare function getReviewCacheStats(): {
|
|
76
|
+
size: number;
|
|
77
|
+
ttl: number;
|
|
78
|
+
maxSize: number;
|
|
79
|
+
cacheDir: string;
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=reviewSessionCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewSessionCache.d.ts","sourceRoot":"","sources":["../../src/utils/reviewSessionCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACnC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,QAAQ,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;CACjD;AAuBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAqBlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA6B7E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,EAAE,CA6BxD;AAiED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,iBAAiB,CAgBnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAeA"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated This file is deprecated. Session management has been migrated to the shared infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* - For session operations, use: src/utils/reviewSessionManager.ts
|
|
5
|
+
* - For type definitions, use: src/utils/sessionSchemas.ts
|
|
6
|
+
*
|
|
7
|
+
* This file is kept only for backward compatibility and type exports (ReviewComment, ReviewRound).
|
|
8
|
+
* The actual session cache functions (save/load/create) have been moved to reviewSessionManager.ts
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as os from 'os';
|
|
13
|
+
import { Logger } from './logger.js';
|
|
14
|
+
// Use persistent storage in user's home directory instead of tmp for session persistence across reboots
|
|
15
|
+
const REVIEW_CACHE_DIR = path.join(os.homedir(), '.gemini-mcp', 'review-sessions');
|
|
16
|
+
const REVIEW_SESSION_TTL = 24 * 60 * 60 * 1000; // 24 hours (increased from 60 min for better persistence)
|
|
17
|
+
const MAX_REVIEW_SESSIONS = 20;
|
|
18
|
+
/**
|
|
19
|
+
* Ensures the review cache directory exists
|
|
20
|
+
*/
|
|
21
|
+
function ensureCacheDir() {
|
|
22
|
+
if (!fs.existsSync(REVIEW_CACHE_DIR)) {
|
|
23
|
+
fs.mkdirSync(REVIEW_CACHE_DIR, { recursive: true });
|
|
24
|
+
Logger.debug(`Created review cache directory: ${REVIEW_CACHE_DIR}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Saves a review session to the cache
|
|
29
|
+
* @param session The session to save
|
|
30
|
+
*/
|
|
31
|
+
export function saveReviewSession(session) {
|
|
32
|
+
ensureCacheDir();
|
|
33
|
+
cleanExpiredSessions();
|
|
34
|
+
const filePath = path.join(REVIEW_CACHE_DIR, `${session.sessionId}.json`);
|
|
35
|
+
const cacheEntry = {
|
|
36
|
+
session,
|
|
37
|
+
timestamp: Date.now(),
|
|
38
|
+
expiryTime: Date.now() + REVIEW_SESSION_TTL
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
fs.writeFileSync(filePath, JSON.stringify(cacheEntry, null, 2));
|
|
42
|
+
Logger.debug(`Saved review session: ${session.sessionId} (${session.totalRounds} rounds)`);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
Logger.error(`Failed to save review session: ${error}`);
|
|
46
|
+
throw new Error(`Failed to save review session: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
enforceSessionLimits();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Loads a review session from the cache
|
|
52
|
+
* @param sessionId The session ID to load
|
|
53
|
+
* @returns The session or null if not found/expired
|
|
54
|
+
*/
|
|
55
|
+
export function loadReviewSession(sessionId) {
|
|
56
|
+
const filePath = path.join(REVIEW_CACHE_DIR, `${sessionId}.json`);
|
|
57
|
+
try {
|
|
58
|
+
if (!fs.existsSync(filePath)) {
|
|
59
|
+
Logger.debug(`Session not found: ${sessionId}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
63
|
+
const cacheEntry = JSON.parse(fileContent);
|
|
64
|
+
// Check expiry
|
|
65
|
+
if (Date.now() > cacheEntry.expiryTime) {
|
|
66
|
+
fs.unlinkSync(filePath);
|
|
67
|
+
Logger.debug(`Session expired and deleted: ${sessionId}`);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
Logger.debug(`Loaded review session: ${sessionId} (${cacheEntry.session.totalRounds} rounds)`);
|
|
71
|
+
return cacheEntry.session;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
Logger.error(`Failed to load review session ${sessionId}: ${error}`);
|
|
75
|
+
// Clean up corrupted file
|
|
76
|
+
try {
|
|
77
|
+
fs.unlinkSync(filePath);
|
|
78
|
+
}
|
|
79
|
+
catch { }
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Lists all active review sessions
|
|
85
|
+
* @returns Array of active sessions
|
|
86
|
+
*/
|
|
87
|
+
export function listActiveSessions() {
|
|
88
|
+
ensureCacheDir();
|
|
89
|
+
const sessions = [];
|
|
90
|
+
try {
|
|
91
|
+
const files = fs.readdirSync(REVIEW_CACHE_DIR);
|
|
92
|
+
const now = Date.now();
|
|
93
|
+
for (const file of files) {
|
|
94
|
+
if (!file.endsWith('.json'))
|
|
95
|
+
continue;
|
|
96
|
+
const filePath = path.join(REVIEW_CACHE_DIR, file);
|
|
97
|
+
try {
|
|
98
|
+
const fileContent = fs.readFileSync(filePath, 'utf-8');
|
|
99
|
+
const cacheEntry = JSON.parse(fileContent);
|
|
100
|
+
// Skip expired sessions
|
|
101
|
+
if (now <= cacheEntry.expiryTime) {
|
|
102
|
+
sessions.push(cacheEntry.session);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
Logger.debug(`Error reading session file ${file}: ${error}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
Logger.error(`Failed to list active sessions: ${error}`);
|
|
112
|
+
}
|
|
113
|
+
return sessions;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Cleans up expired session files
|
|
117
|
+
*/
|
|
118
|
+
function cleanExpiredSessions() {
|
|
119
|
+
try {
|
|
120
|
+
ensureCacheDir();
|
|
121
|
+
const files = fs.readdirSync(REVIEW_CACHE_DIR);
|
|
122
|
+
const now = Date.now();
|
|
123
|
+
let cleaned = 0;
|
|
124
|
+
for (const file of files) {
|
|
125
|
+
if (!file.endsWith('.json'))
|
|
126
|
+
continue;
|
|
127
|
+
const filePath = path.join(REVIEW_CACHE_DIR, file);
|
|
128
|
+
try {
|
|
129
|
+
const stats = fs.statSync(filePath);
|
|
130
|
+
if (now - stats.mtimeMs > REVIEW_SESSION_TTL) {
|
|
131
|
+
fs.unlinkSync(filePath);
|
|
132
|
+
cleaned++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
Logger.debug(`Error checking session file ${file}: ${error}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (cleaned > 0) {
|
|
140
|
+
Logger.debug(`Cleaned ${cleaned} expired review sessions`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
Logger.debug(`Session cleanup error: ${error}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Enforces the maximum session limit using FIFO
|
|
149
|
+
*/
|
|
150
|
+
function enforceSessionLimits() {
|
|
151
|
+
try {
|
|
152
|
+
const files = fs
|
|
153
|
+
.readdirSync(REVIEW_CACHE_DIR)
|
|
154
|
+
.filter(f => f.endsWith('.json'))
|
|
155
|
+
.map(f => ({
|
|
156
|
+
name: f,
|
|
157
|
+
path: path.join(REVIEW_CACHE_DIR, f),
|
|
158
|
+
mtime: fs.statSync(path.join(REVIEW_CACHE_DIR, f)).mtimeMs
|
|
159
|
+
}))
|
|
160
|
+
.sort((a, b) => a.mtime - b.mtime); // Oldest first
|
|
161
|
+
// Remove oldest files if over limit
|
|
162
|
+
if (files.length > MAX_REVIEW_SESSIONS) {
|
|
163
|
+
const toRemove = files.slice(0, files.length - MAX_REVIEW_SESSIONS);
|
|
164
|
+
for (const file of toRemove) {
|
|
165
|
+
try {
|
|
166
|
+
fs.unlinkSync(file.path);
|
|
167
|
+
}
|
|
168
|
+
catch { }
|
|
169
|
+
}
|
|
170
|
+
Logger.debug(`Removed ${toRemove.length} old review sessions to enforce limit`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
Logger.debug(`Error enforcing session limits: ${error}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Creates a new review session
|
|
179
|
+
* @param sessionId The session ID
|
|
180
|
+
* @param gitState The initial git state
|
|
181
|
+
* @param focusFiles Optional files to focus on
|
|
182
|
+
* @returns New CodeReviewSession object
|
|
183
|
+
*/
|
|
184
|
+
export function createNewSession(sessionId, gitState, focusFiles) {
|
|
185
|
+
const now = Date.now();
|
|
186
|
+
return {
|
|
187
|
+
sessionId,
|
|
188
|
+
createdAt: now,
|
|
189
|
+
lastAccessedAt: now,
|
|
190
|
+
gitState,
|
|
191
|
+
currentGitState: gitState,
|
|
192
|
+
rounds: [],
|
|
193
|
+
allComments: [],
|
|
194
|
+
filesTracked: [],
|
|
195
|
+
focusFiles,
|
|
196
|
+
reviewScope: focusFiles ? 'focused' : 'full',
|
|
197
|
+
totalRounds: 0,
|
|
198
|
+
sessionState: 'active'
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Gets cache statistics
|
|
203
|
+
* @returns Cache stats object
|
|
204
|
+
*/
|
|
205
|
+
export function getReviewCacheStats() {
|
|
206
|
+
ensureCacheDir();
|
|
207
|
+
let size = 0;
|
|
208
|
+
try {
|
|
209
|
+
const files = fs.readdirSync(REVIEW_CACHE_DIR);
|
|
210
|
+
size = files.filter(f => f.endsWith('.json')).length;
|
|
211
|
+
}
|
|
212
|
+
catch { }
|
|
213
|
+
return {
|
|
214
|
+
size,
|
|
215
|
+
ttl: REVIEW_SESSION_TTL,
|
|
216
|
+
maxSize: MAX_REVIEW_SESSIONS,
|
|
217
|
+
cacheDir: REVIEW_CACHE_DIR
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=reviewSessionCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewSessionCache.js","sourceRoot":"","sources":["../../src/utils/reviewSessionCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ReviewCodeSessionData } from './sessionSchemas.js';
|
|
2
|
+
import { GitState } from './gitStateDetector.js';
|
|
3
|
+
/**
|
|
4
|
+
* Specialized session manager for review-code tool
|
|
5
|
+
* Wraps generic SessionManager with review-specific helpers
|
|
6
|
+
* Maintains backward compatibility with reviewSessionCache.ts
|
|
7
|
+
*/
|
|
8
|
+
export declare class ReviewSessionManager {
|
|
9
|
+
private sessionManager;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Saves a review session (maintains existing interface)
|
|
13
|
+
*/
|
|
14
|
+
saveReviewSession(session: ReviewCodeSessionData): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Loads a review session (maintains existing interface)
|
|
17
|
+
*/
|
|
18
|
+
loadReviewSession(sessionId: string): Promise<ReviewCodeSessionData | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Lists active review sessions
|
|
21
|
+
*/
|
|
22
|
+
listActiveSessions(): Promise<ReviewCodeSessionData[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Creates a new review session
|
|
25
|
+
*/
|
|
26
|
+
createNewSession(sessionId: string, gitState: GitState, focusFiles?: string[]): ReviewCodeSessionData;
|
|
27
|
+
/**
|
|
28
|
+
* Gets cache statistics
|
|
29
|
+
*/
|
|
30
|
+
getReviewCacheStats(): Promise<{
|
|
31
|
+
toolName: string;
|
|
32
|
+
sessionCount: number;
|
|
33
|
+
ttl: number;
|
|
34
|
+
maxSessions: number;
|
|
35
|
+
evictionPolicy: string;
|
|
36
|
+
cacheDir: string;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export declare const reviewSessionManager: ReviewSessionManager;
|
|
40
|
+
export declare const saveReviewSession: (session: ReviewCodeSessionData) => Promise<void>;
|
|
41
|
+
export declare const loadReviewSession: (sessionId: string) => Promise<ReviewCodeSessionData | null>;
|
|
42
|
+
export declare const listActiveSessions: () => Promise<ReviewCodeSessionData[]>;
|
|
43
|
+
export declare const createNewSession: (sessionId: string, gitState: GitState, focusFiles?: string[]) => ReviewCodeSessionData;
|
|
44
|
+
export declare const getReviewCacheStats: () => Promise<{
|
|
45
|
+
toolName: string;
|
|
46
|
+
sessionCount: number;
|
|
47
|
+
ttl: number;
|
|
48
|
+
maxSessions: number;
|
|
49
|
+
evictionPolicy: string;
|
|
50
|
+
cacheDir: string;
|
|
51
|
+
}>;
|
|
52
|
+
//# sourceMappingURL=reviewSessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewSessionManager.d.ts","sourceRoot":"","sources":["../../src/utils/reviewSessionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,cAAc,CAAwC;;IAM9D;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAIjF;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAI5D;;OAEG;IACH,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,EAClB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,qBAAqB;IAkBxB;;OAEG;IACG,mBAAmB;;;;;;;;CAG1B;AAGD,eAAO,MAAM,oBAAoB,sBAA6B,CAAC;AAG/D,eAAO,MAAM,iBAAiB,GAAU,SAAS,qBAAqB,kBACf,CAAC;AAExD,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,0CACA,CAAC;AAE1D,eAAO,MAAM,kBAAkB,wCACkB,CAAC;AAElD,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,UAAU,QAAQ,EAClB,aAAa,MAAM,EAAE,0BACoD,CAAC;AAE5E,eAAO,MAAM,mBAAmB;;;;;;;EACkB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { SessionManager } from './sessionManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Specialized session manager for review-code tool
|
|
4
|
+
* Wraps generic SessionManager with review-specific helpers
|
|
5
|
+
* Maintains backward compatibility with reviewSessionCache.ts
|
|
6
|
+
*/
|
|
7
|
+
export class ReviewSessionManager {
|
|
8
|
+
sessionManager;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.sessionManager = new SessionManager('review-code');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Saves a review session (maintains existing interface)
|
|
14
|
+
*/
|
|
15
|
+
async saveReviewSession(session) {
|
|
16
|
+
await this.sessionManager.save(session.sessionId, session);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Loads a review session (maintains existing interface)
|
|
20
|
+
*/
|
|
21
|
+
async loadReviewSession(sessionId) {
|
|
22
|
+
return await this.sessionManager.load(sessionId);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Lists active review sessions
|
|
26
|
+
*/
|
|
27
|
+
async listActiveSessions() {
|
|
28
|
+
return await this.sessionManager.list();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates a new review session
|
|
32
|
+
*/
|
|
33
|
+
createNewSession(sessionId, gitState, focusFiles) {
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
return {
|
|
36
|
+
sessionId,
|
|
37
|
+
createdAt: now,
|
|
38
|
+
lastAccessedAt: now,
|
|
39
|
+
gitState,
|
|
40
|
+
currentGitState: gitState,
|
|
41
|
+
rounds: [],
|
|
42
|
+
allComments: [],
|
|
43
|
+
filesTracked: [],
|
|
44
|
+
focusFiles,
|
|
45
|
+
reviewScope: focusFiles ? 'focused' : 'full',
|
|
46
|
+
totalRounds: 0,
|
|
47
|
+
sessionState: 'active'
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Gets cache statistics
|
|
52
|
+
*/
|
|
53
|
+
async getReviewCacheStats() {
|
|
54
|
+
return await this.sessionManager.getStats();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Export singleton instance for backward compatibility
|
|
58
|
+
export const reviewSessionManager = new ReviewSessionManager();
|
|
59
|
+
// Export existing function signatures for drop-in replacement
|
|
60
|
+
export const saveReviewSession = async (session) => await reviewSessionManager.saveReviewSession(session);
|
|
61
|
+
export const loadReviewSession = async (sessionId) => await reviewSessionManager.loadReviewSession(sessionId);
|
|
62
|
+
export const listActiveSessions = async () => await reviewSessionManager.listActiveSessions();
|
|
63
|
+
export const createNewSession = (sessionId, gitState, focusFiles) => reviewSessionManager.createNewSession(sessionId, gitState, focusFiles);
|
|
64
|
+
export const getReviewCacheStats = async () => await reviewSessionManager.getReviewCacheStats();
|
|
65
|
+
//# sourceMappingURL=reviewSessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewSessionManager.js","sourceRoot":"","sources":["../../src/utils/reviewSessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACvB,cAAc,CAAwC;IAE9D;QACE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAwB,aAAa,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,OAA8B;QACpD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,SAAiB,EACjB,QAAkB,EAClB,UAAqB;QAErB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,SAAS;YACT,SAAS,EAAE,GAAG;YACd,cAAc,EAAE,GAAG;YACnB,QAAQ;YACR,eAAe,EAAE,QAAQ;YACzB,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,UAAU;YACV,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YAC5C,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,QAAQ;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE/D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAA8B,EAAE,EAAE,CACxE,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,SAAiB,EAAE,EAAE,CAC3D,MAAM,oBAAoB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE,CAC3C,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,SAAiB,EACjB,QAAkB,EAClB,UAAqB,EACrB,EAAE,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,IAAI,EAAE,CAC5C,MAAM,oBAAoB,CAAC,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base interface that all tool-specific session data must extend
|
|
3
|
+
* Ensures every session has core metadata fields
|
|
4
|
+
*/
|
|
5
|
+
export interface SessionData {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
createdAt: number;
|
|
8
|
+
lastAccessedAt: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for a tool's session management
|
|
12
|
+
*/
|
|
13
|
+
export interface SessionConfig {
|
|
14
|
+
toolName: string;
|
|
15
|
+
ttl: number;
|
|
16
|
+
maxSessions: number;
|
|
17
|
+
evictionPolicy: 'fifo' | 'lru';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generic session manager for all MCP tools
|
|
21
|
+
* Type parameter T ensures type safety for tool-specific session data
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const manager = new SessionManager<MySessionData>('my-tool');
|
|
26
|
+
* manager.save('session-1', { sessionId: 'session-1', ... });
|
|
27
|
+
* const session = manager.load('session-1');
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class SessionManager<T extends SessionData> {
|
|
31
|
+
private config;
|
|
32
|
+
private cacheDir;
|
|
33
|
+
private initPromise;
|
|
34
|
+
constructor(toolName: string, customConfig?: Partial<SessionConfig>);
|
|
35
|
+
/**
|
|
36
|
+
* Ensures the tool's session directory exists (lazy initialization)
|
|
37
|
+
*/
|
|
38
|
+
private ensureCacheDirAsync;
|
|
39
|
+
/**
|
|
40
|
+
* Helper method to quickly get session count without parsing files
|
|
41
|
+
*/
|
|
42
|
+
private getSessionCountFast;
|
|
43
|
+
/**
|
|
44
|
+
* Helper method to read and parse a session file
|
|
45
|
+
*/
|
|
46
|
+
private readSessionFile;
|
|
47
|
+
/**
|
|
48
|
+
* Saves a session to persistent storage
|
|
49
|
+
* @param sessionId User-provided or generated session ID
|
|
50
|
+
* @param data Tool-specific session data
|
|
51
|
+
*/
|
|
52
|
+
save(sessionId: string, data: T): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Loads a session from storage
|
|
55
|
+
* @param sessionId The session ID to load
|
|
56
|
+
* @returns Session data or null if not found/expired
|
|
57
|
+
*/
|
|
58
|
+
load(sessionId: string): Promise<T | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Lists all active sessions for this tool
|
|
61
|
+
* @returns Array of session data
|
|
62
|
+
*/
|
|
63
|
+
list(): Promise<T[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Deletes a specific session
|
|
66
|
+
* @param sessionId The session ID to delete
|
|
67
|
+
* @returns true if deleted, false if not found
|
|
68
|
+
*/
|
|
69
|
+
delete(sessionId: string): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* Cleans up expired sessions
|
|
72
|
+
*/
|
|
73
|
+
private cleanExpiredSessions;
|
|
74
|
+
/**
|
|
75
|
+
* Enforces maximum session limits using configured eviction policy
|
|
76
|
+
*/
|
|
77
|
+
private enforceSessionLimits;
|
|
78
|
+
/**
|
|
79
|
+
* Gets the file path for a session
|
|
80
|
+
*/
|
|
81
|
+
private getSessionFilePath;
|
|
82
|
+
/**
|
|
83
|
+
* Gets statistics about the session cache
|
|
84
|
+
*/
|
|
85
|
+
getStats(): Promise<{
|
|
86
|
+
toolName: string;
|
|
87
|
+
sessionCount: number;
|
|
88
|
+
ttl: number;
|
|
89
|
+
maxSessions: number;
|
|
90
|
+
evictionPolicy: string;
|
|
91
|
+
cacheDir: string;
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=sessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../src/utils/sessionManager.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAWD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,KAAK,CAAC;CAChC;AAmCD;;;;;;;;;;GAUG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,WAAW;IAC/C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAErC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAanE;;OAEG;YACW,mBAAmB;IAkBjC;;OAEG;YACW,mBAAmB;IASjC;;OAEG;YACW,eAAe;IAS7B;;;;OAIG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCrD;;;;OAIG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAqDhD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IA8B1B;;;;OAIG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBjD;;OAEG;YACW,oBAAoB;IAwClC;;OAEG;YACW,oBAAoB;IAiDlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CAqBH"}
|