@esankhan3/anvil-agent-core 0.1.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 (459) hide show
  1. package/README.md +142 -0
  2. package/dist/__tests__/adapter-enrichment.test.d.ts +12 -0
  3. package/dist/__tests__/adapter-enrichment.test.d.ts.map +1 -0
  4. package/dist/__tests__/adapter-enrichment.test.js +199 -0
  5. package/dist/__tests__/adapter-enrichment.test.js.map +1 -0
  6. package/dist/__tests__/adk-anthropic-llm.test.d.ts +18 -0
  7. package/dist/__tests__/adk-anthropic-llm.test.d.ts.map +1 -0
  8. package/dist/__tests__/adk-anthropic-llm.test.js +124 -0
  9. package/dist/__tests__/adk-anthropic-llm.test.js.map +1 -0
  10. package/dist/__tests__/cost-breakdown.test.d.ts +11 -0
  11. package/dist/__tests__/cost-breakdown.test.d.ts.map +1 -0
  12. package/dist/__tests__/cost-breakdown.test.js +163 -0
  13. package/dist/__tests__/cost-breakdown.test.js.map +1 -0
  14. package/dist/__tests__/mcp.test.d.ts +13 -0
  15. package/dist/__tests__/mcp.test.d.ts.map +1 -0
  16. package/dist/__tests__/mcp.test.js +413 -0
  17. package/dist/__tests__/mcp.test.js.map +1 -0
  18. package/dist/__tests__/ollama-adapter-agentic.test.d.ts +15 -0
  19. package/dist/__tests__/ollama-adapter-agentic.test.d.ts.map +1 -0
  20. package/dist/__tests__/ollama-adapter-agentic.test.js +268 -0
  21. package/dist/__tests__/ollama-adapter-agentic.test.js.map +1 -0
  22. package/dist/__tests__/ollama-adapter-executor.test.d.ts +10 -0
  23. package/dist/__tests__/ollama-adapter-executor.test.d.ts.map +1 -0
  24. package/dist/__tests__/ollama-adapter-executor.test.js +95 -0
  25. package/dist/__tests__/ollama-adapter-executor.test.js.map +1 -0
  26. package/dist/__tests__/openai-adapter-output.test.d.ts +17 -0
  27. package/dist/__tests__/openai-adapter-output.test.d.ts.map +1 -0
  28. package/dist/__tests__/openai-adapter-output.test.js +127 -0
  29. package/dist/__tests__/openai-adapter-output.test.js.map +1 -0
  30. package/dist/__tests__/opencode-adapter.test.d.ts +7 -0
  31. package/dist/__tests__/opencode-adapter.test.d.ts.map +1 -0
  32. package/dist/__tests__/opencode-adapter.test.js +141 -0
  33. package/dist/__tests__/opencode-adapter.test.js.map +1 -0
  34. package/dist/__tests__/openrouter-adapter-agentic.test.d.ts +11 -0
  35. package/dist/__tests__/openrouter-adapter-agentic.test.d.ts.map +1 -0
  36. package/dist/__tests__/openrouter-adapter-agentic.test.js +297 -0
  37. package/dist/__tests__/openrouter-adapter-agentic.test.js.map +1 -0
  38. package/dist/__tests__/router-circuit-breaker.test.d.ts +6 -0
  39. package/dist/__tests__/router-circuit-breaker.test.d.ts.map +1 -0
  40. package/dist/__tests__/router-circuit-breaker.test.js +253 -0
  41. package/dist/__tests__/router-circuit-breaker.test.js.map +1 -0
  42. package/dist/__tests__/router-config-loader.test.d.ts +8 -0
  43. package/dist/__tests__/router-config-loader.test.d.ts.map +1 -0
  44. package/dist/__tests__/router-config-loader.test.js +172 -0
  45. package/dist/__tests__/router-config-loader.test.js.map +1 -0
  46. package/dist/__tests__/router-discovery.test.d.ts +5 -0
  47. package/dist/__tests__/router-discovery.test.d.ts.map +1 -0
  48. package/dist/__tests__/router-discovery.test.js +129 -0
  49. package/dist/__tests__/router-discovery.test.js.map +1 -0
  50. package/dist/__tests__/router-fallback.test.d.ts +9 -0
  51. package/dist/__tests__/router-fallback.test.d.ts.map +1 -0
  52. package/dist/__tests__/router-fallback.test.js +283 -0
  53. package/dist/__tests__/router-fallback.test.js.map +1 -0
  54. package/dist/__tests__/router-local-executor.test.d.ts +6 -0
  55. package/dist/__tests__/router-local-executor.test.d.ts.map +1 -0
  56. package/dist/__tests__/router-local-executor.test.js +193 -0
  57. package/dist/__tests__/router-local-executor.test.js.map +1 -0
  58. package/dist/__tests__/router-model-registry.test.d.ts +8 -0
  59. package/dist/__tests__/router-model-registry.test.d.ts.map +1 -0
  60. package/dist/__tests__/router-model-registry.test.js +389 -0
  61. package/dist/__tests__/router-model-registry.test.js.map +1 -0
  62. package/dist/__tests__/router-rate-limiter.test.d.ts +8 -0
  63. package/dist/__tests__/router-rate-limiter.test.d.ts.map +1 -0
  64. package/dist/__tests__/router-rate-limiter.test.js +128 -0
  65. package/dist/__tests__/router-rate-limiter.test.js.map +1 -0
  66. package/dist/__tests__/router-resolver.test.d.ts +7 -0
  67. package/dist/__tests__/router-resolver.test.d.ts.map +1 -0
  68. package/dist/__tests__/router-resolver.test.js +110 -0
  69. package/dist/__tests__/router-resolver.test.js.map +1 -0
  70. package/dist/__tests__/router-retry.test.d.ts +7 -0
  71. package/dist/__tests__/router-retry.test.d.ts.map +1 -0
  72. package/dist/__tests__/router-retry.test.js +302 -0
  73. package/dist/__tests__/router-retry.test.js.map +1 -0
  74. package/dist/__tests__/router-scaffold.test.d.ts +11 -0
  75. package/dist/__tests__/router-scaffold.test.d.ts.map +1 -0
  76. package/dist/__tests__/router-scaffold.test.js +103 -0
  77. package/dist/__tests__/router-scaffold.test.js.map +1 -0
  78. package/dist/__tests__/router-spend-ledger.test.d.ts +8 -0
  79. package/dist/__tests__/router-spend-ledger.test.d.ts.map +1 -0
  80. package/dist/__tests__/router-spend-ledger.test.js +227 -0
  81. package/dist/__tests__/router-spend-ledger.test.js.map +1 -0
  82. package/dist/__tests__/router-telemetry.test.d.ts +11 -0
  83. package/dist/__tests__/router-telemetry.test.d.ts.map +1 -0
  84. package/dist/__tests__/router-telemetry.test.js +173 -0
  85. package/dist/__tests__/router-telemetry.test.js.map +1 -0
  86. package/dist/__tests__/single-shot.test.d.ts +12 -0
  87. package/dist/__tests__/single-shot.test.d.ts.map +1 -0
  88. package/dist/__tests__/single-shot.test.js +204 -0
  89. package/dist/__tests__/single-shot.test.js.map +1 -0
  90. package/dist/__tests__/skills-prompt.test.d.ts +11 -0
  91. package/dist/__tests__/skills-prompt.test.d.ts.map +1 -0
  92. package/dist/__tests__/skills-prompt.test.js +208 -0
  93. package/dist/__tests__/skills-prompt.test.js.map +1 -0
  94. package/dist/__tests__/skills.test.d.ts +11 -0
  95. package/dist/__tests__/skills.test.d.ts.map +1 -0
  96. package/dist/__tests__/skills.test.js +161 -0
  97. package/dist/__tests__/skills.test.js.map +1 -0
  98. package/dist/__tests__/telemetry-integration.test.d.ts +12 -0
  99. package/dist/__tests__/telemetry-integration.test.d.ts.map +1 -0
  100. package/dist/__tests__/telemetry-integration.test.js +153 -0
  101. package/dist/__tests__/telemetry-integration.test.js.map +1 -0
  102. package/dist/__tests__/telemetry.test.d.ts +13 -0
  103. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  104. package/dist/__tests__/telemetry.test.js +161 -0
  105. package/dist/__tests__/telemetry.test.js.map +1 -0
  106. package/dist/__tests__/upstream-error.test.d.ts +8 -0
  107. package/dist/__tests__/upstream-error.test.d.ts.map +1 -0
  108. package/dist/__tests__/upstream-error.test.js +186 -0
  109. package/dist/__tests__/upstream-error.test.js.map +1 -0
  110. package/dist/adk-adapter.d.ts +45 -0
  111. package/dist/adk-adapter.d.ts.map +1 -0
  112. package/dist/adk-adapter.js +403 -0
  113. package/dist/adk-adapter.js.map +1 -0
  114. package/dist/adk-anthropic-llm.d.ts +59 -0
  115. package/dist/adk-anthropic-llm.d.ts.map +1 -0
  116. package/dist/adk-anthropic-llm.js +397 -0
  117. package/dist/adk-anthropic-llm.js.map +1 -0
  118. package/dist/agent/index.d.ts +14 -0
  119. package/dist/agent/index.d.ts.map +1 -0
  120. package/dist/agent/index.js +14 -0
  121. package/dist/agent/index.js.map +1 -0
  122. package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts +10 -0
  123. package/dist/agent/session/__tests__/bridge-tool-executor.test.d.ts.map +1 -0
  124. package/dist/agent/session/__tests__/bridge-tool-executor.test.js +152 -0
  125. package/dist/agent/session/__tests__/bridge-tool-executor.test.js.map +1 -0
  126. package/dist/agent/session/__tests__/collect-trajectory.test.d.ts +18 -0
  127. package/dist/agent/session/__tests__/collect-trajectory.test.d.ts.map +1 -0
  128. package/dist/agent/session/__tests__/collect-trajectory.test.js +208 -0
  129. package/dist/agent/session/__tests__/collect-trajectory.test.js.map +1 -0
  130. package/dist/agent/session/__tests__/run-with-agent.test.d.ts +8 -0
  131. package/dist/agent/session/__tests__/run-with-agent.test.d.ts.map +1 -0
  132. package/dist/agent/session/__tests__/run-with-agent.test.js +98 -0
  133. package/dist/agent/session/__tests__/run-with-agent.test.js.map +1 -0
  134. package/dist/agent/session/__tests__/runtime.test.d.ts +7 -0
  135. package/dist/agent/session/__tests__/runtime.test.d.ts.map +1 -0
  136. package/dist/agent/session/__tests__/runtime.test.js +361 -0
  137. package/dist/agent/session/__tests__/runtime.test.js.map +1 -0
  138. package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts +15 -0
  139. package/dist/agent/session/__tests__/skills-mcp-spawn.test.d.ts.map +1 -0
  140. package/dist/agent/session/__tests__/skills-mcp-spawn.test.js +160 -0
  141. package/dist/agent/session/__tests__/skills-mcp-spawn.test.js.map +1 -0
  142. package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts +13 -0
  143. package/dist/agent/session/__tests__/spawn-telemetry.test.d.ts.map +1 -0
  144. package/dist/agent/session/__tests__/spawn-telemetry.test.js +135 -0
  145. package/dist/agent/session/__tests__/spawn-telemetry.test.js.map +1 -0
  146. package/dist/agent/session/__tests__/types.test.d.ts +9 -0
  147. package/dist/agent/session/__tests__/types.test.d.ts.map +1 -0
  148. package/dist/agent/session/__tests__/types.test.js +220 -0
  149. package/dist/agent/session/__tests__/types.test.js.map +1 -0
  150. package/dist/agent/session/adapter.d.ts +108 -0
  151. package/dist/agent/session/adapter.d.ts.map +1 -0
  152. package/dist/agent/session/adapter.js +39 -0
  153. package/dist/agent/session/adapter.js.map +1 -0
  154. package/dist/agent/session/collect-trajectory.d.ts +36 -0
  155. package/dist/agent/session/collect-trajectory.d.ts.map +1 -0
  156. package/dist/agent/session/collect-trajectory.js +193 -0
  157. package/dist/agent/session/collect-trajectory.js.map +1 -0
  158. package/dist/agent/session/default-adapter-factory.d.ts +48 -0
  159. package/dist/agent/session/default-adapter-factory.d.ts.map +1 -0
  160. package/dist/agent/session/default-adapter-factory.js +227 -0
  161. package/dist/agent/session/default-adapter-factory.js.map +1 -0
  162. package/dist/agent/session/headless-types.d.ts +85 -0
  163. package/dist/agent/session/headless-types.d.ts.map +1 -0
  164. package/dist/agent/session/headless-types.js +16 -0
  165. package/dist/agent/session/headless-types.js.map +1 -0
  166. package/dist/agent/session/index.d.ts +18 -0
  167. package/dist/agent/session/index.d.ts.map +1 -0
  168. package/dist/agent/session/index.js +20 -0
  169. package/dist/agent/session/index.js.map +1 -0
  170. package/dist/agent/session/language-model-bridge.d.ts +84 -0
  171. package/dist/agent/session/language-model-bridge.d.ts.map +1 -0
  172. package/dist/agent/session/language-model-bridge.js +454 -0
  173. package/dist/agent/session/language-model-bridge.js.map +1 -0
  174. package/dist/agent/session/legacy-adapter-types.d.ts +63 -0
  175. package/dist/agent/session/legacy-adapter-types.d.ts.map +1 -0
  176. package/dist/agent/session/legacy-adapter-types.js +11 -0
  177. package/dist/agent/session/legacy-adapter-types.js.map +1 -0
  178. package/dist/agent/session/run-with-agent.d.ts +36 -0
  179. package/dist/agent/session/run-with-agent.d.ts.map +1 -0
  180. package/dist/agent/session/run-with-agent.js +81 -0
  181. package/dist/agent/session/run-with-agent.js.map +1 -0
  182. package/dist/agent/session/session-registry.d.ts +71 -0
  183. package/dist/agent/session/session-registry.d.ts.map +1 -0
  184. package/dist/agent/session/session-registry.js +209 -0
  185. package/dist/agent/session/session-registry.js.map +1 -0
  186. package/dist/agent/session/session.d.ts +76 -0
  187. package/dist/agent/session/session.d.ts.map +1 -0
  188. package/dist/agent/session/session.js +327 -0
  189. package/dist/agent/session/session.js.map +1 -0
  190. package/dist/agent/session/types.d.ts +230 -0
  191. package/dist/agent/session/types.d.ts.map +1 -0
  192. package/dist/agent/session/types.js +44 -0
  193. package/dist/agent/session/types.js.map +1 -0
  194. package/dist/checkpoint/__tests__/blob-store.test.d.ts +5 -0
  195. package/dist/checkpoint/__tests__/blob-store.test.d.ts.map +1 -0
  196. package/dist/checkpoint/__tests__/blob-store.test.js +82 -0
  197. package/dist/checkpoint/__tests__/blob-store.test.js.map +1 -0
  198. package/dist/checkpoint/__tests__/key.test.d.ts +7 -0
  199. package/dist/checkpoint/__tests__/key.test.d.ts.map +1 -0
  200. package/dist/checkpoint/__tests__/key.test.js +130 -0
  201. package/dist/checkpoint/__tests__/key.test.js.map +1 -0
  202. package/dist/checkpoint/__tests__/runner.test.d.ts +12 -0
  203. package/dist/checkpoint/__tests__/runner.test.d.ts.map +1 -0
  204. package/dist/checkpoint/__tests__/runner.test.js +201 -0
  205. package/dist/checkpoint/__tests__/runner.test.js.map +1 -0
  206. package/dist/checkpoint/__tests__/store.test.d.ts +6 -0
  207. package/dist/checkpoint/__tests__/store.test.d.ts.map +1 -0
  208. package/dist/checkpoint/__tests__/store.test.js +150 -0
  209. package/dist/checkpoint/__tests__/store.test.js.map +1 -0
  210. package/dist/checkpoint/blob-store.d.ts +41 -0
  211. package/dist/checkpoint/blob-store.d.ts.map +1 -0
  212. package/dist/checkpoint/blob-store.js +119 -0
  213. package/dist/checkpoint/blob-store.js.map +1 -0
  214. package/dist/checkpoint/index.d.ts +15 -0
  215. package/dist/checkpoint/index.d.ts.map +1 -0
  216. package/dist/checkpoint/index.js +14 -0
  217. package/dist/checkpoint/index.js.map +1 -0
  218. package/dist/checkpoint/key.d.ts +39 -0
  219. package/dist/checkpoint/key.d.ts.map +1 -0
  220. package/dist/checkpoint/key.js +112 -0
  221. package/dist/checkpoint/key.js.map +1 -0
  222. package/dist/checkpoint/runner.d.ts +83 -0
  223. package/dist/checkpoint/runner.d.ts.map +1 -0
  224. package/dist/checkpoint/runner.js +146 -0
  225. package/dist/checkpoint/runner.js.map +1 -0
  226. package/dist/checkpoint/store.d.ts +91 -0
  227. package/dist/checkpoint/store.d.ts.map +1 -0
  228. package/dist/checkpoint/store.js +292 -0
  229. package/dist/checkpoint/store.js.map +1 -0
  230. package/dist/checkpoint/types.d.ts +74 -0
  231. package/dist/checkpoint/types.d.ts.map +1 -0
  232. package/dist/checkpoint/types.js +16 -0
  233. package/dist/checkpoint/types.js.map +1 -0
  234. package/dist/claude-adapter.d.ts +23 -0
  235. package/dist/claude-adapter.d.ts.map +1 -0
  236. package/dist/claude-adapter.js +233 -0
  237. package/dist/claude-adapter.js.map +1 -0
  238. package/dist/cost.d.ts +67 -0
  239. package/dist/cost.d.ts.map +1 -0
  240. package/dist/cost.js +148 -0
  241. package/dist/cost.js.map +1 -0
  242. package/dist/data/model-prices.json +39681 -0
  243. package/dist/fallback-adapter.d.ts +51 -0
  244. package/dist/fallback-adapter.d.ts.map +1 -0
  245. package/dist/fallback-adapter.js +116 -0
  246. package/dist/fallback-adapter.js.map +1 -0
  247. package/dist/gemini-adapter.d.ts +22 -0
  248. package/dist/gemini-adapter.d.ts.map +1 -0
  249. package/dist/gemini-adapter.js +185 -0
  250. package/dist/gemini-adapter.js.map +1 -0
  251. package/dist/gemini-cli-adapter.d.ts +24 -0
  252. package/dist/gemini-cli-adapter.d.ts.map +1 -0
  253. package/dist/gemini-cli-adapter.js +169 -0
  254. package/dist/gemini-cli-adapter.js.map +1 -0
  255. package/dist/index.d.ts +39 -0
  256. package/dist/index.d.ts.map +1 -0
  257. package/dist/index.js +39 -0
  258. package/dist/index.js.map +1 -0
  259. package/dist/mcp/client.d.ts +32 -0
  260. package/dist/mcp/client.d.ts.map +1 -0
  261. package/dist/mcp/client.js +92 -0
  262. package/dist/mcp/client.js.map +1 -0
  263. package/dist/mcp/config-loader.d.ts +36 -0
  264. package/dist/mcp/config-loader.d.ts.map +1 -0
  265. package/dist/mcp/config-loader.js +129 -0
  266. package/dist/mcp/config-loader.js.map +1 -0
  267. package/dist/mcp/index.d.ts +12 -0
  268. package/dist/mcp/index.d.ts.map +1 -0
  269. package/dist/mcp/index.js +11 -0
  270. package/dist/mcp/index.js.map +1 -0
  271. package/dist/mcp/tool-merger.d.ts +18 -0
  272. package/dist/mcp/tool-merger.d.ts.map +1 -0
  273. package/dist/mcp/tool-merger.js +34 -0
  274. package/dist/mcp/tool-merger.js.map +1 -0
  275. package/dist/mcp/types.d.ts +35 -0
  276. package/dist/mcp/types.d.ts.map +1 -0
  277. package/dist/mcp/types.js +10 -0
  278. package/dist/mcp/types.js.map +1 -0
  279. package/dist/ollama-adapter.d.ts +95 -0
  280. package/dist/ollama-adapter.d.ts.map +1 -0
  281. package/dist/ollama-adapter.js +404 -0
  282. package/dist/ollama-adapter.js.map +1 -0
  283. package/dist/openai-adapter.d.ts +40 -0
  284. package/dist/openai-adapter.d.ts.map +1 -0
  285. package/dist/openai-adapter.js +81 -0
  286. package/dist/openai-adapter.js.map +1 -0
  287. package/dist/opencode-adapter.d.ts +39 -0
  288. package/dist/opencode-adapter.d.ts.map +1 -0
  289. package/dist/opencode-adapter.js +105 -0
  290. package/dist/opencode-adapter.js.map +1 -0
  291. package/dist/openrouter-adapter.d.ts +69 -0
  292. package/dist/openrouter-adapter.d.ts.map +1 -0
  293. package/dist/openrouter-adapter.js +481 -0
  294. package/dist/openrouter-adapter.js.map +1 -0
  295. package/dist/registry.d.ts +55 -0
  296. package/dist/registry.d.ts.map +1 -0
  297. package/dist/registry.js +191 -0
  298. package/dist/registry.js.map +1 -0
  299. package/dist/router/circuit-breaker.d.ts +57 -0
  300. package/dist/router/circuit-breaker.d.ts.map +1 -0
  301. package/dist/router/circuit-breaker.js +110 -0
  302. package/dist/router/circuit-breaker.js.map +1 -0
  303. package/dist/router/config-loader.d.ts +43 -0
  304. package/dist/router/config-loader.d.ts.map +1 -0
  305. package/dist/router/config-loader.js +155 -0
  306. package/dist/router/config-loader.js.map +1 -0
  307. package/dist/router/discovery.d.ts +37 -0
  308. package/dist/router/discovery.d.ts.map +1 -0
  309. package/dist/router/discovery.js +54 -0
  310. package/dist/router/discovery.js.map +1 -0
  311. package/dist/router/errors.d.ts +39 -0
  312. package/dist/router/errors.d.ts.map +1 -0
  313. package/dist/router/errors.js +103 -0
  314. package/dist/router/errors.js.map +1 -0
  315. package/dist/router/index.d.ts +31 -0
  316. package/dist/router/index.d.ts.map +1 -0
  317. package/dist/router/index.js +20 -0
  318. package/dist/router/index.js.map +1 -0
  319. package/dist/router/local-executor.d.ts +62 -0
  320. package/dist/router/local-executor.d.ts.map +1 -0
  321. package/dist/router/local-executor.js +161 -0
  322. package/dist/router/local-executor.js.map +1 -0
  323. package/dist/router/model-registry.d.ts +90 -0
  324. package/dist/router/model-registry.d.ts.map +1 -0
  325. package/dist/router/model-registry.js +242 -0
  326. package/dist/router/model-registry.js.map +1 -0
  327. package/dist/router/rate-limiter.d.ts +63 -0
  328. package/dist/router/rate-limiter.d.ts.map +1 -0
  329. package/dist/router/rate-limiter.js +136 -0
  330. package/dist/router/rate-limiter.js.map +1 -0
  331. package/dist/router/resolver.d.ts +45 -0
  332. package/dist/router/resolver.d.ts.map +1 -0
  333. package/dist/router/resolver.js +71 -0
  334. package/dist/router/resolver.js.map +1 -0
  335. package/dist/router/retry.d.ts +58 -0
  336. package/dist/router/retry.d.ts.map +1 -0
  337. package/dist/router/retry.js +119 -0
  338. package/dist/router/retry.js.map +1 -0
  339. package/dist/router/router.d.ts +100 -0
  340. package/dist/router/router.d.ts.map +1 -0
  341. package/dist/router/router.js +306 -0
  342. package/dist/router/router.js.map +1 -0
  343. package/dist/router/spend-ledger.d.ts +69 -0
  344. package/dist/router/spend-ledger.d.ts.map +1 -0
  345. package/dist/router/spend-ledger.js +191 -0
  346. package/dist/router/spend-ledger.js.map +1 -0
  347. package/dist/router/telemetry.d.ts +48 -0
  348. package/dist/router/telemetry.d.ts.map +1 -0
  349. package/dist/router/telemetry.js +112 -0
  350. package/dist/router/telemetry.js.map +1 -0
  351. package/dist/router/types.d.ts +95 -0
  352. package/dist/router/types.d.ts.map +1 -0
  353. package/dist/router/types.js +16 -0
  354. package/dist/router/types.js.map +1 -0
  355. package/dist/single-shot.d.ts +60 -0
  356. package/dist/single-shot.d.ts.map +1 -0
  357. package/dist/single-shot.js +385 -0
  358. package/dist/single-shot.js.map +1 -0
  359. package/dist/skills/activator.d.ts +17 -0
  360. package/dist/skills/activator.d.ts.map +1 -0
  361. package/dist/skills/activator.js +24 -0
  362. package/dist/skills/activator.js.map +1 -0
  363. package/dist/skills/compose.d.ts +43 -0
  364. package/dist/skills/compose.d.ts.map +1 -0
  365. package/dist/skills/compose.js +53 -0
  366. package/dist/skills/compose.js.map +1 -0
  367. package/dist/skills/index.d.ts +17 -0
  368. package/dist/skills/index.d.ts.map +1 -0
  369. package/dist/skills/index.js +16 -0
  370. package/dist/skills/index.js.map +1 -0
  371. package/dist/skills/loader.d.ts +9 -0
  372. package/dist/skills/loader.d.ts.map +1 -0
  373. package/dist/skills/loader.js +49 -0
  374. package/dist/skills/loader.js.map +1 -0
  375. package/dist/skills/parser.d.ts +13 -0
  376. package/dist/skills/parser.d.ts.map +1 -0
  377. package/dist/skills/parser.js +60 -0
  378. package/dist/skills/parser.js.map +1 -0
  379. package/dist/skills/render.d.ts +11 -0
  380. package/dist/skills/render.d.ts.map +1 -0
  381. package/dist/skills/render.js +21 -0
  382. package/dist/skills/render.js.map +1 -0
  383. package/dist/skills/resolve-dir.d.ts +20 -0
  384. package/dist/skills/resolve-dir.d.ts.map +1 -0
  385. package/dist/skills/resolve-dir.js +30 -0
  386. package/dist/skills/resolve-dir.js.map +1 -0
  387. package/dist/skills/tool-policy.d.ts +26 -0
  388. package/dist/skills/tool-policy.d.ts.map +1 -0
  389. package/dist/skills/tool-policy.js +33 -0
  390. package/dist/skills/tool-policy.js.map +1 -0
  391. package/dist/skills/types.d.ts +42 -0
  392. package/dist/skills/types.d.ts.map +1 -0
  393. package/dist/skills/types.js +8 -0
  394. package/dist/skills/types.js.map +1 -0
  395. package/dist/stream-format.d.ts +100 -0
  396. package/dist/stream-format.d.ts.map +1 -0
  397. package/dist/stream-format.js +90 -0
  398. package/dist/stream-format.js.map +1 -0
  399. package/dist/telemetry/attributes.d.ts +38 -0
  400. package/dist/telemetry/attributes.d.ts.map +1 -0
  401. package/dist/telemetry/attributes.js +39 -0
  402. package/dist/telemetry/attributes.js.map +1 -0
  403. package/dist/telemetry/config.d.ts +30 -0
  404. package/dist/telemetry/config.d.ts.map +1 -0
  405. package/dist/telemetry/config.js +54 -0
  406. package/dist/telemetry/config.js.map +1 -0
  407. package/dist/telemetry/exporters.d.ts +10 -0
  408. package/dist/telemetry/exporters.d.ts.map +1 -0
  409. package/dist/telemetry/exporters.js +46 -0
  410. package/dist/telemetry/exporters.js.map +1 -0
  411. package/dist/telemetry/index.d.ts +15 -0
  412. package/dist/telemetry/index.d.ts.map +1 -0
  413. package/dist/telemetry/index.js +12 -0
  414. package/dist/telemetry/index.js.map +1 -0
  415. package/dist/telemetry/instrument.d.ts +36 -0
  416. package/dist/telemetry/instrument.d.ts.map +1 -0
  417. package/dist/telemetry/instrument.js +215 -0
  418. package/dist/telemetry/instrument.js.map +1 -0
  419. package/dist/telemetry/metrics.d.ts +45 -0
  420. package/dist/telemetry/metrics.d.ts.map +1 -0
  421. package/dist/telemetry/metrics.js +186 -0
  422. package/dist/telemetry/metrics.js.map +1 -0
  423. package/dist/telemetry/tracer.d.ts +33 -0
  424. package/dist/telemetry/tracer.d.ts.map +1 -0
  425. package/dist/telemetry/tracer.js +162 -0
  426. package/dist/telemetry/tracer.js.map +1 -0
  427. package/dist/tools/__tests__/builtin.test.d.ts +7 -0
  428. package/dist/tools/__tests__/builtin.test.d.ts.map +1 -0
  429. package/dist/tools/__tests__/builtin.test.js +242 -0
  430. package/dist/tools/__tests__/builtin.test.js.map +1 -0
  431. package/dist/tools/builtin.d.ts +29 -0
  432. package/dist/tools/builtin.d.ts.map +1 -0
  433. package/dist/tools/builtin.js +367 -0
  434. package/dist/tools/builtin.js.map +1 -0
  435. package/dist/tools/index.d.ts +4 -0
  436. package/dist/tools/index.d.ts.map +1 -0
  437. package/dist/tools/index.js +3 -0
  438. package/dist/tools/index.js.map +1 -0
  439. package/dist/tools/path-guard.d.ts +23 -0
  440. package/dist/tools/path-guard.d.ts.map +1 -0
  441. package/dist/tools/path-guard.js +66 -0
  442. package/dist/tools/path-guard.js.map +1 -0
  443. package/dist/tools/types.d.ts +45 -0
  444. package/dist/tools/types.d.ts.map +1 -0
  445. package/dist/tools/types.js +11 -0
  446. package/dist/tools/types.js.map +1 -0
  447. package/dist/types.d.ts +249 -0
  448. package/dist/types.d.ts.map +1 -0
  449. package/dist/types.js +22 -0
  450. package/dist/types.js.map +1 -0
  451. package/dist/upstream-error.d.ts +64 -0
  452. package/dist/upstream-error.d.ts.map +1 -0
  453. package/dist/upstream-error.js +105 -0
  454. package/dist/upstream-error.js.map +1 -0
  455. package/dist/version.d.ts +2 -0
  456. package/dist/version.d.ts.map +1 -0
  457. package/dist/version.js +2 -0
  458. package/dist/version.js.map +1 -0
  459. package/package.json +49 -0
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # @anvil/agent-core
2
+
3
+ **One LLM stack. Every provider. Agentic by default.**
4
+
5
+ The runtime that powers every Anvil agent — a single, vendor-neutral
6
+ core that turns prompts into production-grade agent loops with cost
7
+ tracking, retries, and observability built in.
8
+
9
+ ---
10
+
11
+ ## Why agent-core
12
+
13
+ Building an agent today means stitching together SDKs, retry logic,
14
+ cost math, tool dispatch, and observability — per provider. Then
15
+ doing it again when you swap models.
16
+
17
+ **agent-core gives you one stack.** Switch from Claude to GPT-4 to a
18
+ local Ollama model by changing one string. Every adapter speaks the
19
+ same streaming format, throws the same errors, reports cost the same
20
+ way, and emits the same OpenTelemetry spans.
21
+
22
+ ```ts
23
+ import { runLLM } from '@anvil/agent-core';
24
+
25
+ const result = await runLLM({
26
+ model: 'claude-sonnet-4-6', // or 'gpt-5', 'gemini-2.5-pro',
27
+ // 'opencode/kimi-k2.6', 'qwen3:14b'
28
+ prompt: 'Refactor this function for clarity.',
29
+ workspaceDir: process.cwd(),
30
+ });
31
+
32
+ console.log(result.output);
33
+ console.log(`cost: $${result.costUsd}`);
34
+ ```
35
+
36
+ That's it. No SDK to import. No retry loop to write. No cost table
37
+ to maintain. The model name is the only thing that changes.
38
+
39
+ ---
40
+
41
+ ## What you get
42
+
43
+ ### Eight providers, one interface
44
+ Claude · OpenAI · Gemini · OpenRouter · Ollama · Gemini CLI · Google
45
+ ADK · OpenCode. Six drive a real agentic tool loop out of the box.
46
+ New provider? Add an adapter file. The registry, router, telemetry,
47
+ and cost layer pick it up automatically.
48
+
49
+ ### Production-grade router
50
+ Tag-based routing, per-error retry, chain-fallback across models,
51
+ per-provider rate limiting, circuit breaker, and a SQLite spend
52
+ ledger — all configurable via a single YAML file. Sensible defaults
53
+ ship compiled in, so the zero-config path just works.
54
+
55
+ ### Built-in agentic tools
56
+ A path-guarded `BuiltinToolExecutor` ships seven safe primitives —
57
+ `read_file`, `write_file`, `edit`, `bash`, `grep`, `glob`, `list` —
58
+ that any non-Claude adapter can pair with to drive a true tool loop.
59
+ No more "model can't edit files" workarounds.
60
+
61
+ ### Skills + MCP, first-class
62
+ Drop in Anthropic-format `SKILL.md` files for reusable agent
63
+ behaviors, or wire up any Model Context Protocol server — both
64
+ compose into the same prompt + tool surface that adapters consume.
65
+
66
+ ### Observability that doesn't hurt
67
+ OpenTelemetry spans with GenAI semantic conventions, a parent
68
+ `anvil.agent.session` span that links every resume, automatic cost
69
+ breakdown per call. Plug in any OTLP collector — Langfuse, Tempo,
70
+ Honeycomb — via standard env vars. Off by default. Privacy-safe
71
+ prompt redaction.
72
+
73
+ ### Deterministic checkpoints
74
+ SHA-keyed per-call output cache, scoped by project, run, and stage.
75
+ Re-run the same pipeline, get the same answers. Free retries on
76
+ flaky upstreams. Free regression tests on prompt changes.
77
+
78
+ ---
79
+
80
+ ## Provider matrix
81
+
82
+ | Provider | Tier | Agentic loop | Streaming | Tool use |
83
+ |---|---|---|---|---|
84
+ | **Claude** (CLI subprocess) | agentic | ✓ | ✓ | native |
85
+ | **OpenAI** (HTTP) | agentic | ✓ | ✓ | OpenAI tools |
86
+ | **Gemini** (HTTP) | agentic | ✓ | ✓ | function call |
87
+ | **OpenRouter** (HTTP) | agentic | ✓ | ✓ | OpenAI tools |
88
+ | **OpenCode** (HTTP, Go subscription) | agentic | ✓ | ✓ | OpenAI tools |
89
+ | **Ollama** (local) | agentic | ✓ | ✓ | OpenAI tools |
90
+ | **Gemini CLI** (subprocess) | utility | — | ✓ | — |
91
+ | **Google ADK** (`@google/adk`) | agentic | ✓ | ✓ | ADK runner |
92
+
93
+ All adapters share the same Anvil Stream Format (NDJSON), the same
94
+ `UpstreamError` shape for retry/fallback, and the same per-call
95
+ `AbortController` semantics for safe concurrency.
96
+
97
+ ---
98
+
99
+ ## Architecture at a glance
100
+
101
+ ```
102
+ ┌─ runLLM / runClaude / runGemini ─────────── one-shot
103
+ └─ AgentManager ──── AgentProcess ──── LanguageModelBridge
104
+ │
105
+ └─ ModelAdapter (one of 8)
106
+ ↑
107
+ ProviderRegistry
108
+ ↑
109
+ LlmRouter (retries, fallbacks, rate limit)
110
+ ↑
111
+ Telemetry (OTel spans + cost)
112
+ ↑
113
+ Checkpoint (deterministic cache)
114
+ ```
115
+
116
+ Each layer is opt-in. Use a single adapter directly, or compose the
117
+ full stack — the same interfaces flow all the way up.
118
+
119
+ ---
120
+
121
+ ## Philosophy
122
+
123
+ **No vendor SDKs.** Every HTTP adapter is hand-rolled `fetch()`. No
124
+ `@anthropic-ai/sdk`, no `openai` package, no LangChain, no Vercel AI
125
+ SDK. Lock-in stays at zero.
126
+
127
+ **Cost is observable, not estimated.** Every call attaches a real
128
+ `gen_ai.usage.cost` attribute computed from a vendored LiteLLM
129
+ pricing snapshot. Refresh on demand: `npm run refresh-cost-table`.
130
+
131
+ **Agentic isn't a flag.** When a model supports tool calls, the
132
+ adapter drives the loop — multi-turn, with safe builtins. No
133
+ "agent mode" toggle. No special prompt template required.
134
+
135
+ **One source of truth per concern.** Cost lives in `cost.ts`. Spans
136
+ live at the registry seam. Tool execution lives in
137
+ `BuiltinToolExecutor`. Adding a new provider doesn't touch any of
138
+ them.
139
+
140
+ ---
141
+
142
+ ## Part of [Anvil](../../) — the AI development pipeline.
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Phase 3 tests — verify per-adapter telemetry enrichment.
3
+ *
4
+ * Each adapter is stubbed with a captured-fixture-style provider response;
5
+ * we assert that ModelAdapterResult surfaces the cache + reasoning + tool
6
+ * fields in the normalized agent-core shape.
7
+ *
8
+ * Fixtures are inlined (not files) to keep the test self-contained and
9
+ * to make the response shape obvious next to the assertion.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=adapter-enrichment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-enrichment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/adapter-enrichment.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Phase 3 tests — verify per-adapter telemetry enrichment.
3
+ *
4
+ * Each adapter is stubbed with a captured-fixture-style provider response;
5
+ * we assert that ModelAdapterResult surfaces the cache + reasoning + tool
6
+ * fields in the normalized agent-core shape.
7
+ *
8
+ * Fixtures are inlined (not files) to keep the test self-contained and
9
+ * to make the response shape obvious next to the assertion.
10
+ */
11
+ import { describe, it, beforeEach, afterEach } from 'node:test';
12
+ import assert from 'node:assert/strict';
13
+ import { Writable } from 'node:stream';
14
+ import { trace } from '@opentelemetry/api';
15
+ import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
16
+ import { InMemorySpanExporter, SimpleSpanProcessor, } from '@opentelemetry/sdk-trace-base';
17
+ import { resourceFromAttributes } from '@opentelemetry/resources';
18
+ import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
19
+ import { OpenAIAdapter } from '../openai-adapter.js';
20
+ import { GeminiAdapter } from '../gemini-adapter.js';
21
+ import { instrumentModelAdapter } from '../telemetry/instrument.js';
22
+ import { resetTracer } from '../telemetry/tracer.js';
23
+ import { GenAi } from '../telemetry/attributes.js';
24
+ // ── In-memory exporter scaffold ────────────────────────────────────────────
25
+ let exporter;
26
+ let provider;
27
+ async function installExporter() {
28
+ await resetTracer();
29
+ exporter = new InMemorySpanExporter();
30
+ provider = new NodeTracerProvider({
31
+ resource: resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'anvil-agent-core-test' }),
32
+ spanProcessors: [new SimpleSpanProcessor(exporter)],
33
+ });
34
+ provider.register();
35
+ }
36
+ async function uninstallExporter() {
37
+ try {
38
+ await provider.forceFlush();
39
+ await provider.shutdown();
40
+ }
41
+ catch { }
42
+ exporter.reset();
43
+ trace.disable();
44
+ }
45
+ async function getSpans() {
46
+ await provider.forceFlush();
47
+ return exporter.getFinishedSpans();
48
+ }
49
+ const NULL_STREAM = new Writable({ write(_c, _e, cb) { cb(); } });
50
+ const BASE_CONFIG = {
51
+ userPrompt: 'hello',
52
+ model: 'gpt-4o',
53
+ workingDir: '/tmp',
54
+ stage: 'build',
55
+ persona: 'engineer',
56
+ };
57
+ // ── Fake fetch helper ──────────────────────────────────────────────────────
58
+ function makeFakeFetch(sseLines) {
59
+ return async (_url, _init) => {
60
+ const body = sseLines.map((l) => `data: ${l}\n\n`).join('') + 'data: [DONE]\n\n';
61
+ return new Response(body, {
62
+ status: 200,
63
+ headers: { 'Content-Type': 'text/event-stream' },
64
+ });
65
+ };
66
+ }
67
+ // ── Tests ──────────────────────────────────────────────────────────────────
68
+ describe('Phase 3 — per-adapter enrichment', () => {
69
+ beforeEach(installExporter);
70
+ afterEach(uninstallExporter);
71
+ it('OpenAI adapter surfaces cached_tokens and reasoning_tokens', async () => {
72
+ const originalFetch = globalThis.fetch;
73
+ const originalKey = process.env.OPENAI_API_KEY;
74
+ process.env.OPENAI_API_KEY = 'test-key';
75
+ // Captured-shape fixture: an o3-mini chat.completions stream that uses
76
+ // prompt cache + reasoning. Schema mirrors real OpenAI responses.
77
+ globalThis.fetch = makeFakeFetch([
78
+ JSON.stringify({ choices: [{ delta: { content: 'Hello' } }] }),
79
+ JSON.stringify({ choices: [{ delta: { content: ' world' } }] }),
80
+ JSON.stringify({
81
+ choices: [{ delta: {} }],
82
+ usage: {
83
+ prompt_tokens: 1500,
84
+ completion_tokens: 800,
85
+ prompt_tokens_details: { cached_tokens: 1200 },
86
+ completion_tokens_details: { reasoning_tokens: 600 },
87
+ },
88
+ }),
89
+ ]);
90
+ try {
91
+ const adapter = instrumentModelAdapter(new OpenAIAdapter());
92
+ const result = await adapter.run({ ...BASE_CONFIG, model: 'o3-mini' }, NULL_STREAM);
93
+ assert.equal(result.inputTokens, 1500);
94
+ assert.equal(result.outputTokens, 800);
95
+ assert.equal(result.cacheReadTokens, 1200);
96
+ assert.equal(result.reasoningTokens, 600);
97
+ assert.equal(result.cacheWriteTokens, undefined); // OpenAI does not bill writes
98
+ const spans = await getSpans();
99
+ assert.equal(spans.length, 1);
100
+ const a = spans[0].attributes;
101
+ assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], 1200);
102
+ assert.equal(a[GenAi.REASONING_TOKENS], 600);
103
+ // hit ratio = 1200 / (1500 + 1200) = 0.4444…
104
+ assert.ok(typeof a[GenAi.USAGE_CACHE_HIT_RATIO] === 'number');
105
+ const ratio = a[GenAi.USAGE_CACHE_HIT_RATIO];
106
+ assert.ok(ratio > 0.44 && ratio < 0.45);
107
+ // cache_write should not be present (adapter didn't surface it)
108
+ assert.equal(a[GenAi.USAGE_CACHE_WRITE_TOKENS], undefined);
109
+ }
110
+ finally {
111
+ globalThis.fetch = originalFetch;
112
+ if (originalKey === undefined)
113
+ delete process.env.OPENAI_API_KEY;
114
+ else
115
+ process.env.OPENAI_API_KEY = originalKey;
116
+ }
117
+ });
118
+ it('Gemini adapter surfaces cachedContentTokenCount and thoughtsTokenCount', async () => {
119
+ const originalFetch = globalThis.fetch;
120
+ const originalKey = process.env.GEMINI_API_KEY;
121
+ process.env.GEMINI_API_KEY = 'test-key';
122
+ // Gemini SSE shape: candidates + usageMetadata. Final chunk carries
123
+ // cumulative usage including cachedContentTokenCount and thoughtsTokenCount.
124
+ globalThis.fetch = makeFakeFetch([
125
+ JSON.stringify({
126
+ candidates: [{ content: { parts: [{ text: 'Hi ' }] } }],
127
+ usageMetadata: { promptTokenCount: 1000, candidatesTokenCount: 5 },
128
+ }),
129
+ JSON.stringify({
130
+ candidates: [{ content: { parts: [{ text: 'there' }] } }],
131
+ usageMetadata: {
132
+ promptTokenCount: 1000,
133
+ candidatesTokenCount: 50,
134
+ cachedContentTokenCount: 700,
135
+ thoughtsTokenCount: 200,
136
+ },
137
+ }),
138
+ ]);
139
+ try {
140
+ const adapter = instrumentModelAdapter(new GeminiAdapter());
141
+ const result = await adapter.run({ ...BASE_CONFIG, model: 'gemini-2.5-pro' }, NULL_STREAM);
142
+ assert.equal(result.inputTokens, 1000);
143
+ assert.equal(result.outputTokens, 50);
144
+ assert.equal(result.cacheReadTokens, 700);
145
+ assert.equal(result.reasoningTokens, 200);
146
+ const spans = await getSpans();
147
+ const a = spans[0].attributes;
148
+ assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], 700);
149
+ assert.equal(a[GenAi.REASONING_TOKENS], 200);
150
+ // hit ratio = 700 / (1000 + 700) ≈ 0.4118
151
+ const ratio = a[GenAi.USAGE_CACHE_HIT_RATIO];
152
+ assert.ok(ratio > 0.41 && ratio < 0.42);
153
+ }
154
+ finally {
155
+ globalThis.fetch = originalFetch;
156
+ if (originalKey === undefined)
157
+ delete process.env.GEMINI_API_KEY;
158
+ else
159
+ process.env.GEMINI_API_KEY = originalKey;
160
+ }
161
+ });
162
+ it('omits cache attrs entirely when adapter does not surface them', async () => {
163
+ // A minimal fake that returns no cache fields — verifies the wrapper
164
+ // doesn't fabricate zero values when the data is genuinely absent.
165
+ const fake = instrumentModelAdapter({
166
+ provider: 'claude',
167
+ capabilities: {
168
+ tier: 'agentic',
169
+ streaming: true,
170
+ toolUse: true,
171
+ fileSystem: true,
172
+ shellExecution: true,
173
+ sessionResume: true,
174
+ },
175
+ supportsModel: () => true,
176
+ getModelPricing: () => null,
177
+ checkAvailability: async () => ({ available: true }),
178
+ async run() {
179
+ return {
180
+ output: 'x',
181
+ inputTokens: 100,
182
+ outputTokens: 50,
183
+ costUsd: 0.001,
184
+ durationMs: 10,
185
+ provider: 'claude',
186
+ model: 'sonnet',
187
+ };
188
+ },
189
+ });
190
+ await fake.run(BASE_CONFIG, NULL_STREAM);
191
+ const spans = await getSpans();
192
+ const a = spans[0].attributes;
193
+ assert.equal(a[GenAi.USAGE_CACHE_READ_TOKENS], undefined);
194
+ assert.equal(a[GenAi.USAGE_CACHE_WRITE_TOKENS], undefined);
195
+ assert.equal(a[GenAi.USAGE_CACHE_HIT_RATIO], undefined);
196
+ assert.equal(a[GenAi.REASONING_TOKENS], undefined);
197
+ });
198
+ });
199
+ //# sourceMappingURL=adapter-enrichment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-enrichment.test.js","sourceRoot":"","sources":["../../src/__tests__/adapter-enrichment.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * AnthropicLlm + AdkAdapter unit tests.
3
+ *
4
+ * Covers the parts that don't make a network call:
5
+ * - LLMRegistry registration is idempotent and routes claude-* to
6
+ * AnthropicLlm.
7
+ * - Anvil → ADK content translation (system instruction, contents,
8
+ * tools).
9
+ * - SSE → LlmResponse parsing for text + tool_use streams.
10
+ * - Provider routing: `adk:` prefix → 'adk' provider.
11
+ * - Adapter pricing strips the prefix.
12
+ * - checkAvailability degrades cleanly when no auth env is set.
13
+ *
14
+ * Live calls against api.anthropic.com are exercised by a separate
15
+ * smoke test gated on ANTHROPIC_API_KEY (not run in CI).
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=adk-anthropic-llm.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adk-anthropic-llm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/adk-anthropic-llm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * AnthropicLlm + AdkAdapter unit tests.
3
+ *
4
+ * Covers the parts that don't make a network call:
5
+ * - LLMRegistry registration is idempotent and routes claude-* to
6
+ * AnthropicLlm.
7
+ * - Anvil → ADK content translation (system instruction, contents,
8
+ * tools).
9
+ * - SSE → LlmResponse parsing for text + tool_use streams.
10
+ * - Provider routing: `adk:` prefix → 'adk' provider.
11
+ * - Adapter pricing strips the prefix.
12
+ * - checkAvailability degrades cleanly when no auth env is set.
13
+ *
14
+ * Live calls against api.anthropic.com are exercised by a separate
15
+ * smoke test gated on ANTHROPIC_API_KEY (not run in CI).
16
+ */
17
+ import { describe, it } from 'node:test';
18
+ import assert from 'node:assert/strict';
19
+ import { LLMRegistry, BaseLlm } from '@google/adk';
20
+ import { AnthropicLlm, registerAnthropicLlm } from '../adk-anthropic-llm.js';
21
+ import { AdkAdapter } from '../adk-adapter.js';
22
+ import { resolveProvider } from '../agent/session/default-adapter-factory.js';
23
+ describe('AnthropicLlm — LLMRegistry integration', () => {
24
+ it('register is idempotent', () => {
25
+ registerAnthropicLlm();
26
+ registerAnthropicLlm();
27
+ registerAnthropicLlm();
28
+ // No throw; resolve still works.
29
+ const cls = LLMRegistry.resolve('claude-sonnet-4-6');
30
+ assert.equal(cls, AnthropicLlm);
31
+ });
32
+ it('resolves any claude-* id to AnthropicLlm', () => {
33
+ registerAnthropicLlm();
34
+ const ids = ['claude-haiku-4-5', 'claude-opus-4-7', 'claude-3-5-haiku-latest', 'claude-test-model'];
35
+ for (const id of ids) {
36
+ assert.equal(LLMRegistry.resolve(id), AnthropicLlm, id);
37
+ }
38
+ });
39
+ it('does NOT claim openrouter-style anthropic/* slugs', () => {
40
+ registerAnthropicLlm();
41
+ assert.throws(() => LLMRegistry.resolve('anthropic/claude-sonnet-4-6'), /not found|no.*model|unknown/i);
42
+ });
43
+ it('AnthropicLlm extends BaseLlm', () => {
44
+ const llm = new AnthropicLlm({ model: 'claude-sonnet-4-6' });
45
+ assert.ok(llm instanceof BaseLlm);
46
+ assert.equal(llm.model, 'claude-sonnet-4-6');
47
+ });
48
+ });
49
+ describe('AdkAdapter — provider routing + metadata', () => {
50
+ it('resolveProvider routes `adk:` prefix to adk', () => {
51
+ assert.equal(resolveProvider('adk:claude-sonnet-4-6'), 'adk');
52
+ assert.equal(resolveProvider('adk:gemini-2.5-flash'), 'adk');
53
+ assert.equal(resolveProvider('adk:claude-haiku-4-5'), 'adk');
54
+ });
55
+ it('routes BEFORE the generic slash check (so adk:foo/bar still picks adk)', () => {
56
+ assert.equal(resolveProvider('adk:vendor/model-id'), 'adk');
57
+ });
58
+ it('supportsModel only matches the prefixed form', () => {
59
+ const adapter = new AdkAdapter();
60
+ assert.equal(adapter.supportsModel('adk:claude-sonnet-4-6'), true);
61
+ assert.equal(adapter.supportsModel('claude-sonnet-4-6'), false);
62
+ assert.equal(adapter.supportsModel('gpt-4o'), false);
63
+ });
64
+ it('getModelPricing strips the prefix and falls back to null for unknown', () => {
65
+ const adapter = new AdkAdapter();
66
+ assert.deepEqual(adapter.getModelPricing('adk:claude-sonnet-4-6'), [3.0, 15.0]);
67
+ assert.deepEqual(adapter.getModelPricing('adk:gemini-2.5-flash'), [0.075, 0.30]);
68
+ assert.equal(adapter.getModelPricing('adk:unknown-future-model'), null);
69
+ });
70
+ it('capabilities advertise an agentic loop', () => {
71
+ const adapter = new AdkAdapter();
72
+ assert.equal(adapter.capabilities.tier, 'agentic');
73
+ assert.equal(adapter.capabilities.toolUse, true);
74
+ assert.equal(adapter.capabilities.fileSystem, true);
75
+ assert.equal(adapter.capabilities.shellExecution, true);
76
+ assert.equal(adapter.capabilities.streaming, true);
77
+ });
78
+ });
79
+ describe('AdkAdapter — checkAvailability', () => {
80
+ it('reports unavailable when no auth env is set', async () => {
81
+ const prior = {
82
+ anthropic: process.env.ANTHROPIC_API_KEY,
83
+ google: process.env.GOOGLE_API_KEY,
84
+ gemini: process.env.GEMINI_API_KEY,
85
+ genai: process.env.GOOGLE_GENAI_API_KEY,
86
+ };
87
+ delete process.env.ANTHROPIC_API_KEY;
88
+ delete process.env.GOOGLE_API_KEY;
89
+ delete process.env.GEMINI_API_KEY;
90
+ delete process.env.GOOGLE_GENAI_API_KEY;
91
+ try {
92
+ const adapter = new AdkAdapter();
93
+ const result = await adapter.checkAvailability();
94
+ assert.equal(result.available, false);
95
+ assert.match(result.error ?? '', /ANTHROPIC_API_KEY|GOOGLE_API_KEY|GEMINI_API_KEY/);
96
+ }
97
+ finally {
98
+ if (prior.anthropic !== undefined)
99
+ process.env.ANTHROPIC_API_KEY = prior.anthropic;
100
+ if (prior.google !== undefined)
101
+ process.env.GOOGLE_API_KEY = prior.google;
102
+ if (prior.gemini !== undefined)
103
+ process.env.GEMINI_API_KEY = prior.gemini;
104
+ if (prior.genai !== undefined)
105
+ process.env.GOOGLE_GENAI_API_KEY = prior.genai;
106
+ }
107
+ });
108
+ it('reports available when ANTHROPIC_API_KEY is set', async () => {
109
+ const prior = process.env.ANTHROPIC_API_KEY;
110
+ process.env.ANTHROPIC_API_KEY = 'sk-ant-test-only';
111
+ try {
112
+ const adapter = new AdkAdapter();
113
+ const result = await adapter.checkAvailability();
114
+ assert.equal(result.available, true);
115
+ }
116
+ finally {
117
+ if (prior === undefined)
118
+ delete process.env.ANTHROPIC_API_KEY;
119
+ else
120
+ process.env.ANTHROPIC_API_KEY = prior;
121
+ }
122
+ });
123
+ });
124
+ //# sourceMappingURL=adk-anthropic-llm.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adk-anthropic-llm.test.js","sourceRoot":"","sources":["../../src/__tests__/adk-anthropic-llm.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Phase 4 tests — cost breakdown + per-component span annotation.
3
+ *
4
+ * Covers:
5
+ * - calculateCostBreakdown returns 5 fields, components sum to total (within ε)
6
+ * - Wrapper emits gen_ai.usage.cost_{input,output,cache_read,cache_write}_usd
7
+ * - Unknown-model fallback: wrapper preserves adapter's costUsd when the
8
+ * central table doesn't know the model (no fabricated zero on the total)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cost-breakdown.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-breakdown.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cost-breakdown.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}