mcp-agent-foundry 1.0.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/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/install-skills.d.ts +11 -0
- package/dist/cli/install-skills.d.ts.map +1 -0
- package/dist/cli/install-skills.js +143 -0
- package/dist/cli/install-skills.js.map +1 -0
- package/dist/cli/recovery-commands.d.ts +41 -0
- package/dist/cli/recovery-commands.d.ts.map +1 -0
- package/dist/cli/recovery-commands.js +241 -0
- package/dist/cli/recovery-commands.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +25 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1417 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +45 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +317 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +75 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +704 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +99 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +184 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +347 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/merger.d.ts +76 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +189 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +20 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +254 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +363 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/config/worktree-defaults.d.ts +23 -0
- package/dist/config/worktree-defaults.d.ts.map +1 -0
- package/dist/config/worktree-defaults.js +78 -0
- package/dist/config/worktree-defaults.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools/compare-agents.d.ts +25 -0
- package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
- package/dist/mcp/tools/compare-agents.js +177 -0
- package/dist/mcp/tools/compare-agents.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts +26 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
- package/dist/mcp/tools/critique-plan.js +162 -0
- package/dist/mcp/tools/critique-plan.js.map +1 -0
- package/dist/mcp/tools/design-feedback.d.ts +26 -0
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
- package/dist/mcp/tools/design-feedback.js +216 -0
- package/dist/mcp/tools/design-feedback.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +50 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +191 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invoke-agent.d.ts +25 -0
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
- package/dist/mcp/tools/invoke-agent.js +141 -0
- package/dist/mcp/tools/invoke-agent.js.map +1 -0
- package/dist/mcp/tools/review-code.d.ts +25 -0
- package/dist/mcp/tools/review-code.d.ts.map +1 -0
- package/dist/mcp/tools/review-code.js +170 -0
- package/dist/mcp/tools/review-code.js.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
- package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
- package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.js +284 -0
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +36 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/index.js +66 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
- package/dist/mcp/tools/worktree/index.d.ts +41 -0
- package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/index.js +69 -0
- package/dist/mcp/tools/worktree/index.js.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
- package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
- package/dist/mcp/transport/stdio.d.ts +13 -0
- package/dist/mcp/transport/stdio.d.ts.map +1 -0
- package/dist/mcp/transport/stdio.js +15 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/observability/logger.d.ts +137 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +235 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +250 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +364 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/persistence/index.d.ts +9 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +9 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/state-schema.d.ts +116 -0
- package/dist/persistence/state-schema.d.ts.map +1 -0
- package/dist/persistence/state-schema.js +28 -0
- package/dist/persistence/state-schema.js.map +1 -0
- package/dist/persistence/state-store.d.ts +111 -0
- package/dist/persistence/state-store.d.ts.map +1 -0
- package/dist/persistence/state-store.js +291 -0
- package/dist/persistence/state-store.js.map +1 -0
- package/dist/providers/anthropic.d.ts +164 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +500 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +151 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +20 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +160 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +264 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +453 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +96 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +457 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +20 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/router/context-manager.d.ts +2 -0
- package/dist/router/context-manager.d.ts.map +1 -0
- package/dist/router/context-manager.js +3 -0
- package/dist/router/context-manager.js.map +1 -0
- package/dist/router/engine.d.ts +169 -0
- package/dist/router/engine.d.ts.map +1 -0
- package/dist/router/engine.js +435 -0
- package/dist/router/engine.js.map +1 -0
- package/dist/router/pattern-executor.d.ts +317 -0
- package/dist/router/pattern-executor.d.ts.map +1 -0
- package/dist/router/pattern-executor.js +571 -0
- package/dist/router/pattern-executor.js.map +1 -0
- package/dist/router/role-resolver.d.ts +59 -0
- package/dist/router/role-resolver.d.ts.map +1 -0
- package/dist/router/role-resolver.js +95 -0
- package/dist/router/role-resolver.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/startup.d.ts +78 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +107 -0
- package/dist/startup.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +141 -0
- package/dist/tasks/coordinator.d.ts.map +1 -0
- package/dist/tasks/coordinator.js +331 -0
- package/dist/tasks/coordinator.js.map +1 -0
- package/dist/tasks/index.d.ts +13 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +13 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
- package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
- package/dist/tasks/persistent-state-coordinator.js +371 -0
- package/dist/tasks/persistent-state-coordinator.js.map +1 -0
- package/dist/tasks/pipeline-manager.d.ts +103 -0
- package/dist/tasks/pipeline-manager.d.ts.map +1 -0
- package/dist/tasks/pipeline-manager.js +358 -0
- package/dist/tasks/pipeline-manager.js.map +1 -0
- package/dist/tasks/state-coordinator.d.ts +79 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -0
- package/dist/tasks/state-coordinator.js +200 -0
- package/dist/tasks/state-coordinator.js.map +1 -0
- package/dist/tasks/worker-mode.d.ts +65 -0
- package/dist/tasks/worker-mode.d.ts.map +1 -0
- package/dist/tasks/worker-mode.js +208 -0
- package/dist/tasks/worker-mode.js.map +1 -0
- package/dist/translation/errors.d.ts +203 -0
- package/dist/translation/errors.d.ts.map +1 -0
- package/dist/translation/errors.js +477 -0
- package/dist/translation/errors.js.map +1 -0
- package/dist/translation/index.d.ts +12 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +32 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/messages.d.ts +295 -0
- package/dist/translation/messages.d.ts.map +1 -0
- package/dist/translation/messages.js +557 -0
- package/dist/translation/messages.js.map +1 -0
- package/dist/translation/streaming.d.ts +226 -0
- package/dist/translation/streaming.d.ts.map +1 -0
- package/dist/translation/streaming.js +520 -0
- package/dist/translation/streaming.js.map +1 -0
- package/dist/translation/tools.d.ts +209 -0
- package/dist/translation/tools.d.ts.map +1 -0
- package/dist/translation/tools.js +331 -0
- package/dist/translation/tools.js.map +1 -0
- package/dist/types.d.ts +747 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +175 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +315 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/git.d.ts +58 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +197 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge-ordering.d.ts +45 -0
- package/dist/utils/merge-ordering.d.ts.map +1 -0
- package/dist/utils/merge-ordering.js +128 -0
- package/dist/utils/merge-ordering.js.map +1 -0
- package/dist/utils/retry.d.ts +106 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +188 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/worktrees/branch-manager.d.ts +55 -0
- package/dist/worktrees/branch-manager.d.ts.map +1 -0
- package/dist/worktrees/branch-manager.js +129 -0
- package/dist/worktrees/branch-manager.js.map +1 -0
- package/dist/worktrees/conflict-handler.d.ts +72 -0
- package/dist/worktrees/conflict-handler.d.ts.map +1 -0
- package/dist/worktrees/conflict-handler.js +287 -0
- package/dist/worktrees/conflict-handler.js.map +1 -0
- package/dist/worktrees/conflict-parser.d.ts +28 -0
- package/dist/worktrees/conflict-parser.d.ts.map +1 -0
- package/dist/worktrees/conflict-parser.js +140 -0
- package/dist/worktrees/conflict-parser.js.map +1 -0
- package/dist/worktrees/index.d.ts +20 -0
- package/dist/worktrees/index.d.ts.map +1 -0
- package/dist/worktrees/index.js +20 -0
- package/dist/worktrees/index.js.map +1 -0
- package/dist/worktrees/instructions.d.ts +20 -0
- package/dist/worktrees/instructions.d.ts.map +1 -0
- package/dist/worktrees/instructions.js +84 -0
- package/dist/worktrees/instructions.js.map +1 -0
- package/dist/worktrees/manager.d.ts +76 -0
- package/dist/worktrees/manager.d.ts.map +1 -0
- package/dist/worktrees/manager.js +277 -0
- package/dist/worktrees/manager.js.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
- package/dist/worktrees/pool.d.ts +95 -0
- package/dist/worktrees/pool.d.ts.map +1 -0
- package/dist/worktrees/pool.js +271 -0
- package/dist/worktrees/pool.js.map +1 -0
- package/dist/worktrees/recovery.d.ts +94 -0
- package/dist/worktrees/recovery.d.ts.map +1 -0
- package/dist/worktrees/recovery.js +371 -0
- package/dist/worktrees/recovery.js.map +1 -0
- package/dist/worktrees/resource-manager.d.ts +74 -0
- package/dist/worktrees/resource-manager.d.ts.map +1 -0
- package/dist/worktrees/resource-manager.js +228 -0
- package/dist/worktrees/resource-manager.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Response Translation
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for parsing Server-Sent Events (SSE) streams from
|
|
5
|
+
* different LLM providers and normalizing them to AgentRouter's StreamChunk format.
|
|
6
|
+
*
|
|
7
|
+
* Supported providers:
|
|
8
|
+
* - Anthropic: message_start, content_block_start, content_block_delta, message_stop events
|
|
9
|
+
* - OpenAI: data: {"choices":[{"delta":{...}}]} format
|
|
10
|
+
* - Gemini: data: {"candidates":[{"content":{"parts":[...]}}]} format
|
|
11
|
+
*
|
|
12
|
+
* All streams are normalized to the common StreamChunk interface.
|
|
13
|
+
*/
|
|
14
|
+
import { TranslationError } from '../types.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// SSE Parser Utility
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Parse SSE (Server-Sent Events) data from a ReadableStream.
|
|
20
|
+
* Handles buffering of partial lines and yields complete events.
|
|
21
|
+
*
|
|
22
|
+
* @param stream - The ReadableStream to parse
|
|
23
|
+
* @param options - Parser options
|
|
24
|
+
* @returns AsyncIterable yielding parsed event data strings
|
|
25
|
+
*/
|
|
26
|
+
export async function* parseSSE(stream, options) {
|
|
27
|
+
const dataPrefix = options?.dataPrefix ?? 'data: ';
|
|
28
|
+
const doneMarker = options?.doneMarker ?? '[DONE]';
|
|
29
|
+
const reader = stream.getReader();
|
|
30
|
+
const decoder = new TextDecoder();
|
|
31
|
+
let buffer = '';
|
|
32
|
+
try {
|
|
33
|
+
while (true) {
|
|
34
|
+
const { done, value } = await reader.read();
|
|
35
|
+
if (done) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
buffer += decoder.decode(value, { stream: true });
|
|
39
|
+
// Process complete lines from buffer
|
|
40
|
+
const lines = buffer.split('\n');
|
|
41
|
+
buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
const trimmedLine = line.trim();
|
|
44
|
+
// Skip empty lines and comments
|
|
45
|
+
if (!trimmedLine || trimmedLine.startsWith(':')) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Parse data line
|
|
49
|
+
if (trimmedLine.startsWith(dataPrefix)) {
|
|
50
|
+
const data = trimmedLine.slice(dataPrefix.length);
|
|
51
|
+
// Skip stream end marker
|
|
52
|
+
if (data === doneMarker) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
yield data;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Process any remaining data in buffer
|
|
60
|
+
if (buffer.trim()) {
|
|
61
|
+
const trimmedLine = buffer.trim();
|
|
62
|
+
if (trimmedLine.startsWith(dataPrefix)) {
|
|
63
|
+
const data = trimmedLine.slice(dataPrefix.length);
|
|
64
|
+
if (data !== doneMarker) {
|
|
65
|
+
yield data;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
reader.releaseLock();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Parse Anthropic SSE stream and yield normalized StreamChunks.
|
|
76
|
+
*
|
|
77
|
+
* Anthropic streaming events:
|
|
78
|
+
* - message_start: Contains initial message metadata
|
|
79
|
+
* - content_block_start: Starts a new content block (text or tool_use)
|
|
80
|
+
* - content_block_delta: Incremental content updates
|
|
81
|
+
* - content_block_stop: Marks end of a content block
|
|
82
|
+
* - message_delta: Final message metadata (stop_reason, usage)
|
|
83
|
+
* - message_stop: Marks end of the message
|
|
84
|
+
* - ping: Keep-alive (ignored)
|
|
85
|
+
* - error: Stream error
|
|
86
|
+
*
|
|
87
|
+
* @param stream - ReadableStream from Anthropic API response
|
|
88
|
+
* @returns AsyncIterable of normalized StreamChunks
|
|
89
|
+
*/
|
|
90
|
+
export async function* parseAnthropicStream(stream) {
|
|
91
|
+
const state = {
|
|
92
|
+
contentBlocks: new Map(),
|
|
93
|
+
messageStarted: false,
|
|
94
|
+
};
|
|
95
|
+
for await (const data of parseSSE(stream)) {
|
|
96
|
+
let event;
|
|
97
|
+
try {
|
|
98
|
+
event = JSON.parse(data);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Skip malformed JSON
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const chunk = translateAnthropicEvent(event, state);
|
|
105
|
+
if (chunk) {
|
|
106
|
+
yield chunk;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Translate a single Anthropic stream event to a normalized StreamChunk.
|
|
112
|
+
*
|
|
113
|
+
* @param event - Anthropic stream event
|
|
114
|
+
* @param state - Parser state for tracking content blocks
|
|
115
|
+
* @returns StreamChunk or undefined if event should be skipped
|
|
116
|
+
*/
|
|
117
|
+
function translateAnthropicEvent(event, state) {
|
|
118
|
+
switch (event.type) {
|
|
119
|
+
case 'content_block_start': {
|
|
120
|
+
const contentBlock = translateAnthropicContentBlock(event.content_block);
|
|
121
|
+
state.contentBlocks.set(event.index, contentBlock);
|
|
122
|
+
return {
|
|
123
|
+
type: 'content_block_start',
|
|
124
|
+
index: event.index,
|
|
125
|
+
content_block: contentBlock,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
case 'content_block_delta': {
|
|
129
|
+
const delta = {
|
|
130
|
+
type: event.delta.type,
|
|
131
|
+
};
|
|
132
|
+
if (event.delta.text !== undefined) {
|
|
133
|
+
delta.text = event.delta.text;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
type: 'content_block_delta',
|
|
137
|
+
index: event.index,
|
|
138
|
+
delta,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
case 'message_stop':
|
|
142
|
+
return {
|
|
143
|
+
type: 'message_stop',
|
|
144
|
+
};
|
|
145
|
+
case 'error':
|
|
146
|
+
throw new TranslationError(`Anthropic stream error: ${event.error.message}`, 'anthropic_stream', 'stream_chunk', new Error(event.error.message));
|
|
147
|
+
// Skip these events - they don't produce output
|
|
148
|
+
case 'message_start':
|
|
149
|
+
state.messageStarted = true;
|
|
150
|
+
return undefined;
|
|
151
|
+
case 'content_block_stop':
|
|
152
|
+
case 'message_delta':
|
|
153
|
+
case 'ping':
|
|
154
|
+
return undefined;
|
|
155
|
+
default:
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Translate Anthropic content block to normalized format.
|
|
161
|
+
*/
|
|
162
|
+
function translateAnthropicContentBlock(block) {
|
|
163
|
+
switch (block.type) {
|
|
164
|
+
case 'text':
|
|
165
|
+
return {
|
|
166
|
+
type: 'text',
|
|
167
|
+
text: block.text ?? '',
|
|
168
|
+
};
|
|
169
|
+
case 'tool_use':
|
|
170
|
+
return {
|
|
171
|
+
type: 'tool_use',
|
|
172
|
+
id: block.id ?? '',
|
|
173
|
+
name: block.name ?? '',
|
|
174
|
+
input: block.input ?? {},
|
|
175
|
+
};
|
|
176
|
+
case 'tool_result':
|
|
177
|
+
return {
|
|
178
|
+
type: 'tool_result',
|
|
179
|
+
tool_use_id: block.tool_use_id ?? '',
|
|
180
|
+
content: block.content ?? '',
|
|
181
|
+
};
|
|
182
|
+
default:
|
|
183
|
+
return {
|
|
184
|
+
type: 'text',
|
|
185
|
+
text: '',
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Parse OpenAI SSE stream and yield normalized StreamChunks.
|
|
191
|
+
*
|
|
192
|
+
* OpenAI streams JSON objects with this structure:
|
|
193
|
+
* - data: {"choices":[{"delta":{"content":"..."}}]}
|
|
194
|
+
* - data: {"choices":[{"delta":{"tool_calls":[...]}}]}
|
|
195
|
+
* - data: [DONE]
|
|
196
|
+
*
|
|
197
|
+
* Key differences from Anthropic:
|
|
198
|
+
* - Content comes in delta.content field
|
|
199
|
+
* - Tool calls are accumulated across chunks
|
|
200
|
+
* - No explicit content_block_start/stop events
|
|
201
|
+
*
|
|
202
|
+
* @param stream - ReadableStream from OpenAI API response
|
|
203
|
+
* @returns AsyncIterable of normalized StreamChunks
|
|
204
|
+
*/
|
|
205
|
+
export async function* parseOpenAIStream(stream) {
|
|
206
|
+
const state = {
|
|
207
|
+
toolCallsInProgress: new Map(),
|
|
208
|
+
hasStartedContent: false,
|
|
209
|
+
nextBlockIndex: 0,
|
|
210
|
+
};
|
|
211
|
+
for await (const data of parseSSE(stream)) {
|
|
212
|
+
let chunk;
|
|
213
|
+
try {
|
|
214
|
+
chunk = JSON.parse(data);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Skip malformed JSON
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
const streamChunks = translateOpenAIChunk(chunk, state);
|
|
221
|
+
for (const streamChunk of streamChunks) {
|
|
222
|
+
yield streamChunk;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Emit message_stop at the end
|
|
226
|
+
yield { type: 'message_stop' };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Translate a single OpenAI stream chunk to normalized StreamChunks.
|
|
230
|
+
*
|
|
231
|
+
* OpenAI chunks may produce multiple StreamChunks, especially when
|
|
232
|
+
* starting new content blocks (text or tool_use).
|
|
233
|
+
*
|
|
234
|
+
* @param chunk - OpenAI stream chunk
|
|
235
|
+
* @param state - Parser state for tracking progress
|
|
236
|
+
* @returns Array of StreamChunks to yield
|
|
237
|
+
*/
|
|
238
|
+
function translateOpenAIChunk(chunk, state) {
|
|
239
|
+
const chunks = [];
|
|
240
|
+
const choice = chunk.choices[0];
|
|
241
|
+
if (!choice) {
|
|
242
|
+
return chunks;
|
|
243
|
+
}
|
|
244
|
+
const delta = choice.delta;
|
|
245
|
+
// Handle text content
|
|
246
|
+
if (delta.content !== undefined && delta.content !== null) {
|
|
247
|
+
// Emit content_block_start if this is the first content
|
|
248
|
+
if (!state.hasStartedContent) {
|
|
249
|
+
chunks.push({
|
|
250
|
+
type: 'content_block_start',
|
|
251
|
+
index: state.nextBlockIndex,
|
|
252
|
+
content_block: {
|
|
253
|
+
type: 'text',
|
|
254
|
+
text: '',
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
state.hasStartedContent = true;
|
|
258
|
+
}
|
|
259
|
+
// Emit content delta
|
|
260
|
+
chunks.push({
|
|
261
|
+
type: 'content_block_delta',
|
|
262
|
+
index: 0, // Text is always at index 0
|
|
263
|
+
delta: {
|
|
264
|
+
type: 'text_delta',
|
|
265
|
+
text: delta.content,
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// Handle tool calls
|
|
270
|
+
if (delta.tool_calls) {
|
|
271
|
+
for (const toolCallDelta of delta.tool_calls) {
|
|
272
|
+
const toolIndex = toolCallDelta.index;
|
|
273
|
+
// Initialize tool call tracking if new
|
|
274
|
+
if (!state.toolCallsInProgress.has(toolIndex)) {
|
|
275
|
+
state.toolCallsInProgress.set(toolIndex, {
|
|
276
|
+
id: toolCallDelta.id ?? '',
|
|
277
|
+
name: toolCallDelta.function?.name ?? '',
|
|
278
|
+
arguments: '',
|
|
279
|
+
});
|
|
280
|
+
// Emit content_block_start for tool use
|
|
281
|
+
if (toolCallDelta.id && toolCallDelta.function?.name) {
|
|
282
|
+
// Tool calls start after text block (if any)
|
|
283
|
+
const blockIndex = state.hasStartedContent ? toolIndex + 1 : toolIndex;
|
|
284
|
+
chunks.push({
|
|
285
|
+
type: 'content_block_start',
|
|
286
|
+
index: blockIndex,
|
|
287
|
+
content_block: {
|
|
288
|
+
type: 'tool_use',
|
|
289
|
+
id: toolCallDelta.id,
|
|
290
|
+
name: toolCallDelta.function.name,
|
|
291
|
+
input: {},
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Update tool call data
|
|
297
|
+
const toolCall = state.toolCallsInProgress.get(toolIndex);
|
|
298
|
+
if (toolCallDelta.id) {
|
|
299
|
+
toolCall.id = toolCallDelta.id;
|
|
300
|
+
}
|
|
301
|
+
if (toolCallDelta.function?.name) {
|
|
302
|
+
toolCall.name = toolCallDelta.function.name;
|
|
303
|
+
}
|
|
304
|
+
if (toolCallDelta.function?.arguments) {
|
|
305
|
+
toolCall.arguments += toolCallDelta.function.arguments;
|
|
306
|
+
// Emit delta for argument chunks
|
|
307
|
+
const blockIndex = state.hasStartedContent ? toolIndex + 1 : toolIndex;
|
|
308
|
+
chunks.push({
|
|
309
|
+
type: 'content_block_delta',
|
|
310
|
+
index: blockIndex,
|
|
311
|
+
delta: {
|
|
312
|
+
type: 'input_json_delta',
|
|
313
|
+
text: toolCallDelta.function.arguments,
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return chunks;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Parse Gemini SSE stream and yield normalized StreamChunks.
|
|
323
|
+
*
|
|
324
|
+
* Gemini streams JSON objects with this structure:
|
|
325
|
+
* - data: {"candidates":[{"content":{"parts":[{"text":"..."}]}}]}
|
|
326
|
+
* - data: {"candidates":[{"content":{"parts":[{"functionCall":{...}}]}}]}
|
|
327
|
+
*
|
|
328
|
+
* Key differences from Anthropic:
|
|
329
|
+
* - Content comes in parts array
|
|
330
|
+
* - Function calls use "functionCall" with "args" (not "arguments")
|
|
331
|
+
* - Gemini may send cumulative text (full content each chunk) - we need to deduplicate
|
|
332
|
+
*
|
|
333
|
+
* @param stream - ReadableStream from Gemini API response
|
|
334
|
+
* @returns AsyncIterable of normalized StreamChunks
|
|
335
|
+
*/
|
|
336
|
+
export async function* parseGeminiStream(stream) {
|
|
337
|
+
const state = {
|
|
338
|
+
hasStartedContent: false,
|
|
339
|
+
currentToolIndex: 0,
|
|
340
|
+
lastTextLength: 0,
|
|
341
|
+
};
|
|
342
|
+
for await (const data of parseSSE(stream)) {
|
|
343
|
+
let chunk;
|
|
344
|
+
try {
|
|
345
|
+
chunk = JSON.parse(data);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// Skip malformed JSON
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const streamChunks = translateGeminiChunk(chunk, state);
|
|
352
|
+
for (const streamChunk of streamChunks) {
|
|
353
|
+
yield streamChunk;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Emit message_stop at the end
|
|
357
|
+
yield { type: 'message_stop' };
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Translate a single Gemini stream chunk to normalized StreamChunks.
|
|
361
|
+
*
|
|
362
|
+
* @param chunk - Gemini stream chunk
|
|
363
|
+
* @param state - Parser state for tracking progress
|
|
364
|
+
* @returns Array of StreamChunks to yield
|
|
365
|
+
*/
|
|
366
|
+
function translateGeminiChunk(chunk, state) {
|
|
367
|
+
const chunks = [];
|
|
368
|
+
const candidate = chunk.candidates?.[0];
|
|
369
|
+
if (!candidate?.content?.parts) {
|
|
370
|
+
return chunks;
|
|
371
|
+
}
|
|
372
|
+
for (const part of candidate.content.parts) {
|
|
373
|
+
// Handle text content
|
|
374
|
+
if (part.text !== undefined) {
|
|
375
|
+
// Gemini may send cumulative text - extract only new content
|
|
376
|
+
const fullText = part.text;
|
|
377
|
+
const newText = fullText.slice(state.lastTextLength);
|
|
378
|
+
state.lastTextLength = fullText.length;
|
|
379
|
+
// Skip if no new text
|
|
380
|
+
if (!newText) {
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
// Emit content_block_start if this is the first content
|
|
384
|
+
if (!state.hasStartedContent) {
|
|
385
|
+
chunks.push({
|
|
386
|
+
type: 'content_block_start',
|
|
387
|
+
index: 0,
|
|
388
|
+
content_block: {
|
|
389
|
+
type: 'text',
|
|
390
|
+
text: '',
|
|
391
|
+
},
|
|
392
|
+
});
|
|
393
|
+
state.hasStartedContent = true;
|
|
394
|
+
}
|
|
395
|
+
// Emit content delta with new text only
|
|
396
|
+
chunks.push({
|
|
397
|
+
type: 'content_block_delta',
|
|
398
|
+
index: 0,
|
|
399
|
+
delta: {
|
|
400
|
+
type: 'text_delta',
|
|
401
|
+
text: newText,
|
|
402
|
+
},
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
// Handle function calls
|
|
406
|
+
if (part.functionCall) {
|
|
407
|
+
const toolIndex = state.hasStartedContent
|
|
408
|
+
? state.currentToolIndex + 1
|
|
409
|
+
: state.currentToolIndex;
|
|
410
|
+
// Emit content_block_start for tool use
|
|
411
|
+
chunks.push({
|
|
412
|
+
type: 'content_block_start',
|
|
413
|
+
index: toolIndex,
|
|
414
|
+
content_block: {
|
|
415
|
+
type: 'tool_use',
|
|
416
|
+
id: `tool_${toolIndex}`, // Gemini doesn't provide IDs, generate one
|
|
417
|
+
name: part.functionCall.name,
|
|
418
|
+
input: part.functionCall.args,
|
|
419
|
+
},
|
|
420
|
+
});
|
|
421
|
+
// Emit the full input as a delta (Gemini sends complete function calls)
|
|
422
|
+
chunks.push({
|
|
423
|
+
type: 'content_block_delta',
|
|
424
|
+
index: toolIndex,
|
|
425
|
+
delta: {
|
|
426
|
+
type: 'input_json_delta',
|
|
427
|
+
text: JSON.stringify(part.functionCall.args),
|
|
428
|
+
},
|
|
429
|
+
});
|
|
430
|
+
state.currentToolIndex++;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return chunks;
|
|
434
|
+
}
|
|
435
|
+
// ============================================================================
|
|
436
|
+
// Utility Functions
|
|
437
|
+
// ============================================================================
|
|
438
|
+
/**
|
|
439
|
+
* Create a TransformStream that converts raw SSE bytes to StreamChunks.
|
|
440
|
+
*
|
|
441
|
+
* @param provider - The provider type ('anthropic', 'openai', 'gemini')
|
|
442
|
+
* @returns TransformStream that outputs StreamChunks
|
|
443
|
+
*/
|
|
444
|
+
export function createStreamTransformer(provider) {
|
|
445
|
+
let parseFunction;
|
|
446
|
+
switch (provider) {
|
|
447
|
+
case 'anthropic':
|
|
448
|
+
parseFunction = parseAnthropicStream;
|
|
449
|
+
break;
|
|
450
|
+
case 'openai':
|
|
451
|
+
parseFunction = parseOpenAIStream;
|
|
452
|
+
break;
|
|
453
|
+
case 'gemini':
|
|
454
|
+
parseFunction = parseGeminiStream;
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
457
|
+
// Create a pass-through that collects chunks and processes them
|
|
458
|
+
let transformController;
|
|
459
|
+
const buffer = [];
|
|
460
|
+
return new TransformStream({
|
|
461
|
+
start(ctrl) {
|
|
462
|
+
transformController = ctrl;
|
|
463
|
+
},
|
|
464
|
+
transform(chunk) {
|
|
465
|
+
buffer.push(chunk);
|
|
466
|
+
},
|
|
467
|
+
async flush() {
|
|
468
|
+
// Combine all buffered chunks
|
|
469
|
+
const totalLength = buffer.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
470
|
+
const combined = new Uint8Array(totalLength);
|
|
471
|
+
let offset = 0;
|
|
472
|
+
for (const chunk of buffer) {
|
|
473
|
+
combined.set(chunk, offset);
|
|
474
|
+
offset += chunk.length;
|
|
475
|
+
}
|
|
476
|
+
// Create a ReadableStream from the combined data
|
|
477
|
+
const stream = new ReadableStream({
|
|
478
|
+
start(ctrl) {
|
|
479
|
+
ctrl.enqueue(combined);
|
|
480
|
+
ctrl.close();
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
// Parse and emit chunks
|
|
484
|
+
for await (const streamChunk of parseFunction(stream)) {
|
|
485
|
+
transformController.enqueue(streamChunk);
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Collect all text content from a stream of StreamChunks.
|
|
492
|
+
* Useful for testing or when you need the full response text.
|
|
493
|
+
*
|
|
494
|
+
* @param stream - AsyncIterable of StreamChunks
|
|
495
|
+
* @returns Promise resolving to the complete text content
|
|
496
|
+
*/
|
|
497
|
+
export async function collectStreamText(stream) {
|
|
498
|
+
let text = '';
|
|
499
|
+
for await (const chunk of stream) {
|
|
500
|
+
if (chunk.type === 'content_block_delta' && chunk.delta?.type === 'text_delta') {
|
|
501
|
+
text += chunk.delta.text ?? '';
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return text;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Collect all StreamChunks from an async iterable into an array.
|
|
508
|
+
* Useful for testing.
|
|
509
|
+
*
|
|
510
|
+
* @param stream - AsyncIterable of StreamChunks
|
|
511
|
+
* @returns Promise resolving to array of all chunks
|
|
512
|
+
*/
|
|
513
|
+
export async function collectStreamChunks(stream) {
|
|
514
|
+
const chunks = [];
|
|
515
|
+
for await (const chunk of stream) {
|
|
516
|
+
chunks.push(chunk);
|
|
517
|
+
}
|
|
518
|
+
return chunks;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/translation/streaming.ts"],"names":[],"mappings":"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"}
|