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.
Files changed (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/install-skills.d.ts +11 -0
  4. package/dist/cli/install-skills.d.ts.map +1 -0
  5. package/dist/cli/install-skills.js +143 -0
  6. package/dist/cli/install-skills.js.map +1 -0
  7. package/dist/cli/recovery-commands.d.ts +41 -0
  8. package/dist/cli/recovery-commands.d.ts.map +1 -0
  9. package/dist/cli/recovery-commands.js +241 -0
  10. package/dist/cli/recovery-commands.js.map +1 -0
  11. package/dist/cli/setup-wizard.d.ts +25 -0
  12. package/dist/cli/setup-wizard.d.ts.map +1 -0
  13. package/dist/cli/setup-wizard.js +1417 -0
  14. package/dist/cli/setup-wizard.js.map +1 -0
  15. package/dist/cli/test-connection.d.ts +45 -0
  16. package/dist/cli/test-connection.d.ts.map +1 -0
  17. package/dist/cli/test-connection.js +317 -0
  18. package/dist/cli/test-connection.js.map +1 -0
  19. package/dist/cli.d.ts +75 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +704 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config/defaults.d.ts +57 -0
  24. package/dist/config/defaults.d.ts.map +1 -0
  25. package/dist/config/defaults.js +99 -0
  26. package/dist/config/defaults.js.map +1 -0
  27. package/dist/config/index.d.ts +14 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +22 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/manager.d.ts +184 -0
  32. package/dist/config/manager.d.ts.map +1 -0
  33. package/dist/config/manager.js +347 -0
  34. package/dist/config/manager.js.map +1 -0
  35. package/dist/config/merger.d.ts +76 -0
  36. package/dist/config/merger.d.ts.map +1 -0
  37. package/dist/config/merger.js +189 -0
  38. package/dist/config/merger.js.map +1 -0
  39. package/dist/config/schema.d.ts +20 -0
  40. package/dist/config/schema.d.ts.map +1 -0
  41. package/dist/config/schema.js +20 -0
  42. package/dist/config/schema.js.map +1 -0
  43. package/dist/config/validator.d.ts +254 -0
  44. package/dist/config/validator.d.ts.map +1 -0
  45. package/dist/config/validator.js +363 -0
  46. package/dist/config/validator.js.map +1 -0
  47. package/dist/config/worktree-defaults.d.ts +23 -0
  48. package/dist/config/worktree-defaults.d.ts.map +1 -0
  49. package/dist/config/worktree-defaults.js +78 -0
  50. package/dist/config/worktree-defaults.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +44 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/tools/compare-agents.d.ts +25 -0
  56. package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
  57. package/dist/mcp/tools/compare-agents.js +177 -0
  58. package/dist/mcp/tools/compare-agents.js.map +1 -0
  59. package/dist/mcp/tools/critique-plan.d.ts +26 -0
  60. package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
  61. package/dist/mcp/tools/critique-plan.js +162 -0
  62. package/dist/mcp/tools/critique-plan.js.map +1 -0
  63. package/dist/mcp/tools/design-feedback.d.ts +26 -0
  64. package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
  65. package/dist/mcp/tools/design-feedback.js +216 -0
  66. package/dist/mcp/tools/design-feedback.js.map +1 -0
  67. package/dist/mcp/tools/index.d.ts +50 -0
  68. package/dist/mcp/tools/index.d.ts.map +1 -0
  69. package/dist/mcp/tools/index.js +191 -0
  70. package/dist/mcp/tools/index.js.map +1 -0
  71. package/dist/mcp/tools/invoke-agent.d.ts +25 -0
  72. package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
  73. package/dist/mcp/tools/invoke-agent.js +141 -0
  74. package/dist/mcp/tools/invoke-agent.js.map +1 -0
  75. package/dist/mcp/tools/review-code.d.ts +25 -0
  76. package/dist/mcp/tools/review-code.d.ts.map +1 -0
  77. package/dist/mcp/tools/review-code.js +170 -0
  78. package/dist/mcp/tools/review-code.js.map +1 -0
  79. package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
  80. package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
  81. package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
  82. package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
  83. package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
  84. package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
  85. package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
  86. package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
  87. package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
  88. package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
  89. package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
  90. package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
  91. package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
  92. package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
  93. package/dist/mcp/tools/tasks/execute-task.js +284 -0
  94. package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
  95. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
  96. package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
  97. package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
  98. package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
  99. package/dist/mcp/tools/tasks/index.d.ts +36 -0
  100. package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
  101. package/dist/mcp/tools/tasks/index.js +66 -0
  102. package/dist/mcp/tools/tasks/index.js.map +1 -0
  103. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
  104. package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
  105. package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
  106. package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
  107. package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
  108. package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
  109. package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
  110. package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
  111. package/dist/mcp/tools/worktree/index.d.ts +41 -0
  112. package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
  113. package/dist/mcp/tools/worktree/index.js +69 -0
  114. package/dist/mcp/tools/worktree/index.js.map +1 -0
  115. package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
  116. package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
  117. package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
  118. package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
  119. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
  120. package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
  121. package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
  122. package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
  123. package/dist/mcp/transport/stdio.d.ts +13 -0
  124. package/dist/mcp/transport/stdio.d.ts.map +1 -0
  125. package/dist/mcp/transport/stdio.js +15 -0
  126. package/dist/mcp/transport/stdio.js.map +1 -0
  127. package/dist/observability/logger.d.ts +137 -0
  128. package/dist/observability/logger.d.ts.map +1 -0
  129. package/dist/observability/logger.js +235 -0
  130. package/dist/observability/logger.js.map +1 -0
  131. package/dist/observability/metrics.d.ts +250 -0
  132. package/dist/observability/metrics.d.ts.map +1 -0
  133. package/dist/observability/metrics.js +364 -0
  134. package/dist/observability/metrics.js.map +1 -0
  135. package/dist/persistence/index.d.ts +9 -0
  136. package/dist/persistence/index.d.ts.map +1 -0
  137. package/dist/persistence/index.js +9 -0
  138. package/dist/persistence/index.js.map +1 -0
  139. package/dist/persistence/state-schema.d.ts +116 -0
  140. package/dist/persistence/state-schema.d.ts.map +1 -0
  141. package/dist/persistence/state-schema.js +28 -0
  142. package/dist/persistence/state-schema.js.map +1 -0
  143. package/dist/persistence/state-store.d.ts +111 -0
  144. package/dist/persistence/state-store.d.ts.map +1 -0
  145. package/dist/persistence/state-store.js +291 -0
  146. package/dist/persistence/state-store.js.map +1 -0
  147. package/dist/providers/anthropic.d.ts +164 -0
  148. package/dist/providers/anthropic.d.ts.map +1 -0
  149. package/dist/providers/anthropic.js +500 -0
  150. package/dist/providers/anthropic.js.map +1 -0
  151. package/dist/providers/base.d.ts +151 -0
  152. package/dist/providers/base.d.ts.map +1 -0
  153. package/dist/providers/base.js +227 -0
  154. package/dist/providers/base.js.map +1 -0
  155. package/dist/providers/gemini.d.ts +85 -0
  156. package/dist/providers/gemini.d.ts.map +1 -0
  157. package/dist/providers/gemini.js +414 -0
  158. package/dist/providers/gemini.js.map +1 -0
  159. package/dist/providers/kimi.d.ts +19 -0
  160. package/dist/providers/kimi.d.ts.map +1 -0
  161. package/dist/providers/kimi.js +20 -0
  162. package/dist/providers/kimi.js.map +1 -0
  163. package/dist/providers/manager.d.ts +160 -0
  164. package/dist/providers/manager.d.ts.map +1 -0
  165. package/dist/providers/manager.js +264 -0
  166. package/dist/providers/manager.js.map +1 -0
  167. package/dist/providers/ollama.d.ts +83 -0
  168. package/dist/providers/ollama.d.ts.map +1 -0
  169. package/dist/providers/ollama.js +453 -0
  170. package/dist/providers/ollama.js.map +1 -0
  171. package/dist/providers/openai.d.ts +96 -0
  172. package/dist/providers/openai.d.ts.map +1 -0
  173. package/dist/providers/openai.js +457 -0
  174. package/dist/providers/openai.js.map +1 -0
  175. package/dist/providers/zai.d.ts +19 -0
  176. package/dist/providers/zai.d.ts.map +1 -0
  177. package/dist/providers/zai.js +20 -0
  178. package/dist/providers/zai.js.map +1 -0
  179. package/dist/router/context-manager.d.ts +2 -0
  180. package/dist/router/context-manager.d.ts.map +1 -0
  181. package/dist/router/context-manager.js +3 -0
  182. package/dist/router/context-manager.js.map +1 -0
  183. package/dist/router/engine.d.ts +169 -0
  184. package/dist/router/engine.d.ts.map +1 -0
  185. package/dist/router/engine.js +435 -0
  186. package/dist/router/engine.js.map +1 -0
  187. package/dist/router/pattern-executor.d.ts +317 -0
  188. package/dist/router/pattern-executor.d.ts.map +1 -0
  189. package/dist/router/pattern-executor.js +571 -0
  190. package/dist/router/pattern-executor.js.map +1 -0
  191. package/dist/router/role-resolver.d.ts +59 -0
  192. package/dist/router/role-resolver.d.ts.map +1 -0
  193. package/dist/router/role-resolver.js +95 -0
  194. package/dist/router/role-resolver.js.map +1 -0
  195. package/dist/server.d.ts +32 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +223 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/startup.d.ts +78 -0
  200. package/dist/startup.d.ts.map +1 -0
  201. package/dist/startup.js +107 -0
  202. package/dist/startup.js.map +1 -0
  203. package/dist/tasks/coordinator.d.ts +141 -0
  204. package/dist/tasks/coordinator.d.ts.map +1 -0
  205. package/dist/tasks/coordinator.js +331 -0
  206. package/dist/tasks/coordinator.js.map +1 -0
  207. package/dist/tasks/index.d.ts +13 -0
  208. package/dist/tasks/index.d.ts.map +1 -0
  209. package/dist/tasks/index.js +13 -0
  210. package/dist/tasks/index.js.map +1 -0
  211. package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
  212. package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
  213. package/dist/tasks/persistent-state-coordinator.js +371 -0
  214. package/dist/tasks/persistent-state-coordinator.js.map +1 -0
  215. package/dist/tasks/pipeline-manager.d.ts +103 -0
  216. package/dist/tasks/pipeline-manager.d.ts.map +1 -0
  217. package/dist/tasks/pipeline-manager.js +358 -0
  218. package/dist/tasks/pipeline-manager.js.map +1 -0
  219. package/dist/tasks/state-coordinator.d.ts +79 -0
  220. package/dist/tasks/state-coordinator.d.ts.map +1 -0
  221. package/dist/tasks/state-coordinator.js +200 -0
  222. package/dist/tasks/state-coordinator.js.map +1 -0
  223. package/dist/tasks/worker-mode.d.ts +65 -0
  224. package/dist/tasks/worker-mode.d.ts.map +1 -0
  225. package/dist/tasks/worker-mode.js +208 -0
  226. package/dist/tasks/worker-mode.js.map +1 -0
  227. package/dist/translation/errors.d.ts +203 -0
  228. package/dist/translation/errors.d.ts.map +1 -0
  229. package/dist/translation/errors.js +477 -0
  230. package/dist/translation/errors.js.map +1 -0
  231. package/dist/translation/index.d.ts +12 -0
  232. package/dist/translation/index.d.ts.map +1 -0
  233. package/dist/translation/index.js +32 -0
  234. package/dist/translation/index.js.map +1 -0
  235. package/dist/translation/messages.d.ts +295 -0
  236. package/dist/translation/messages.d.ts.map +1 -0
  237. package/dist/translation/messages.js +557 -0
  238. package/dist/translation/messages.js.map +1 -0
  239. package/dist/translation/streaming.d.ts +226 -0
  240. package/dist/translation/streaming.d.ts.map +1 -0
  241. package/dist/translation/streaming.js +520 -0
  242. package/dist/translation/streaming.js.map +1 -0
  243. package/dist/translation/tools.d.ts +209 -0
  244. package/dist/translation/tools.d.ts.map +1 -0
  245. package/dist/translation/tools.js +331 -0
  246. package/dist/translation/tools.js.map +1 -0
  247. package/dist/types.d.ts +747 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +86 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/utils/circuit-breaker.d.ts +175 -0
  252. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  253. package/dist/utils/circuit-breaker.js +315 -0
  254. package/dist/utils/circuit-breaker.js.map +1 -0
  255. package/dist/utils/env.d.ts +2 -0
  256. package/dist/utils/env.d.ts.map +1 -0
  257. package/dist/utils/env.js +3 -0
  258. package/dist/utils/env.js.map +1 -0
  259. package/dist/utils/git.d.ts +58 -0
  260. package/dist/utils/git.d.ts.map +1 -0
  261. package/dist/utils/git.js +197 -0
  262. package/dist/utils/git.js.map +1 -0
  263. package/dist/utils/index.d.ts +9 -0
  264. package/dist/utils/index.d.ts.map +1 -0
  265. package/dist/utils/index.js +9 -0
  266. package/dist/utils/index.js.map +1 -0
  267. package/dist/utils/merge-ordering.d.ts +45 -0
  268. package/dist/utils/merge-ordering.d.ts.map +1 -0
  269. package/dist/utils/merge-ordering.js +128 -0
  270. package/dist/utils/merge-ordering.js.map +1 -0
  271. package/dist/utils/retry.d.ts +106 -0
  272. package/dist/utils/retry.d.ts.map +1 -0
  273. package/dist/utils/retry.js +188 -0
  274. package/dist/utils/retry.js.map +1 -0
  275. package/dist/worktrees/branch-manager.d.ts +55 -0
  276. package/dist/worktrees/branch-manager.d.ts.map +1 -0
  277. package/dist/worktrees/branch-manager.js +129 -0
  278. package/dist/worktrees/branch-manager.js.map +1 -0
  279. package/dist/worktrees/conflict-handler.d.ts +72 -0
  280. package/dist/worktrees/conflict-handler.d.ts.map +1 -0
  281. package/dist/worktrees/conflict-handler.js +287 -0
  282. package/dist/worktrees/conflict-handler.js.map +1 -0
  283. package/dist/worktrees/conflict-parser.d.ts +28 -0
  284. package/dist/worktrees/conflict-parser.d.ts.map +1 -0
  285. package/dist/worktrees/conflict-parser.js +140 -0
  286. package/dist/worktrees/conflict-parser.js.map +1 -0
  287. package/dist/worktrees/index.d.ts +20 -0
  288. package/dist/worktrees/index.d.ts.map +1 -0
  289. package/dist/worktrees/index.js +20 -0
  290. package/dist/worktrees/index.js.map +1 -0
  291. package/dist/worktrees/instructions.d.ts +20 -0
  292. package/dist/worktrees/instructions.d.ts.map +1 -0
  293. package/dist/worktrees/instructions.js +84 -0
  294. package/dist/worktrees/instructions.js.map +1 -0
  295. package/dist/worktrees/manager.d.ts +76 -0
  296. package/dist/worktrees/manager.d.ts.map +1 -0
  297. package/dist/worktrees/manager.js +277 -0
  298. package/dist/worktrees/manager.js.map +1 -0
  299. package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
  300. package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
  301. package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
  302. package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
  303. package/dist/worktrees/pool.d.ts +95 -0
  304. package/dist/worktrees/pool.d.ts.map +1 -0
  305. package/dist/worktrees/pool.js +271 -0
  306. package/dist/worktrees/pool.js.map +1 -0
  307. package/dist/worktrees/recovery.d.ts +94 -0
  308. package/dist/worktrees/recovery.d.ts.map +1 -0
  309. package/dist/worktrees/recovery.js +371 -0
  310. package/dist/worktrees/recovery.js.map +1 -0
  311. package/dist/worktrees/resource-manager.d.ts +74 -0
  312. package/dist/worktrees/resource-manager.d.ts.map +1 -0
  313. package/dist/worktrees/resource-manager.js +228 -0
  314. package/dist/worktrees/resource-manager.js.map +1 -0
  315. package/package.json +88 -0
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Google Gemini Provider Implementation
3
+ *
4
+ * Provider adapter for the Google Gemini API (Generative Language API).
5
+ * Handles message formatting, streaming, and tool use for Gemini models.
6
+ *
7
+ * Key differences from Anthropic format:
8
+ * - Messages use "contents" array with "parts" instead of "content"
9
+ * - System prompt is a separate "systemInstruction" field
10
+ * - Tool schemas use "parameters" (OpenAI style) in function declarations
11
+ * - Tool calls return "functionCall" parts, results use "functionResponse" parts
12
+ * - Auth via API key query param or Authorization header
13
+ */
14
+ import { BaseProvider } from './base.js';
15
+ // ============================================================================
16
+ // Gemini Provider Implementation
17
+ // ============================================================================
18
+ /**
19
+ * Google Gemini API provider adapter.
20
+ *
21
+ * Implements the Provider interface for Google's Gemini models.
22
+ * Handles:
23
+ * - Message format translation (our format -> Gemini format)
24
+ * - Streaming SSE event parsing
25
+ * - Tool use / function calling
26
+ * - Authentication via API key
27
+ */
28
+ export class GeminiProvider extends BaseProvider {
29
+ name = 'google';
30
+ static DEFAULT_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta';
31
+ /** Default max tokens if not specified in request */
32
+ static DEFAULT_MAX_TOKENS = 4096;
33
+ constructor(config) {
34
+ super(config);
35
+ }
36
+ /**
37
+ * Build the full API URL with model and action.
38
+ * Gemini uses URL path for model selection and action.
39
+ *
40
+ * @param model - Model identifier
41
+ * @param action - API action (generateContent, streamGenerateContent)
42
+ * @returns Full API URL
43
+ */
44
+ buildUrl(model, action) {
45
+ const baseUrl = this.getBaseUrl(GeminiProvider.DEFAULT_BASE_URL);
46
+ const url = `${baseUrl}/models/${model}:${action}`;
47
+ // Gemini supports API key as query parameter
48
+ if (this.config.api_key) {
49
+ return `${url}?key=${this.config.api_key}`;
50
+ }
51
+ return url;
52
+ }
53
+ /**
54
+ * Build headers for Gemini API requests.
55
+ * Uses Bearer token if API key is provided (alternative to query param).
56
+ */
57
+ buildHeaders() {
58
+ const headers = {
59
+ 'Content-Type': 'application/json',
60
+ };
61
+ // Gemini also supports Authorization header (alternative to query param)
62
+ // We use query param by default, but support Bearer if explicitly configured
63
+ if (this.config.headers?.['Authorization']) {
64
+ headers['Authorization'] = this.config.headers['Authorization'];
65
+ }
66
+ // Add any custom headers from config
67
+ if (this.config.headers) {
68
+ Object.assign(headers, this.config.headers);
69
+ }
70
+ return headers;
71
+ }
72
+ /**
73
+ * Execute a completion request and return the full response.
74
+ */
75
+ async complete(request) {
76
+ const url = this.buildUrl(request.model, 'generateContent');
77
+ const geminiRequest = this.translateRequest(request);
78
+ const response = await this.makeRequest({
79
+ method: 'POST',
80
+ url,
81
+ headers: this.buildHeaders(),
82
+ body: geminiRequest,
83
+ timeoutMs: request.timeout_ms ?? this.defaultTimeoutMs,
84
+ });
85
+ return this.translateResponse(response, request.model);
86
+ }
87
+ /**
88
+ * Execute a streaming completion request.
89
+ */
90
+ async *completeStream(request) {
91
+ // Gemini uses streamGenerateContent endpoint with alt=sse query param
92
+ let url = this.buildUrl(request.model, 'streamGenerateContent');
93
+ // Add alt=sse for server-sent events format
94
+ url += url.includes('?') ? '&alt=sse' : '?alt=sse';
95
+ const geminiRequest = this.translateRequest(request);
96
+ const response = await this.makeStreamingRequest({
97
+ method: 'POST',
98
+ url,
99
+ headers: this.buildHeaders(),
100
+ body: geminiRequest,
101
+ timeoutMs: request.timeout_ms ?? this.defaultTimeoutMs,
102
+ stream: true,
103
+ });
104
+ if (!response.body) {
105
+ throw new Error('No response body for streaming request');
106
+ }
107
+ // Track state for content block management
108
+ let hasStartedContent = false;
109
+ let currentToolCallIndex = 0;
110
+ const activeToolCalls = new Map();
111
+ const reader = response.body.getReader();
112
+ const decoder = new TextDecoder();
113
+ let buffer = '';
114
+ try {
115
+ while (true) {
116
+ const { done, value } = await reader.read();
117
+ if (done) {
118
+ break;
119
+ }
120
+ buffer += decoder.decode(value, { stream: true });
121
+ // Process complete SSE events
122
+ const lines = buffer.split('\n');
123
+ buffer = lines.pop() || '';
124
+ for (const line of lines) {
125
+ const trimmed = line.trim();
126
+ if (!trimmed || trimmed === 'data: [DONE]') {
127
+ continue;
128
+ }
129
+ if (trimmed.startsWith('data: ')) {
130
+ const jsonStr = trimmed.slice(6);
131
+ try {
132
+ const chunk = JSON.parse(jsonStr);
133
+ const chunks = this.translateStreamChunk(chunk, hasStartedContent, currentToolCallIndex, activeToolCalls);
134
+ for (const streamChunk of chunks) {
135
+ // Track state for content block management
136
+ if (streamChunk.type === 'content_block_start' &&
137
+ streamChunk.content_block?.type === 'text') {
138
+ hasStartedContent = true;
139
+ }
140
+ if (streamChunk.type === 'content_block_start' &&
141
+ streamChunk.content_block?.type === 'tool_use') {
142
+ currentToolCallIndex++;
143
+ }
144
+ yield streamChunk;
145
+ }
146
+ }
147
+ catch {
148
+ // Skip malformed JSON chunks
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ finally {
155
+ reader.releaseLock();
156
+ }
157
+ // Emit message_stop at the end
158
+ yield { type: 'message_stop' };
159
+ }
160
+ /**
161
+ * Check if the Gemini API is available and credentials are valid.
162
+ */
163
+ async healthCheck() {
164
+ // List models endpoint to verify API key
165
+ const baseUrl = this.getBaseUrl(GeminiProvider.DEFAULT_BASE_URL);
166
+ let url = `${baseUrl}/models`;
167
+ if (this.config.api_key) {
168
+ url += `?key=${this.config.api_key}`;
169
+ }
170
+ await this.makeRequest({
171
+ method: 'GET',
172
+ url,
173
+ headers: this.buildHeaders(),
174
+ timeoutMs: 10000,
175
+ });
176
+ }
177
+ // ==========================================================================
178
+ // Translation Methods
179
+ // ==========================================================================
180
+ /**
181
+ * Translate AgentRouter request to Gemini format.
182
+ */
183
+ translateRequest(request) {
184
+ const geminiRequest = {
185
+ contents: this.translateMessages(request.messages),
186
+ };
187
+ // Add generation config if any options specified
188
+ const generationConfig = {};
189
+ if (request.temperature !== undefined) {
190
+ generationConfig.temperature = request.temperature;
191
+ }
192
+ if (request.max_tokens !== undefined) {
193
+ generationConfig.maxOutputTokens = request.max_tokens;
194
+ }
195
+ else {
196
+ generationConfig.maxOutputTokens = GeminiProvider.DEFAULT_MAX_TOKENS;
197
+ }
198
+ if (Object.keys(generationConfig).length > 0) {
199
+ geminiRequest.generationConfig = generationConfig;
200
+ }
201
+ // Translate tools if present
202
+ if (request.tools && request.tools.length > 0) {
203
+ geminiRequest.tools = [
204
+ {
205
+ functionDeclarations: this.translateTools(request.tools),
206
+ },
207
+ ];
208
+ }
209
+ return geminiRequest;
210
+ }
211
+ /**
212
+ * Translate messages from AgentRouter format to Gemini format.
213
+ *
214
+ * Key translations:
215
+ * - role: "user" -> "user", role: "assistant" -> "model"
216
+ * - Content blocks become parts
217
+ * - tool_use blocks become functionCall parts
218
+ * - tool_result blocks become functionResponse parts
219
+ */
220
+ translateMessages(messages) {
221
+ const geminiContents = [];
222
+ for (const message of messages) {
223
+ const role = message.role === 'assistant' ? 'model' : 'user';
224
+ const parts = [];
225
+ if (typeof message.content === 'string') {
226
+ // Simple string content
227
+ parts.push({ text: message.content });
228
+ }
229
+ else {
230
+ // Content blocks - translate each type
231
+ for (const block of message.content) {
232
+ switch (block.type) {
233
+ case 'text':
234
+ if (block.text) {
235
+ parts.push({ text: block.text });
236
+ }
237
+ break;
238
+ case 'tool_use':
239
+ if (block.name) {
240
+ parts.push({
241
+ functionCall: {
242
+ name: block.name,
243
+ args: block.input || {},
244
+ },
245
+ });
246
+ }
247
+ break;
248
+ case 'tool_result':
249
+ if (block.tool_use_id && block.content) {
250
+ // Gemini expects function name, not ID
251
+ // We need to track tool calls to map IDs to names
252
+ // For now, use the ID as name (caller should ensure consistency)
253
+ parts.push({
254
+ functionResponse: {
255
+ name: block.tool_use_id,
256
+ response: {
257
+ content: block.content,
258
+ },
259
+ },
260
+ });
261
+ }
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ if (parts.length > 0) {
267
+ geminiContents.push({ role, parts });
268
+ }
269
+ }
270
+ return geminiContents;
271
+ }
272
+ /**
273
+ * Translate tools from AgentRouter format to Gemini function declarations.
274
+ */
275
+ translateTools(tools) {
276
+ return tools.map((tool) => ({
277
+ name: tool.name,
278
+ description: tool.description,
279
+ parameters: tool.input_schema,
280
+ }));
281
+ }
282
+ /**
283
+ * Translate Gemini response to AgentRouter format.
284
+ */
285
+ translateResponse(response, model) {
286
+ const candidate = response.candidates?.[0];
287
+ if (!candidate) {
288
+ throw new Error('No candidates in Gemini response');
289
+ }
290
+ const content = [];
291
+ let toolCallCounter = 0;
292
+ // Translate parts to content blocks
293
+ for (const part of candidate.content.parts) {
294
+ if (part.text !== undefined) {
295
+ content.push({
296
+ type: 'text',
297
+ text: part.text,
298
+ });
299
+ }
300
+ if (part.functionCall) {
301
+ // Generate a unique ID for the tool call
302
+ const toolId = `call_${Date.now()}_${toolCallCounter++}`;
303
+ content.push({
304
+ type: 'tool_use',
305
+ id: toolId,
306
+ name: part.functionCall.name,
307
+ input: part.functionCall.args,
308
+ });
309
+ }
310
+ }
311
+ // Map Gemini finish reason to AgentRouter stop_reason
312
+ let stopReason = 'end_turn';
313
+ switch (candidate.finishReason) {
314
+ case 'STOP':
315
+ stopReason = 'end_turn';
316
+ break;
317
+ case 'MAX_TOKENS':
318
+ stopReason = 'max_tokens';
319
+ break;
320
+ case 'SAFETY':
321
+ stopReason = 'content_filter';
322
+ break;
323
+ case 'RECITATION':
324
+ stopReason = 'content_filter';
325
+ break;
326
+ default:
327
+ stopReason = 'end_turn';
328
+ }
329
+ // Check if we have tool calls - that changes the stop reason
330
+ if (content.some((block) => block.type === 'tool_use')) {
331
+ stopReason = 'tool_use';
332
+ }
333
+ const result = {
334
+ id: `gemini-${Date.now()}`, // Gemini doesn't provide response ID
335
+ content,
336
+ model,
337
+ stop_reason: stopReason,
338
+ };
339
+ if (response.usageMetadata) {
340
+ result.usage = {
341
+ input_tokens: response.usageMetadata.promptTokenCount,
342
+ output_tokens: response.usageMetadata.candidatesTokenCount,
343
+ };
344
+ }
345
+ return result;
346
+ }
347
+ /**
348
+ * Translate Gemini streaming chunk to AgentRouter StreamChunk format.
349
+ */
350
+ translateStreamChunk(chunk, hasStartedContent, currentToolCallIndex, activeToolCalls) {
351
+ const chunks = [];
352
+ const candidate = chunk.candidates?.[0];
353
+ if (!candidate?.content?.parts) {
354
+ return chunks;
355
+ }
356
+ for (const part of candidate.content.parts) {
357
+ // Handle text content
358
+ if (part.text !== undefined) {
359
+ // Emit content_block_start if this is the first content
360
+ if (!hasStartedContent) {
361
+ chunks.push({
362
+ type: 'content_block_start',
363
+ index: 0,
364
+ content_block: {
365
+ type: 'text',
366
+ text: '',
367
+ },
368
+ });
369
+ }
370
+ // Emit content delta
371
+ chunks.push({
372
+ type: 'content_block_delta',
373
+ index: 0,
374
+ delta: {
375
+ type: 'text_delta',
376
+ text: part.text,
377
+ },
378
+ });
379
+ }
380
+ // Handle function calls
381
+ if (part.functionCall) {
382
+ const toolIndex = currentToolCallIndex;
383
+ const toolId = `call_${Date.now()}_${toolIndex}`;
384
+ // Track this tool call
385
+ activeToolCalls.set(toolIndex, {
386
+ id: toolId,
387
+ name: part.functionCall.name,
388
+ });
389
+ // Emit content_block_start for tool use
390
+ chunks.push({
391
+ type: 'content_block_start',
392
+ index: toolIndex + 1, // Offset by 1 since text is at index 0
393
+ content_block: {
394
+ type: 'tool_use',
395
+ id: toolId,
396
+ name: part.functionCall.name,
397
+ input: part.functionCall.args,
398
+ },
399
+ });
400
+ // Emit the full arguments as a delta (Gemini sends complete args)
401
+ chunks.push({
402
+ type: 'content_block_delta',
403
+ index: toolIndex + 1,
404
+ delta: {
405
+ type: 'input_json_delta',
406
+ text: JSON.stringify(part.functionCall.args),
407
+ },
408
+ });
409
+ }
410
+ }
411
+ return chunks;
412
+ }
413
+ }
414
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Kimi (Moonshot AI) Provider Implementation
3
+ *
4
+ * Kimi uses an OpenAI-compatible API format.
5
+ * This provider extends OpenAIProvider with the correct name identifier.
6
+ */
7
+ import { OpenAIProvider } from './openai.js';
8
+ import type { ProviderConfig } from '../types.js';
9
+ /**
10
+ * Kimi (Moonshot AI) API provider adapter.
11
+ *
12
+ * Uses OpenAI-compatible API format but with Kimi endpoints.
13
+ * Default base URL: https://api.moonshot.cn/v1
14
+ */
15
+ export declare class KimiProvider extends OpenAIProvider {
16
+ readonly name = "kimi";
17
+ constructor(config: ProviderConfig);
18
+ }
19
+ //# sourceMappingURL=kimi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../src/providers/kimi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,cAAc;IAC9C,SAAyB,IAAI,UAAU;gBAE3B,MAAM,EAAE,cAAc;CAGnC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Kimi (Moonshot AI) Provider Implementation
3
+ *
4
+ * Kimi uses an OpenAI-compatible API format.
5
+ * This provider extends OpenAIProvider with the correct name identifier.
6
+ */
7
+ import { OpenAIProvider } from './openai.js';
8
+ /**
9
+ * Kimi (Moonshot AI) API provider adapter.
10
+ *
11
+ * Uses OpenAI-compatible API format but with Kimi endpoints.
12
+ * Default base URL: https://api.moonshot.cn/v1
13
+ */
14
+ export class KimiProvider extends OpenAIProvider {
15
+ name = 'kimi';
16
+ constructor(config) {
17
+ super(config);
18
+ }
19
+ }
20
+ //# sourceMappingURL=kimi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../src/providers/kimi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,cAAc;IACrB,IAAI,GAAG,MAAM,CAAC;IAEvC,YAAY,MAAsB;QAChC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Provider Manager
3
+ *
4
+ * Manages the registry of LLM providers, handling provider creation,
5
+ * retrieval, and configuration updates. Provides a factory method for
6
+ * creating provider instances based on their type.
7
+ */
8
+ import { type Provider, type ProviderConfig, type ProviderType } from '../types.js';
9
+ /**
10
+ * Factory function type for creating provider instances.
11
+ */
12
+ export type ProviderFactory = (config: ProviderConfig) => Provider;
13
+ /**
14
+ * Manager for LLM provider instances.
15
+ *
16
+ * Handles:
17
+ * - Provider registration and retrieval
18
+ * - Provider instance creation via factory methods
19
+ * - Configuration updates with instance recreation
20
+ * - Lazy instantiation of providers
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const manager = new ProviderManager();
25
+ *
26
+ * // Register provider factories
27
+ * manager.registerFactory('anthropic', (config) => new AnthropicProvider(config));
28
+ * manager.registerFactory('openai', (config) => new OpenAIProvider(config));
29
+ *
30
+ * // Update configurations (creates instances lazily)
31
+ * manager.updateConfig({
32
+ * anthropic: { api_key: 'sk-...' },
33
+ * openai: { api_key: 'sk-...' }
34
+ * });
35
+ *
36
+ * // Get a provider instance
37
+ * const provider = manager.get('anthropic');
38
+ * ```
39
+ */
40
+ export declare class ProviderManager {
41
+ /** Registry of provider factories and instances by name */
42
+ private readonly providers;
43
+ /** Registry of active provider instances */
44
+ private readonly instances;
45
+ /**
46
+ * Register a provider factory for a given provider type.
47
+ * The factory will be used to create provider instances when needed.
48
+ *
49
+ * @param name - Provider name (e.g., 'anthropic', 'openai')
50
+ * @param factory - Factory function that creates provider instances
51
+ */
52
+ registerFactory(name: string, factory: ProviderFactory): void;
53
+ /**
54
+ * Register a pre-created provider instance directly.
55
+ * Useful for testing or custom provider implementations.
56
+ *
57
+ * @param name - Provider name
58
+ * @param provider - Provider instance
59
+ */
60
+ register(name: string, provider: Provider): void;
61
+ /**
62
+ * Get a provider instance by name.
63
+ * Creates the instance lazily if it hasn't been created yet.
64
+ *
65
+ * @param name - Provider name
66
+ * @returns The provider instance
67
+ * @throws ConfigurationError if the provider is not registered or not configured
68
+ */
69
+ get(name: string): Provider;
70
+ /**
71
+ * Check if a provider is registered (has a factory).
72
+ *
73
+ * @param name - Provider name
74
+ * @returns True if the provider is registered
75
+ */
76
+ has(name: string): boolean;
77
+ /**
78
+ * Check if a provider is configured and ready to use.
79
+ *
80
+ * @param name - Provider name
81
+ * @returns True if the provider is configured
82
+ */
83
+ isConfigured(name: string): boolean;
84
+ /**
85
+ * Update provider configurations.
86
+ * This will invalidate existing instances so they are recreated with new configs.
87
+ *
88
+ * @param configs - Map of provider name to configuration
89
+ */
90
+ updateConfig(configs: Record<string, ProviderConfig>): void;
91
+ /**
92
+ * Get the configuration for a provider.
93
+ *
94
+ * @param name - Provider name
95
+ * @returns The provider configuration, or undefined if not configured
96
+ */
97
+ getConfig(name: string): ProviderConfig | undefined;
98
+ /**
99
+ * List all registered provider names.
100
+ *
101
+ * @returns Array of provider names
102
+ */
103
+ listProviders(): string[];
104
+ /**
105
+ * List all configured provider names (ready to use).
106
+ *
107
+ * @returns Array of configured provider names
108
+ */
109
+ listConfigured(): string[];
110
+ /**
111
+ * Remove a provider from the registry.
112
+ *
113
+ * @param name - Provider name to remove
114
+ */
115
+ remove(name: string): void;
116
+ /**
117
+ * Clear all providers from the registry.
118
+ */
119
+ clear(): void;
120
+ /**
121
+ * Run health checks on all configured providers.
122
+ *
123
+ * @returns Map of provider name to health check result (true = healthy, Error = failed)
124
+ */
125
+ healthCheckAll(): Promise<Map<string, true | Error>>;
126
+ }
127
+ /**
128
+ * Create a provider instance based on provider type.
129
+ * This is a factory function that maps provider types to their implementations.
130
+ *
131
+ * Note: This function requires the provider implementations to be imported
132
+ * and registered. Use ProviderManager.registerFactory() to register providers.
133
+ *
134
+ * @param type - Provider type
135
+ * @param config - Provider configuration
136
+ * @param manager - Provider manager with registered factories
137
+ * @returns Provider instance
138
+ * @throws ConfigurationError if the provider type is not supported
139
+ */
140
+ export declare function createProvider(type: ProviderType, config: ProviderConfig, manager: ProviderManager): Provider;
141
+ /**
142
+ * Create a ProviderManager with default provider factories registered.
143
+ * Provider implementations must be passed in to avoid circular dependencies.
144
+ *
145
+ * @param factories - Map of provider type to factory function
146
+ * @returns Configured ProviderManager
147
+ *
148
+ * @example
149
+ * ```ts
150
+ * import { AnthropicProvider } from './anthropic.js';
151
+ * import { OpenAIProvider } from './openai.js';
152
+ *
153
+ * const manager = createProviderManager({
154
+ * anthropic: (config) => new AnthropicProvider(config),
155
+ * openai: (config) => new OpenAIProvider(config),
156
+ * });
157
+ * ```
158
+ */
159
+ export declare function createProviderManager(factories: Partial<Record<ProviderType, ProviderFactory>>): ProviderManager;
160
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/providers/manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAsB,KAAM,QAAQ,EAAC,KAAM,cAAc,EAAC,KAAM,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzG;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,QAAQ,CAAC;AAcnE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,eAAe;IAC1B,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IAErE,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD;;;;;;OAMG;IACI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAcpE;;;;;;OAMG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAUvD;;;;;;;OAOG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAkClC;;;;;OAKG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;;;;OAKG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAK1C;;;;;OAKG;IACI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAwBlE;;;;;OAKG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI1D;;;;OAIG;IACI,aAAa,IAAI,MAAM,EAAE;IAOhC;;;;OAIG;IACI,cAAc,IAAI,MAAM,EAAE;IAIjC;;;;OAIG;IACI,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACI,KAAK,IAAI,IAAI;IAKpB;;;;OAIG;IACU,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;CAkBlE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,eAAe,GACvB,QAAQ,CAIV;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,GACxD,eAAe,CAUjB"}