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,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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,gBAAgB,EAAwC,MAAM,aAAa,CAAC;AA6JrF,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAC7B,MAAkC,EAClC,OAKC;IAED,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBAAA,MAAM;YAAA,CAAC;YAElB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,qCAAqC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,iCAAiC;YAE7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAEhC,gCAAgC;gBAChC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChD,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAElD,yBAAyB;oBACzB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;wBACxB,SAAS;oBACX,CAAC;oBAED,MAAM,IAAI,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAClD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAiBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,oBAAoB,CACzC,MAAkC;IAElC,MAAM,KAAK,GAAyB;QAClC,aAAa,EAAE,IAAI,GAAG,EAAE;QACxB,cAAc,EAAE,KAAK;KACtB,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,KAA2B,CAAC;QAEhC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAyB,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sBAAsB;YACtB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAC9B,KAA2B,EAC3B,KAA2B;IAE3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,YAAY,GAAG,8BAA8B,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACzE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YAEnD,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,aAAa,EAAE,YAAY;aAC5B,CAAC;QACJ,CAAC;QAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAyB;gBAClC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;aACvB,CAAC;YAEF,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAChC,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK;aACN,CAAC;QACJ,CAAC;QAED,KAAK,cAAc;YACjB,OAAO;gBACL,IAAI,EAAE,cAAc;aACrB,CAAC;QAEJ,KAAK,OAAO;YACV,MAAM,IAAI,gBAAgB,CACxB,2BAA2B,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAChD,kBAAkB,EAClB,cAAc,EACd,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAC/B,CAAC;QAEJ,gDAAgD;QAChD,KAAK,eAAe;YAClB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;YAC5B,OAAO,SAAS,CAAC;QAEnB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,eAAe,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QAEnB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,8BAA8B,CAAC,KAA4B;IAClE,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;aACvB,CAAC;QAEJ,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE;aACzB,CAAC;QAEJ,KAAK,aAAa;YAChB,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;aAC7B,CAAC;QAEJ;YACE,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,EAAE;aACT,CAAC;IACN,CAAC;AACH,CAAC;AAuBD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,MAAkC;IAElC,MAAM,KAAK,GAAsB;QAC/B,mBAAmB,EAAE,IAAI,GAAG,EAAE;QAC9B,iBAAiB,EAAE,KAAK;QACxB,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAwB,CAAC;QAE7B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;YACtB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC;QACpB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAC3B,KAAwB,EACxB,KAAwB;IAExB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAE3B,sBAAsB;IACtB,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1D,wDAAwD;QACxD,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,KAAK,CAAC,cAAc;gBAC3B,aAAa,EAAE;oBACb,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,EAAE;iBACT;aACF,CAAC,CAAC;YACH,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,qBAAqB;QACrB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,CAAC,EAAE,4BAA4B;YACtC,KAAK,EAAE;gBACL,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,KAAK,CAAC,OAAO;aACpB;SACF,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;YAEtC,uCAAuC;YACvC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE;oBACvC,EAAE,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE;oBAC1B,IAAI,EAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;oBACxC,SAAS,EAAE,EAAE;iBACd,CAAC,CAAC;gBAEH,wCAAwC;gBACxC,IAAI,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACrD,6CAA6C;oBAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAEvE,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,qBAAqB;wBAC3B,KAAK,EAAE,UAAU;wBACjB,aAAa,EAAE;4BACb,IAAI,EAAE,UAAU;4BAChB,EAAE,EAAE,aAAa,CAAC,EAAE;4BACpB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI;4BACjC,KAAK,EAAE,EAAE;yBACV;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YAC3D,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;gBACrB,QAAQ,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC9C,CAAC;YACD,IAAI,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC;gBACtC,QAAQ,CAAC,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAEvD,iCAAiC;gBACjC,MAAM,UAAU,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAEvE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,KAAK,EAAE,UAAU;oBACjB,KAAK,EAAE;wBACL,IAAI,EAAE,kBAAkB;wBACxB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,SAAS;qBACvC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAkBD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACtC,MAAkC;IAElC,MAAM,KAAK,GAAsB;QAC/B,iBAAiB,EAAE,KAAK;QACxB,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAwB,CAAC;QAE7B,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;YACtB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,WAAW,CAAC;QACpB,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,KAAwB,EACxB,KAAwB;IAExB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3C,sBAAsB;QACtB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,6DAA6D;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrD,KAAK,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;YAEvC,sBAAsB;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,wDAAwD;YACxD,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,qBAAqB;oBAC3B,KAAK,EAAE,CAAC;oBACR,aAAa,EAAE;wBACb,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,EAAE;qBACT;iBACF,CAAC,CAAC;gBACH,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,wCAAwC;YACxC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE;oBACL,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,OAAO;iBACd;aACF,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB;gBACvC,CAAC,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC;gBAC5B,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAE3B,wCAAwC;YACxC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,SAAS;gBAChB,aAAa,EAAE;oBACb,IAAI,EAAE,UAAU;oBAChB,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,2CAA2C;oBACpE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;oBAC5B,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;iBAC9B;aACF,CAAC,CAAC;YAEH,wEAAwE;YACxE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE;oBACL,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;iBAC7C;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAA2C;IAE3C,IAAI,aAAiF,CAAC;IAEtF,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW;YACd,aAAa,GAAG,oBAAoB,CAAC;YACrC,MAAM;QACR,KAAK,QAAQ;YACX,aAAa,GAAG,iBAAiB,CAAC;YAClC,MAAM;QACR,KAAK,QAAQ;YACX,aAAa,GAAG,iBAAiB,CAAC;YAClC,MAAM;IACV,CAAC;IAED,gEAAgE;IAChE,IAAI,mBAAkE,CAAC;IACvE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,OAAO,IAAI,eAAe,CAA0B;QAClD,KAAK,CAAC,IAAI;YACR,mBAAmB,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,SAAS,CAAC,KAAK;YACb,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,KAAK;YACT,8BAA8B;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,CAAC;YAED,iDAAiD;YACjD,MAAM,MAAM,GAAG,IAAI,cAAc,CAAa;gBAC5C,KAAK,CAAC,IAAI;oBACR,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,CAAC;aACF,CAAC,CAAC;YAEH,wBAAwB;YACxB,IAAI,KAAK,EAAE,MAAM,WAAW,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAkC;IAElC,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/E,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAkC;IAElC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}