@maxanatsko/llm-cli-bridge 3.1.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 +26 -0
- package/README.md +203 -0
- package/dist/backends/codex.d.ts +37 -0
- package/dist/backends/codex.d.ts.map +1 -0
- package/dist/backends/codex.js +438 -0
- package/dist/backends/codex.js.map +1 -0
- package/dist/backends/gemini.d.ts +17 -0
- package/dist/backends/gemini.d.ts.map +1 -0
- package/dist/backends/gemini.js +174 -0
- package/dist/backends/gemini.js.map +1 -0
- package/dist/backends/index.d.ts +8 -0
- package/dist/backends/index.d.ts.map +1 -0
- package/dist/backends/index.js +9 -0
- package/dist/backends/index.js.map +1 -0
- package/dist/backends/registry.d.ts +33 -0
- package/dist/backends/registry.d.ts.map +1 -0
- package/dist/backends/registry.js +80 -0
- package/dist/backends/registry.js.map +1 -0
- package/dist/backends/types.d.ts +61 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +5 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/constants.d.ts +223 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +228 -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 +192 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/ask.tool.d.ts +4 -0
- package/dist/tools/ask.tool.d.ts.map +1 -0
- package/dist/tools/ask.tool.js +113 -0
- package/dist/tools/ask.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 +250 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +42 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +85 -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 +279 -0
- package/dist/tools/review-code.tool.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 +38 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/askSessionManager.d.ts +59 -0
- package/dist/utils/askSessionManager.d.ts.map +1 -0
- package/dist/utils/askSessionManager.js +123 -0
- package/dist/utils/askSessionManager.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 +174 -0
- package/dist/utils/brainstormSessionManager.js.map +1 -0
- package/dist/utils/changeModeInstructions.d.ts +17 -0
- package/dist/utils/changeModeInstructions.d.ts.map +1 -0
- package/dist/utils/changeModeInstructions.js +100 -0
- package/dist/utils/changeModeInstructions.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 +81 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +4 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +42 -0
- package/dist/utils/changeModeTranslator.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 +76 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/envAllowlist.d.ts +17 -0
- package/dist/utils/envAllowlist.d.ts.map +1 -0
- package/dist/utils/envAllowlist.js +54 -0
- package/dist/utils/envAllowlist.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 +94 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/gitStateDetector.d.ts +32 -0
- package/dist/utils/gitStateDetector.d.ts.map +1 -0
- package/dist/utils/gitStateDetector.js +68 -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 +201 -0
- package/dist/utils/reviewFormatter.js.map +1 -0
- package/dist/utils/reviewPromptBuilder.d.ts +43 -0
- package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
- package/dist/utils/reviewPromptBuilder.js +170 -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 +95 -0
- package/dist/utils/sessionManager.d.ts.map +1 -0
- package/dist/utils/sessionManager.js +382 -0
- package/dist/utils/sessionManager.js.map +1 -0
- package/dist/utils/sessionSchemas.d.ts +140 -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 +72 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// Logging
|
|
2
|
+
export const LOG_PREFIX = "[GMCPT]";
|
|
3
|
+
// Error messages
|
|
4
|
+
export const ERROR_MESSAGES = {
|
|
5
|
+
QUOTA_EXCEEDED: "Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'",
|
|
6
|
+
QUOTA_EXCEEDED_SHORT: "⚠️ Gemini 2.5 Pro daily quota exceeded. Please retry with model: 'gemini-2.5-flash'",
|
|
7
|
+
TOOL_NOT_FOUND: "not found in registry",
|
|
8
|
+
NO_PROMPT_PROVIDED: "Please provide a prompt for analysis. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions",
|
|
9
|
+
// Codex @file inlining (translateFileRefs)
|
|
10
|
+
ACCESS_DENIED_PATH_TRAVERSAL: "[Access denied: path traversal not allowed]",
|
|
11
|
+
ACCESS_DENIED_OUTSIDE_WORKSPACE: "[Access denied: path is outside workspace]",
|
|
12
|
+
ACCESS_DENIED_SYMLINK_OUTSIDE_WORKSPACE: "[Access denied: symlink points outside workspace]",
|
|
13
|
+
FILE_TOO_LARGE: "[File too large]",
|
|
14
|
+
FILE_NOT_FOUND: "[File not found]",
|
|
15
|
+
ERROR_READING_FILE: "[Error reading file]",
|
|
16
|
+
INLINE_LIMIT_REACHED: "[Inline limit reached]",
|
|
17
|
+
};
|
|
18
|
+
// Status messages
|
|
19
|
+
export const STATUS_MESSAGES = {
|
|
20
|
+
QUOTA_SWITCHING: "🚫 Gemini 2.5 Pro quota exceeded, switching to Flash model...",
|
|
21
|
+
FLASH_RETRY: "⚡ Retrying with Gemini 2.5 Flash...",
|
|
22
|
+
FLASH_SUCCESS: "✅ Flash model completed successfully",
|
|
23
|
+
SANDBOX_EXECUTING: "🔒 Executing CLI command in sandbox mode...",
|
|
24
|
+
// Timeout prevention messages
|
|
25
|
+
PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)",
|
|
26
|
+
PROCESSING_CONTINUE: "⏳ Still processing... Working on your request",
|
|
27
|
+
PROCESSING_COMPLETE: "✅ Analysis completed successfully",
|
|
28
|
+
};
|
|
29
|
+
// Models
|
|
30
|
+
export const MODELS = {
|
|
31
|
+
PRO_3: "gemini-3.1-pro",
|
|
32
|
+
FLASH_3: "gemini-3-flash",
|
|
33
|
+
PRO: "gemini-2.5-pro",
|
|
34
|
+
FLASH: "gemini-2.5-flash",
|
|
35
|
+
};
|
|
36
|
+
// Backward-compatible model aliases for deprecated Gemini model names
|
|
37
|
+
export const GEMINI_MODEL_ALIASES = {
|
|
38
|
+
"gemini-3-pro-preview": MODELS.PRO_3,
|
|
39
|
+
"gemini-3-flash-preview": MODELS.FLASH_3,
|
|
40
|
+
};
|
|
41
|
+
// MCP Protocol Constants
|
|
42
|
+
export const PROTOCOL = {
|
|
43
|
+
// Message roles
|
|
44
|
+
ROLES: {
|
|
45
|
+
USER: "user",
|
|
46
|
+
ASSISTANT: "assistant",
|
|
47
|
+
},
|
|
48
|
+
// Content types
|
|
49
|
+
CONTENT_TYPES: {
|
|
50
|
+
TEXT: "text",
|
|
51
|
+
},
|
|
52
|
+
// Status codes
|
|
53
|
+
STATUS: {
|
|
54
|
+
SUCCESS: "success",
|
|
55
|
+
ERROR: "error",
|
|
56
|
+
FAILED: "failed",
|
|
57
|
+
REPORT: "report",
|
|
58
|
+
},
|
|
59
|
+
// Notification methods
|
|
60
|
+
NOTIFICATIONS: {
|
|
61
|
+
PROGRESS: "notifications/progress",
|
|
62
|
+
},
|
|
63
|
+
// Timeout prevention
|
|
64
|
+
KEEPALIVE_INTERVAL: 25000, // 25 seconds
|
|
65
|
+
};
|
|
66
|
+
// CLI Constants
|
|
67
|
+
export const CLI = {
|
|
68
|
+
// Command names
|
|
69
|
+
COMMANDS: {
|
|
70
|
+
GEMINI: "gemini",
|
|
71
|
+
ECHO: "echo",
|
|
72
|
+
},
|
|
73
|
+
// Command flags
|
|
74
|
+
FLAGS: {
|
|
75
|
+
MODEL: "-m",
|
|
76
|
+
SANDBOX: "-s",
|
|
77
|
+
PROMPT: "-p",
|
|
78
|
+
HELP: "-help",
|
|
79
|
+
ALLOWED_TOOLS: "--allowed-tools",
|
|
80
|
+
},
|
|
81
|
+
// Default values
|
|
82
|
+
DEFAULTS: {
|
|
83
|
+
MODEL: MODELS.PRO_3, // Tool default model used when no specific model is provided
|
|
84
|
+
BOOLEAN_TRUE: "true",
|
|
85
|
+
BOOLEAN_FALSE: "false",
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
// Backend Constants
|
|
89
|
+
export const BACKENDS = {
|
|
90
|
+
GEMINI: 'gemini', // Default backend
|
|
91
|
+
CODEX: 'codex',
|
|
92
|
+
};
|
|
93
|
+
// Codex CLI Constants
|
|
94
|
+
export const CODEX_CLI = {
|
|
95
|
+
COMMANDS: {
|
|
96
|
+
EXEC: 'exec',
|
|
97
|
+
RESUME: 'resume',
|
|
98
|
+
},
|
|
99
|
+
FLAGS: {
|
|
100
|
+
CONFIG: '--config',
|
|
101
|
+
MODEL: '-m',
|
|
102
|
+
APPROVAL: '-a',
|
|
103
|
+
SANDBOX: '-s',
|
|
104
|
+
FULL_AUTO: '--full-auto',
|
|
105
|
+
JSON: '--json',
|
|
106
|
+
STDIN: '-',
|
|
107
|
+
},
|
|
108
|
+
APPROVAL_MODES: {
|
|
109
|
+
UNTRUSTED: 'untrusted',
|
|
110
|
+
ON_FAILURE: 'on-failure',
|
|
111
|
+
ON_REQUEST: 'on-request',
|
|
112
|
+
NEVER: 'never',
|
|
113
|
+
},
|
|
114
|
+
SANDBOX_MODES: {
|
|
115
|
+
READ_ONLY: 'read-only',
|
|
116
|
+
WORKSPACE_WRITE: 'workspace-write',
|
|
117
|
+
FULL_ACCESS: 'danger-full-access',
|
|
118
|
+
},
|
|
119
|
+
REASONING_EFFORT: {
|
|
120
|
+
LOW: 'low',
|
|
121
|
+
MEDIUM: 'medium', // Default, recommended for most tasks
|
|
122
|
+
HIGH: 'high',
|
|
123
|
+
XHIGH: 'xhigh', // Extra high, for hardest tasks
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
export const CODEX_FILE_REF = {
|
|
127
|
+
MAX_FILE_BYTES: 10 * 1024 * 1024, // 10MB
|
|
128
|
+
MAX_TOTAL_BYTES: 20 * 1024 * 1024, // 20MB total inlined content
|
|
129
|
+
MAX_DIR_ENTRIES: 200, // Prevent huge directory listings
|
|
130
|
+
};
|
|
131
|
+
export const CODEX_OUTPUT = {
|
|
132
|
+
MAX_OUTPUT_SIZE: 10 * 1024 * 1024, // 10MB max output to prevent memory exhaustion
|
|
133
|
+
MAX_JSONL_LINES: 10000, // Maximum JSONL lines to parse
|
|
134
|
+
};
|
|
135
|
+
// Codex Models
|
|
136
|
+
export const CODEX_MODELS = {
|
|
137
|
+
// Recommended
|
|
138
|
+
GPT_5_4: 'gpt-5.4', // Latest general-purpose model
|
|
139
|
+
GPT_5_4_MINI: 'gpt-5.4-mini', // Faster/cheaper GPT-5.4 variant
|
|
140
|
+
GPT_5_3_CODEX: 'gpt-5.3-codex', // Agentic coding model
|
|
141
|
+
GPT_5_2_CODEX: 'gpt-5.2-codex', // Agentic coding model
|
|
142
|
+
GPT_5_2: 'gpt-5.2', // General-purpose model
|
|
143
|
+
// Default (used when no model is specified)
|
|
144
|
+
DEFAULT: 'gpt-5.4',
|
|
145
|
+
};
|
|
146
|
+
// Shared Session Management Constants
|
|
147
|
+
export const SESSION = {
|
|
148
|
+
BASE_DIR: '.ai-cli-mcp/sessions', // Base directory in user's home
|
|
149
|
+
DEFAULT_TTL: 24 * 60 * 60 * 1000, // 24 hours default
|
|
150
|
+
DEFAULT_MAX_SESSIONS: 20,
|
|
151
|
+
DEFAULT_EVICTION_POLICY: 'lru',
|
|
152
|
+
// Per-tool configurations
|
|
153
|
+
TOOL_CONFIGS: {
|
|
154
|
+
'review-code': {
|
|
155
|
+
TTL: 24 * 60 * 60 * 1000, // 24 hours
|
|
156
|
+
MAX_SESSIONS: 20,
|
|
157
|
+
EVICTION_POLICY: 'lru'
|
|
158
|
+
},
|
|
159
|
+
'ask': {
|
|
160
|
+
TTL: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
161
|
+
MAX_SESSIONS: 50,
|
|
162
|
+
EVICTION_POLICY: 'lru'
|
|
163
|
+
},
|
|
164
|
+
'ask-gemini': {
|
|
165
|
+
TTL: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
166
|
+
MAX_SESSIONS: 50,
|
|
167
|
+
EVICTION_POLICY: 'lru'
|
|
168
|
+
},
|
|
169
|
+
'brainstorm': {
|
|
170
|
+
TTL: 14 * 24 * 60 * 60 * 1000, // 14 days
|
|
171
|
+
MAX_SESSIONS: 30,
|
|
172
|
+
EVICTION_POLICY: 'lru'
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
// Code Review Constants
|
|
177
|
+
export const REVIEW = {
|
|
178
|
+
// Session configuration (deprecated - use SESSION constants)
|
|
179
|
+
SESSION: {
|
|
180
|
+
TTL: 60 * 60 * 1000, // 60 minutes (deprecated)
|
|
181
|
+
MAX_SESSIONS: 20,
|
|
182
|
+
CACHE_DIR_NAME: 'ai-cli-mcp-review-sessions', // deprecated
|
|
183
|
+
},
|
|
184
|
+
// Review types
|
|
185
|
+
TYPES: {
|
|
186
|
+
SECURITY: 'security',
|
|
187
|
+
PERFORMANCE: 'performance',
|
|
188
|
+
QUALITY: 'quality',
|
|
189
|
+
ARCHITECTURE: 'architecture',
|
|
190
|
+
GENERAL: 'general',
|
|
191
|
+
},
|
|
192
|
+
// Comment severity levels
|
|
193
|
+
SEVERITY: {
|
|
194
|
+
CRITICAL: 'critical',
|
|
195
|
+
IMPORTANT: 'important',
|
|
196
|
+
SUGGESTION: 'suggestion',
|
|
197
|
+
QUESTION: 'question',
|
|
198
|
+
},
|
|
199
|
+
// Comment status
|
|
200
|
+
STATUS: {
|
|
201
|
+
PENDING: 'pending',
|
|
202
|
+
ACCEPTED: 'accepted',
|
|
203
|
+
REJECTED: 'rejected',
|
|
204
|
+
MODIFIED: 'modified',
|
|
205
|
+
DEFERRED: 'deferred',
|
|
206
|
+
},
|
|
207
|
+
// Session state
|
|
208
|
+
SESSION_STATE: {
|
|
209
|
+
ACTIVE: 'active',
|
|
210
|
+
PAUSED: 'paused',
|
|
211
|
+
COMPLETED: 'completed',
|
|
212
|
+
},
|
|
213
|
+
// Review scope
|
|
214
|
+
SCOPE: {
|
|
215
|
+
FULL: 'full',
|
|
216
|
+
CHANGES_ONLY: 'changes-only',
|
|
217
|
+
FOCUSED: 'focused',
|
|
218
|
+
},
|
|
219
|
+
// Formatting
|
|
220
|
+
MAX_HISTORY_ROUNDS: 3, // How many previous rounds to include in context
|
|
221
|
+
SEVERITY_EMOJI: {
|
|
222
|
+
critical: '🔴',
|
|
223
|
+
important: '🟠',
|
|
224
|
+
suggestion: '🟡',
|
|
225
|
+
question: '💬',
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { Logger } from "./utils/logger.js";
|
|
6
|
+
import { PROTOCOL } from "./constants.js";
|
|
7
|
+
import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage } from "./tools/index.js";
|
|
8
|
+
const server = new Server({
|
|
9
|
+
name: "llm-cli-bridge",
|
|
10
|
+
version: "3.1.0",
|
|
11
|
+
}, {
|
|
12
|
+
capabilities: {
|
|
13
|
+
tools: {},
|
|
14
|
+
prompts: {},
|
|
15
|
+
notifications: {},
|
|
16
|
+
logging: {},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
async function sendNotification(method, params) {
|
|
20
|
+
try {
|
|
21
|
+
await server.notification({ method, params });
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
Logger.error("notification failed: ", error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @param progressToken The progress token provided by the client
|
|
29
|
+
* @param progress The current progress value
|
|
30
|
+
* @param total Optional total value
|
|
31
|
+
* @param message Optional status message
|
|
32
|
+
*/
|
|
33
|
+
async function sendProgressNotification(progressToken, progress, total, message) {
|
|
34
|
+
if (progressToken === undefined || progressToken === null)
|
|
35
|
+
return; // Only send if client requested progress
|
|
36
|
+
try {
|
|
37
|
+
const params = {
|
|
38
|
+
progressToken,
|
|
39
|
+
progress
|
|
40
|
+
};
|
|
41
|
+
if (total !== undefined)
|
|
42
|
+
params.total = total; // future cache progress
|
|
43
|
+
if (message)
|
|
44
|
+
params.message = message;
|
|
45
|
+
await server.notification({
|
|
46
|
+
method: PROTOCOL.NOTIFICATIONS.PROGRESS,
|
|
47
|
+
params
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
Logger.error("Failed to send progress notification:", error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function startProgressUpdates(operationName, progressToken) {
|
|
55
|
+
const hasProgressToken = progressToken !== undefined && progressToken !== null;
|
|
56
|
+
// Per-request state - no global variables
|
|
57
|
+
let isActive = true;
|
|
58
|
+
let latestOutput = "";
|
|
59
|
+
let messageIndex = 0;
|
|
60
|
+
let progress = 0;
|
|
61
|
+
const progressMessages = [
|
|
62
|
+
`🧠 ${operationName} - Analyzing your request...`,
|
|
63
|
+
`📊 ${operationName} - Processing files and generating insights...`,
|
|
64
|
+
`✨ ${operationName} - Creating structured response for your review...`,
|
|
65
|
+
`⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
|
|
66
|
+
`🔍 ${operationName} - Still working... Quality results take time...`,
|
|
67
|
+
];
|
|
68
|
+
// Send immediate acknowledgment if progress requested
|
|
69
|
+
if (hasProgressToken) {
|
|
70
|
+
sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
|
|
71
|
+
`🔍 Starting ${operationName}`);
|
|
72
|
+
}
|
|
73
|
+
// Keep client alive with periodic updates
|
|
74
|
+
const progressInterval = setInterval(async () => {
|
|
75
|
+
if (isActive && hasProgressToken) {
|
|
76
|
+
// Simply increment progress value
|
|
77
|
+
progress += 1;
|
|
78
|
+
// Include latest output if available
|
|
79
|
+
const baseMessage = progressMessages[messageIndex % progressMessages.length];
|
|
80
|
+
const outputPreview = latestOutput.slice(-150).trim(); // Last 150 chars
|
|
81
|
+
const message = outputPreview
|
|
82
|
+
? `${baseMessage}\n📝 Output: ...${outputPreview}`
|
|
83
|
+
: baseMessage;
|
|
84
|
+
await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
|
|
85
|
+
message);
|
|
86
|
+
messageIndex++;
|
|
87
|
+
}
|
|
88
|
+
}, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
|
|
89
|
+
const stop = (success) => {
|
|
90
|
+
isActive = false;
|
|
91
|
+
clearInterval(progressInterval);
|
|
92
|
+
// Send final progress notification if client requested progress
|
|
93
|
+
if (hasProgressToken) {
|
|
94
|
+
sendProgressNotification(progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const updateOutput = (output) => {
|
|
98
|
+
latestOutput = output;
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
interval: progressInterval,
|
|
102
|
+
progressToken,
|
|
103
|
+
operationName,
|
|
104
|
+
latestOutput,
|
|
105
|
+
isActive,
|
|
106
|
+
stop,
|
|
107
|
+
updateOutput,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// tools/list
|
|
111
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
112
|
+
return { tools: getToolDefinitions() };
|
|
113
|
+
});
|
|
114
|
+
// tools/get
|
|
115
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
116
|
+
const toolName = request.params.name;
|
|
117
|
+
if (toolExists(toolName)) {
|
|
118
|
+
// Check if client requested progress updates
|
|
119
|
+
const progressToken = request.params._meta?.progressToken;
|
|
120
|
+
// Start progress updates if client requested them (per-request state)
|
|
121
|
+
const progressState = startProgressUpdates(toolName, progressToken);
|
|
122
|
+
try {
|
|
123
|
+
// Get prompt and other parameters from arguments with proper typing
|
|
124
|
+
const args = request.params.arguments || {};
|
|
125
|
+
Logger.toolInvocation(toolName, request.params.arguments);
|
|
126
|
+
// Execute the tool using the unified registry with progress callback
|
|
127
|
+
const result = await executeTool(toolName, args, (newOutput) => {
|
|
128
|
+
progressState.updateOutput(newOutput);
|
|
129
|
+
});
|
|
130
|
+
// Stop progress updates
|
|
131
|
+
progressState.stop(true);
|
|
132
|
+
return {
|
|
133
|
+
content: [
|
|
134
|
+
{
|
|
135
|
+
type: "text",
|
|
136
|
+
text: result,
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
isError: false,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// Stop progress updates on error
|
|
144
|
+
progressState.stop(false);
|
|
145
|
+
Logger.error(`Error in tool '${toolName}':`, error);
|
|
146
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: `Error executing ${toolName}: ${errorMessage}`,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
isError: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
// prompts/list
|
|
163
|
+
server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
|
|
164
|
+
return { prompts: getPromptDefinitions() };
|
|
165
|
+
});
|
|
166
|
+
// prompts/get
|
|
167
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
168
|
+
const promptName = request.params.name;
|
|
169
|
+
const args = request.params.arguments || {};
|
|
170
|
+
const promptMessage = getPromptMessage(promptName, args);
|
|
171
|
+
if (!promptMessage) {
|
|
172
|
+
throw new Error(`Unknown prompt: ${promptName}`);
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
messages: [{
|
|
176
|
+
role: "user",
|
|
177
|
+
content: {
|
|
178
|
+
type: "text",
|
|
179
|
+
text: promptMessage
|
|
180
|
+
}
|
|
181
|
+
}]
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
// Start the server
|
|
185
|
+
async function main() {
|
|
186
|
+
Logger.debug("init llm-cli-bridge");
|
|
187
|
+
const transport = new StdioServerTransport();
|
|
188
|
+
await server.connect(transport);
|
|
189
|
+
Logger.debug("llm-cli-bridge listening on stdio");
|
|
190
|
+
}
|
|
191
|
+
main().catch((error) => { Logger.error("Fatal error:", error); process.exit(1); });
|
|
192
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.tool.d.ts","sourceRoot":"","sources":["../../src/tools/ask.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA0B5C,eAAO,MAAM,OAAO,EAAE,WAsHrB,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,WAI3B,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getBackend } from '../backends/index.js';
|
|
3
|
+
import { processChangeModeOutput } from '../utils/geminiExecutor.js';
|
|
4
|
+
import { ERROR_MESSAGES, CODEX_MODELS, MODELS } from '../constants.js';
|
|
5
|
+
import { askSessionManager } from '../utils/askSessionManager.js';
|
|
6
|
+
import { extractFilesFromPrompt } from '../utils/reviewPromptBuilder.js';
|
|
7
|
+
import { Logger } from '../utils/logger.js';
|
|
8
|
+
const askArgsSchema = z.object({
|
|
9
|
+
prompt: z.string().min(1).describe("Analysis request. Use @ syntax to include files (e.g., '@largefile.js explain what this does') or ask general questions"),
|
|
10
|
+
backend: z.enum(['gemini', 'codex']).optional().describe("AI backend to use: 'gemini' (default) or 'codex'. Gemini offers 1M+ token context, Codex integrates with OpenAI models."),
|
|
11
|
+
session: z.string().optional().describe("Session ID for conversation continuity (e.g., 'typescript-learning'). Maintains context across multiple questions."),
|
|
12
|
+
model: z.string().optional().describe("Model override. Gemini: 'gemini-3.1-pro' (default), 'gemini-3-flash', 'gemini-2.5-pro', 'gemini-2.5-flash'. Codex: 'gpt-5.4' (default), 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.2-codex', 'gpt-5.2'"),
|
|
13
|
+
reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh']).optional().describe("Reasoning effort level (Codex only): 'low', 'medium' (default), 'high', 'xhigh'. Use 'high'/'xhigh' for complex tasks."),
|
|
14
|
+
sandbox: z.boolean().default(false).describe("Sandbox (Gemini) / workspace-write (Codex). For Codex: false => read-only (default), true => workspace-write. Ignored if sandboxMode is set."),
|
|
15
|
+
sandboxMode: z.enum(['read-only', 'workspace-write', 'danger-full-access']).optional().describe("Codex-only override for sandbox policy (takes precedence over sandbox). Use 'danger-full-access' only with explicit opt-in."),
|
|
16
|
+
changeMode: z.boolean().default(false).describe("Enable structured change mode - formats prompts to prevent tool errors and returns structured edit suggestions that Claude can apply directly"),
|
|
17
|
+
includeHistory: z.boolean().default(true).describe("Include conversation history in context (only applies when session is provided). Default: true"),
|
|
18
|
+
allowedTools: z.array(z.string()).optional().describe("Tools that the AI can auto-approve without confirmation (e.g., ['run_shell_command'] for git commands). Use sparingly for security."),
|
|
19
|
+
cwd: z.string().optional().describe("Working directory for CLI execution. Use this to match your IDE workspace directory if you get 'Directory mismatch' errors."),
|
|
20
|
+
});
|
|
21
|
+
export const askTool = {
|
|
22
|
+
name: "ask",
|
|
23
|
+
description: "Query AI with file analysis, session continuity, and dual-backend support (Gemini/Codex). Use backend:'codex' for OpenAI, defaults to Gemini.",
|
|
24
|
+
zodSchema: askArgsSchema,
|
|
25
|
+
annotations: {
|
|
26
|
+
readOnlyHint: false, // Can modify state via sessions
|
|
27
|
+
destructiveHint: false, // Doesn't delete data
|
|
28
|
+
idempotentHint: false, // Same input may yield different AI responses
|
|
29
|
+
openWorldHint: true, // Interacts with external AI APIs
|
|
30
|
+
},
|
|
31
|
+
prompt: {
|
|
32
|
+
description: "Execute AI query with optional file references, session management, and backend selection.",
|
|
33
|
+
},
|
|
34
|
+
category: 'ai',
|
|
35
|
+
execute: async (args, onProgress) => {
|
|
36
|
+
const { prompt, backend: backendChoice, session, model, reasoningEffort, sandbox, sandboxMode, changeMode, includeHistory, allowedTools, cwd } = args;
|
|
37
|
+
if (!prompt?.trim()) {
|
|
38
|
+
throw new Error(ERROR_MESSAGES.NO_PROMPT_PROVIDED);
|
|
39
|
+
}
|
|
40
|
+
// Session handling - load first so we can use lastBackend for backend selection
|
|
41
|
+
let sessionData = null;
|
|
42
|
+
let enhancedPrompt = prompt;
|
|
43
|
+
if (session) {
|
|
44
|
+
try {
|
|
45
|
+
sessionData = await askSessionManager.getOrCreate(session);
|
|
46
|
+
// Build conversation context if history is enabled
|
|
47
|
+
if (includeHistory && sessionData.conversationHistory.length > 0) {
|
|
48
|
+
const historyContext = askSessionManager.buildConversationContext(sessionData, 3);
|
|
49
|
+
enhancedPrompt = `${historyContext}\n\n# Current Question\n${prompt}`;
|
|
50
|
+
}
|
|
51
|
+
onProgress?.(`📝 Session '${session}' (Round ${sessionData.totalRounds + 1})`);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
onProgress?.(`⚠️ Session loading failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
|
+
Logger.error(`Failed to load session '${session}': ${error}`);
|
|
56
|
+
// Continue without session
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Get the appropriate backend (defaults to session's last backend, then Gemini)
|
|
60
|
+
const backendType = backendChoice || sessionData?.lastBackend || 'gemini';
|
|
61
|
+
const backend = await getBackend(backendType);
|
|
62
|
+
onProgress?.(`🤖 Using ${backend.name} backend...`);
|
|
63
|
+
// Execute via the selected backend
|
|
64
|
+
// Pass existing codexThreadId for native session resume when using Codex
|
|
65
|
+
const result = await backend.execute(enhancedPrompt, {
|
|
66
|
+
provider: backendType,
|
|
67
|
+
model: model,
|
|
68
|
+
sandbox: !!sandbox,
|
|
69
|
+
sandboxMode: sandboxMode,
|
|
70
|
+
changeMode: !!changeMode,
|
|
71
|
+
allowedTools: allowedTools,
|
|
72
|
+
cwd: cwd,
|
|
73
|
+
codexThreadId: sessionData?.codexThreadId, // For Codex native session resume
|
|
74
|
+
reasoningEffort: reasoningEffort,
|
|
75
|
+
}, onProgress);
|
|
76
|
+
// Save to session if provided
|
|
77
|
+
if (session && sessionData) {
|
|
78
|
+
try {
|
|
79
|
+
const contextFiles = extractFilesFromPrompt(prompt);
|
|
80
|
+
// Use model from backend result (actual model used), fallback to input or default
|
|
81
|
+
const usedModel = result.model ||
|
|
82
|
+
model ||
|
|
83
|
+
(backendType === 'codex' ? CODEX_MODELS.DEFAULT : MODELS.PRO_3);
|
|
84
|
+
askSessionManager.addRound(sessionData, prompt, result.response, usedModel, contextFiles, backendType, result.codexThreadId // Store Codex thread ID for native session resume
|
|
85
|
+
);
|
|
86
|
+
await askSessionManager.save(sessionData);
|
|
87
|
+
onProgress?.(`💾 Saved to session '${session}' (${sessionData.totalRounds} rounds)`);
|
|
88
|
+
if (result.codexThreadId && result.codexThreadId.length > 0) {
|
|
89
|
+
const threadPreview = result.codexThreadId.slice(0, 8);
|
|
90
|
+
onProgress?.(`🔗 Codex thread: ${threadPreview}...`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
onProgress?.(`⚠️ Session save failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
95
|
+
Logger.error(`Failed to save session '${session}': ${error}`);
|
|
96
|
+
// Continue - result is still valid even if session save failed
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (changeMode) {
|
|
100
|
+
return processChangeModeOutput(result.response);
|
|
101
|
+
}
|
|
102
|
+
// Use backend-aware response prefix
|
|
103
|
+
const backendName = backend.name.charAt(0).toUpperCase() + backend.name.slice(1);
|
|
104
|
+
return `${backendName} response:\n${result.response}`;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
// Backward compatibility: register as a separate tool name
|
|
108
|
+
export const askGeminiTool = {
|
|
109
|
+
...askTool,
|
|
110
|
+
name: 'ask-gemini',
|
|
111
|
+
description: "Backward-compatible alias for 'ask'.",
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=ask.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.tool.js","sourceRoot":"","sources":["../../src/tools/ask.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brainstorm.tool.d.ts","sourceRoot":"","sources":["../../src/tools/brainstorm.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsI5C,eAAO,MAAM,cAAc,EAAE,WAqI5B,CAAC"}
|