@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 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAY,MAAM,KAAK,CAAC;AAG3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;IAEtB,MAAM,CAAC,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5F,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAC9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CAgB3C;AAcD,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAQ/C;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAsBpF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ZodError } from "zod";
|
|
2
|
+
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
3
|
+
export const toolRegistry = [];
|
|
4
|
+
export function toolExists(toolName) {
|
|
5
|
+
return toolRegistry.some(t => t.name === toolName);
|
|
6
|
+
}
|
|
7
|
+
export function getToolDefinitions() {
|
|
8
|
+
return toolRegistry.map(tool => {
|
|
9
|
+
const raw = zodToJsonSchema(tool.zodSchema, tool.name);
|
|
10
|
+
const def = raw.definitions?.[tool.name] ?? raw;
|
|
11
|
+
const inputSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: def.properties || {},
|
|
14
|
+
required: def.required || [],
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
name: tool.name,
|
|
18
|
+
description: tool.description,
|
|
19
|
+
inputSchema,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function extractPromptArguments(zodSchema) {
|
|
24
|
+
const jsonSchema = zodToJsonSchema(zodSchema);
|
|
25
|
+
const properties = jsonSchema.properties || {};
|
|
26
|
+
const required = jsonSchema.required || [];
|
|
27
|
+
return Object.entries(properties).map(([name, prop]) => ({
|
|
28
|
+
name,
|
|
29
|
+
description: prop.description || `${name} parameter`,
|
|
30
|
+
required: required.includes(name)
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
export function getPromptDefinitions() {
|
|
34
|
+
return toolRegistry
|
|
35
|
+
.filter(tool => tool.prompt)
|
|
36
|
+
.map(tool => ({
|
|
37
|
+
name: tool.name,
|
|
38
|
+
description: tool.prompt.description,
|
|
39
|
+
arguments: tool.prompt.arguments || extractPromptArguments(tool.zodSchema),
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
export async function executeTool(toolName, args, onProgress) {
|
|
43
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
44
|
+
if (!tool) {
|
|
45
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const validatedArgs = tool.zodSchema.parse(args);
|
|
49
|
+
return tool.execute(validatedArgs, onProgress);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof ZodError) {
|
|
53
|
+
const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
|
|
54
|
+
throw new Error(`Invalid arguments for ${toolName}: ${issues}`);
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function getPromptMessage(toolName, args) {
|
|
60
|
+
const tool = toolRegistry.find(t => t.name === toolName);
|
|
61
|
+
if (!tool?.prompt) {
|
|
62
|
+
throw new Error(`No prompt defined for tool: ${toolName}`);
|
|
63
|
+
}
|
|
64
|
+
const paramStrings = [];
|
|
65
|
+
if (args.prompt) {
|
|
66
|
+
paramStrings.push(args.prompt);
|
|
67
|
+
}
|
|
68
|
+
Object.entries(args).forEach(([key, value]) => {
|
|
69
|
+
if (key !== 'prompt' && value !== undefined && value !== null && value !== false) {
|
|
70
|
+
if (typeof value === 'boolean' && value) {
|
|
71
|
+
paramStrings.push(`[${key}]`);
|
|
72
|
+
}
|
|
73
|
+
else if (typeof value !== 'boolean') {
|
|
74
|
+
paramStrings.push(`(${key}: ${value})`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return `Use the ${toolName} tool${paramStrings.length > 0 ? ': ' + paramStrings.join(' ') : ''}`;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-code.tool.d.ts","sourceRoot":"","sources":["../../src/tools/review-code.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAoE5C,eAAO,MAAM,cAAc,EAAE,WA8J5B,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeGeminiCLI } from '../utils/geminiExecutor.js';
|
|
3
|
+
import { getCurrentGitState, generateSessionId, detectSessionContinuation } from '../utils/gitStateDetector.js';
|
|
4
|
+
import { loadReviewSession, saveReviewSession, createNewSession } from '../utils/reviewSessionManager.js';
|
|
5
|
+
import { buildReviewPrompt, extractFilesFromPrompt } from '../utils/reviewPromptBuilder.js';
|
|
6
|
+
import { parseReviewResponse, validateComments } from '../utils/reviewResponseParser.js';
|
|
7
|
+
import { formatReviewResponse, formatSessionNotFound, formatGitStateWarning } from '../utils/reviewFormatter.js';
|
|
8
|
+
import { Logger } from '../utils/logger.js';
|
|
9
|
+
const reviewCodeArgsSchema = z.object({
|
|
10
|
+
prompt: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe('Review request or follow-up question'),
|
|
14
|
+
files: z
|
|
15
|
+
.array(z.string())
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Specific files to review (uses @ syntax internally)'),
|
|
18
|
+
sessionId: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Explicit session ID to continue (auto-detected from git if omitted)'),
|
|
22
|
+
forceNewSession: z
|
|
23
|
+
.boolean()
|
|
24
|
+
.default(false)
|
|
25
|
+
.describe('Force create new session ignoring git state'),
|
|
26
|
+
reviewType: z
|
|
27
|
+
.enum(['security', 'performance', 'quality', 'architecture', 'general'])
|
|
28
|
+
.default('general')
|
|
29
|
+
.describe('Type of review to perform'),
|
|
30
|
+
severity: z
|
|
31
|
+
.enum(['all', 'critical-only', 'important-and-above'])
|
|
32
|
+
.default('all')
|
|
33
|
+
.describe('Filter issues by severity level'),
|
|
34
|
+
commentDecisions: z
|
|
35
|
+
.array(z.object({
|
|
36
|
+
commentId: z.string(),
|
|
37
|
+
decision: z.enum(['accept', 'reject', 'modify', 'defer']),
|
|
38
|
+
notes: z.string().optional()
|
|
39
|
+
}))
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Responses to previous round\'s comments'),
|
|
42
|
+
model: z.string().optional().describe('Optional model to use'),
|
|
43
|
+
includeHistory: z
|
|
44
|
+
.boolean()
|
|
45
|
+
.default(true)
|
|
46
|
+
.describe('Include conversation history in prompt')
|
|
47
|
+
});
|
|
48
|
+
export const reviewCodeTool = {
|
|
49
|
+
name: 'review-code',
|
|
50
|
+
description: 'Interactive code review with session continuity. Auto-detects git state for session management. Maintains conversation history and tracks review decisions across iterations.',
|
|
51
|
+
zodSchema: reviewCodeArgsSchema,
|
|
52
|
+
category: 'gemini',
|
|
53
|
+
execute: async (args, onProgress) => {
|
|
54
|
+
const { prompt, files, sessionId, forceNewSession, reviewType, severity, commentDecisions, model, includeHistory } = args;
|
|
55
|
+
try {
|
|
56
|
+
// Step 1: Determine session
|
|
57
|
+
onProgress?.('🔍 Detecting git state and session...');
|
|
58
|
+
const currentGitState = await getCurrentGitState();
|
|
59
|
+
const detectedSessionId = generateSessionId(currentGitState);
|
|
60
|
+
const targetSessionId = sessionId || detectedSessionId;
|
|
61
|
+
Logger.debug(`Current git state: ${currentGitState.branch} @ ${currentGitState.commitHash.slice(0, 8)}`);
|
|
62
|
+
Logger.debug(`Target session ID: ${targetSessionId}`);
|
|
63
|
+
// Step 2: Load or create session
|
|
64
|
+
let session;
|
|
65
|
+
let isNewSession = false;
|
|
66
|
+
if (forceNewSession) {
|
|
67
|
+
Logger.debug('Force new session requested');
|
|
68
|
+
session = createNewSession(targetSessionId, currentGitState, files);
|
|
69
|
+
isNewSession = true;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const existing = await loadReviewSession(targetSessionId);
|
|
73
|
+
if (existing) {
|
|
74
|
+
// Validate git state hasn't diverged
|
|
75
|
+
const continuationCheck = detectSessionContinuation(currentGitState, existing.gitState);
|
|
76
|
+
if (!continuationCheck.canContinue) {
|
|
77
|
+
onProgress?.(formatGitStateWarning(continuationCheck.reason, true));
|
|
78
|
+
}
|
|
79
|
+
session = existing;
|
|
80
|
+
session.currentGitState = currentGitState;
|
|
81
|
+
Logger.debug(`Loaded existing session with ${session.totalRounds} rounds`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (sessionId) {
|
|
85
|
+
// User explicitly requested a session that doesn't exist
|
|
86
|
+
return formatSessionNotFound(targetSessionId, currentGitState.branch, currentGitState.commitHash);
|
|
87
|
+
}
|
|
88
|
+
// Create new session
|
|
89
|
+
session = createNewSession(targetSessionId, currentGitState, files);
|
|
90
|
+
isNewSession = true;
|
|
91
|
+
Logger.debug('Created new session');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Step 3: Process comment decisions from previous round
|
|
95
|
+
if (commentDecisions && commentDecisions.length > 0) {
|
|
96
|
+
applyCommentDecisions(session, commentDecisions);
|
|
97
|
+
onProgress?.(`✅ Applied ${commentDecisions.length} comment decision(s)`);
|
|
98
|
+
}
|
|
99
|
+
// Step 4: Update files tracked - use Set for efficient uniqueness handling
|
|
100
|
+
if (files && files.length > 0) {
|
|
101
|
+
session.filesTracked = [...new Set([...session.filesTracked, ...files])];
|
|
102
|
+
}
|
|
103
|
+
// Step 5: Build review prompt with context
|
|
104
|
+
const reviewPrompt = buildReviewPrompt({
|
|
105
|
+
userPrompt: prompt,
|
|
106
|
+
session,
|
|
107
|
+
files: files,
|
|
108
|
+
reviewType: reviewType,
|
|
109
|
+
includeHistory: !!includeHistory,
|
|
110
|
+
currentGitState
|
|
111
|
+
});
|
|
112
|
+
Logger.debug(`Built review prompt (${reviewPrompt.length} chars)`);
|
|
113
|
+
// Step 6: Execute Gemini review
|
|
114
|
+
onProgress?.(`🔍 Round ${session.totalRounds + 1}: Reviewing ${files?.length || 'tracked'} file(s)...`);
|
|
115
|
+
const geminiResponse = await executeGeminiCLI(reviewPrompt, model, false, // sandbox
|
|
116
|
+
false, // changeMode - we parse manually
|
|
117
|
+
onProgress);
|
|
118
|
+
// Step 7: Parse response into structured comments
|
|
119
|
+
onProgress?.('📝 Parsing review feedback...');
|
|
120
|
+
let newComments = parseReviewResponse(geminiResponse, session.totalRounds + 1);
|
|
121
|
+
newComments = validateComments(newComments);
|
|
122
|
+
// Apply severity filter if requested
|
|
123
|
+
if (severity === 'critical-only') {
|
|
124
|
+
newComments = newComments.filter(c => c.severity === 'critical');
|
|
125
|
+
}
|
|
126
|
+
else if (severity === 'important-and-above') {
|
|
127
|
+
newComments = newComments.filter(c => c.severity === 'critical' || c.severity === 'important');
|
|
128
|
+
}
|
|
129
|
+
Logger.debug(`Parsed ${newComments.length} comments (after filtering)`);
|
|
130
|
+
// Step 8: Create new review round
|
|
131
|
+
const filesReviewed = files || extractFilesFromPrompt(reviewPrompt);
|
|
132
|
+
const newRound = {
|
|
133
|
+
roundNumber: session.totalRounds + 1,
|
|
134
|
+
timestamp: Date.now(),
|
|
135
|
+
filesReviewed: filesReviewed,
|
|
136
|
+
userPrompt: prompt,
|
|
137
|
+
geminiResponse,
|
|
138
|
+
commentsGenerated: newComments,
|
|
139
|
+
gitState: currentGitState
|
|
140
|
+
};
|
|
141
|
+
session.rounds.push(newRound);
|
|
142
|
+
session.allComments.push(...newComments);
|
|
143
|
+
session.totalRounds++;
|
|
144
|
+
session.lastAccessedAt = Date.now();
|
|
145
|
+
// Step 9: Save session
|
|
146
|
+
await saveReviewSession(session);
|
|
147
|
+
onProgress?.('💾 Session saved');
|
|
148
|
+
// Step 10: Format and return response
|
|
149
|
+
const formattedResponse = formatReviewResponse({
|
|
150
|
+
session,
|
|
151
|
+
currentRound: newRound,
|
|
152
|
+
newComments,
|
|
153
|
+
showHistory: !!includeHistory
|
|
154
|
+
});
|
|
155
|
+
return formattedResponse;
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
Logger.error(`Review code execution error: ${error}`);
|
|
159
|
+
throw new Error(`Code review failed: ${error}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Applies comment decisions from the user to the session
|
|
165
|
+
* Uses Map for O(1) comment lookups instead of O(N) linear search
|
|
166
|
+
* @param session The current session
|
|
167
|
+
* @param decisions Array of comment decisions
|
|
168
|
+
*/
|
|
169
|
+
function applyCommentDecisions(session, decisions) {
|
|
170
|
+
// Create a Map for O(1) lookups instead of O(N) linear search
|
|
171
|
+
const commentMap = new Map(session.allComments.map(c => [c.id, c]));
|
|
172
|
+
for (const decision of decisions) {
|
|
173
|
+
const comment = commentMap.get(decision.commentId);
|
|
174
|
+
if (comment) {
|
|
175
|
+
comment.status = decision.decision;
|
|
176
|
+
if (decision.notes) {
|
|
177
|
+
comment.resolution = decision.notes;
|
|
178
|
+
}
|
|
179
|
+
Logger.debug(`Applied decision '${decision.decision}' to comment ${decision.commentId}`);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
Logger.debug(`Comment ${decision.commentId} not found in session`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=review-code.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-code.tool.js","sourceRoot":"","sources":["../../src/tools/review-code.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-tools.d.ts","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAO5C,eAAO,MAAM,QAAQ,EAAE,WAYtB,CAAC;AAIF,eAAO,MAAM,QAAQ,EAAE,WAWtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { executeCommand } from '../utils/commandExecutor.js';
|
|
3
|
+
const pingArgsSchema = z.object({
|
|
4
|
+
prompt: z.string().default('').describe("Message to echo "),
|
|
5
|
+
});
|
|
6
|
+
export const pingTool = {
|
|
7
|
+
name: "ping",
|
|
8
|
+
description: "Echo",
|
|
9
|
+
zodSchema: pingArgsSchema,
|
|
10
|
+
prompt: {
|
|
11
|
+
description: "Echo test message with structured response.",
|
|
12
|
+
},
|
|
13
|
+
category: 'simple',
|
|
14
|
+
execute: async (args, onProgress) => {
|
|
15
|
+
const message = args.prompt || args.message || "Pong!";
|
|
16
|
+
return executeCommand("echo", [message], onProgress);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const helpArgsSchema = z.object({});
|
|
20
|
+
export const helpTool = {
|
|
21
|
+
name: "Help",
|
|
22
|
+
description: "receive help information",
|
|
23
|
+
zodSchema: helpArgsSchema,
|
|
24
|
+
prompt: {
|
|
25
|
+
description: "receive help information",
|
|
26
|
+
},
|
|
27
|
+
category: 'simple',
|
|
28
|
+
execute: async (args, onProgress) => {
|
|
29
|
+
return executeCommand("gemini", ["-help"], onProgress);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=simple-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-tools.js","sourceRoot":"","sources":["../../src/tools/simple-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,6CAA6C;KAC3D;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;QACvD,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,OAAiB,CAAC,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,0BAA0B;IACvC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE;QACN,WAAW,EAAE,0BAA0B;KACxC;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Adding a new tool with the unified registry
|
|
3
|
+
* To add this tool:
|
|
4
|
+
* 1. Rename this file to remove .example (test-tool.ts)
|
|
5
|
+
* 2. Import and register in src/tools/index.ts:
|
|
6
|
+
* import { testTool } from './test-tool.js';
|
|
7
|
+
* toolRegistry.push(testTool);
|
|
8
|
+
*
|
|
9
|
+
* That's it! No more editing multiple files.
|
|
10
|
+
*/
|
|
11
|
+
import { UnifiedTool } from './registry.js';
|
|
12
|
+
export declare const testTool: UnifiedTool;
|
|
13
|
+
//# sourceMappingURL=test-tool.example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-tool.example.d.ts","sourceRoot":"","sources":["../../src/tools/test-tool.example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,eAAO,MAAM,QAAQ,EAAE,WAgBtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Adding a new tool with the unified registry
|
|
3
|
+
* To add this tool:
|
|
4
|
+
* 1. Rename this file to remove .example (test-tool.ts)
|
|
5
|
+
* 2. Import and register in src/tools/index.ts:
|
|
6
|
+
* import { testTool } from './test-tool.js';
|
|
7
|
+
* toolRegistry.push(testTool);
|
|
8
|
+
*
|
|
9
|
+
* That's it! No more editing multiple files.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
const testToolArgsSchema = z.object({
|
|
13
|
+
message: z.string().describe("Test message to echo"), // Required field (no .optional())
|
|
14
|
+
});
|
|
15
|
+
export const testTool = {
|
|
16
|
+
name: "test-tool",
|
|
17
|
+
description: "A test tool demonstrating the simplified registration",
|
|
18
|
+
zodSchema: testToolArgsSchema,
|
|
19
|
+
prompt: {
|
|
20
|
+
description: "Test the new unified tool registration",
|
|
21
|
+
arguments: [{
|
|
22
|
+
name: "message",
|
|
23
|
+
description: "Message to test with",
|
|
24
|
+
required: true
|
|
25
|
+
}]
|
|
26
|
+
},
|
|
27
|
+
category: 'utility',
|
|
28
|
+
execute: async (args) => {
|
|
29
|
+
return `Test tool received: ${args.message}`;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=test-tool.example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-tool.example.js","sourceRoot":"","sources":["../../src/tools/test-tool.example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,kCAAkC;CACzF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAgB;IACnC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,uDAAuD;IACpE,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE;QACN,WAAW,EAAE,wCAAwC;QACrD,SAAS,EAAE,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sBAAsB;gBACnC,QAAQ,EAAE,IAAI;aACf,CAAC;KACH;IACD,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,OAAO,uBAAuB,IAAI,CAAC,OAAO,EAAE,CAAC;IAC/C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-test.tool.d.ts","sourceRoot":"","sources":["../../src/tools/timeout-test.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAM5C,eAAO,MAAM,eAAe,EAAE,WA8B7B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const timeoutTestArgsSchema = z.object({
|
|
3
|
+
duration: z.number().min(10).describe("Duration in milliseconds (minimum 10ms)"),
|
|
4
|
+
});
|
|
5
|
+
export const timeoutTestTool = {
|
|
6
|
+
name: "timeout-test",
|
|
7
|
+
description: "Test timeout prevention by running for a specified duration",
|
|
8
|
+
zodSchema: timeoutTestArgsSchema,
|
|
9
|
+
prompt: {
|
|
10
|
+
description: "Test the timeout prevention system by running a long operation",
|
|
11
|
+
},
|
|
12
|
+
category: 'simple',
|
|
13
|
+
execute: async (args, onProgress) => {
|
|
14
|
+
const duration = args.duration;
|
|
15
|
+
const steps = Math.ceil(duration / 5000); // Progress every 5 seconds
|
|
16
|
+
const stepDuration = duration / steps;
|
|
17
|
+
const startTime = Date.now();
|
|
18
|
+
const results = [];
|
|
19
|
+
results.push(`Starting timeout test for ${duration}ms (${duration / 1000}s)`);
|
|
20
|
+
for (let i = 1; i <= steps; i++) {
|
|
21
|
+
await new Promise(resolve => setTimeout(resolve, stepDuration));
|
|
22
|
+
const elapsed = Date.now() - startTime;
|
|
23
|
+
results.push(`Step ${i}/${steps} completed - Elapsed: ${Math.round(elapsed / 1000)}s`);
|
|
24
|
+
}
|
|
25
|
+
const totalElapsed = Date.now() - startTime;
|
|
26
|
+
results.push(`\nTimeout test completed successfully!`);
|
|
27
|
+
results.push(`Target duration: ${duration}ms`);
|
|
28
|
+
results.push(`Actual duration: ${totalElapsed}ms`);
|
|
29
|
+
return results.join('\n');
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=timeout-test.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout-test.tool.js","sourceRoot":"","sources":["../../src/tools/timeout-test.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CACjF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,6DAA6D;IAC1E,SAAS,EAAE,qBAAqB;IAChC,MAAM,EAAE;QACN,WAAW,EAAE,gEAAgE;KAC9E;IACD,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,2BAA2B;QACrE,MAAM,YAAY,GAAG,QAAQ,GAAG,KAAK,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,6BAA6B,QAAQ,OAAO,QAAQ,GAAC,IAAI,IAAI,CAAC,CAAC;QAE5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,yBAAyB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,oBAAoB,QAAQ,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,oBAAoB,YAAY,IAAI,CAAC,CAAC;QAEnD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AskGeminiSessionData } from './sessionSchemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* Session manager for ask-gemini tool
|
|
4
|
+
* Tracks multi-turn conversations with context
|
|
5
|
+
*/
|
|
6
|
+
export declare class AskGeminiSessionManager {
|
|
7
|
+
private sessionManager;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new conversation session
|
|
11
|
+
*/
|
|
12
|
+
createSession(sessionId: string): AskGeminiSessionData;
|
|
13
|
+
/**
|
|
14
|
+
* Adds a conversation round to the session
|
|
15
|
+
*/
|
|
16
|
+
addRound(session: AskGeminiSessionData, userPrompt: string, geminiResponse: string, model: string, contextFiles?: string[]): AskGeminiSessionData;
|
|
17
|
+
/**
|
|
18
|
+
* Builds conversation context from history for inclusion in prompts
|
|
19
|
+
* @param session The session to build context from
|
|
20
|
+
* @param maxRounds Maximum number of previous rounds to include (default: 3)
|
|
21
|
+
* @returns Formatted conversation context
|
|
22
|
+
*/
|
|
23
|
+
buildConversationContext(session: AskGeminiSessionData, maxRounds?: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* Saves a session
|
|
26
|
+
*/
|
|
27
|
+
save(session: AskGeminiSessionData): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Loads a session
|
|
30
|
+
*/
|
|
31
|
+
load(sessionId: string): Promise<AskGeminiSessionData | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Lists all sessions
|
|
34
|
+
*/
|
|
35
|
+
list(): Promise<AskGeminiSessionData[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Deletes a session
|
|
38
|
+
*/
|
|
39
|
+
delete(sessionId: string): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Gets or creates a session
|
|
42
|
+
*/
|
|
43
|
+
getOrCreate(sessionId: string): Promise<AskGeminiSessionData>;
|
|
44
|
+
/**
|
|
45
|
+
* Gets cache statistics
|
|
46
|
+
*/
|
|
47
|
+
getStats(): Promise<{
|
|
48
|
+
toolName: string;
|
|
49
|
+
sessionCount: number;
|
|
50
|
+
ttl: number;
|
|
51
|
+
maxSessions: number;
|
|
52
|
+
evictionPolicy: string;
|
|
53
|
+
cacheDir: string;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
export declare const askGeminiSessionManager: AskGeminiSessionManager;
|
|
57
|
+
//# sourceMappingURL=askGeminiSessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askGeminiSessionManager.d.ts","sourceRoot":"","sources":["../../src/utils/askGeminiSessionManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,cAAc,CAAuC;;IAM7D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB;IAatD;;OAEG;IACH,QAAQ,CACN,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,oBAAoB;IAoBvB;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM;IAqBtF;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAInE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAI7C;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAQnE;;OAEG;IACG,QAAQ;;;;;;;;CAGf;AAGD,eAAO,MAAM,uBAAuB,yBAAgC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { SessionManager } from './sessionManager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Session manager for ask-gemini tool
|
|
4
|
+
* Tracks multi-turn conversations with context
|
|
5
|
+
*/
|
|
6
|
+
export class AskGeminiSessionManager {
|
|
7
|
+
sessionManager;
|
|
8
|
+
constructor() {
|
|
9
|
+
this.sessionManager = new SessionManager('ask-gemini');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new conversation session
|
|
13
|
+
*/
|
|
14
|
+
createSession(sessionId) {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
return {
|
|
17
|
+
sessionId,
|
|
18
|
+
createdAt: now,
|
|
19
|
+
lastAccessedAt: now,
|
|
20
|
+
conversationHistory: [],
|
|
21
|
+
totalRounds: 0,
|
|
22
|
+
contextFiles: [],
|
|
23
|
+
metadata: {}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Adds a conversation round to the session
|
|
28
|
+
*/
|
|
29
|
+
addRound(session, userPrompt, geminiResponse, model, contextFiles) {
|
|
30
|
+
session.conversationHistory.push({
|
|
31
|
+
roundNumber: session.totalRounds + 1,
|
|
32
|
+
timestamp: Date.now(),
|
|
33
|
+
userPrompt,
|
|
34
|
+
geminiResponse,
|
|
35
|
+
model
|
|
36
|
+
});
|
|
37
|
+
session.totalRounds++;
|
|
38
|
+
session.lastAccessedAt = Date.now();
|
|
39
|
+
// Track context files
|
|
40
|
+
if (contextFiles && contextFiles.length > 0) {
|
|
41
|
+
session.contextFiles = [...new Set([...session.contextFiles, ...contextFiles])];
|
|
42
|
+
}
|
|
43
|
+
return session;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Builds conversation context from history for inclusion in prompts
|
|
47
|
+
* @param session The session to build context from
|
|
48
|
+
* @param maxRounds Maximum number of previous rounds to include (default: 3)
|
|
49
|
+
* @returns Formatted conversation context
|
|
50
|
+
*/
|
|
51
|
+
buildConversationContext(session, maxRounds = 3) {
|
|
52
|
+
if (session.conversationHistory.length === 0) {
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
const recentRounds = session.conversationHistory.slice(-maxRounds);
|
|
56
|
+
const contextParts = recentRounds.map(round => {
|
|
57
|
+
// Truncate long responses for context
|
|
58
|
+
const truncatedResponse = round.geminiResponse.length > 500
|
|
59
|
+
? round.geminiResponse.slice(0, 500) + '...'
|
|
60
|
+
: round.geminiResponse;
|
|
61
|
+
return `[Round ${round.roundNumber}]
|
|
62
|
+
User: ${round.userPrompt}
|
|
63
|
+
Gemini: ${truncatedResponse}`;
|
|
64
|
+
});
|
|
65
|
+
return `# Conversation History\n\n${contextParts.join('\n\n')}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Saves a session
|
|
69
|
+
*/
|
|
70
|
+
async save(session) {
|
|
71
|
+
await this.sessionManager.save(session.sessionId, session);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Loads a session
|
|
75
|
+
*/
|
|
76
|
+
async load(sessionId) {
|
|
77
|
+
return await this.sessionManager.load(sessionId);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Lists all sessions
|
|
81
|
+
*/
|
|
82
|
+
async list() {
|
|
83
|
+
return await this.sessionManager.list();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Deletes a session
|
|
87
|
+
*/
|
|
88
|
+
async delete(sessionId) {
|
|
89
|
+
return await this.sessionManager.delete(sessionId);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Gets or creates a session
|
|
93
|
+
*/
|
|
94
|
+
async getOrCreate(sessionId) {
|
|
95
|
+
const existing = await this.load(sessionId);
|
|
96
|
+
if (existing) {
|
|
97
|
+
return existing;
|
|
98
|
+
}
|
|
99
|
+
return this.createSession(sessionId);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets cache statistics
|
|
103
|
+
*/
|
|
104
|
+
async getStats() {
|
|
105
|
+
return await this.sessionManager.getStats();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Export singleton instance
|
|
109
|
+
export const askGeminiSessionManager = new AskGeminiSessionManager();
|
|
110
|
+
//# sourceMappingURL=askGeminiSessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"askGeminiSessionManager.js","sourceRoot":"","sources":["../../src/utils/askGeminiSessionManager.ts"],"names":[],"mappings":"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"}
|