kagent-ts 0.1.4 → 0.1.5

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 (341) hide show
  1. package/LICENSE +68 -21
  2. package/README.md +27 -371
  3. package/dist/compression/progressive-compressor.d.ts +66 -0
  4. package/dist/compression/progressive-compressor.d.ts.map +1 -0
  5. package/dist/compression/progressive-compressor.js +367 -0
  6. package/dist/compression/progressive-compressor.js.map +1 -0
  7. package/dist/compression/types.d.ts +1 -5
  8. package/dist/compression/types.d.ts.map +1 -1
  9. package/dist/context/context-manager.d.ts +34 -15
  10. package/dist/context/context-manager.d.ts.map +1 -1
  11. package/dist/context/context-manager.js +78 -28
  12. package/dist/context/context-manager.js.map +1 -1
  13. package/dist/context/types.d.ts +20 -4
  14. package/dist/context/types.d.ts.map +1 -1
  15. package/dist/core/agent.d.ts +354 -25
  16. package/dist/core/agent.d.ts.map +1 -1
  17. package/dist/core/agent.js +646 -64
  18. package/dist/core/agent.js.map +1 -1
  19. package/dist/core/fusion-agent.d.ts +207 -0
  20. package/dist/core/fusion-agent.d.ts.map +1 -0
  21. package/dist/core/fusion-agent.js +769 -0
  22. package/dist/core/fusion-agent.js.map +1 -0
  23. package/dist/core/hooks.d.ts +19 -7
  24. package/dist/core/hooks.d.ts.map +1 -1
  25. package/dist/core/plan-solve-agent.d.ts +1 -15
  26. package/dist/core/plan-solve-agent.d.ts.map +1 -1
  27. package/dist/core/plan-solve-agent.js +142 -117
  28. package/dist/core/plan-solve-agent.js.map +1 -1
  29. package/dist/core/react-agent.d.ts +0 -13
  30. package/dist/core/react-agent.d.ts.map +1 -1
  31. package/dist/core/react-agent.js +127 -102
  32. package/dist/core/react-agent.js.map +1 -1
  33. package/dist/core/response-schema.d.ts +65 -0
  34. package/dist/core/response-schema.d.ts.map +1 -1
  35. package/dist/core/response-schema.js +174 -1
  36. package/dist/core/response-schema.js.map +1 -1
  37. package/dist/core/system-prompts.d.ts +27 -0
  38. package/dist/core/system-prompts.d.ts.map +1 -0
  39. package/dist/core/system-prompts.js +112 -0
  40. package/dist/core/system-prompts.js.map +1 -0
  41. package/dist/eval/benchmark.d.ts +81 -0
  42. package/dist/eval/benchmark.d.ts.map +1 -0
  43. package/dist/eval/benchmark.js +292 -0
  44. package/dist/eval/benchmark.js.map +1 -0
  45. package/dist/eval/eval-runner.d.ts +79 -0
  46. package/dist/eval/eval-runner.d.ts.map +1 -0
  47. package/dist/eval/eval-runner.js +252 -0
  48. package/dist/eval/eval-runner.js.map +1 -0
  49. package/dist/eval/index.d.ts +7 -0
  50. package/dist/eval/index.d.ts.map +1 -0
  51. package/dist/eval/index.js +13 -0
  52. package/dist/eval/index.js.map +1 -0
  53. package/dist/eval/tool-call-evaluator.d.ts +72 -0
  54. package/dist/eval/tool-call-evaluator.d.ts.map +1 -0
  55. package/dist/eval/tool-call-evaluator.js +265 -0
  56. package/dist/eval/tool-call-evaluator.js.map +1 -0
  57. package/dist/eval/types.d.ts +219 -0
  58. package/dist/eval/types.d.ts.map +1 -0
  59. package/dist/eval/types.js +3 -0
  60. package/dist/eval/types.js.map +1 -0
  61. package/dist/index.d.ts +58 -14
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +116 -8
  64. package/dist/index.js.map +1 -1
  65. package/dist/llm/anthropic-provider.d.ts +141 -0
  66. package/dist/llm/anthropic-provider.d.ts.map +1 -0
  67. package/dist/llm/anthropic-provider.js +486 -0
  68. package/dist/llm/anthropic-provider.js.map +1 -0
  69. package/dist/llm/errors.d.ts +26 -0
  70. package/dist/llm/errors.d.ts.map +1 -0
  71. package/dist/llm/errors.js +19 -0
  72. package/dist/llm/errors.js.map +1 -0
  73. package/dist/llm/factory.d.ts +73 -0
  74. package/dist/llm/factory.d.ts.map +1 -0
  75. package/dist/llm/factory.js +77 -0
  76. package/dist/llm/factory.js.map +1 -0
  77. package/dist/llm/fallback-provider.d.ts +47 -0
  78. package/dist/llm/fallback-provider.d.ts.map +1 -0
  79. package/dist/llm/fallback-provider.js +91 -0
  80. package/dist/llm/fallback-provider.js.map +1 -0
  81. package/dist/llm/interface.d.ts +54 -11
  82. package/dist/llm/interface.d.ts.map +1 -1
  83. package/dist/llm/interface.js +34 -0
  84. package/dist/llm/interface.js.map +1 -1
  85. package/dist/llm/model-router.d.ts +126 -0
  86. package/dist/llm/model-router.d.ts.map +1 -0
  87. package/dist/llm/model-router.js +178 -0
  88. package/dist/llm/model-router.js.map +1 -0
  89. package/dist/llm/openai-provider.d.ts +8 -32
  90. package/dist/llm/openai-provider.d.ts.map +1 -1
  91. package/dist/llm/openai-provider.js +27 -60
  92. package/dist/llm/openai-provider.js.map +1 -1
  93. package/dist/llm/rate-limiter.d.ts +41 -0
  94. package/dist/llm/rate-limiter.d.ts.map +1 -0
  95. package/dist/llm/rate-limiter.js +93 -0
  96. package/dist/llm/rate-limiter.js.map +1 -0
  97. package/dist/llm/retry.d.ts +26 -0
  98. package/dist/llm/retry.d.ts.map +1 -0
  99. package/dist/llm/retry.js +44 -0
  100. package/dist/llm/retry.js.map +1 -0
  101. package/dist/llm/token-budget.d.ts +97 -0
  102. package/dist/llm/token-budget.d.ts.map +1 -0
  103. package/dist/llm/token-budget.js +115 -0
  104. package/dist/llm/token-budget.js.map +1 -0
  105. package/dist/logging/index.d.ts +2 -0
  106. package/dist/logging/index.d.ts.map +1 -0
  107. package/dist/logging/index.js +7 -0
  108. package/dist/logging/index.js.map +1 -0
  109. package/dist/logging/logger.d.ts +38 -0
  110. package/dist/logging/logger.d.ts.map +1 -0
  111. package/dist/logging/logger.js +34 -0
  112. package/dist/logging/logger.js.map +1 -0
  113. package/dist/mcp/mcp-client-manager.d.ts +10 -2
  114. package/dist/mcp/mcp-client-manager.d.ts.map +1 -1
  115. package/dist/mcp/mcp-client-manager.js +20 -9
  116. package/dist/mcp/mcp-client-manager.js.map +1 -1
  117. package/dist/memory/index.d.ts +3 -0
  118. package/dist/memory/index.d.ts.map +1 -0
  119. package/dist/memory/index.js +6 -0
  120. package/dist/memory/index.js.map +1 -0
  121. package/dist/memory/memory-manager.d.ts +119 -0
  122. package/dist/memory/memory-manager.d.ts.map +1 -0
  123. package/dist/memory/memory-manager.js +334 -0
  124. package/dist/memory/memory-manager.js.map +1 -0
  125. package/dist/messages/types.d.ts +2 -0
  126. package/dist/messages/types.d.ts.map +1 -1
  127. package/dist/orchestrator/index.d.ts +5 -0
  128. package/dist/orchestrator/index.d.ts.map +1 -0
  129. package/dist/orchestrator/index.js +13 -0
  130. package/dist/orchestrator/index.js.map +1 -0
  131. package/dist/orchestrator/json-extractor.d.ts +18 -0
  132. package/dist/orchestrator/json-extractor.d.ts.map +1 -0
  133. package/dist/orchestrator/json-extractor.js +111 -0
  134. package/dist/orchestrator/json-extractor.js.map +1 -0
  135. package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
  136. package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
  137. package/dist/orchestrator/orchestrator-agent.js +675 -0
  138. package/dist/orchestrator/orchestrator-agent.js.map +1 -0
  139. package/dist/orchestrator/orchestrator-response.d.ts +40 -0
  140. package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
  141. package/dist/orchestrator/orchestrator-response.js +275 -0
  142. package/dist/orchestrator/orchestrator-response.js.map +1 -0
  143. package/dist/orchestrator/orchestrator-types.d.ts +116 -0
  144. package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
  145. package/dist/orchestrator/orchestrator-types.js +3 -0
  146. package/dist/orchestrator/orchestrator-types.js.map +1 -0
  147. package/dist/preferences/preference-manager.d.ts +8 -3
  148. package/dist/preferences/preference-manager.d.ts.map +1 -1
  149. package/dist/preferences/preference-manager.js +17 -4
  150. package/dist/preferences/preference-manager.js.map +1 -1
  151. package/dist/rag/chroma-store.d.ts +52 -0
  152. package/dist/rag/chroma-store.d.ts.map +1 -0
  153. package/dist/rag/chroma-store.js +110 -0
  154. package/dist/rag/chroma-store.js.map +1 -0
  155. package/dist/rag/document-loader.d.ts +21 -0
  156. package/dist/rag/document-loader.d.ts.map +1 -0
  157. package/dist/rag/document-loader.js +129 -0
  158. package/dist/rag/document-loader.js.map +1 -0
  159. package/dist/rag/embedding-provider.d.ts +36 -0
  160. package/dist/rag/embedding-provider.d.ts.map +1 -0
  161. package/dist/rag/embedding-provider.js +74 -0
  162. package/dist/rag/embedding-provider.js.map +1 -0
  163. package/dist/rag/index.d.ts +17 -0
  164. package/dist/rag/index.d.ts.map +1 -0
  165. package/dist/rag/index.js +27 -0
  166. package/dist/rag/index.js.map +1 -0
  167. package/dist/rag/keyword-index.d.ts +53 -0
  168. package/dist/rag/keyword-index.d.ts.map +1 -0
  169. package/dist/rag/keyword-index.js +161 -0
  170. package/dist/rag/keyword-index.js.map +1 -0
  171. package/dist/rag/llm-reranker.d.ts +36 -0
  172. package/dist/rag/llm-reranker.d.ts.map +1 -0
  173. package/dist/rag/llm-reranker.js +95 -0
  174. package/dist/rag/llm-reranker.js.map +1 -0
  175. package/dist/rag/rag-manager.d.ts +54 -0
  176. package/dist/rag/rag-manager.d.ts.map +1 -0
  177. package/dist/rag/rag-manager.js +179 -0
  178. package/dist/rag/rag-manager.js.map +1 -0
  179. package/dist/rag/rag-types.d.ts +143 -0
  180. package/dist/rag/rag-types.d.ts.map +1 -0
  181. package/dist/rag/rag-types.js +9 -0
  182. package/dist/rag/rag-types.js.map +1 -0
  183. package/dist/rag/rrf.d.ts +47 -0
  184. package/dist/rag/rrf.d.ts.map +1 -0
  185. package/dist/rag/rrf.js +70 -0
  186. package/dist/rag/rrf.js.map +1 -0
  187. package/dist/rag/search-knowledge.d.ts +24 -0
  188. package/dist/rag/search-knowledge.d.ts.map +1 -0
  189. package/dist/rag/search-knowledge.js +86 -0
  190. package/dist/rag/search-knowledge.js.map +1 -0
  191. package/dist/rag/text-splitter.d.ts +25 -0
  192. package/dist/rag/text-splitter.d.ts.map +1 -0
  193. package/dist/rag/text-splitter.js +136 -0
  194. package/dist/rag/text-splitter.js.map +1 -0
  195. package/dist/rag/vector-store.d.ts +34 -0
  196. package/dist/rag/vector-store.d.ts.map +1 -0
  197. package/dist/rag/vector-store.js +73 -0
  198. package/dist/rag/vector-store.js.map +1 -0
  199. package/dist/reflection/error-notebook.d.ts +125 -0
  200. package/dist/reflection/error-notebook.d.ts.map +1 -0
  201. package/dist/reflection/error-notebook.js +368 -0
  202. package/dist/reflection/error-notebook.js.map +1 -0
  203. package/dist/reflection/index.d.ts +8 -0
  204. package/dist/reflection/index.d.ts.map +1 -0
  205. package/dist/reflection/index.js +12 -0
  206. package/dist/reflection/index.js.map +1 -0
  207. package/dist/reflection/memory-reflector.d.ts +97 -0
  208. package/dist/reflection/memory-reflector.d.ts.map +1 -0
  209. package/dist/reflection/memory-reflector.js +215 -0
  210. package/dist/reflection/memory-reflector.js.map +1 -0
  211. package/dist/reflection/reflection-agent.d.ts +105 -0
  212. package/dist/reflection/reflection-agent.d.ts.map +1 -0
  213. package/dist/reflection/reflection-agent.js +234 -0
  214. package/dist/reflection/reflection-agent.js.map +1 -0
  215. package/dist/reflection/reflection-hook.d.ts +50 -0
  216. package/dist/reflection/reflection-hook.d.ts.map +1 -0
  217. package/dist/reflection/reflection-hook.js +108 -0
  218. package/dist/reflection/reflection-hook.js.map +1 -0
  219. package/dist/rules/project-rules.d.ts +47 -0
  220. package/dist/rules/project-rules.d.ts.map +1 -0
  221. package/dist/rules/project-rules.js +166 -0
  222. package/dist/rules/project-rules.js.map +1 -0
  223. package/dist/security/boundaries.d.ts +81 -0
  224. package/dist/security/boundaries.d.ts.map +1 -0
  225. package/dist/security/boundaries.js +158 -0
  226. package/dist/security/boundaries.js.map +1 -0
  227. package/dist/security/index.d.ts +2 -0
  228. package/dist/security/index.d.ts.map +1 -0
  229. package/dist/security/index.js +11 -0
  230. package/dist/security/index.js.map +1 -0
  231. package/dist/session/session-types.d.ts +25 -4
  232. package/dist/session/session-types.d.ts.map +1 -1
  233. package/dist/skills/file-skill-loader.d.ts +4 -6
  234. package/dist/skills/file-skill-loader.d.ts.map +1 -1
  235. package/dist/skills/file-skill-loader.js +8 -19
  236. package/dist/skills/file-skill-loader.js.map +1 -1
  237. package/dist/skills/index.d.ts +1 -1
  238. package/dist/skills/index.d.ts.map +1 -1
  239. package/dist/skills/index.js +1 -2
  240. package/dist/skills/index.js.map +1 -1
  241. package/dist/skills/skill-manager.d.ts +18 -8
  242. package/dist/skills/skill-manager.d.ts.map +1 -1
  243. package/dist/skills/skill-manager.js +58 -36
  244. package/dist/skills/skill-manager.js.map +1 -1
  245. package/dist/skills/types.d.ts +3 -8
  246. package/dist/skills/types.d.ts.map +1 -1
  247. package/dist/subagent/index.d.ts +4 -0
  248. package/dist/subagent/index.d.ts.map +1 -0
  249. package/dist/subagent/index.js +8 -0
  250. package/dist/subagent/index.js.map +1 -0
  251. package/dist/subagent/subagent-loader.d.ts +53 -0
  252. package/dist/subagent/subagent-loader.d.ts.map +1 -0
  253. package/dist/subagent/subagent-loader.js +155 -0
  254. package/dist/subagent/subagent-loader.js.map +1 -0
  255. package/dist/subagent/subagent-manager.d.ts +161 -0
  256. package/dist/subagent/subagent-manager.d.ts.map +1 -0
  257. package/dist/subagent/subagent-manager.js +468 -0
  258. package/dist/subagent/subagent-manager.js.map +1 -0
  259. package/dist/subagent/subagent-types.d.ts +77 -0
  260. package/dist/subagent/subagent-types.d.ts.map +1 -0
  261. package/dist/subagent/subagent-types.js +3 -0
  262. package/dist/subagent/subagent-types.js.map +1 -0
  263. package/dist/tools/builtin/bash.d.ts +3 -0
  264. package/dist/tools/builtin/bash.d.ts.map +1 -0
  265. package/dist/tools/builtin/bash.js +87 -0
  266. package/dist/tools/builtin/bash.js.map +1 -0
  267. package/dist/tools/builtin/edit-file.d.ts.map +1 -1
  268. package/dist/tools/builtin/edit-file.js +1 -0
  269. package/dist/tools/builtin/edit-file.js.map +1 -1
  270. package/dist/tools/builtin/index.d.ts +14 -0
  271. package/dist/tools/builtin/index.d.ts.map +1 -1
  272. package/dist/tools/builtin/index.js +45 -1
  273. package/dist/tools/builtin/index.js.map +1 -1
  274. package/dist/tools/builtin/list-errors.d.ts +7 -0
  275. package/dist/tools/builtin/list-errors.d.ts.map +1 -0
  276. package/dist/tools/builtin/list-errors.js +64 -0
  277. package/dist/tools/builtin/list-errors.js.map +1 -0
  278. package/dist/tools/builtin/list-subagents.d.ts +7 -0
  279. package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
  280. package/dist/tools/builtin/list-subagents.js +21 -0
  281. package/dist/tools/builtin/list-subagents.js.map +1 -0
  282. package/dist/tools/builtin/recall.d.ts +11 -0
  283. package/dist/tools/builtin/recall.d.ts.map +1 -0
  284. package/dist/tools/builtin/recall.js +60 -0
  285. package/dist/tools/builtin/recall.js.map +1 -0
  286. package/dist/tools/builtin/remember.d.ts +12 -0
  287. package/dist/tools/builtin/remember.d.ts.map +1 -0
  288. package/dist/tools/builtin/remember.js +72 -0
  289. package/dist/tools/builtin/remember.js.map +1 -0
  290. package/dist/tools/builtin/skill.d.ts +14 -0
  291. package/dist/tools/builtin/skill.d.ts.map +1 -0
  292. package/dist/tools/builtin/skill.js +71 -0
  293. package/dist/tools/builtin/skill.js.map +1 -0
  294. package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
  295. package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
  296. package/dist/tools/builtin/spawn-subagent.js +43 -0
  297. package/dist/tools/builtin/spawn-subagent.js.map +1 -0
  298. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  299. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  300. package/dist/tools/builtin/web-fetch.js +101 -0
  301. package/dist/tools/builtin/web-fetch.js.map +1 -0
  302. package/dist/tools/builtin/write-file.d.ts.map +1 -1
  303. package/dist/tools/builtin/write-file.js +1 -0
  304. package/dist/tools/builtin/write-file.js.map +1 -1
  305. package/dist/tools/circuit-breaker.d.ts +19 -10
  306. package/dist/tools/circuit-breaker.d.ts.map +1 -1
  307. package/dist/tools/circuit-breaker.js +22 -11
  308. package/dist/tools/circuit-breaker.js.map +1 -1
  309. package/dist/tools/error-tracker.d.ts +28 -44
  310. package/dist/tools/error-tracker.d.ts.map +1 -1
  311. package/dist/tools/error-tracker.js +39 -156
  312. package/dist/tools/error-tracker.js.map +1 -1
  313. package/dist/tools/tool-filter.d.ts +70 -0
  314. package/dist/tools/tool-filter.d.ts.map +1 -0
  315. package/dist/tools/tool-filter.js +92 -0
  316. package/dist/tools/tool-filter.js.map +1 -0
  317. package/dist/tools/tool-output-truncator.d.ts +36 -0
  318. package/dist/tools/tool-output-truncator.d.ts.map +1 -0
  319. package/dist/tools/tool-output-truncator.js +117 -0
  320. package/dist/tools/tool-output-truncator.js.map +1 -0
  321. package/dist/tools/tool-registry.d.ts +25 -9
  322. package/dist/tools/tool-registry.d.ts.map +1 -1
  323. package/dist/tools/tool-registry.js +77 -28
  324. package/dist/tools/tool-registry.js.map +1 -1
  325. package/dist/tools/tool-validator.d.ts +13 -0
  326. package/dist/tools/tool-validator.d.ts.map +1 -0
  327. package/dist/tools/tool-validator.js +116 -0
  328. package/dist/tools/tool-validator.js.map +1 -0
  329. package/dist/tools/types.d.ts +86 -3
  330. package/dist/tools/types.d.ts.map +1 -1
  331. package/dist/tools/types.js +51 -2
  332. package/dist/tools/types.js.map +1 -1
  333. package/dist/trace/trace-logger.d.ts +30 -4
  334. package/dist/trace/trace-logger.d.ts.map +1 -1
  335. package/dist/trace/trace-logger.js +82 -6
  336. package/dist/trace/trace-logger.js.map +1 -1
  337. package/package.json +13 -4
  338. package/dist/compression/sliding-window.d.ts +0 -21
  339. package/dist/compression/sliding-window.d.ts.map +0 -1
  340. package/dist/compression/sliding-window.js +0 -44
  341. package/dist/compression/sliding-window.js.map +0 -1
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AnthropicProvider = void 0;
7
+ const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
8
+ const interface_1 = require("./interface");
9
+ const types_1 = require("../messages/types");
10
+ const token_counter_1 = require("../utils/token-counter");
11
+ const retry_1 = require("./retry");
12
+ // ─── Anthropic-specific network error helpers ────────────────────────────────
13
+ /**
14
+ * Check whether an error is network-related and thus retryable.
15
+ * Anthropic-provider specific: checks `Anthropic.APIError` status codes.
16
+ */
17
+ function isNetworkError(error) {
18
+ if (error instanceof Error && error.name === "LLMNetworkError")
19
+ return true;
20
+ if (error instanceof sdk_1.default.APIError) {
21
+ // 429 (rate-limit) and 5xx (server) are retryable
22
+ if (error.status === 429)
23
+ return true;
24
+ if (error.status !== undefined && error.status >= 500 && error.status < 600)
25
+ return true;
26
+ return false;
27
+ }
28
+ if (error instanceof Error) {
29
+ const msg = error.message.toLowerCase();
30
+ return (msg.includes("timeout") ||
31
+ msg.includes("econnrefused") ||
32
+ msg.includes("econnreset") ||
33
+ msg.includes("econnaborted") ||
34
+ msg.includes("enotfound") ||
35
+ msg.includes("fetch failed") ||
36
+ msg.includes("network") ||
37
+ msg.includes("socket hang up"));
38
+ }
39
+ return false;
40
+ }
41
+ /**
42
+ * Map a raw error to its NetworkErrorCause category.
43
+ * Anthropic-provider specific: checks `Anthropic.APIError` status codes.
44
+ */
45
+ function classifyError(error) {
46
+ if (error instanceof sdk_1.default.APIError) {
47
+ if (error.status === 429)
48
+ return "rate_limit";
49
+ if (error.status !== undefined && error.status >= 500)
50
+ return "server_error";
51
+ }
52
+ if (error instanceof Error) {
53
+ const msg = error.message.toLowerCase();
54
+ if (msg.includes("abort"))
55
+ return "aborted";
56
+ if (msg.includes("timeout"))
57
+ return "timeout";
58
+ if (msg.includes("econnrefused"))
59
+ return "connection_refused";
60
+ if (msg.includes("econnreset"))
61
+ return "connection_reset";
62
+ if (msg.includes("enotfound") || msg.includes("dns"))
63
+ return "dns_error";
64
+ }
65
+ return "unknown_network";
66
+ }
67
+ // ─── AnthropicConfig ─────────────────────────────────────────────────────────
68
+ /**
69
+ * Maximum output tokens for Anthropic models.
70
+ * Claude 4.x models support up to 16384. Default is 8192 to balance
71
+ * output capacity with token cost.
72
+ */
73
+ const DEFAULT_MAX_TOKENS = 8192;
74
+ /** Retry callbacks shared by all AnthropicProvider instances. */
75
+ const anthropicRetryCallbacks = {
76
+ isRetryable: isNetworkError,
77
+ classifyError,
78
+ };
79
+ // ─── AnthropicProvider ───────────────────────────────────────────────────────
80
+ /**
81
+ * Anthropic implementation of the LLMProvider interface.
82
+ * Uses the official `@anthropic-ai/sdk` npm package.
83
+ *
84
+ * Features:
85
+ * - Tool/function calling support
86
+ * - Network error retry with exponential backoff (chat only)
87
+ * - Configurable timeout
88
+ * - Token counting via tiktoken (with model-aware encoding, falls back for Claude models)
89
+ *
90
+ * Message format conversion:
91
+ * The internal `MessageData[]` format (OpenAI-compatible) is converted to
92
+ * Anthropic's native format transparently:
93
+ * - System messages are extracted and passed as the top-level `system` parameter.
94
+ * - Tool messages (role "tool") become user messages with `tool_result` content blocks.
95
+ * - Assistant messages with tool_calls become content-block arrays with `tool_use` blocks.
96
+ */
97
+ class AnthropicProvider {
98
+ model;
99
+ client;
100
+ temperature;
101
+ maxTokens;
102
+ retryConfig;
103
+ timeout;
104
+ cacheSystemPrompt;
105
+ constructor(config) {
106
+ this.client = new sdk_1.default({
107
+ apiKey: config.apiKey,
108
+ baseURL: config.baseURL,
109
+ timeout: config.timeout,
110
+ maxRetries: 0, // We handle retries ourselves via withRetry
111
+ });
112
+ if (!config.model) {
113
+ throw new Error("AnthropicProvider: `model` is required. " +
114
+ "Provide a model name (e.g. \"claude-sonnet-4-6\", \"claude-opus-4-8\") " +
115
+ "when constructing the provider.");
116
+ }
117
+ this.model = config.model;
118
+ this.temperature = config.temperature ?? 0.7;
119
+ this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;
120
+ this.timeout = config.timeout;
121
+ this.cacheSystemPrompt = config.cacheSystemPrompt ?? false;
122
+ this.retryConfig = {
123
+ maxRetries: config.retry?.maxRetries ?? 3,
124
+ baseDelayMs: config.retry?.baseDelayMs ?? 1000,
125
+ maxDelayMs: config.retry?.maxDelayMs ?? 30000,
126
+ };
127
+ }
128
+ // ─── LLMProvider Implementation ─────────────────────────────────────────
129
+ /**
130
+ * Build the `system` parameter for the Anthropic API.
131
+ * When `cacheSystemPrompt` is enabled and the system prompt is non-empty,
132
+ * wraps it in a content block with `cache_control` so Anthropic caches it.
133
+ */
134
+ buildSystemParam(systemPrompt) {
135
+ if (!systemPrompt)
136
+ return undefined;
137
+ if (!this.cacheSystemPrompt)
138
+ return systemPrompt;
139
+ return [
140
+ {
141
+ type: "text",
142
+ text: systemPrompt,
143
+ cache_control: { type: "ephemeral" },
144
+ },
145
+ ];
146
+ }
147
+ async chat(messages, tools, signal) {
148
+ const { systemPrompt, formattedMessages } = AnthropicProvider.convertMessages(messages);
149
+ const anthropicTools = tools?.length ? AnthropicProvider.convertTools(tools) : undefined;
150
+ const response = await (0, retry_1.withRetry)(() => this.client.messages.create({
151
+ model: this.model,
152
+ system: this.buildSystemParam(systemPrompt),
153
+ messages: formattedMessages,
154
+ tools: anthropicTools,
155
+ max_tokens: this.maxTokens,
156
+ temperature: this.temperature,
157
+ }, { signal }), this.retryConfig, anthropicRetryCallbacks);
158
+ return AnthropicProvider.convertResponse(response);
159
+ }
160
+ async *chatStream(messages, tools, signal) {
161
+ const { systemPrompt, formattedMessages } = AnthropicProvider.convertMessages(messages);
162
+ const anthropicTools = tools?.length ? AnthropicProvider.convertTools(tools) : undefined;
163
+ // The Anthropic SDK's stream() is synchronous — it returns a MessageStream
164
+ // without initiating a network request. The actual connection happens on
165
+ // first iteration. We retry the initial stream setup only (which may fail
166
+ // for auth/config errors), but NOT mid-stream drops — those are handled
167
+ // by the agent's outer loop, same as the OpenAI provider.
168
+ const stream = await (0, retry_1.withRetry)(async () => this.client.messages.stream({
169
+ model: this.model,
170
+ system: this.buildSystemParam(systemPrompt),
171
+ messages: formattedMessages,
172
+ tools: anthropicTools,
173
+ max_tokens: this.maxTokens,
174
+ temperature: this.temperature,
175
+ }, { signal }), this.retryConfig, anthropicRetryCallbacks);
176
+ let emittedDone = false;
177
+ for await (const event of stream) {
178
+ switch (event.type) {
179
+ case "content_block_start":
180
+ if (event.content_block.type === "tool_use") {
181
+ yield {
182
+ type: "chunk",
183
+ tool_calls: [
184
+ {
185
+ index: event.index,
186
+ id: event.content_block.id,
187
+ function: { name: event.content_block.name },
188
+ },
189
+ ],
190
+ };
191
+ }
192
+ break;
193
+ case "content_block_delta":
194
+ if (event.delta.type === "text_delta") {
195
+ yield { type: "chunk", content: event.delta.text };
196
+ }
197
+ else if (event.delta.type === "input_json_delta") {
198
+ yield {
199
+ type: "chunk",
200
+ tool_calls: [
201
+ {
202
+ index: event.index,
203
+ function: { arguments: event.delta.partial_json },
204
+ },
205
+ ],
206
+ };
207
+ }
208
+ break;
209
+ }
210
+ }
211
+ // Retrieve usage from the final message. If the stream was aborted or
212
+ // the network dropped, finalMessage() throws — we catch and still emit
213
+ // a terminal "done" event so consumers don't hang.
214
+ try {
215
+ const finalMessage = await stream.finalMessage();
216
+ if (finalMessage.usage) {
217
+ emittedDone = true;
218
+ yield {
219
+ type: "done",
220
+ usage: {
221
+ prompt_tokens: finalMessage.usage.input_tokens,
222
+ completion_tokens: finalMessage.usage.output_tokens,
223
+ total_tokens: finalMessage.usage.input_tokens + finalMessage.usage.output_tokens,
224
+ },
225
+ };
226
+ }
227
+ }
228
+ catch {
229
+ // Stream terminated abnormally — usage stats unavailable.
230
+ }
231
+ if (!emittedDone) {
232
+ yield { type: "done" };
233
+ }
234
+ }
235
+ /**
236
+ * Count tokens using tiktoken (with model-aware encoding) when available.
237
+ * Falls back to character-based estimation if tiktoken is not installed.
238
+ *
239
+ * Note: Claude models are not recognized by tiktoken's `encoding_for_model()`,
240
+ * so it falls through to the generic `o200k_base` encoding, which is a
241
+ * reasonable approximation for Claude's tokenizer.
242
+ *
243
+ * @param text The text to tokenize.
244
+ * @param model Optional model override. Defaults to this provider's model.
245
+ */
246
+ getTokenCount(text, model) {
247
+ return (0, token_counter_1.countTokens)(text, model ?? this.model);
248
+ }
249
+ // ─── Private Helpers ────────────────────────────────────────────────────
250
+ // ─── Static Converters ──────────────────────────────────────────────────
251
+ /**
252
+ * Validate and convert internal Tool definitions to Anthropic tool format.
253
+ *
254
+ * Internal format: `{ name, description, parameters }` (JSON Schema)
255
+ * Anthropic format: `{ name, description, input_schema }`
256
+ *
257
+ * If `parameters` is missing the required `type` field, we wrap it in
258
+ * an object schema as a best-effort fallback.
259
+ */
260
+ /**
261
+ * Build a valid Anthropic `input_schema` from a tool's raw parameters.
262
+ *
263
+ * Anthropic requires `{type: "object", properties: {...}}` at the top
264
+ * level. If the tool's parameters already provide this shape (i.e. it
265
+ * has `type: "object"`), we use `satisfies` to verify compatibility at
266
+ * compile time without runtime casting. Otherwise we wrap the params in
267
+ * an object schema.
268
+ */
269
+ static buildInputSchema(params) {
270
+ if (params &&
271
+ params.type === "object" &&
272
+ params.properties &&
273
+ typeof params.properties === "object") {
274
+ return {
275
+ type: "object",
276
+ properties: params.properties,
277
+ ...(params.required
278
+ ? { required: params.required }
279
+ : {}),
280
+ };
281
+ }
282
+ // Wrap in a minimal object schema.
283
+ return {
284
+ type: "object",
285
+ properties: params && Object.keys(params).length > 0 ? params : {},
286
+ };
287
+ }
288
+ static convertTools(tools) {
289
+ return tools.map((t) => ({
290
+ name: t.name,
291
+ description: t.description,
292
+ input_schema: AnthropicProvider.buildInputSchema(t.parameters),
293
+ }));
294
+ }
295
+ /**
296
+ * Convert an Anthropic API response to the internal `LLMResponse` format.
297
+ *
298
+ * - Text blocks → `content`
299
+ * - Tool use blocks → `tool_calls` with `JSON.stringify(input)`
300
+ * - Thinking blocks → merged into `content` (Claude extended thinking)
301
+ * - Usage → mapped from Anthropic's input_tokens/output_tokens
302
+ * - Stop reason → preserved for agents to detect truncation / tool-use
303
+ */
304
+ static convertResponse(response) {
305
+ const textBlocks = response.content.filter((b) => b.type === "text");
306
+ const toolUseBlocks = response.content.filter((b) => b.type === "tool_use");
307
+ // Claude extended thinking returns `type: "thinking"` blocks. These
308
+ // contain the model's internal reasoning and should be included in the
309
+ // content so the agent has full context.
310
+ const thinkingBlocks = response.content.filter((b) => b.type === "thinking");
311
+ // Build content from text + thinking blocks.
312
+ const parts = [];
313
+ parts.push(textBlocks.map((b) => b.text).join(""));
314
+ if (thinkingBlocks.length > 0) {
315
+ parts.push(thinkingBlocks.map((b) => b.thinking).join(""));
316
+ }
317
+ const content = parts.filter((p) => p.length > 0).join("");
318
+ const result = {
319
+ content,
320
+ tool_calls: toolUseBlocks.length > 0
321
+ ? toolUseBlocks.map((b) => ({
322
+ id: b.id,
323
+ type: "function",
324
+ function: {
325
+ name: b.name,
326
+ arguments: JSON.stringify(b.input),
327
+ },
328
+ }))
329
+ : undefined,
330
+ usage: response.usage
331
+ ? {
332
+ prompt_tokens: response.usage.input_tokens,
333
+ completion_tokens: response.usage.output_tokens,
334
+ total_tokens: response.usage.input_tokens + response.usage.output_tokens,
335
+ }
336
+ : undefined,
337
+ stop_reason: response.stop_reason ?? undefined,
338
+ };
339
+ // Flag response-level quality issues
340
+ if (response.stop_reason === "max_tokens") {
341
+ result.responseError = {
342
+ code: interface_1.LLMResponseErrorCode.MAX_TOKENS,
343
+ message: "Response truncated: max_tokens reached. " +
344
+ "Content or tool call arguments may be incomplete.",
345
+ };
346
+ }
347
+ return result;
348
+ }
349
+ /**
350
+ * Convert the internal `MessageData[]` format (OpenAI-compatible) to
351
+ * Anthropic's native message format.
352
+ *
353
+ * Conversion rules:
354
+ * 1. `role: "system"` messages are extracted, concatenated, and returned as
355
+ * the top-level `systemPrompt`.
356
+ * 2. `role: "user"` → `{ role: "user", content: string }`
357
+ * 3. `role: "assistant"` without tool_calls → `{ role: "assistant", content: string }`
358
+ * 4. `role: "assistant"` with tool_calls → content-block array with text + tool_use blocks
359
+ * 5. `role: "tool"` → `{ role: "user", content: [{ type: "tool_result", ... }] }`
360
+ * 6. Consecutive same-role messages are merged with synthetic separators
361
+ * to satisfy Anthropic's user/assistant alternation requirement.
362
+ * 7. If no non-system messages remain, a placeholder user message is inserted
363
+ * to satisfy Anthropic's requirement of at least one user/assistant message.
364
+ */
365
+ static convertMessages(messages) {
366
+ // Extract system messages
367
+ const systemMessages = messages.filter((m) => m.role === types_1.Role.System);
368
+ const systemPrompt = systemMessages.length > 0
369
+ ? systemMessages.map((m) => m.content).join("\n")
370
+ : undefined;
371
+ // Convert non-system messages
372
+ const nonSystem = messages.filter((m) => m.role !== types_1.Role.System);
373
+ const formattedMessages = [];
374
+ for (const msg of nonSystem) {
375
+ const converted = AnthropicProvider.convertSingleMessage(msg);
376
+ // An empty result means the message was skipped (e.g. empty content).
377
+ if (!converted)
378
+ continue;
379
+ // Ensure user/assistant alternation.
380
+ // If the converted message has the same role as the last one in the array,
381
+ // insert a synthetic message to break the consecutive sequence.
382
+ if (formattedMessages.length > 0) {
383
+ const lastRole = formattedMessages[formattedMessages.length - 1].role;
384
+ if (lastRole === converted.role) {
385
+ formattedMessages.push({
386
+ role: lastRole === "user" ? "assistant" : "user",
387
+ content: "(continued)",
388
+ });
389
+ }
390
+ }
391
+ formattedMessages.push(converted);
392
+ }
393
+ // Anthropic requires at least one user or assistant message.
394
+ // If all messages were system-level, insert a placeholder.
395
+ if (formattedMessages.length === 0) {
396
+ formattedMessages.push({
397
+ role: "user",
398
+ content: "(start)",
399
+ });
400
+ }
401
+ return { systemPrompt, formattedMessages };
402
+ }
403
+ /** Counter for generating unique synthetic tool_use_ids. */
404
+ static toolUseIdCounter = 0;
405
+ /**
406
+ * Convert a single internal `MessageData` to an Anthropic `MessageParam`.
407
+ * Returns `null` if the message should be skipped.
408
+ */
409
+ static convertSingleMessage(msg) {
410
+ switch (msg.role) {
411
+ case types_1.Role.User:
412
+ return {
413
+ role: "user",
414
+ content: msg.content || "(empty)",
415
+ };
416
+ case types_1.Role.Assistant: {
417
+ const hasToolCalls = msg.tool_calls && msg.tool_calls.length > 0;
418
+ if (!hasToolCalls) {
419
+ return {
420
+ role: "assistant",
421
+ content: msg.content || "(empty)",
422
+ };
423
+ }
424
+ // Assistant message with tool calls → content-block array.
425
+ const contentBlocks = [];
426
+ // Add text block if there's non-empty content.
427
+ if (msg.content) {
428
+ contentBlocks.push({ type: "text", text: msg.content });
429
+ }
430
+ // Add tool_use blocks for each tool call.
431
+ for (const tc of msg.tool_calls) {
432
+ let input = {};
433
+ if (tc.function.arguments) {
434
+ try {
435
+ input = JSON.parse(tc.function.arguments);
436
+ }
437
+ catch {
438
+ // Unparseable arguments — use empty object as fallback.
439
+ input = {};
440
+ }
441
+ }
442
+ contentBlocks.push({
443
+ type: "tool_use",
444
+ id: tc.id,
445
+ name: tc.function.name,
446
+ input,
447
+ });
448
+ }
449
+ return {
450
+ role: "assistant",
451
+ content: contentBlocks,
452
+ };
453
+ }
454
+ case types_1.Role.Tool: {
455
+ // Tool messages become user messages with tool_result content blocks.
456
+ // Generate a unique fallback ID when tool_call_id is missing to avoid
457
+ // collisions (Anthropic requires unique tool_use_ids across the conversation).
458
+ let toolUseId = msg.tool_call_id;
459
+ if (!toolUseId) {
460
+ AnthropicProvider.toolUseIdCounter++;
461
+ toolUseId = msg.name
462
+ ? `${msg.name}_${AnthropicProvider.toolUseIdCounter}`
463
+ : `tool_${AnthropicProvider.toolUseIdCounter}`;
464
+ }
465
+ return {
466
+ role: "user",
467
+ content: [
468
+ {
469
+ type: "tool_result",
470
+ tool_use_id: toolUseId,
471
+ content: msg.content || "",
472
+ },
473
+ ],
474
+ };
475
+ }
476
+ default:
477
+ // Unknown roles are treated as user messages.
478
+ return {
479
+ role: "user",
480
+ content: msg.content || "(empty)",
481
+ };
482
+ }
483
+ }
484
+ }
485
+ exports.AnthropicProvider = AnthropicProvider;
486
+ //# sourceMappingURL=anthropic-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../src/llm/anthropic-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Categories of network-related LLM failures.
3
+ * Used by both OpenAI and Anthropic providers.
4
+ */
5
+ export type NetworkErrorCause = "timeout" | "connection_refused" | "connection_reset" | "dns_error" | "rate_limit" | "server_error" | "aborted" | "unknown_network";
6
+ /**
7
+ * Thrown by an LLM provider when all retry attempts for a network-related
8
+ * failure have been exhausted. The agent catches this to save a checkpoint
9
+ * and guide the user to resume their session.
10
+ */
11
+ export declare class LLMNetworkError extends Error {
12
+ readonly cause: NetworkErrorCause;
13
+ constructor(message: string, cause: NetworkErrorCause);
14
+ }
15
+ /**
16
+ * Retry configuration shared by all LLM providers.
17
+ */
18
+ export interface RetryConfig {
19
+ /** Max retry attempts for network errors (default: 3). */
20
+ maxRetries?: number;
21
+ /** Initial backoff delay in ms (default: 1000). */
22
+ baseDelayMs?: number;
23
+ /** Maximum backoff delay in ms (default: 30000). */
24
+ maxDelayMs?: number;
25
+ }
26
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,oBAAoB,GACpB,kBAAkB,GAClB,WAAW,GACX,YAAY,GACZ,cAAc,GACd,SAAS,GACT,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,KAAK,EAAE,iBAAiB,CAAC;gBAE7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB;CAKtD;AAID;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ // ─── Shared LLM Error Types ─────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.LLMNetworkError = void 0;
5
+ /**
6
+ * Thrown by an LLM provider when all retry attempts for a network-related
7
+ * failure have been exhausted. The agent catches this to save a checkpoint
8
+ * and guide the user to resume their session.
9
+ */
10
+ class LLMNetworkError extends Error {
11
+ cause;
12
+ constructor(message, cause) {
13
+ super(message);
14
+ this.name = "LLMNetworkError";
15
+ this.cause = cause;
16
+ }
17
+ }
18
+ exports.LLMNetworkError = LLMNetworkError;
19
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":";AAAA,+EAA+E;;;AAgB/E;;;;GAIG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxB,KAAK,CAAoB;IAEzC,YAAY,OAAe,EAAE,KAAwB;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AARD,0CAQC"}
@@ -0,0 +1,73 @@
1
+ import { LLMProvider } from "./interface";
2
+ import { RetryConfig } from "./errors";
3
+ /**
4
+ * Explicit provider selection for the factory.
5
+ * - `"openai"`: Always use OpenAI.
6
+ * - `"anthropic"`: Always use Anthropic.
7
+ * - `"auto"`: Detect from `baseURL` (default).
8
+ */
9
+ export type ProviderType = "openai" | "anthropic" | "auto";
10
+ /**
11
+ * Unified configuration accepted by `createLLMProvider`.
12
+ * Pass this instead of provider-specific configs (`OpenAIConfig`, `AnthropicConfig`)
13
+ * to enable automatic provider detection.
14
+ */
15
+ export interface LLMProviderConfig {
16
+ /** API key for the LLM service. */
17
+ apiKey: string;
18
+ /** Model identifier (e.g. "gpt-4o", "claude-sonnet-4-6"). */
19
+ model: string;
20
+ /** Sampling temperature (default: 0.7). */
21
+ temperature?: number;
22
+ /**
23
+ * Maximum output tokens.
24
+ * Per-provider defaults: OpenAI 4096, Anthropic 8192.
25
+ */
26
+ maxTokens?: number;
27
+ /**
28
+ * Base URL for the LLM API endpoint.
29
+ * Used to auto-detect the provider when `provider` is `"auto"`.
30
+ * Examples:
31
+ * - `"https://api.openai.com/v1"` → OpenAI
32
+ * - `"https://api.anthropic.com"` → Anthropic
33
+ * - `undefined` → defaults to OpenAI (backward compatible)
34
+ */
35
+ baseURL?: string;
36
+ /** Retry configuration for network resilience. */
37
+ retry?: RetryConfig;
38
+ /** Request timeout in ms. */
39
+ timeout?: number;
40
+ /**
41
+ * Explicitly choose the provider. When `"auto"` or omitted,
42
+ * the factory detects the provider from `baseURL`.
43
+ */
44
+ provider?: ProviderType;
45
+ }
46
+ /**
47
+ * Create an LLM provider instance, auto-detecting the backend from `baseURL`.
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * // Auto-detect: baseURL contains "anthropic" → AnthropicProvider
52
+ * const llm = createLLMProvider({
53
+ * apiKey: process.env.ANTHROPIC_API_KEY!,
54
+ * model: "claude-sonnet-4-6",
55
+ * baseURL: "https://api.anthropic.com",
56
+ * });
57
+ *
58
+ * // Explicit provider selection
59
+ * const llm = createLLMProvider({
60
+ * apiKey: process.env.OPENAI_API_KEY!,
61
+ * model: "gpt-4o",
62
+ * provider: "openai",
63
+ * });
64
+ *
65
+ * // Backward-compatible: no baseURL → OpenAI
66
+ * const llm = createLLMProvider({
67
+ * apiKey: process.env.OPENAI_API_KEY!,
68
+ * model: "gpt-4o",
69
+ * });
70
+ * ```
71
+ */
72
+ export declare function createLLMProvider(config: LLMProviderConfig): LLMProvider;
73
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/llm/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAI3D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AA8BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAwBxE"}