polydev-ai 1.8.35 → 1.8.37

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/lib/cliManager.js CHANGED
@@ -584,9 +584,10 @@ This is a known issue with @google/gemini-cli@0.3.4 and older Node.js versions.`
584
584
  // Claude Code uses --model flag
585
585
  args = ['--model', model, ...args, prompt];
586
586
  } else if (providerId === 'gemini_cli') {
587
- // Gemini CLI: -m for model, -p for prompt (headless mode)
588
- // Format: gemini -m gemini-2.0-flash -p "prompt"
589
- args = ['-m', model, '-p', prompt];
587
+ // Gemini CLI: -s for sandbox (no tools), -m for model, -p for prompt (headless mode)
588
+ // Format: gemini -s -m gemini-2.0-flash -p "prompt"
589
+ // -s flag disables agentic tool use which causes truncated "I will search..." outputs
590
+ args = ['-s', '-m', model, '-p', prompt];
590
591
  } else {
591
592
  // Default: just append prompt
592
593
  args = [...args, prompt];
@@ -594,8 +595,8 @@ This is a known issue with @google/gemini-cli@0.3.4 and older Node.js versions.`
594
595
  } else {
595
596
  // No model specified
596
597
  if (providerId === 'gemini_cli') {
597
- // Gemini CLI still needs -p flag for headless mode
598
- args = ['-p', prompt];
598
+ // Gemini CLI: -s for sandbox (no tools), -p for headless mode
599
+ args = ['-s', '-p', prompt];
599
600
  } else {
600
601
  args = [...args, prompt];
601
602
  }
package/mcp/README.md CHANGED
@@ -57,12 +57,44 @@ export POLYDEV_USER_TOKEN="pd_your_token_here"
57
57
  Add to your Claude Code MCP configuration:
58
58
 
59
59
  ```json
60
- "polydev": {
61
- "disabled": false,
62
- "timeout": 120,
63
- "type": "http",
64
- "url": "https://www.polydev.ai/api/mcp"
65
- },
60
+ "polydev": {
61
+ "disabled": false,
62
+ "timeout": 120,
63
+ "type": "http",
64
+ "url": "https://www.polydev.ai/api/mcp"
65
+ }
66
+ ```
67
+
68
+ ### Codex CLI Integration (OpenAI)
69
+
70
+ Add to `~/.codex/config.toml`:
71
+
72
+ ```toml
73
+ [mcp_servers.polydev]
74
+ command = "/path/to/node"
75
+ args = ["/path/to/node_modules/polydev-ai/mcp/stdio-wrapper.js"]
76
+ env = { POLYDEV_USER_TOKEN = "pd_your_token_here" }
77
+
78
+ [mcp_servers.polydev.timeouts]
79
+ tool_timeout = 180
80
+ session_timeout = 600
81
+ ```
82
+
83
+ **Important for Codex CLI:**
84
+ - Use direct `node` path instead of `npx` for faster startup
85
+ - Find your node path with: `which node`
86
+ - Find polydev path with: `npm root -g`
87
+
88
+ Example with typical paths:
89
+ ```toml
90
+ [mcp_servers.polydev]
91
+ command = "/Users/yourname/.nvm/versions/node/v22.20.0/bin/node"
92
+ args = ["/Users/yourname/.nvm/versions/node/v22.20.0/lib/node_modules/polydev-ai/mcp/stdio-wrapper.js"]
93
+ env = { POLYDEV_USER_TOKEN = "pd_your_token_here" }
94
+
95
+ [mcp_servers.polydev.timeouts]
96
+ tool_timeout = 180
97
+ session_timeout = 600
66
98
  ```
67
99
 
68
100
  ## Available Tools
@@ -129,6 +161,34 @@ The MCP server automatically detects CLI status changes:
129
161
 
130
162
  ## Troubleshooting
131
163
 
164
+ ### Codex CLI: "Transport closed" Error
165
+
166
+ This error occurs when the MCP handshake fails. Common causes and fixes:
167
+
168
+ 1. **Use direct node path instead of npx**
169
+ ```toml
170
+ # Wrong - npx has startup overhead
171
+ command = "npx"
172
+ args = ["-y", "polydev-ai"]
173
+
174
+ # Correct - direct node path
175
+ command = "/path/to/node"
176
+ args = ["/path/to/polydev-ai/mcp/stdio-wrapper.js"]
177
+ ```
178
+
179
+ 2. **Use inline env format**
180
+ ```toml
181
+ # Correct format
182
+ env = { POLYDEV_USER_TOKEN = "pd_xxx" }
183
+ ```
184
+
185
+ 3. **Protocol version mismatch**: Ensure polydev-ai version >= 1.8.36 which supports MCP protocol 2025-06-18
186
+
187
+ 4. **Check Codex logs** for details:
188
+ ```bash
189
+ cat ~/.codex/log/codex-tui.log | tail -50
190
+ ```
191
+
132
192
  ### CLI Not Detected
133
193
 
134
194
  1. Ensure the CLI is installed and in your PATH
@@ -149,6 +209,16 @@ npm config set prefix '~/.npm-global'
149
209
  export PATH=~/.npm-global/bin:$PATH
150
210
  ```
151
211
 
212
+ ### Debugging MCP Connection
213
+
214
+ Test the wrapper manually:
215
+ ```bash
216
+ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | \
217
+ POLYDEV_USER_TOKEN="pd_xxx" node /path/to/stdio-wrapper.js
218
+ ```
219
+
220
+ You should see a JSON response with `protocolVersion: "2025-06-18"`
221
+
152
222
  ## Support
153
223
 
154
224
  - 📧 Email: [support@polydev.ai](mailto:support@polydev.ai)
@@ -292,7 +292,7 @@ class StdioMCPWrapper {
292
292
  jsonrpc: '2.0',
293
293
  id,
294
294
  result: {
295
- protocolVersion: '2024-11-05',
295
+ protocolVersion: '2025-06-18',
296
296
  capabilities: { tools: {} },
297
297
  serverInfo: {
298
298
  name: this.manifest.name,
@@ -718,11 +718,6 @@ class StdioMCPWrapper {
718
718
  }
719
719
  }
720
720
 
721
- // Report CLI results to server for dashboard storage (non-blocking)
722
- this.reportCliResultsToServer(prompt, localResults, args).catch(err => {
723
- console.error('[Stdio Wrapper] CLI results reporting failed (non-critical):', err.message);
724
- });
725
-
726
721
  // Calculate how many successful local perspectives we got
727
722
  const successfulLocalCount = localResults.filter(r => r.success).length;
728
723
  const failedCliCount = localResults.filter(r => !r.success).length;
@@ -742,9 +737,18 @@ class StdioMCPWrapper {
742
737
  model: p.model
743
738
  }));
744
739
 
740
+ // Note: Remote API will handle logging of CLI + API results together
741
+ // We do NOT call reportCliResultsToServer() here to avoid duplicate logs
745
742
  perspectivesResult = await this.callPerspectivesForCli(args, localResults, remainingPerspectives, apiProvidersInfo);
746
743
  } else {
747
744
  console.error(`[Stdio Wrapper] Already have ${successfulLocalCount} perspectives from CLIs, skipping remote call`);
745
+
746
+ // ONLY report CLI results when NOT calling remote API
747
+ // (When we call remote API, it handles logging CLI + API results together)
748
+ this.reportCliResultsToServer(prompt, localResults, args).catch(err => {
749
+ console.error('[Stdio Wrapper] CLI results reporting failed (non-critical):', err.message);
750
+ });
751
+
748
752
  perspectivesResult = {
749
753
  success: true,
750
754
  content: '',
@@ -955,6 +959,22 @@ class StdioMCPWrapper {
955
959
  .map(cli => cliToApiProvider[cli])
956
960
  .filter(Boolean);
957
961
 
962
+ // Get failed CLI providers and map them to their API equivalents
963
+ const failedCliProviders = localResults
964
+ .filter(r => !r.success && r.provider_id)
965
+ .map(r => r.provider_id);
966
+
967
+ const failedCliApiProviders = failedCliProviders
968
+ .map(cli => {
969
+ const apiProvider = cliToApiProvider[cli];
970
+ if (apiProvider) {
971
+ console.error(`[Stdio Wrapper] CLI ${cli} failed, will request API fallback: ${apiProvider}`);
972
+ return { provider: apiProvider, model: null }; // Let server choose model
973
+ }
974
+ return null;
975
+ })
976
+ .filter(Boolean);
977
+
958
978
  // If we don't need any perspectives, skip remote call
959
979
  if (maxPerspectives <= 0) {
960
980
  console.error(`[Stdio Wrapper] Max perspectives is 0, skipping remote perspectives`);
@@ -967,12 +987,16 @@ class StdioMCPWrapper {
967
987
  };
968
988
  }
969
989
 
970
- // Build list of specific providers to request (from API-only providers)
971
- const requestProviders = apiProvidersInfo.map(p => ({
990
+ // Build list of specific providers to request (from API-only providers + failed CLI fallbacks)
991
+ const apiOnlyProvidersList = apiProvidersInfo.map(p => ({
972
992
  provider: p.provider,
973
993
  model: p.model
974
994
  }));
975
995
 
996
+ // Combine API-only providers with failed CLI fallback providers
997
+ // Failed CLI providers get priority (they're the ones user expected to work)
998
+ const requestProviders = [...failedCliApiProviders, ...apiOnlyProvidersList];
999
+
976
1000
  console.error(`[Stdio Wrapper] Calling remote perspectives (excluding: ${excludeProviders.join(', ') || 'none'}, requesting: ${requestProviders.map(p => p.provider).join(', ') || 'any'}, max: ${maxPerspectives})`);
977
1001
 
978
1002
  // Format ONLY SUCCESSFUL CLI responses for logging on the server
@@ -1577,14 +1601,19 @@ class StdioMCPWrapper {
1577
1601
 
1578
1602
  process.stdin.on('data', async (chunk) => {
1579
1603
  buffer += chunk;
1580
-
1604
+
1581
1605
  const lines = buffer.split('\n');
1582
1606
  buffer = lines.pop() || '';
1583
-
1607
+
1584
1608
  for (const line of lines) {
1585
1609
  if (line.trim()) {
1586
1610
  try {
1587
1611
  const request = JSON.parse(line);
1612
+ // Notifications have no id - don't respond to them (JSON-RPC spec)
1613
+ if (request.id === undefined) {
1614
+ console.error(`[Stdio Wrapper] Received notification: ${request.method}`);
1615
+ continue;
1616
+ }
1588
1617
  const response = await this.handleRequest(request);
1589
1618
  process.stdout.write(JSON.stringify(response) + '\n');
1590
1619
  } catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polydev-ai",
3
- "version": "1.8.35",
3
+ "version": "1.8.37",
4
4
  "description": "Agentic workflow assistant with CLI integration - get diverse perspectives from multiple LLMs when stuck or need enhanced reasoning",
5
5
  "keywords": [
6
6
  "mcp",
@@ -16,7 +16,7 @@
16
16
  "author": "Polydev AI",
17
17
  "license": "MIT",
18
18
  "private": false,
19
- "main": "mcp/server.js",
19
+ "main": "mcp/stdio-wrapper.js",
20
20
  "bin": {
21
21
  "polydev-stdio": "mcp/stdio-wrapper.js"
22
22
  },
@@ -67,7 +67,7 @@
67
67
  "lucide-react": "^0.542.0",
68
68
  "marked": "^16.2.1",
69
69
  "next": "^15.5.7",
70
- "polydev-ai": "^1.8.34",
70
+ "polydev-ai": "^1.8.36",
71
71
  "posthog-js": "^1.157.2",
72
72
  "prismjs": "^1.30.0",
73
73
  "react": "^18.3.1",