@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.
Files changed (119) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +230 -0
  3. package/dist/constants.d.ts +153 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +150 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +188 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  12. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  13. package/dist/tools/ask-gemini.tool.js +74 -0
  14. package/dist/tools/ask-gemini.tool.js.map +1 -0
  15. package/dist/tools/brainstorm.tool.d.ts +3 -0
  16. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  17. package/dist/tools/brainstorm.tool.js +202 -0
  18. package/dist/tools/brainstorm.tool.js.map +1 -0
  19. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  20. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  21. package/dist/tools/fetch-chunk.tool.js +62 -0
  22. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  23. package/dist/tools/index.d.ts +2 -0
  24. package/dist/tools/index.d.ts.map +1 -0
  25. package/dist/tools/index.js +11 -0
  26. package/dist/tools/index.js.map +1 -0
  27. package/dist/tools/registry.d.ts +25 -0
  28. package/dist/tools/registry.d.ts.map +1 -0
  29. package/dist/tools/registry.js +80 -0
  30. package/dist/tools/registry.js.map +1 -0
  31. package/dist/tools/review-code.tool.d.ts +3 -0
  32. package/dist/tools/review-code.tool.d.ts.map +1 -0
  33. package/dist/tools/review-code.tool.js +186 -0
  34. package/dist/tools/review-code.tool.js.map +1 -0
  35. package/dist/tools/simple-tools.d.ts +4 -0
  36. package/dist/tools/simple-tools.d.ts.map +1 -0
  37. package/dist/tools/simple-tools.js +32 -0
  38. package/dist/tools/simple-tools.js.map +1 -0
  39. package/dist/tools/test-tool.example.d.ts +13 -0
  40. package/dist/tools/test-tool.example.d.ts.map +1 -0
  41. package/dist/tools/test-tool.example.js +32 -0
  42. package/dist/tools/test-tool.example.js.map +1 -0
  43. package/dist/tools/timeout-test.tool.d.ts +3 -0
  44. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  45. package/dist/tools/timeout-test.tool.js +32 -0
  46. package/dist/tools/timeout-test.tool.js.map +1 -0
  47. package/dist/utils/askGeminiSessionManager.d.ts +57 -0
  48. package/dist/utils/askGeminiSessionManager.d.ts.map +1 -0
  49. package/dist/utils/askGeminiSessionManager.js +110 -0
  50. package/dist/utils/askGeminiSessionManager.js.map +1 -0
  51. package/dist/utils/brainstormSessionManager.d.ts +67 -0
  52. package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
  53. package/dist/utils/brainstormSessionManager.js +165 -0
  54. package/dist/utils/brainstormSessionManager.js.map +1 -0
  55. package/dist/utils/changeModeChunker.d.ts +11 -0
  56. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  57. package/dist/utils/changeModeChunker.js +89 -0
  58. package/dist/utils/changeModeChunker.js.map +1 -0
  59. package/dist/utils/changeModeParser.d.ts +15 -0
  60. package/dist/utils/changeModeParser.d.ts.map +1 -0
  61. package/dist/utils/changeModeParser.js +67 -0
  62. package/dist/utils/changeModeParser.js.map +1 -0
  63. package/dist/utils/changeModeTranslator.d.ts +8 -0
  64. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  65. package/dist/utils/changeModeTranslator.js +70 -0
  66. package/dist/utils/changeModeTranslator.js.map +1 -0
  67. package/dist/utils/chunkCache.d.ts +22 -0
  68. package/dist/utils/chunkCache.d.ts.map +1 -0
  69. package/dist/utils/chunkCache.js +161 -0
  70. package/dist/utils/chunkCache.js.map +1 -0
  71. package/dist/utils/commandExecutor.d.ts +2 -0
  72. package/dist/utils/commandExecutor.d.ts.map +1 -0
  73. package/dist/utils/commandExecutor.js +74 -0
  74. package/dist/utils/commandExecutor.js.map +1 -0
  75. package/dist/utils/geminiExecutor.d.ts +3 -0
  76. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  77. package/dist/utils/geminiExecutor.js +170 -0
  78. package/dist/utils/geminiExecutor.js.map +1 -0
  79. package/dist/utils/gitStateDetector.d.ts +31 -0
  80. package/dist/utils/gitStateDetector.d.ts.map +1 -0
  81. package/dist/utils/gitStateDetector.js +67 -0
  82. package/dist/utils/gitStateDetector.js.map +1 -0
  83. package/dist/utils/logger.d.ts +13 -0
  84. package/dist/utils/logger.d.ts.map +1 -0
  85. package/dist/utils/logger.js +42 -0
  86. package/dist/utils/logger.js.map +1 -0
  87. package/dist/utils/reviewFormatter.d.ts +35 -0
  88. package/dist/utils/reviewFormatter.d.ts.map +1 -0
  89. package/dist/utils/reviewFormatter.js +198 -0
  90. package/dist/utils/reviewFormatter.js.map +1 -0
  91. package/dist/utils/reviewPromptBuilder.d.ts +35 -0
  92. package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
  93. package/dist/utils/reviewPromptBuilder.js +146 -0
  94. package/dist/utils/reviewPromptBuilder.js.map +1 -0
  95. package/dist/utils/reviewResponseParser.d.ts +20 -0
  96. package/dist/utils/reviewResponseParser.d.ts.map +1 -0
  97. package/dist/utils/reviewResponseParser.js +149 -0
  98. package/dist/utils/reviewResponseParser.js.map +1 -0
  99. package/dist/utils/reviewSessionCache.d.ts +81 -0
  100. package/dist/utils/reviewSessionCache.d.ts.map +1 -0
  101. package/dist/utils/reviewSessionCache.js +220 -0
  102. package/dist/utils/reviewSessionCache.js.map +1 -0
  103. package/dist/utils/reviewSessionManager.d.ts +52 -0
  104. package/dist/utils/reviewSessionManager.d.ts.map +1 -0
  105. package/dist/utils/reviewSessionManager.js +65 -0
  106. package/dist/utils/reviewSessionManager.js.map +1 -0
  107. package/dist/utils/sessionManager.d.ts +94 -0
  108. package/dist/utils/sessionManager.d.ts.map +1 -0
  109. package/dist/utils/sessionManager.js +374 -0
  110. package/dist/utils/sessionManager.js.map +1 -0
  111. package/dist/utils/sessionSchemas.d.ts +126 -0
  112. package/dist/utils/sessionSchemas.d.ts.map +1 -0
  113. package/dist/utils/sessionSchemas.js +2 -0
  114. package/dist/utils/sessionSchemas.js.map +1 -0
  115. package/dist/utils/timeoutManager.d.ts +2 -0
  116. package/dist/utils/timeoutManager.d.ts.map +1 -0
  117. package/dist/utils/timeoutManager.js +2 -0
  118. package/dist/utils/timeoutManager.js.map +1 -0
  119. 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":"AAGA,OAAO,EAAc,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAoBrD,MAAM,CAAC,MAAM,YAAY,GAAkB,EAAE,CAAC;AAC9C,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACrD,CAAC;AACD,MAAM,UAAU,kBAAkB;IAChC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC7B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAQ,CAAC;QAC9D,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QAChD,MAAM,WAAW,GAAwB;YACvC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;YAChC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;SAC7B,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAqB;IACnD,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAQ,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE3C,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAgB,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,YAAY;QACpD,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;KAClC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY;SAChB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;SAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,MAAO,CAAC,WAAW;QACrC,SAAS,EAAE,IAAI,CAAC,MAAO,CAAC,SAAS,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;KAC5E,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,IAAmB,EAAE,UAAwC;IAC/G,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,IAAI,CAAC;QAAC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClH,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjG,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAyB;IAC1E,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,IAAI,GAAG,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACjF,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,CAAC;gBACxC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,QAAQ,QAAQ,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const reviewCodeTool: UnifiedTool;
3
+ //# sourceMappingURL=review-code.tool.d.ts.map
@@ -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,4 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const pingTool: UnifiedTool;
3
+ export declare const helpTool: UnifiedTool;
4
+ //# sourceMappingURL=simple-tools.d.ts.map
@@ -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,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const timeoutTestTool: UnifiedTool;
3
+ //# sourceMappingURL=timeout-test.tool.d.ts.map
@@ -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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"}