@osanoai/multicli 1.5.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/README.md +209 -0
- package/dist/clientFilter.d.ts +5 -0
- package/dist/clientFilter.d.ts.map +1 -0
- package/dist/clientFilter.js +27 -0
- package/dist/clientFilter.js.map +1 -0
- package/dist/constants.d.ts +88 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +90 -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 +205 -0
- package/dist/index.js.map +1 -0
- package/dist/modelCatalog.d.ts +14 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.js +99 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/tools/ask-claude.tool.d.ts +3 -0
- package/dist/tools/ask-claude.tool.d.ts.map +1 -0
- package/dist/tools/ask-claude.tool.js +28 -0
- package/dist/tools/ask-claude.tool.js.map +1 -0
- package/dist/tools/ask-codex.tool.d.ts +3 -0
- package/dist/tools/ask-codex.tool.d.ts.map +1 -0
- package/dist/tools/ask-codex.tool.js +27 -0
- package/dist/tools/ask-codex.tool.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +3 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
- package/dist/tools/ask-gemini.tool.js +36 -0
- package/dist/tools/ask-gemini.tool.js.map +1 -0
- package/dist/tools/brainstorm-claude.tool.d.ts +3 -0
- package/dist/tools/brainstorm-claude.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm-claude.tool.js +42 -0
- package/dist/tools/brainstorm-claude.tool.js.map +1 -0
- package/dist/tools/brainstorm-codex.tool.d.ts +3 -0
- package/dist/tools/brainstorm-codex.tool.d.ts.map +1 -0
- package/dist/tools/brainstorm-codex.tool.js +42 -0
- package/dist/tools/brainstorm-codex.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 +42 -0
- package/dist/tools/brainstorm.tool.js.map +1 -0
- package/dist/tools/fetch-chunk.tool.d.ts +3 -0
- package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
- package/dist/tools/fetch-chunk.tool.js +58 -0
- package/dist/tools/fetch-chunk.tool.js.map +1 -0
- package/dist/tools/important-read-now.tool.d.ts +3 -0
- package/dist/tools/important-read-now.tool.d.ts.map +1 -0
- package/dist/tools/important-read-now.tool.js +31 -0
- package/dist/tools/important-read-now.tool.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +25 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +78 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/simple-tools.d.ts +8 -0
- package/dist/tools/simple-tools.d.ts.map +1 -0
- package/dist/tools/simple-tools.js +78 -0
- package/dist/tools/simple-tools.js.map +1 -0
- package/dist/tools/test-tool.example.d.ts +13 -0
- package/dist/tools/test-tool.example.d.ts.map +1 -0
- package/dist/tools/test-tool.example.js +32 -0
- package/dist/tools/test-tool.example.js.map +1 -0
- package/dist/tools/timeout-test.tool.d.ts +3 -0
- package/dist/tools/timeout-test.tool.d.ts.map +1 -0
- package/dist/tools/timeout-test.tool.js +32 -0
- package/dist/tools/timeout-test.tool.js.map +1 -0
- package/dist/utils/brainstormPromptBuilder.d.ts +11 -0
- package/dist/utils/brainstormPromptBuilder.d.ts.map +1 -0
- package/dist/utils/brainstormPromptBuilder.js +93 -0
- package/dist/utils/brainstormPromptBuilder.js.map +1 -0
- package/dist/utils/changeModeChunker.d.ts +11 -0
- package/dist/utils/changeModeChunker.d.ts.map +1 -0
- package/dist/utils/changeModeChunker.js +89 -0
- package/dist/utils/changeModeChunker.js.map +1 -0
- package/dist/utils/changeModeParser.d.ts +15 -0
- package/dist/utils/changeModeParser.d.ts.map +1 -0
- package/dist/utils/changeModeParser.js +67 -0
- package/dist/utils/changeModeParser.js.map +1 -0
- package/dist/utils/changeModeTranslator.d.ts +8 -0
- package/dist/utils/changeModeTranslator.d.ts.map +1 -0
- package/dist/utils/changeModeTranslator.js +70 -0
- package/dist/utils/changeModeTranslator.js.map +1 -0
- package/dist/utils/chunkCache.d.ts +22 -0
- package/dist/utils/chunkCache.d.ts.map +1 -0
- package/dist/utils/chunkCache.js +147 -0
- package/dist/utils/chunkCache.js.map +1 -0
- package/dist/utils/claudeExecutor.d.ts +2 -0
- package/dist/utils/claudeExecutor.d.ts.map +1 -0
- package/dist/utils/claudeExecutor.js +21 -0
- package/dist/utils/claudeExecutor.js.map +1 -0
- package/dist/utils/cliDetector.d.ts +17 -0
- package/dist/utils/cliDetector.d.ts.map +1 -0
- package/dist/utils/cliDetector.js +45 -0
- package/dist/utils/cliDetector.js.map +1 -0
- package/dist/utils/codexExecutor.d.ts +2 -0
- package/dist/utils/codexExecutor.d.ts.map +1 -0
- package/dist/utils/codexExecutor.js +19 -0
- package/dist/utils/codexExecutor.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 +53 -0
- package/dist/utils/commandExecutor.js.map +1 -0
- package/dist/utils/geminiExecutor.d.ts +3 -0
- package/dist/utils/geminiExecutor.d.ts.map +1 -0
- package/dist/utils/geminiExecutor.js +126 -0
- package/dist/utils/geminiExecutor.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +56 -0
- package/dist/utils/logger.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 +68 -0
package/README.md
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Osano AI - Multi CLI MCP
|
|
2
|
+
|
|
3
|
+
**The AI collab no one asked for, but everyone needed.**
|
|
4
|
+
|
|
5
|
+
An MCP server that lets Claude, Gemini, and Codex call each other as tools. Because why argue about which AI is best when you can make them work together?
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Claude: "Hey Gemini, what do you think about this code?"
|
|
9
|
+
Gemini: "It's mass. Let me ask Codex for a second opinion."
|
|
10
|
+
Codex: "You're both wrong. Here's the fix."
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## What It Does
|
|
14
|
+
|
|
15
|
+
Multi-CLI sits between your AI clients and bridges them via the [Model Context Protocol](https://modelcontextprotocol.io/). Install it once, and whichever AI you're talking to gains the ability to call the others.
|
|
16
|
+
|
|
17
|
+
- **Claude** can ask Gemini or Codex for help
|
|
18
|
+
- **Gemini** can delegate to Claude or Codex
|
|
19
|
+
- **Codex** can consult Claude or Gemini
|
|
20
|
+
- Each client's own tools are hidden (no talking to yourself, that's weird)
|
|
21
|
+
- Auto-detects which CLIs you have installed — only shows what's available
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
You need **Node.js >= 18** and at least **two** of these CLIs installed:
|
|
26
|
+
|
|
27
|
+
| CLI | Install |
|
|
28
|
+
|-----|---------|
|
|
29
|
+
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `npm install -g @google/gemini-cli` |
|
|
30
|
+
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) | `npm install -g @anthropic-ai/claude-code` |
|
|
31
|
+
| [Codex CLI](https://github.com/openai/codex) | `npm install -g @openai/codex` |
|
|
32
|
+
|
|
33
|
+
> Why two? Because one AI talking to itself is a monologue, not a collaboration.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Installation
|
|
38
|
+
|
|
39
|
+
### Claude Code
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
claude mcp add "Multi-CLI" -- npx -y "Multi-CLI"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
That's it. Restart Claude Code and Gemini + Codex tools appear automatically.
|
|
46
|
+
|
|
47
|
+
<details>
|
|
48
|
+
<summary>Claude Desktop (JSON config)</summary>
|
|
49
|
+
|
|
50
|
+
Add to your config file (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"mcpServers": {
|
|
55
|
+
"multicli-mcp": {
|
|
56
|
+
"command": "npx",
|
|
57
|
+
"args": ["-y", "multicli-mcp"]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Restart Claude Desktop completely after saving.
|
|
64
|
+
</details>
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Gemini CLI
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
gemini mcp add --scope user multicli-mcp npx -y multicli-mcp
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Restart the Gemini CLI and Claude + Codex tools will be available.
|
|
75
|
+
|
|
76
|
+
<details>
|
|
77
|
+
<summary>Manual config (~/.gemini/settings.json)</summary>
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"mcpServers": {
|
|
82
|
+
"multicli-mcp": {
|
|
83
|
+
"command": "npx",
|
|
84
|
+
"args": ["-y", "multicli-mcp"]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
</details>
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### Codex CLI
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
codex mcp add multicli-mcp -- npx -y multicli-mcp
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Restart Codex and Claude + Gemini tools will be available.
|
|
100
|
+
|
|
101
|
+
<details>
|
|
102
|
+
<summary>Manual config (~/.codex/config.toml) or pass --mcp-config</summary>
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
codex --mcp-config mcp.json
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Where `mcp.json` contains:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"mcpServers": {
|
|
113
|
+
"Multi-CLI": {
|
|
114
|
+
"command": "npx",
|
|
115
|
+
"args": ["-y", "multicli"]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
</details>
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### Any Other MCP Client
|
|
125
|
+
|
|
126
|
+
Multi-CLI uses standard stdio transport. If your client supports MCP, point it at:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
npx -y multicli
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Available Tools
|
|
135
|
+
|
|
136
|
+
Once connected, your AI client gains access to tools for the *other* CLIs (never its own):
|
|
137
|
+
|
|
138
|
+
| Tool | Description |
|
|
139
|
+
|------|-------------|
|
|
140
|
+
| `List Gemini Models` | List available Gemini models and their strengths |
|
|
141
|
+
| `Ask Gemini` | Ask Gemini a question or give it a task |
|
|
142
|
+
| `Fetch Chunk` | Retrieve chunked responses from Gemini |
|
|
143
|
+
| `Gemini Help` | Get Gemini CLI help info |
|
|
144
|
+
| `List Codex Models` | List available Codex models |
|
|
145
|
+
| `Ask Codex` | Ask Codex a question or give it a task |
|
|
146
|
+
| `Codex Help` | Get Codex CLI help info |
|
|
147
|
+
| `List Claude Models` | List available Claude models |
|
|
148
|
+
| `Ask Claude` | Ask Claude a question or give it a task |
|
|
149
|
+
| `Claude Help` | Get Claude Code CLI help info |
|
|
150
|
+
|
|
151
|
+
## Usage Examples
|
|
152
|
+
|
|
153
|
+
Once installed, just talk naturally to your AI:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
"Ask Gemini what it thinks about this architecture"
|
|
157
|
+
"Have Codex review this function for performance issues"
|
|
158
|
+
"Get Claude's opinion on this error message"
|
|
159
|
+
"Use Gemini to analyze @largefile.js"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Or get a second opinion on anything:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
"I want three perspectives on how to refactor this module —
|
|
166
|
+
ask Gemini and Codex what they'd do differently"
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## How It Works
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
┌─────────────┐ MCP (stdio) ┌──────────────┐ CLI calls ┌─────────────┐
|
|
173
|
+
│ Your AI │ ◄──────────────────► │ Multi-CLI │ ───────────────► │ Other AIs │
|
|
174
|
+
│ Client │ │ server │ │ (CLI tools) │
|
|
175
|
+
└─────────────┘ └──────────────┘ └─────────────┘
|
|
176
|
+
|
|
177
|
+
1. Your AI client connects to Multi-CLI via MCP
|
|
178
|
+
2. Multi-CLI detects which CLIs are installed on your system
|
|
179
|
+
3. It registers tools for the OTHER clients (hides tools for the calling client)
|
|
180
|
+
4. When a tool is called, Multi-CLI executes the corresponding CLI command
|
|
181
|
+
5. Results flow back through MCP to your AI client
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Troubleshooting
|
|
185
|
+
|
|
186
|
+
**"No usable AI CLIs detected"**
|
|
187
|
+
Make sure at least one other CLI is installed and on your PATH:
|
|
188
|
+
```bash
|
|
189
|
+
which gemini && which codex && which claude
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**No tools showing up?**
|
|
193
|
+
If only your own CLI is installed, Multi-CLI hides it (no self-calls). Install a *different* CLI to enable cross-model collaboration.
|
|
194
|
+
|
|
195
|
+
**MCP server not responding?**
|
|
196
|
+
1. Check that Node.js >= 18 is installed
|
|
197
|
+
2. Run `npx multicli` directly to see if it starts
|
|
198
|
+
3. Restart your AI client completely
|
|
199
|
+
|
|
200
|
+
## Development
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
git clone https://github.com/osanoai/multicli.git
|
|
204
|
+
cd multicli
|
|
205
|
+
npm install
|
|
206
|
+
npm run build
|
|
207
|
+
npm run dev
|
|
208
|
+
```
|
|
209
|
+
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { UnifiedTool } from './tools/registry.js';
|
|
2
|
+
export declare function getExcludedCategory(clientName: string | undefined): UnifiedTool['category'] | undefined;
|
|
3
|
+
export declare function filterToolsForClient(tools: UnifiedTool[], clientName: string | undefined): UnifiedTool[];
|
|
4
|
+
export declare function isToolBlockedForClient(tool: UnifiedTool | undefined, clientName: string | undefined): boolean;
|
|
5
|
+
//# sourceMappingURL=clientFilter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientFilter.d.ts","sourceRoot":"","sources":["../src/clientFilter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAalD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS,CAGvG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,EAAE,CAKxG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI7G"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-based tool filtering: hide a client's own tools
|
|
3
|
+
* (no point asking yourself for a second opinion).
|
|
4
|
+
*/
|
|
5
|
+
const CLIENT_EXCLUSIONS = {
|
|
6
|
+
'claude-code': 'claude',
|
|
7
|
+
'codex-mcp-client': 'codex',
|
|
8
|
+
'gemini-cli-mcp-client': 'gemini',
|
|
9
|
+
};
|
|
10
|
+
export function getExcludedCategory(clientName) {
|
|
11
|
+
if (!clientName)
|
|
12
|
+
return undefined;
|
|
13
|
+
return CLIENT_EXCLUSIONS[clientName];
|
|
14
|
+
}
|
|
15
|
+
export function filterToolsForClient(tools, clientName) {
|
|
16
|
+
const excluded = getExcludedCategory(clientName);
|
|
17
|
+
if (!excluded)
|
|
18
|
+
return tools;
|
|
19
|
+
return tools.filter(t => t.category !== excluded);
|
|
20
|
+
}
|
|
21
|
+
export function isToolBlockedForClient(tool, clientName) {
|
|
22
|
+
if (!tool)
|
|
23
|
+
return false;
|
|
24
|
+
const excluded = getExcludedCategory(clientName);
|
|
25
|
+
return excluded !== undefined && tool.category === excluded;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=clientFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientFilter.js","sourceRoot":"","sources":["../src/clientFilter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,iBAAiB,GAA4C;IACjE,aAAa,EAAa,QAAQ;IAClC,kBAAkB,EAAQ,OAAO;IACjC,uBAAuB,EAAG,QAAQ;CACnC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,UAA8B;IAChE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAoB,EAAE,UAA8B;IACvF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAA6B,EAAE,UAA8B;IAClG,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export declare const ERROR_MESSAGES: {
|
|
2
|
+
readonly QUOTA_EXCEEDED: "Quota exceeded for Gemini model requests";
|
|
3
|
+
readonly QUOTA_EXCEEDED_SHORT: "⚠️ Gemini daily quota exceeded. Please try again later.";
|
|
4
|
+
readonly TOOL_NOT_FOUND: "not found in registry";
|
|
5
|
+
readonly 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";
|
|
6
|
+
};
|
|
7
|
+
export declare const STATUS_MESSAGES: {
|
|
8
|
+
readonly SANDBOX_EXECUTING: "🔒 Executing CLI command in sandbox mode...";
|
|
9
|
+
readonly GEMINI_RESPONSE: "Gemini response:";
|
|
10
|
+
readonly CODEX_RESPONSE: "Codex response:";
|
|
11
|
+
readonly CLAUDE_RESPONSE: "Claude response:";
|
|
12
|
+
readonly PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)";
|
|
13
|
+
readonly PROCESSING_CONTINUE: "⏳ Still processing...";
|
|
14
|
+
readonly PROCESSING_COMPLETE: "✅ Analysis completed successfully";
|
|
15
|
+
};
|
|
16
|
+
export declare const PROTOCOL: {
|
|
17
|
+
readonly ROLES: {
|
|
18
|
+
readonly USER: "user";
|
|
19
|
+
readonly ASSISTANT: "assistant";
|
|
20
|
+
};
|
|
21
|
+
readonly CONTENT_TYPES: {
|
|
22
|
+
readonly TEXT: "text";
|
|
23
|
+
};
|
|
24
|
+
readonly STATUS: {
|
|
25
|
+
readonly SUCCESS: "success";
|
|
26
|
+
readonly ERROR: "error";
|
|
27
|
+
readonly FAILED: "failed";
|
|
28
|
+
readonly REPORT: "report";
|
|
29
|
+
};
|
|
30
|
+
readonly NOTIFICATIONS: {
|
|
31
|
+
readonly PROGRESS: "notifications/progress";
|
|
32
|
+
};
|
|
33
|
+
readonly KEEPALIVE_INTERVAL: 25000;
|
|
34
|
+
};
|
|
35
|
+
export declare const CLI: {
|
|
36
|
+
readonly COMMANDS: {
|
|
37
|
+
readonly GEMINI: "gemini";
|
|
38
|
+
readonly CODEX: "codex";
|
|
39
|
+
readonly CLAUDE: "claude";
|
|
40
|
+
readonly ECHO: "echo";
|
|
41
|
+
};
|
|
42
|
+
readonly FLAGS: {
|
|
43
|
+
readonly MODEL: "-m";
|
|
44
|
+
readonly SANDBOX: "-s";
|
|
45
|
+
readonly PROMPT: "-p";
|
|
46
|
+
readonly HELP: "-help";
|
|
47
|
+
};
|
|
48
|
+
readonly SUBCOMMANDS: {
|
|
49
|
+
readonly EXEC: "exec";
|
|
50
|
+
};
|
|
51
|
+
readonly CODEX_FLAGS: {
|
|
52
|
+
readonly MODEL: "-m";
|
|
53
|
+
readonly SANDBOX: "-s";
|
|
54
|
+
readonly APPROVAL: "-a";
|
|
55
|
+
readonly COLOR: "--color";
|
|
56
|
+
readonly FULL_AUTO: "--full-auto";
|
|
57
|
+
readonly SKIP_GIT_CHECK: "--skip-git-repo-check";
|
|
58
|
+
};
|
|
59
|
+
readonly CLAUDE_FLAGS: {
|
|
60
|
+
readonly PRINT: "--print";
|
|
61
|
+
readonly MODEL: "--model";
|
|
62
|
+
readonly OUTPUT_FORMAT: "--output-format";
|
|
63
|
+
readonly PERMISSION_MODE: "--permission-mode";
|
|
64
|
+
readonly MAX_BUDGET: "--max-budget-usd";
|
|
65
|
+
readonly SYSTEM_PROMPT: "--system-prompt";
|
|
66
|
+
readonly TOOLS: "--tools";
|
|
67
|
+
readonly HELP: "--help";
|
|
68
|
+
};
|
|
69
|
+
readonly DEFAULTS: {
|
|
70
|
+
readonly BOOLEAN_TRUE: "true";
|
|
71
|
+
readonly BOOLEAN_FALSE: "false";
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
export interface ToolArguments {
|
|
75
|
+
prompt?: string;
|
|
76
|
+
model?: string;
|
|
77
|
+
sandbox?: boolean | string;
|
|
78
|
+
changeMode?: boolean | string;
|
|
79
|
+
chunkIndex?: number | string;
|
|
80
|
+
chunkCacheKey?: string;
|
|
81
|
+
message?: string;
|
|
82
|
+
approvalPolicy?: string;
|
|
83
|
+
permissionMode?: string;
|
|
84
|
+
maxBudgetUsd?: number;
|
|
85
|
+
systemPrompt?: string;
|
|
86
|
+
[key: string]: string | boolean | number | undefined;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AAGX,eAAO,MAAM,eAAe;;;;;;;;CASlB,CAAC;AAGX,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAIX,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CN,CAAC;AAIX,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACtD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Error messages
|
|
2
|
+
export const ERROR_MESSAGES = {
|
|
3
|
+
QUOTA_EXCEEDED: "Quota exceeded for Gemini model requests",
|
|
4
|
+
QUOTA_EXCEEDED_SHORT: "⚠️ Gemini daily quota exceeded. Please try again later.",
|
|
5
|
+
TOOL_NOT_FOUND: "not found in registry",
|
|
6
|
+
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",
|
|
7
|
+
};
|
|
8
|
+
// Status messages
|
|
9
|
+
export const STATUS_MESSAGES = {
|
|
10
|
+
SANDBOX_EXECUTING: "🔒 Executing CLI command in sandbox mode...",
|
|
11
|
+
GEMINI_RESPONSE: "Gemini response:",
|
|
12
|
+
CODEX_RESPONSE: "Codex response:",
|
|
13
|
+
CLAUDE_RESPONSE: "Claude response:",
|
|
14
|
+
// Timeout prevention messages
|
|
15
|
+
PROCESSING_START: "🔍 Starting analysis (may take 5-15 minutes for large codebases)",
|
|
16
|
+
PROCESSING_CONTINUE: "⏳ Still processing...",
|
|
17
|
+
PROCESSING_COMPLETE: "✅ Analysis completed successfully",
|
|
18
|
+
};
|
|
19
|
+
// MCP Protocol Constants
|
|
20
|
+
export const PROTOCOL = {
|
|
21
|
+
// Message roles
|
|
22
|
+
ROLES: {
|
|
23
|
+
USER: "user",
|
|
24
|
+
ASSISTANT: "assistant",
|
|
25
|
+
},
|
|
26
|
+
// Content types
|
|
27
|
+
CONTENT_TYPES: {
|
|
28
|
+
TEXT: "text",
|
|
29
|
+
},
|
|
30
|
+
// Status codes
|
|
31
|
+
STATUS: {
|
|
32
|
+
SUCCESS: "success",
|
|
33
|
+
ERROR: "error",
|
|
34
|
+
FAILED: "failed",
|
|
35
|
+
REPORT: "report",
|
|
36
|
+
},
|
|
37
|
+
// Notification methods
|
|
38
|
+
NOTIFICATIONS: {
|
|
39
|
+
PROGRESS: "notifications/progress",
|
|
40
|
+
},
|
|
41
|
+
// Timeout prevention
|
|
42
|
+
KEEPALIVE_INTERVAL: 25000, // 25 seconds
|
|
43
|
+
};
|
|
44
|
+
// CLI Constants
|
|
45
|
+
export const CLI = {
|
|
46
|
+
// Command names
|
|
47
|
+
COMMANDS: {
|
|
48
|
+
GEMINI: "gemini",
|
|
49
|
+
CODEX: "codex",
|
|
50
|
+
CLAUDE: "claude",
|
|
51
|
+
ECHO: "echo",
|
|
52
|
+
},
|
|
53
|
+
// Gemini command flags
|
|
54
|
+
FLAGS: {
|
|
55
|
+
MODEL: "-m",
|
|
56
|
+
SANDBOX: "-s",
|
|
57
|
+
PROMPT: "-p",
|
|
58
|
+
HELP: "-help",
|
|
59
|
+
},
|
|
60
|
+
// Codex subcommands
|
|
61
|
+
SUBCOMMANDS: {
|
|
62
|
+
EXEC: "exec",
|
|
63
|
+
},
|
|
64
|
+
// Codex-specific flags
|
|
65
|
+
CODEX_FLAGS: {
|
|
66
|
+
MODEL: "-m",
|
|
67
|
+
SANDBOX: "-s",
|
|
68
|
+
APPROVAL: "-a",
|
|
69
|
+
COLOR: "--color",
|
|
70
|
+
FULL_AUTO: "--full-auto",
|
|
71
|
+
SKIP_GIT_CHECK: "--skip-git-repo-check",
|
|
72
|
+
},
|
|
73
|
+
// Claude Code flags
|
|
74
|
+
CLAUDE_FLAGS: {
|
|
75
|
+
PRINT: "--print",
|
|
76
|
+
MODEL: "--model",
|
|
77
|
+
OUTPUT_FORMAT: "--output-format",
|
|
78
|
+
PERMISSION_MODE: "--permission-mode",
|
|
79
|
+
MAX_BUDGET: "--max-budget-usd",
|
|
80
|
+
SYSTEM_PROMPT: "--system-prompt",
|
|
81
|
+
TOOLS: "--tools",
|
|
82
|
+
HELP: "--help",
|
|
83
|
+
},
|
|
84
|
+
// Default values
|
|
85
|
+
DEFAULTS: {
|
|
86
|
+
BOOLEAN_TRUE: "true",
|
|
87
|
+
BOOLEAN_FALSE: "false",
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,0CAA0C;IAC1D,oBAAoB,EAAE,yDAAyD;IAC/E,cAAc,EAAE,uBAAuB;IACvC,kBAAkB,EAAE,6IAA6I;CACzJ,CAAC;AAEX,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB,EAAE,6CAA6C;IAChE,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,kBAAkB;IACnC,8BAA8B;IAC9B,gBAAgB,EAAE,kEAAkE;IACpF,mBAAmB,EAAE,uBAAuB;IAC5C,mBAAmB,EAAE,mCAAmC;CAChD,CAAC;AAEX,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,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;KACb;IACD,uBAAuB;IACvB,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,OAAO;KACd;IACD,oBAAoB;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM;KACb;IACD,uBAAuB;IACvB,WAAW,EAAE;QACX,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,aAAa;QACxB,cAAc,EAAE,uBAAuB;KACxC;IACD,oBAAoB;IACpB,YAAY,EAAE;QACZ,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,iBAAiB;QAChC,eAAe,EAAE,mBAAmB;QACpC,UAAU,EAAE,kBAAkB;QAC9B,aAAa,EAAE,iBAAiB;QAChC,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,QAAQ;KACf;IACD,iBAAiB;IACjB,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,OAAO;KACvB;CACO,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
+
import { PROTOCOL } from "./constants.js";
|
|
7
|
+
import { getToolDefinitions, getPromptDefinitions, executeTool, toolExists, getPromptMessage, toolRegistry, initTools, } from "./tools/index.js";
|
|
8
|
+
import { importantReadNowTool } from './tools/important-read-now.tool.js';
|
|
9
|
+
import { filterToolsForClient, isToolBlockedForClient } from './clientFilter.js';
|
|
10
|
+
const server = new Server({
|
|
11
|
+
name: "Multi-CLI",
|
|
12
|
+
version: "1.5.0",
|
|
13
|
+
}, {
|
|
14
|
+
capabilities: {
|
|
15
|
+
tools: {},
|
|
16
|
+
prompts: {},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
let connectedClientName;
|
|
20
|
+
server.oninitialized = () => {
|
|
21
|
+
const clientInfo = server.getClientVersion();
|
|
22
|
+
connectedClientName = clientInfo?.name;
|
|
23
|
+
};
|
|
24
|
+
let isProcessing = false;
|
|
25
|
+
let currentOperationName = "";
|
|
26
|
+
let latestOutput = "";
|
|
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)
|
|
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 {
|
|
51
|
+
// progress notification errors are non-critical
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function startProgressUpdates(operationName, progressToken) {
|
|
55
|
+
isProcessing = true;
|
|
56
|
+
currentOperationName = operationName;
|
|
57
|
+
latestOutput = ""; // Reset latest output
|
|
58
|
+
const progressMessages = [
|
|
59
|
+
`🧠 ${operationName} - Analyzing your request...`,
|
|
60
|
+
`📊 ${operationName} - Processing and generating insights...`,
|
|
61
|
+
`✨ ${operationName} - Creating structured response for your review...`,
|
|
62
|
+
`⏱️ ${operationName} - Large analysis in progress (this is normal for big requests)...`,
|
|
63
|
+
`🔍 ${operationName} - Still working on your request...`,
|
|
64
|
+
];
|
|
65
|
+
let messageIndex = 0;
|
|
66
|
+
let progress = 0;
|
|
67
|
+
// Send immediate acknowledgment if progress requested
|
|
68
|
+
if (progressToken) {
|
|
69
|
+
sendProgressNotification(progressToken, 0, undefined, // No total - indeterminate progress
|
|
70
|
+
`🔍 Starting ${operationName}`);
|
|
71
|
+
}
|
|
72
|
+
// Keep client alive with periodic updates
|
|
73
|
+
const progressInterval = setInterval(async () => {
|
|
74
|
+
if (isProcessing && progressToken) {
|
|
75
|
+
// Simply increment progress value
|
|
76
|
+
progress += 1;
|
|
77
|
+
// Include latest output if available
|
|
78
|
+
const baseMessage = progressMessages[messageIndex % progressMessages.length];
|
|
79
|
+
const outputPreview = latestOutput.slice(-150).trim(); // Last 150 chars
|
|
80
|
+
const message = outputPreview
|
|
81
|
+
? `${baseMessage}\n📝 Output: ...${outputPreview}`
|
|
82
|
+
: baseMessage;
|
|
83
|
+
await sendProgressNotification(progressToken, progress, undefined, // No total - indeterminate progress
|
|
84
|
+
message);
|
|
85
|
+
messageIndex++;
|
|
86
|
+
}
|
|
87
|
+
else if (!isProcessing) {
|
|
88
|
+
clearInterval(progressInterval);
|
|
89
|
+
}
|
|
90
|
+
}, PROTOCOL.KEEPALIVE_INTERVAL); // Every 25 seconds
|
|
91
|
+
return { interval: progressInterval, progressToken };
|
|
92
|
+
}
|
|
93
|
+
function stopProgressUpdates(progressData, success = true) {
|
|
94
|
+
const operationName = currentOperationName; // Store before clearing
|
|
95
|
+
isProcessing = false;
|
|
96
|
+
currentOperationName = "";
|
|
97
|
+
clearInterval(progressData.interval);
|
|
98
|
+
// Send final progress notification if client requested progress
|
|
99
|
+
if (progressData.progressToken) {
|
|
100
|
+
sendProgressNotification(progressData.progressToken, 100, 100, success ? `✅ ${operationName} completed successfully` : `❌ ${operationName} failed`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// tools/list
|
|
104
|
+
server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
105
|
+
const visible = filterToolsForClient(toolRegistry, connectedClientName);
|
|
106
|
+
if (visible.length === 0) {
|
|
107
|
+
return { tools: getToolDefinitions([importantReadNowTool]) };
|
|
108
|
+
}
|
|
109
|
+
return { tools: getToolDefinitions(visible) };
|
|
110
|
+
});
|
|
111
|
+
// tools/get
|
|
112
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
113
|
+
const toolName = request.params.name;
|
|
114
|
+
// Handle fallback tool (dynamically injected, not in registry)
|
|
115
|
+
if (toolName === importantReadNowTool.name) {
|
|
116
|
+
const result = await importantReadNowTool.execute({});
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: result }],
|
|
119
|
+
isError: false,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const toolEntry = toolRegistry.find(t => t.name === toolName);
|
|
123
|
+
if (isToolBlockedForClient(toolEntry, connectedClientName)) {
|
|
124
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
125
|
+
}
|
|
126
|
+
if (toolExists(toolName)) {
|
|
127
|
+
// Check if client requested progress updates
|
|
128
|
+
const progressToken = request.params._meta?.progressToken;
|
|
129
|
+
// Start progress updates if client requested them
|
|
130
|
+
const progressData = startProgressUpdates(toolName, progressToken);
|
|
131
|
+
try {
|
|
132
|
+
// Get prompt and other parameters from arguments with proper typing
|
|
133
|
+
const args = request.params.arguments || {};
|
|
134
|
+
// Execute the tool using the unified registry with progress callback
|
|
135
|
+
const result = await executeTool(toolName, args, (newOutput) => {
|
|
136
|
+
latestOutput = newOutput;
|
|
137
|
+
});
|
|
138
|
+
// Stop progress updates
|
|
139
|
+
stopProgressUpdates(progressData, true);
|
|
140
|
+
return {
|
|
141
|
+
content: [
|
|
142
|
+
{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: result,
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
isError: false,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Stop progress updates on error
|
|
152
|
+
stopProgressUpdates(progressData, false);
|
|
153
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: `Error executing ${toolName}: ${errorMessage}`,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
// prompts/list
|
|
170
|
+
server.setRequestHandler(ListPromptsRequestSchema, async (request) => {
|
|
171
|
+
const visible = filterToolsForClient(toolRegistry, connectedClientName);
|
|
172
|
+
return { prompts: getPromptDefinitions(visible) };
|
|
173
|
+
});
|
|
174
|
+
// prompts/get
|
|
175
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
176
|
+
const promptName = request.params.name;
|
|
177
|
+
const promptEntry = toolRegistry.find(t => t.name === promptName);
|
|
178
|
+
if (isToolBlockedForClient(promptEntry, connectedClientName)) {
|
|
179
|
+
throw new Error(`Unknown prompt: ${promptName}`);
|
|
180
|
+
}
|
|
181
|
+
const args = request.params.arguments || {};
|
|
182
|
+
const promptMessage = getPromptMessage(promptName, args);
|
|
183
|
+
if (!promptMessage) {
|
|
184
|
+
throw new Error(`Unknown prompt: ${promptName}`);
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
messages: [{
|
|
188
|
+
role: "user",
|
|
189
|
+
content: {
|
|
190
|
+
type: "text",
|
|
191
|
+
text: promptMessage
|
|
192
|
+
}
|
|
193
|
+
}]
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
// Start the server
|
|
197
|
+
async function main() {
|
|
198
|
+
await initTools();
|
|
199
|
+
const transport = new StdioServerTransport();
|
|
200
|
+
await server.connect(transport);
|
|
201
|
+
}
|
|
202
|
+
main().catch(() => {
|
|
203
|
+
process.exit(1);
|
|
204
|
+
});
|
|
205
|
+
//# 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,14 @@
|
|
|
1
|
+
export interface ModelTier {
|
|
2
|
+
tier: 'fast' | 'balanced' | 'powerful';
|
|
3
|
+
label: string;
|
|
4
|
+
models: string[];
|
|
5
|
+
useWhen: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CLICatalog {
|
|
8
|
+
cli: 'gemini' | 'codex' | 'claude';
|
|
9
|
+
tiers: ModelTier[];
|
|
10
|
+
note: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function getCatalog(cli: 'gemini' | 'codex' | 'claude'): CLICatalog;
|
|
13
|
+
export declare function formatCatalog(cli: 'gemini' | 'codex' | 'claude'): string;
|
|
14
|
+
//# sourceMappingURL=modelCatalog.d.ts.map
|