converse-mcp-server 2.3.1 → 2.4.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 (42) hide show
  1. package/README.md +771 -738
  2. package/docs/API.md +10 -1
  3. package/docs/PROVIDERS.md +8 -4
  4. package/package.json +12 -12
  5. package/src/async/asyncJobStore.js +82 -52
  6. package/src/async/eventBus.js +25 -20
  7. package/src/async/fileCache.js +121 -40
  8. package/src/async/jobRunner.js +65 -39
  9. package/src/async/providerStreamNormalizer.js +203 -117
  10. package/src/config.js +374 -102
  11. package/src/continuationStore.js +32 -24
  12. package/src/index.js +45 -25
  13. package/src/prompts/helpPrompt.js +328 -305
  14. package/src/providers/anthropic.js +303 -119
  15. package/src/providers/codex.js +103 -45
  16. package/src/providers/deepseek.js +24 -8
  17. package/src/providers/google.js +323 -93
  18. package/src/providers/index.js +1 -1
  19. package/src/providers/interface.js +16 -11
  20. package/src/providers/mistral.js +179 -69
  21. package/src/providers/openai-compatible.js +231 -94
  22. package/src/providers/openai.js +1094 -914
  23. package/src/providers/openrouter-endpoints-client.js +220 -216
  24. package/src/providers/openrouter.js +426 -381
  25. package/src/providers/xai.js +153 -56
  26. package/src/resources/helpResource.js +70 -67
  27. package/src/router.js +95 -67
  28. package/src/services/summarizationService.js +51 -24
  29. package/src/systemPrompts.js +89 -89
  30. package/src/tools/cancelJob.js +31 -19
  31. package/src/tools/chat.js +997 -883
  32. package/src/tools/checkStatus.js +86 -65
  33. package/src/tools/consensus.js +400 -234
  34. package/src/tools/index.js +39 -16
  35. package/src/transport/httpTransport.js +82 -55
  36. package/src/utils/contextProcessor.js +54 -37
  37. package/src/utils/errorHandler.js +95 -45
  38. package/src/utils/fileValidator.js +107 -98
  39. package/src/utils/formatStatus.js +122 -64
  40. package/src/utils/logger.js +459 -449
  41. package/src/utils/pathUtils.js +2 -2
  42. package/src/utils/tokenLimiter.js +216 -216
@@ -23,7 +23,7 @@ const EVENT_TYPES = {
23
23
  USAGE: 'usage',
24
24
  END: 'end',
25
25
  ERROR: 'error',
26
- REASONING_SUMMARY: 'reasoning_summary'
26
+ REASONING_SUMMARY: 'reasoning_summary',
27
27
  };
28
28
 
