@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.
Files changed (131) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +203 -0
  3. package/dist/backends/codex.d.ts +37 -0
  4. package/dist/backends/codex.d.ts.map +1 -0
  5. package/dist/backends/codex.js +438 -0
  6. package/dist/backends/codex.js.map +1 -0
  7. package/dist/backends/gemini.d.ts +17 -0
  8. package/dist/backends/gemini.d.ts.map +1 -0
  9. package/dist/backends/gemini.js +174 -0
  10. package/dist/backends/gemini.js.map +1 -0
  11. package/dist/backends/index.d.ts +8 -0
  12. package/dist/backends/index.d.ts.map +1 -0
  13. package/dist/backends/index.js +9 -0
  14. package/dist/backends/index.js.map +1 -0
  15. package/dist/backends/registry.d.ts +33 -0
  16. package/dist/backends/registry.d.ts.map +1 -0
  17. package/dist/backends/registry.js +80 -0
  18. package/dist/backends/registry.js.map +1 -0
  19. package/dist/backends/types.d.ts +61 -0
  20. package/dist/backends/types.d.ts.map +1 -0
  21. package/dist/backends/types.js +5 -0
  22. package/dist/backends/types.js.map +1 -0
  23. package/dist/constants.d.ts +223 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +228 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +192 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/tools/ask.tool.d.ts +4 -0
  32. package/dist/tools/ask.tool.d.ts.map +1 -0
  33. package/dist/tools/ask.tool.js +113 -0
  34. package/dist/tools/ask.tool.js.map +1 -0
  35. package/dist/tools/brainstorm.tool.d.ts +3 -0
  36. package/dist/tools/brainstorm.tool.d.ts.map +1 -0
  37. package/dist/tools/brainstorm.tool.js +250 -0
  38. package/dist/tools/brainstorm.tool.js.map +1 -0
  39. package/dist/tools/index.d.ts +5 -0
  40. package/dist/tools/index.d.ts.map +1 -0
  41. package/dist/tools/index.js +13 -0
  42. package/dist/tools/index.js.map +1 -0
  43. package/dist/tools/registry.d.ts +42 -0
  44. package/dist/tools/registry.d.ts.map +1 -0
  45. package/dist/tools/registry.js +85 -0
  46. package/dist/tools/registry.js.map +1 -0
  47. package/dist/tools/review-code.tool.d.ts +3 -0
  48. package/dist/tools/review-code.tool.d.ts.map +1 -0
  49. package/dist/tools/review-code.tool.js +279 -0
  50. package/dist/tools/review-code.tool.js.map +1 -0
  51. package/dist/tools/test-tool.example.d.ts +13 -0
  52. package/dist/tools/test-tool.example.d.ts.map +1 -0
  53. package/dist/tools/test-tool.example.js +32 -0
  54. package/dist/tools/test-tool.example.js.map +1 -0
  55. package/dist/tools/timeout-test.tool.d.ts +3 -0
  56. package/dist/tools/timeout-test.tool.d.ts.map +1 -0
  57. package/dist/tools/timeout-test.tool.js +38 -0
  58. package/dist/tools/timeout-test.tool.js.map +1 -0
  59. package/dist/utils/askSessionManager.d.ts +59 -0
  60. package/dist/utils/askSessionManager.d.ts.map +1 -0
  61. package/dist/utils/askSessionManager.js +123 -0
  62. package/dist/utils/askSessionManager.js.map +1 -0
  63. package/dist/utils/brainstormSessionManager.d.ts +67 -0
  64. package/dist/utils/brainstormSessionManager.d.ts.map +1 -0
  65. package/dist/utils/brainstormSessionManager.js +174 -0
  66. package/dist/utils/brainstormSessionManager.js.map +1 -0
  67. package/dist/utils/changeModeInstructions.d.ts +17 -0
  68. package/dist/utils/changeModeInstructions.d.ts.map +1 -0
  69. package/dist/utils/changeModeInstructions.js +100 -0
  70. package/dist/utils/changeModeInstructions.js.map +1 -0
  71. package/dist/utils/changeModeParser.d.ts +15 -0
  72. package/dist/utils/changeModeParser.d.ts.map +1 -0
  73. package/dist/utils/changeModeParser.js +81 -0
  74. package/dist/utils/changeModeParser.js.map +1 -0
  75. package/dist/utils/changeModeTranslator.d.ts +4 -0
  76. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  77. package/dist/utils/changeModeTranslator.js +42 -0
  78. package/dist/utils/changeModeTranslator.js.map +1 -0
  79. package/dist/utils/commandExecutor.d.ts +2 -0
  80. package/dist/utils/commandExecutor.d.ts.map +1 -0
  81. package/dist/utils/commandExecutor.js +76 -0
  82. package/dist/utils/commandExecutor.js.map +1 -0
  83. package/dist/utils/envAllowlist.d.ts +17 -0
  84. package/dist/utils/envAllowlist.d.ts.map +1 -0
  85. package/dist/utils/envAllowlist.js +54 -0
  86. package/dist/utils/envAllowlist.js.map +1 -0
  87. package/dist/utils/geminiExecutor.d.ts +3 -0
  88. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  89. package/dist/utils/geminiExecutor.js +94 -0
  90. package/dist/utils/geminiExecutor.js.map +1 -0
  91. package/dist/utils/gitStateDetector.d.ts +32 -0
  92. package/dist/utils/gitStateDetector.d.ts.map +1 -0
  93. package/dist/utils/gitStateDetector.js +68 -0
  94. package/dist/utils/gitStateDetector.js.map +1 -0
  95. package/dist/utils/logger.d.ts +13 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +42 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/reviewFormatter.d.ts +35 -0
  100. package/dist/utils/reviewFormatter.d.ts.map +1 -0
  101. package/dist/utils/reviewFormatter.js +201 -0
  102. package/dist/utils/reviewFormatter.js.map +1 -0
  103. package/dist/utils/reviewPromptBuilder.d.ts +43 -0
  104. package/dist/utils/reviewPromptBuilder.d.ts.map +1 -0
  105. package/dist/utils/reviewPromptBuilder.js +170 -0
  106. package/dist/utils/reviewPromptBuilder.js.map +1 -0
  107. package/dist/utils/reviewResponseParser.d.ts +20 -0
  108. package/dist/utils/reviewResponseParser.d.ts.map +1 -0
  109. package/dist/utils/reviewResponseParser.js +149 -0
  110. package/dist/utils/reviewResponseParser.js.map +1 -0
  111. package/dist/utils/reviewSessionCache.d.ts +81 -0
  112. package/dist/utils/reviewSessionCache.d.ts.map +1 -0
  113. package/dist/utils/reviewSessionCache.js +220 -0
  114. package/dist/utils/reviewSessionCache.js.map +1 -0
  115. package/dist/utils/reviewSessionManager.d.ts +52 -0
  116. package/dist/utils/reviewSessionManager.d.ts.map +1 -0
  117. package/dist/utils/reviewSessionManager.js +65 -0
  118. package/dist/utils/reviewSessionManager.js.map +1 -0
  119. package/dist/utils/sessionManager.d.ts +95 -0
  120. package/dist/utils/sessionManager.d.ts.map +1 -0
  121. package/dist/utils/sessionManager.js +382 -0
  122. package/dist/utils/sessionManager.js.map +1 -0
  123. package/dist/utils/sessionSchemas.d.ts +140 -0
  124. package/dist/utils/sessionSchemas.d.ts.map +1 -0
  125. package/dist/utils/sessionSchemas.js +2 -0
  126. package/dist/utils/sessionSchemas.js.map +1 -0
  127. package/dist/utils/timeoutManager.d.ts +2 -0
  128. package/dist/utils/timeoutManager.d.ts.map +1 -0
  129. package/dist/utils/timeoutManager.js +2 -0
  130. package/dist/utils/timeoutManager.js.map +1 -0
  131. 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":"AAEA,UAAU;AACV,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,2DAA2D;IAC3E,oBAAoB,EAAE,qFAAqF;IAC3G,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,6IAA6I;IACjK,2CAA2C;IAC3C,4BAA4B,EAAE,6CAA6C;IAC3E,+BAA+B,EAAE,4CAA4C;IAC7E,uCAAuC,EAAE,mDAAmD;IAC5F,cAAc,EAAE,kBAAkB;IAClC,cAAc,EAAE,kBAAkB;IAClC,kBAAkB,EAAE,sBAAsB;IAC1C,oBAAoB,EAAE,wBAAwB;CACtC,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,eAAe,EAAE,+DAA+D;IAChF,WAAW,EAAE,qCAAqC;IAClD,aAAa,EAAE,sCAAsC;IACrD,iBAAiB,EAAE,6CAA6C;IAChE,8BAA8B;IAC9B,gBAAgB,EAAE,kEAAkE;IACpF,mBAAmB,EAAE,+CAA+C;IACpE,mBAAmB,EAAE,mCAAmC;CAChD,CAAC;AAEX,SAAS;AACT,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE,gBAAgB;IACzB,GAAG,EAAE,gBAAgB;IACrB,KAAK,EAAE,kBAAkB;CACjB,CAAC;AAEX,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,sBAAsB,EAAE,MAAM,CAAC,KAAK;IACpC,wBAAwB,EAAE,MAAM,CAAC,OAAO;CACzC,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,gBAAgB;IAChB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,WAAW;KACvB;IACD,gBAAgB;IAChB,aAAa,EAAE;QACb,IAAI,EAAE,MAAM;KACb;IACD,eAAe;IACf,MAAM,EAAE;QACN,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;KACjB;IACD,uBAAuB;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,wBAAwB;KACnC;IACD,qBAAqB;IACrB,kBAAkB,EAAE,KAAK,EAAE,aAAa;CAChC,CAAC;AAGX,gBAAgB;AAChB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,gBAAgB;IAChB,QAAQ,EAAE;QACR,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;KACb;IACD,gBAAgB;IAChB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO;QACb,aAAa,EAAE,iBAAiB;KACjC;IACD,iBAAiB;IACjB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,6DAA6D;QAClF,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO;KACvB;CACO,CAAC;AAEX,oBAAoB;AACpB,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,MAAM,EAAE,QAAQ,EAAG,kBAAkB;IACrC,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,sBAAsB;AACtB,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;KACjB;IACD,KAAK,EAAE;QACL,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,aAAa;QACxB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;KACX;IACD,cAAc,EAAE;QACd,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,OAAO;KACf;IACD,aAAa,EAAE;QACb,SAAS,EAAE,WAAW;QACtB,eAAe,EAAE,iBAAiB;QAClC,WAAW,EAAE,oBAAoB;KAClC;IACD,gBAAgB,EAAE;QAChB,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,QAAQ,EAAO,sCAAsC;QAC7D,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO,EAAS,gCAAgC;KACxD;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IACzC,eAAe,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,6BAA6B;IAChE,eAAe,EAAE,GAAG,EAAE,kCAAkC;CAChD,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,eAAe,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,+CAA+C;IAClF,eAAe,EAAE,KAAK,EAAE,+BAA+B;CAC/C,CAAC;AAEX,eAAe;AACf,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,cAAc;IACd,OAAO,EAAE,SAAS,EAAmB,+BAA+B;IACpE,YAAY,EAAE,cAAc,EAAS,iCAAiC;IACtE,aAAa,EAAE,eAAe,EAAO,uBAAuB;IAC5D,aAAa,EAAE,eAAe,EAAO,uBAAuB;IAC5D,OAAO,EAAE,SAAS,EAAmB,wBAAwB;IAC7D,4CAA4C;IAC5C,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,QAAQ,EAAE,sBAAsB,EAAE,gCAAgC;IAClE,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,mBAAmB;IACrD,oBAAoB,EAAE,EAAE;IACxB,uBAAuB,EAAE,KAAc;IAEvC,0BAA0B;IAC1B,YAAY,EAAE;QACZ,aAAa,EAAE;YACb,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,WAAW;YACrC,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,KAAc;SAChC;QACD,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;YACvC,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,KAAc;SAChC;QACD,YAAY,EAAE;YACZ,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;YACvC,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,KAAc;SAChC;QACD,YAAY,EAAE;YACZ,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;YACzC,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,KAAc;SAChC;KACF;CACO,CAAC;AAEX,wBAAwB;AACxB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,6DAA6D;IAC7D,OAAO,EAAE;QACP,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,0BAA0B;QAC/C,YAAY,EAAE,EAAE;QAChB,cAAc,EAAE,4BAA4B,EAAE,aAAa;KAC5D;IACD,eAAe;IACf,KAAK,EAAE;QACL,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,SAAS;KACnB;IACD,0BAA0B;IAC1B,QAAQ,EAAE;QACR,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,UAAU;KACrB;IACD,iBAAiB;IACjB,MAAM,EAAE;QACN,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,UAAU;KACrB;IACD,gBAAgB;IAChB,aAAa,EAAE;QACb,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,WAAW;KACvB;IACD,eAAe;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,cAAc;QAC5B,OAAO,EAAE,SAAS;KACnB;IACD,aAAa;IACb,kBAAkB,EAAE,CAAC,EAAE,iDAAiD;IACxE,cAAc,EAAE;QACd,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;KACN;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const askTool: UnifiedTool;
3
+ export declare const askGeminiTool: UnifiedTool;
4
+ //# sourceMappingURL=ask.tool.d.ts.map
@@ -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,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const brainstormTool: UnifiedTool;
3
+ //# sourceMappingURL=brainstorm.tool.d.ts.map
@@ -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"}