polydev-ai 1.8.18 → 1.8.19
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/mcp/stdio-wrapper.js +39 -13
- package/package.json +1 -1
package/mcp/stdio-wrapper.js
CHANGED
|
@@ -613,21 +613,29 @@ class StdioMCPWrapper {
|
|
|
613
613
|
const result = await this.cliManager.sendCliPrompt(provider_id, prompt, mode, gracefulTimeout, model);
|
|
614
614
|
localResults = [{ provider_id, ...result }];
|
|
615
615
|
} else {
|
|
616
|
-
// No specific provider - use
|
|
617
|
-
|
|
618
|
-
|
|
616
|
+
// No specific provider - use providers in user's preferred order
|
|
617
|
+
// Mix CLI (where available) + API fallback (where CLI unavailable)
|
|
618
|
+
console.error(`[Stdio Wrapper] Using providers in user's preferred order (max: ${maxPerspectives})`);
|
|
619
|
+
const { available: availableClis, unavailable: unavailableClis } = await this.getAllAvailableProviders();
|
|
619
620
|
|
|
620
|
-
//
|
|
621
|
-
const
|
|
621
|
+
// Build ordered list: use CLI if available, otherwise mark for API fallback
|
|
622
|
+
const userOrder = this.userProviderOrder || ['claude_code', 'codex_cli', 'gemini_cli'];
|
|
623
|
+
const providersToUse = userOrder.slice(0, maxPerspectives);
|
|
622
624
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
+
// Separate into CLI vs API fallback
|
|
626
|
+
const cliProviders = providersToUse.filter(p => availableClis.includes(p));
|
|
627
|
+
const apiProviders = providersToUse.filter(p => unavailableClis.includes(p));
|
|
628
|
+
|
|
629
|
+
console.error(`[Stdio Wrapper] Provider breakdown: CLI=${cliProviders.join(', ') || 'none'}, API fallback=${apiProviders.join(', ') || 'none'}`);
|
|
630
|
+
|
|
631
|
+
if (cliProviders.length === 0 && apiProviders.length === 0) {
|
|
632
|
+
console.error(`[Stdio Wrapper] No providers available, will use remote perspectives only`);
|
|
625
633
|
localResults = [];
|
|
626
634
|
} else {
|
|
627
|
-
console.error(`[Stdio Wrapper]
|
|
635
|
+
console.error(`[Stdio Wrapper] Using ${cliProviders.length} CLIs + ${apiProviders.length} API fallbacks`);
|
|
628
636
|
|
|
629
637
|
// Run all CLI prompts concurrently
|
|
630
|
-
const cliPromises =
|
|
638
|
+
const cliPromises = cliProviders.map(async (providerId) => {
|
|
631
639
|
try {
|
|
632
640
|
const model = modelPreferences[providerId] || null;
|
|
633
641
|
if (model) {
|
|
@@ -700,14 +708,19 @@ class StdioMCPWrapper {
|
|
|
700
708
|
|
|
701
709
|
/**
|
|
702
710
|
* Get all available and authenticated CLI providers
|
|
711
|
+
* Uses user's provider order from dashboard (display_order) instead of hardcoded order
|
|
712
|
+
* Falls back to API for providers where CLI is not available/authenticated
|
|
703
713
|
*/
|
|
704
714
|
async getAllAvailableProviders() {
|
|
705
715
|
try {
|
|
706
716
|
const results = await this.cliManager.forceCliDetection();
|
|
707
717
|
const availableProviders = [];
|
|
718
|
+
const unavailableProviders = [];
|
|
708
719
|
|
|
709
|
-
//
|
|
710
|
-
|
|
720
|
+
// Use user's provider order from dashboard (fetched via model-preferences API)
|
|
721
|
+
// Falls back to default order if not yet loaded
|
|
722
|
+
const priorityOrder = this.userProviderOrder || ['claude_code', 'codex_cli', 'gemini_cli'];
|
|
723
|
+
console.error(`[Stdio Wrapper] Using provider order: ${priorityOrder.join(' > ')}`);
|
|
711
724
|
|
|
712
725
|
for (const providerId of priorityOrder) {
|
|
713
726
|
const status = results[providerId];
|
|
@@ -715,17 +728,25 @@ class StdioMCPWrapper {
|
|
|
715
728
|
// Skip providers with quota exhausted - they'll use API fallback
|
|
716
729
|
if (status.quota_exhausted) {
|
|
717
730
|
console.error(`[Stdio Wrapper] Skipping ${providerId} - quota exhausted, will use API fallback`);
|
|
731
|
+
unavailableProviders.push(providerId);
|
|
718
732
|
continue;
|
|
719
733
|
}
|
|
720
734
|
availableProviders.push(providerId);
|
|
735
|
+
} else {
|
|
736
|
+
// CLI not available - will fall back to API for this provider
|
|
737
|
+
const reason = !status ? 'not detected' : (!status.available ? 'not installed' : 'not authenticated');
|
|
738
|
+
console.error(`[Stdio Wrapper] CLI ${providerId} ${reason}, will use API fallback`);
|
|
739
|
+
unavailableProviders.push(providerId);
|
|
721
740
|
}
|
|
722
741
|
}
|
|
723
742
|
|
|
724
|
-
|
|
743
|
+
// Return available CLIs first, then unavailable ones (for API fallback)
|
|
744
|
+
// The caller will handle mixing CLI + API based on availability
|
|
745
|
+
return { available: availableProviders, unavailable: unavailableProviders };
|
|
725
746
|
|
|
726
747
|
} catch (error) {
|
|
727
748
|
console.error('[Stdio Wrapper] Failed to get available providers:', error);
|
|
728
|
-
return [];
|
|
749
|
+
return { available: [], unavailable: [] };
|
|
729
750
|
}
|
|
730
751
|
}
|
|
731
752
|
|
|
@@ -1379,7 +1400,12 @@ class StdioMCPWrapper {
|
|
|
1379
1400
|
// Also cache perspectives_per_message setting (default 2)
|
|
1380
1401
|
this.perspectivesPerMessage = result.perspectivesPerMessage || 2;
|
|
1381
1402
|
|
|
1403
|
+
// Cache provider order from user's dashboard (respects display_order)
|
|
1404
|
+
// This determines which CLIs/APIs to use first
|
|
1405
|
+
this.userProviderOrder = result.providerOrder || ['claude_code', 'codex_cli', 'gemini_cli'];
|
|
1406
|
+
|
|
1382
1407
|
console.error('[Stdio Wrapper] Model preferences loaded:', JSON.stringify(result.modelPreferences));
|
|
1408
|
+
console.error('[Stdio Wrapper] Provider order:', JSON.stringify(this.userProviderOrder));
|
|
1383
1409
|
console.error('[Stdio Wrapper] Perspectives per message:', this.perspectivesPerMessage);
|
|
1384
1410
|
return result.modelPreferences;
|
|
1385
1411
|
} else {
|
package/package.json
CHANGED