29
29
  /**
@@ -41,7 +41,7 @@ class ProviderStreamNormalizer {
41
41
  mistral: this.normalizeMistralStream.bind(this),
42
42
  deepseek: this.normalizeDeepSeekStream.bind(this),
43
43
  openrouter: this.normalizeOpenRouterStream.bind(this),
44
- codex: this.normalizeCodexStream.bind(this)
44
+ codex: this.normalizeCodexStream.bind(this),
45
45
  };
46
46
  }
47
47
 
@@ -56,16 +56,23 @@ class ProviderStreamNormalizer {
56
56
  const normalizedProvider = provider.toLowerCase();
57
57
 
58
58
  if (!this.normalizers[normalizedProvider]) {
59
- throw new Error(`Unsupported provider for streaming normalization: ${provider}`);
59
+ throw new Error(
60
+ `Unsupported provider for streaming normalization: ${provider}`,
61
+ );
60
62
  }
61
63
 
62
- debugLog(`[StreamNormalizer] Normalizing ${provider} stream for model ${context.model || 'unknown'}`);
64
+ debugLog(
65
+ `[StreamNormalizer] Normalizing ${provider} stream for model ${context.model || 'unknown'}`,
66
+ );
63
67
 
64
68
  try {
65
69
  // Delegate to provider-specific normalizer
66
70
  yield* this.normalizers[normalizedProvider](stream, context);
67
71
  } catch (error) {
68
- debugError(`[StreamNormalizer] Error during ${provider} stream normalization:`, error);
72
+ debugError(
73
+ `[StreamNormalizer] Error during ${provider} stream normalization:`,
74
+ error,
75
+ );
69
76
 
70
77
  // Yield error event before re-throwing
71
78
  yield this.createErrorEvent(error, provider);
@@ -112,26 +119,38 @@ class ProviderStreamNormalizer {
112
119
 
113
120
  // Handle reasoning summary events (OpenAI reasoning models)
114
121
  if (event.type === 'reasoning_summary') {
115
- yield this.createReasoningSummaryEvent(event.content, provider, model);
122
+ yield this.createReasoningSummaryEvent(
123
+ event.content,
124
+ provider,
125
+ model,
126
+ );
116
127
  continue;
117
128
  }
118
129
 
119
130
  // Handle end event
120
131
  if (event.type === 'end') {
121
132
  finishReason = event.stop_reason || event.metadata?.finish_reason;
122
- yield this.createEndEvent({
123
- content: event.content || accumulatedContent,
124
- stopReason: finishReason,
125
- usage: event.metadata?.usage || accumulatedUsage,
126
- responseTime: Date.now() - startTime,
127
- metadata: event.metadata
128
- }, provider, model);
133
+ yield this.createEndEvent(
134
+ {
135
+ content: event.content || accumulatedContent,
136
+ stopReason: finishReason,
137
+ usage: event.metadata?.usage || accumulatedUsage,
138
+ responseTime: Date.now() - startTime,
139
+ metadata: event.metadata,
140
+ },
141
+ provider,
142
+ model,
143
+ );
129
144
  continue;
130
145
  }
131
146
 
132
147
  // Handle error events
133
148
  if (event.type === 'error') {
134
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
149
+ yield this.createErrorEvent(
150
+ event.error,
151
+ provider,
152
+ event.error?.recoverable,
153
+ );
135
154
  continue;
136
155
  }
137
156
  }
@@ -177,7 +196,8 @@ class ProviderStreamNormalizer {
177
196
  accumulatedUsage = event.usage;
178
197
  if (event.usage.search_sources_used) {
179
198
  searchMetadata.searchSourcesUsed = event.usage.search_sources_used;
180
- searchMetadata.searchCostEstimate = event.usage.search_cost_estimate;
199
+ searchMetadata.searchCostEstimate =
200
+ event.usage.search_cost_estimate;
181
201
  }
182
202
  yield this.createUsageEvent(event.usage, provider, model);
183
203
  continue;
@@ -188,22 +208,30 @@ class ProviderStreamNormalizer {
188
208
  finishReason = event.stop_reason || event.metadata?.finish_reason;
189
209
  const endMetadata = {
190
210
  ...event.metadata,
191
- ...searchMetadata
211
+ ...searchMetadata,
192
212
  };
193
213
 
194
- yield this.createEndEvent({
195
- content: event.content || accumulatedContent,
196
- stopReason: finishReason,
197
- usage: event.metadata?.usage || accumulatedUsage,
198
- responseTime: Date.now() - startTime,
199
- metadata: endMetadata
200
- }, provider, model);
214
+ yield this.createEndEvent(
215
+ {
216
+ content: event.content || accumulatedContent,
217
+ stopReason: finishReason,
218
+ usage: event.metadata?.usage || accumulatedUsage,
219
+ responseTime: Date.now() - startTime,
220
+ metadata: endMetadata,
221
+ },
222
+ provider,
223
+ model,
224
+ );
201
225
  continue;
202
226
  }
203
227
 
204
228
  // Handle error events
205
229
  if (event.type === 'error') {
206
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
230
+ yield this.createErrorEvent(
231
+ event.error,
232
+ provider,
233
+ event.error?.recoverable,
234
+ );
207
235
  continue;
208
236
  }
209
237
  }
@@ -259,22 +287,30 @@ class ProviderStreamNormalizer {
259
287
  finishReason = event.stop_reason || event.metadata?.finish_reason;
260
288
  const endMetadata = {
261
289
  ...event.metadata,
262
- ...searchMetadata
290
+ ...searchMetadata,
263
291
  };
264
292
 
265
- yield this.createEndEvent({
266
- content: event.content || accumulatedContent,
267
- stopReason: finishReason,
268
- usage: event.metadata?.usage || accumulatedUsage,
269
- responseTime: Date.now() - startTime,
270
- metadata: endMetadata
271
- }, provider, model);
293
+ yield this.createEndEvent(
294
+ {
295
+ content: event.content || accumulatedContent,
296
+ stopReason: finishReason,
297
+ usage: event.metadata?.usage || accumulatedUsage,
298
+ responseTime: Date.now() - startTime,
299
+ metadata: endMetadata,
300
+ },
301
+ provider,
302
+ model,
303
+ );
272
304
  continue;
273
305
  }
274
306
 
275
307
  // Handle error events
276
308
  if (event.type === 'error') {
277
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
309
+ yield this.createErrorEvent(
310
+ event.error,
311
+ provider,
312
+ event.error?.recoverable,
313
+ );
278
314
  continue;
279
315
  }
280
316
  }
@@ -312,7 +348,7 @@ class ProviderStreamNormalizer {
312
348
  if (event.type === 'delta') {
313
349
  accumulatedContent += event.content || '';
314
350
  yield this.createDeltaEvent(event.content || '', provider, model, {
315
- isThinking: event.isThinking || false
351
+ isThinking: event.isThinking || false,
316
352
  });
317
353
  continue;
318
354
  }
@@ -323,10 +359,13 @@ class ProviderStreamNormalizer {
323
359
  if (event.usage.thinking_tokens) {
324
360
  thinkingMetadata.thinkingTokens = event.usage.thinking_tokens;
325
361
  }
326
- if (event.usage.cache_creation_input_tokens || event.usage.cache_read_input_tokens) {
362
+ if (
363
+ event.usage.cache_creation_input_tokens ||
364
+ event.usage.cache_read_input_tokens
365
+ ) {
327
366
  thinkingMetadata.cacheUsage = {
328
367
  creation: event.usage.cache_creation_input_tokens || 0,
329
- read: event.usage.cache_read_input_tokens || 0
368
+ read: event.usage.cache_read_input_tokens || 0,
330
369
  };
331
370
  }
332
371
  yield this.createUsageEvent(event.usage, provider, model);
@@ -338,22 +377,30 @@ class ProviderStreamNormalizer {
338
377
  finishReason = event.stop_reason || event.metadata?.finish_reason;
339
378
  const endMetadata = {
340
379
  ...event.metadata,
341
- ...thinkingMetadata
380
+ ...thinkingMetadata,
342
381
  };
343
382
 
344
- yield this.createEndEvent({
345
- content: event.content || accumulatedContent,
346
- stopReason: finishReason,
347
- usage: event.metadata?.usage || accumulatedUsage,
348
- responseTime: Date.now() - startTime,
349
- metadata: endMetadata
350
- }, provider, model);
383
+ yield this.createEndEvent(
384
+ {
385
+ content: event.content || accumulatedContent,
386
+ stopReason: finishReason,
387
+ usage: event.metadata?.usage || accumulatedUsage,
388
+ responseTime: Date.now() - startTime,
389
+ metadata: endMetadata,
390
+ },
391
+ provider,
392
+ model,
393
+ );
351
394
  continue;
352
395
  }
353
396
 
354
397
  // Handle error events
355
398
  if (event.type === 'error') {
356
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
399
+ yield this.createErrorEvent(
400
+ event.error,
401
+ provider,
402
+ event.error?.recoverable,
403
+ );
357
404
  continue;
358
405
  }
359
406
  }
@@ -403,19 +450,27 @@ class ProviderStreamNormalizer {
403
450
  // Handle end event
404
451
  if (event.type === 'end') {
405
452
  finishReason = event.stop_reason || event.metadata?.finish_reason;
406
- yield this.createEndEvent({
407
- content: event.content || accumulatedContent,
408
- stopReason: finishReason,
409
- usage: event.metadata?.usage || accumulatedUsage,
410
- responseTime: Date.now() - startTime,
411
- metadata: event.metadata
412
- }, provider, model);
453
+ yield this.createEndEvent(
454
+ {
455
+ content: event.content || accumulatedContent,
456
+ stopReason: finishReason,
457
+ usage: event.metadata?.usage || accumulatedUsage,
458
+ responseTime: Date.now() - startTime,
459
+ metadata: event.metadata,
460
+ },
461
+ provider,
462
+ model,
463
+ );
413
464
  continue;
414
465
  }
415
466
 
416
467
  // Handle error events
417
468
  if (event.type === 'error') {
418
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
469
+ yield this.createErrorEvent(
470
+ event.error,
471
+ provider,
472
+ event.error?.recoverable,
473
+ );
419
474
  continue;
420
475
  }
421
476
  }
@@ -453,7 +508,7 @@ class ProviderStreamNormalizer {
453
508
  if (event.type === 'delta') {
454
509
  accumulatedContent += event.content || '';
455
510
  yield this.createDeltaEvent(event.content || '', provider, model, {
456
- isReasoning: event.isReasoning || false
511
+ isReasoning: event.isReasoning || false,
457
512
  });
458
513
  continue;
459
514
  }
@@ -473,22 +528,30 @@ class ProviderStreamNormalizer {
473
528
  finishReason = event.stop_reason || event.metadata?.finish_reason;
474
529
  const endMetadata = {
475
530
  ...event.metadata,
476
- ...reasoningMetadata
531
+ ...reasoningMetadata,
477
532
  };
478
533
 
479
- yield this.createEndEvent({
480
- content: event.content || accumulatedContent,
481
- stopReason: finishReason,
482
- usage: event.metadata?.usage || accumulatedUsage,
483
- responseTime: Date.now() - startTime,
484
- metadata: endMetadata
485
- }, provider, model);
534
+ yield this.createEndEvent(
535
+ {
536
+ content: event.content || accumulatedContent,
537
+ stopReason: finishReason,
538
+ usage: event.metadata?.usage || accumulatedUsage,
539
+ responseTime: Date.now() - startTime,
540
+ metadata: endMetadata,
541
+ },
542
+ provider,
543
+ model,
544
+ );
486
545
  continue;
487
546
  }
488
547
 
489
548
  // Handle error events
490
549
  if (event.type === 'error') {
491
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
550
+ yield this.createErrorEvent(
551
+ event.error,
552
+ provider,
553
+ event.error?.recoverable,
554
+ );
492
555
  continue;
493
556
  }
494
557
  }
@@ -544,22 +607,30 @@ class ProviderStreamNormalizer {
544
607
  finishReason = event.stop_reason || event.metadata?.finish_reason;
545
608
  const endMetadata = {
546
609
  ...event.metadata,
547
- ...routingMetadata
610
+ ...routingMetadata,
548
611
  };
549
612
 
550
- yield this.createEndEvent({
551
- content: event.content || accumulatedContent,
552
- stopReason: finishReason,
553
- usage: event.metadata?.usage || accumulatedUsage,
554
- responseTime: Date.now() - startTime,
555
- metadata: endMetadata
556
- }, provider, model);
613
+ yield this.createEndEvent(
614
+ {
615
+ content: event.content || accumulatedContent,
616
+ stopReason: finishReason,
617
+ usage: event.metadata?.usage || accumulatedUsage,
618
+ responseTime: Date.now() - startTime,
619
+ metadata: endMetadata,
620
+ },
621
+ provider,
622
+ model,
623
+ );
557
624
  continue;
558
625
  }
559
626
 
560
627
  // Handle error events
561
628
  if (event.type === 'error') {
562
- yield this.createErrorEvent(event.error, provider, event.error?.recoverable);
629
+ yield this.createErrorEvent(
630
+ event.error,
631
+ provider,
632
+ event.error?.recoverable,
633
+ );
563
634
  continue;
564
635
  }
565
636
  }
@@ -582,8 +653,8 @@ class ProviderStreamNormalizer {
582
653
  data: {
583
654
  requestId: originalEvent.requestId || `${provider}-${Date.now()}`,
584
655
  estimatedTokens: originalEvent.estimatedTokens || null,
585
- ...originalEvent.data
586
- }
656
+ ...originalEvent.data,
657
+ },
587
658
  };
588
659
  }
589
660
 
@@ -600,8 +671,8 @@ class ProviderStreamNormalizer {
600
671
  textDelta,
601
672
  role: 'assistant',
602
673
  index: 0,
603
- ...metadata
604
- }
674
+ ...metadata,
675
+ },
605
676
  };
606
677
  }
607
678
 
@@ -620,9 +691,9 @@ class ProviderStreamNormalizer {
620
691
  outputTokens: usage.output_tokens || usage.completion_tokens || 0,
621
692
  totalTokens: usage.total_tokens || 0,
622
693
  // Preserve provider-specific usage fields
623
- ...usage
624
- }
625
- }
694
+ ...usage,
695
+ },
696
+ },
626
697
  };
627
698
  }
628
699
 
@@ -638,8 +709,8 @@ class ProviderStreamNormalizer {
638
709
  data: {
639
710
  content: content || '',
640
711
  role: 'assistant',
641
- isReasoningSummary: true
642
- }
712
+ isReasoningSummary: true,
713
+ },
643
714
  };
644
715
  }
645
716
 
@@ -656,14 +727,16 @@ class ProviderStreamNormalizer {
656
727
  content: params.content,
657
728
  stopReason: params.stopReason || 'stop',
658
729
  usage: {
659
- inputTokens: params.usage?.input_tokens || params.usage?.prompt_tokens || 0,
660
- outputTokens: params.usage?.output_tokens || params.usage?.completion_tokens || 0,
730
+ inputTokens:
731
+ params.usage?.input_tokens || params.usage?.prompt_tokens || 0,
732
+ outputTokens:
733
+ params.usage?.output_tokens || params.usage?.completion_tokens || 0,
661
734
  totalTokens: params.usage?.total_tokens || 0,
662
- ...params.usage
735
+ ...params.usage,
663
736
  },
664
737
  responseTimeMs: params.responseTime,
665
- metadata: params.metadata || {}
666
- }
738
+ metadata: params.metadata || {},
739
+ },
667
740
  };
668
741
  }
669
742
 
@@ -672,7 +745,8 @@ class ProviderStreamNormalizer {
672
745
  */
