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.
- package/README.md +771 -738
- package/docs/API.md +10 -1
- package/docs/PROVIDERS.md +8 -4
- package/package.json +12 -12
- package/src/async/asyncJobStore.js +82 -52
- package/src/async/eventBus.js +25 -20
- package/src/async/fileCache.js +121 -40
- package/src/async/jobRunner.js +65 -39
- package/src/async/providerStreamNormalizer.js +203 -117
- package/src/config.js +374 -102
- package/src/continuationStore.js +32 -24
- package/src/index.js +45 -25
- package/src/prompts/helpPrompt.js +328 -305
- package/src/providers/anthropic.js +303 -119
- package/src/providers/codex.js +103 -45
- package/src/providers/deepseek.js +24 -8
- package/src/providers/google.js +323 -93
- package/src/providers/index.js +1 -1
- package/src/providers/interface.js +16 -11
- package/src/providers/mistral.js +179 -69
- package/src/providers/openai-compatible.js +231 -94
- package/src/providers/openai.js +1094 -914
- package/src/providers/openrouter-endpoints-client.js +220 -216
- package/src/providers/openrouter.js +426 -381
- package/src/providers/xai.js +153 -56
- package/src/resources/helpResource.js +70 -67
- package/src/router.js +95 -67
- package/src/services/summarizationService.js +51 -24
- package/src/systemPrompts.js +89 -89
- package/src/tools/cancelJob.js +31 -19
- package/src/tools/chat.js +997 -883
- package/src/tools/checkStatus.js +86 -65
- package/src/tools/consensus.js +400 -234
- package/src/tools/index.js +39 -16
- package/src/transport/httpTransport.js +82 -55
- package/src/utils/contextProcessor.js +54 -37
- package/src/utils/errorHandler.js +95 -45
- package/src/utils/fileValidator.js +107 -98
- package/src/utils/formatStatus.js +122 -64
- package/src/utils/logger.js +459 -449
- package/src/utils/pathUtils.js +2 -2
- 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(
|
|
59
|
+
throw new Error(
|
|
60
|
+
`Unsupported provider for streaming normalization: ${provider}`,
|
|
61
|
+
);
|
|
60
62
|
}
|
|
61
63
|
|
|
62
|
-
debugLog(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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(
|
|
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
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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(
|
|
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 (
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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(
|
|
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
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
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(
|
|
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
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
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(
|
|
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
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
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(
|
|
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:
|
|
660
|
-
|
|
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 =
|
|
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
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
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
|
}
|