673
746
  createErrorEvent(error, provider, recoverable = false) {
674
747
  // Determine if error is recoverable based on error type
675
- const isRecoverable = recoverable ||
748
+ const isRecoverable =
749
+ recoverable ||
676
750
  error.code === 'RATE_LIMIT_EXCEEDED' ||
677
751
  error.code === 'CHUNK_PROCESSING_ERROR' ||
678
752
  error.code === 'TIMEOUT' ||
@@ -688,9 +762,9 @@ class ProviderStreamNormalizer {
688
762
  message: error.message || 'Unknown streaming error',
689
763
  code: error.code || 'STREAMING_ERROR',
690
764
  recoverable: isRecoverable,
691
- originalError: error
692
- }
693
- }
765
+ originalError: error,
766
+ },
767
+ },
694
768
  };
695
769
  }
696
770
 
@@ -740,13 +814,13 @@ class ProviderStreamNormalizer {
740
814
  // Internal reasoning - log for debugging but don't send to user
741
815
  debugLog('[Codex] Reasoning item completed', {
742
816
  id: event.item.id,
743
- text: event.item.text?.substring(0, 100) // Log first 100 chars
817
+ text: event.item.text?.substring(0, 100), // Log first 100 chars
744
818
  });
745
819
  } else {
746
820
  // Unknown item type - log and preserve
747
821
  debugLog('[Codex] Unknown item type', {
748
822
  type: event.item?.type,
749
- event
823
+ event,
750
824
  });
751
825
  }
752
826
  break;
@@ -756,18 +830,26 @@ class ProviderStreamNormalizer {
756
830
  finalUsage = event.usage;
757
831
  hasEnded = true;
758
832
 
759
- yield this.createEndEvent({
760
- content: accumulatedContent,
761
- stopReason: 'stop',
762
- usage: finalUsage ? {
763
- input_tokens: finalUsage.input_tokens || 0,
764
- output_tokens: finalUsage.output_tokens || 0,
765
- total_tokens: (finalUsage.input_tokens || 0) + (finalUsage.output_tokens || 0),
766
- cached_input_tokens: finalUsage.cached_input_tokens || 0
767
- } : null,
768
- responseTime: Date.now() - startTime,
769
- metadata: { threadId }
770
- }, provider, model);
833
+ yield this.createEndEvent(
834
+ {
835
+ content: accumulatedContent,
836
+ stopReason: 'stop',
837
+ usage: finalUsage
838
+ ? {
839
+ input_tokens: finalUsage.input_tokens || 0,
840
+ output_tokens: finalUsage.output_tokens || 0,
841
+ total_tokens:
842
+ (finalUsage.input_tokens || 0) +
843
+ (finalUsage.output_tokens || 0),
844
+ cached_input_tokens: finalUsage.cached_input_tokens || 0,
845
+ }
846
+ : null,
847
+ responseTime: Date.now() - startTime,
848
+ metadata: { threadId },
849
+ },
850
+ provider,
851
+ model,
852
+ );
771
853
  // Exit the generator after turn completion - no more events expected
772
854
  return;
773
855
 
@@ -777,7 +859,7 @@ class ProviderStreamNormalizer {
777
859
  debugError('[Codex] Turn failed', event.error);
778
860
  yield this.createErrorEvent(
779
861
  new Error(event.error?.message || 'Turn failed'),
780
- provider
862
+ provider,
781
863
  );
782
864
  // Exit the generator after turn failure
783
865
  return;
@@ -788,7 +870,7 @@ class ProviderStreamNormalizer {
788
870
  debugError('[Codex] Stream error', event.message);
789
871
  yield this.createErrorEvent(
790
872
  new Error(event.message || 'Stream error'),
791
- provider
873
+ provider,
792
874
  );
793
875
  // Exit the generator after fatal error
794
876
  return;
@@ -798,7 +880,7 @@ class ProviderStreamNormalizer {
798
880
  // Item progress events - log for debugging
799
881
  debugLog('[Codex] Item event', {
800
882
  type: event.type,
801
- itemType: event.item?.type
883
+ itemType: event.item?.type,
802
884
  });
803
885
  break;
804
886
 
@@ -806,7 +888,7 @@ class ProviderStreamNormalizer {
806
888
  // Unknown event type - log at debug level but don't crash
807
889
  debugLog('[Codex] Unknown event type', {
808
890
  type: event?.type,
809
- event
891
+ event,
810
892
  });
811
893
  break;
812
894
  }
@@ -816,13 +898,17 @@ class ProviderStreamNormalizer {
816
898
  // yield a final end event with whatever content we accumulated
817
899
  if (!hasEnded) {
818
900
  debugLog('[Codex] Stream ended naturally without turn.completed event');
819
- yield this.createEndEvent({
820
- content: accumulatedContent,
821
- stopReason: 'stop',
822
- usage: finalUsage,
823
- responseTime: Date.now() - startTime,
824
- metadata: { threadId }
825
- }, provider, model);
901
+ yield this.createEndEvent(
902
+ {
903
+ content: accumulatedContent,
904
+ stopReason: 'stop',
905
+ usage: finalUsage,
906
+ responseTime: Date.now() - startTime,
907
+ metadata: { threadId },
908
+ },
909
+ provider,
910
+ model,
911
+ );
826
912
  }
827
913
  } catch (error) {
828
914
  debugError('[Codex] Stream normalization error:', error);
@@ -891,7 +977,7 @@ class ProviderStreamNormalizer {
891
977
  hasStart,
892
978
  hasEnd,
893
979
  errorCount,
894
- totalEvents: events.length
980
+ totalEvents: events.length,
895
981
  };
896
982
  } catch (error) {
897
983
  return {
@@ -901,7 +987,7 @@ class ProviderStreamNormalizer {
901
987
  hasStart,
902
988
  hasEnd,
903
989
  errorCount,
904
- totalEvents: events.length
990
+ totalEvents: events.length,
905
991
  };
906
992
  }
907
993
  }